专栏名称: 雷克世界
赛迪研究院(CCID)主办的新媒体平台,每天跟你聊聊机器人、人工智能、智能制造领域的那些你想知道的事……
目录
相关文章推荐
51好读  ›  专栏  ›  雷克世界

如何用CoreML和Swift在苹果上开发一款「实时对象识别器」?超简单!

雷克世界  · 公众号  · 机器人  · 2017-08-06 11:10

正文


原文来源medium

作者:Lazim Mohammed

「机器人圈」编译:BaymaxZ


CoreML是2017年苹果WWDC发布的最令人兴奋的功能之一。它可用于将机器学习整合到应用程序中,并且全部脱机。


以下是来自苹果的官方机器学习文档:(https://developer.apple.com/machine-learning


CoreML允许你将各种机器学习模型类型集成到你的应用程序中。除了支持30多种类型的广泛的深度学习外,它还支持诸如树集成、SVM(支持向量机)和广义线性模型之类的标准模型。由于它是建立在像Metal和Accelerate这样的低级技术之上的,所以Core ML无缝利用CPU和GPU,以提供最高的性能和效率。你可以在设备上运行机器学习模型,因此数据不需要离开要进行分析的设备。


当深入了解预测如何发生,在哪儿发生,你就会发现CoreML的重要性。到目前为止,所有人都习惯于将机器学习整合到应用程序中,预测过程则发生在托管服务器中。如果是对象识别应用程序,则必须从设备中捕获帧,将数据发送到预测引擎,等待图像完全上传到服务器,最后得到输出。 这种方法主要有两个问题——网络延迟和用户隐私。现在,所有这些处理都可以简单地发生在设备中,从而减少了这两个问题。


在coreML之前,架构是这样的



从零开始


我们可以尝试使用CoreML,并为此实现一个简单的设备上解决方案。


我将重点介绍iOS或Swift的基础知识。首先我们要做的是获得iOS 11设备和Xcode 9。如果你不熟悉机器学习,请在这里看一下简单介绍,或者你可以从这里获得高级别概述。


机器学习


该技术使计算机能够在没有明确编码问题解决方案的情况下学习。这里有两个过程——训练和预测。训练是我们给模型不同的输入集(和相应的输出)以便从模式中学习的过程。这个训练过的模型被传送了一个从之前没有看到的输入,从之前的观察中预测出来。


选择模型


所以我们要做的第一件事是为你的项目选择一个很好的模型。有许多预训练的模型可用于图像识别。或者你甚至可以训练自己的模型来获得更好的体验。


来自苹果机器学习的CoreML有很多很好的模型(下载网址https://developer.apple.com/machine-learning/), 或者如果你有自己的模型,可以使用Apple提供的CoreML工具将其转换为支持CoreML的模型(网址:https://pypi.python.org/pypi/coremltools)。我选择了苹果中提供的Inception V3库。


Inception v3——从一组1000个类别(如树木、动物、食物、车辆、人物等)中检测出图像中的主要物体。


创建iOS项目


你可以使用带有单视图控制器的swift创建一个基本的iOS项目,包括视频预览图层和标签。


从视频预览中获取帧


获取当前帧照例是一样的,我们已经知道了。这在这篇invasivecode的文章中有所解释。


使用Inception V3进行预测


在提供输入图像时,将我们的初始模型视为黑盒子,可以将你作为其知道的一组类别中的一个概率。


从Apple的门户下载模型,拖动它(Inceptionv3.mlmodel)到你的项目。你可以从Xcode中看到模型描述。

 

Xcode模型查看器显示的Inceptionv2.mlmodel


你可以看到该模型以299x299像素的图像作为输入,并给出输出:


图像最可能的类别


每个类别的概率列表


我们可以利用任何这些参数来确定类别。我使用的第一个是一个绳子,并直接打印在屏幕上。


你还可以看到,Xcode直接从mlmodel对象创建一个swift模型(Inceptionv3.swift)。你不必为此做任何额外的更改。


用法


我们可以利用Xcode生成的预测API,如下所示:


/**

  Make a prediction using the convenience interface

    - parameters:

      - image: Input image to be classified as RGB image buffer, 299 pixels wide by 299 pixels high

    - throws: an NSError object that describes the problem

    - returns: the result of the prediction as Inceptionv3Output

*/

func prediction(image: CVPixelBuffer) throws -> Inceptionv3Output {

    let input_ = Inceptionv3Input(image: image)

    return try self.prediction(input: input_)

}


/// Model Prediction Output Type

class Inceptionv3Output : MLFeatureProvider {


    /// Probability of each category as dictionary of strings to doubles

    let classLabelProbs: [String : Double]


    /// Most likely image category as string value

    let classLabel: String

    

    // Class has other APIs and properties.

    // ...

  

}


预测则很简单:


var model = Inceptionv3()

let output = try? model.prediction(image: pixelBuffer)

let prediction = output?.classLabel ?? “I don’t know! ”


但它需要一个CVPixelBuffer的对象而不是UIImage进行预测,这是由hackingwithswift.com在“机器学习与远景”一节中精通这些的人介绍的,文章(https://www.hackingwithswift.com/whats-new-in-ios-11)。


我已经创建了UIImage类别,并将其与resize API一起进行提取。


extension UIImage {

    func buffer() -> CVPixelBuffer? {

        return UIImage.buffer(from: self)

    }

    

    static func buffer(from image: UIImage) -> CVPixelBuffer? {

        // as explained in https://www.hackingwithswift.com/whats-new-in-ios-11

        // ...

    }

    

    func resizeTo(_ size: CGSize) -> UIImage? {

        UIGraphicsBeginImageContext(size)

        draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

        let image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        return image

    }

}


最后的架构

 


结果


该应用程序能够从几乎所有提供的输入中正确识别结果。





    

点击此处链接获取完整的代码资源。


回复转载获得授权,微信搜索ROBO_AI关注公众号


欢迎加入


中国人工智能产业创新联盟在京成立 近200家成员单位共推AI发展



关注“机器人圈”后不要忘记置顶

我们还在搜狐新闻、机器人圈官网、腾讯新闻、网易新闻、一点资讯、天天快报、今日头条、QQ公众号…

↓↓↓点击阅读原文查看中国人工智能产业创新联盟手册