iOS

WWDC2017之Core ML

Posted by 李清发 & 戴伟来 on June 26, 2017

目录[+]

Top

什么是Core ML

​ Core ML是苹果新推出的,面向开发者的机器学习框架。开发者能够轻松实现实时物体识别、人脸特征点识别、跟踪运动中的物体、文本分析等。

​ Core ML 让你将很多机器学习模型集成到你的app中。除了支持层数超过30层的深度学习之外,还支持决策树的融合,SVM(支持向量机),线性模型。由于其底层建立在MetalAccelerate等技术上,所以可以最大限度的发挥 CPU 和 GPU 的优势。你可以在移动设备上运行机器学习模型,数据可以不离开设备直接被分析,在一定程度上可以为开发者节省购买服务器的成本。而且该框架让所有的机器学习计算都在iOS设备本地进行,这一点依旧体现出苹果对用户隐私很看重。

 Vision:高性能的图像分析和图像识别。这部分应用于人脸追踪,人脸识别,文本识别,区域识别,二维码识别,物体追踪,图像识别等。 * Nattural Language processing:自然语言处理。用于语言识别,分词,词性还原,词性判定等。 * GamePlayKit*:游戏制作,构建游戏。用于常见的游戏行为如随机数生成、人工智能、寻路、和代理行为。

如何使用Core ML

​ 不得不提的是CoreML使用起来非常方便。苹果很聪明的定义了一个标准的模型格式(.mlmodel),提供了流行的框架模型到该格式的转换工具, 比如你可以将你的Caffe模型转换成CoreML的模型格式。这样就可以利用各个模型的训练阶段,而不像TensorflowLite只能使用Tensorflow模型。模型训练好了之后,只要拖放到Xcode中就可以使用,苹果甚至把接口的Swift代码都给你生成好了,非常方便。

Step1

​ 准备好你的模型(.mlmodel),可以按照上面的方法制作你所需的模型,也可以直接在Apple开发者网站上下载现成的模型:

Step2

​ 新建Project,把格式化的模型文件拖入到项目当中,这里下载的是Places205-GoogLeNet.mlmodel,然后点击该model,可以看到:

从上图可以看到 CoreML Model 分成三部分,第一部分算是基本的描述,第二部分 ModelClass 是对应 Model 生成的 Source 点击 GoogLeNetPlaces (Swift generated source) 末尾的小箭头进入GoogLeNetPlaces.Swift 文件 可以看到对应 Model的类和方法如下:

  • GoogLeNetPlacesInput:识别输入参数

    class GoogLeNetPlacesInput : MLFeatureProvider
    
  • GoogLeNetPlacesOutput:输出鉴定结果

    class GoogLeNetPlacesOutput : MLFeatureProvider
    
  • GoogLeNetPlaces:封装输入输出

     @objc class GoogLeNetPlaces:NSObject
    

Step3

使用Xcode自动生成的类及方法

let leNetPlaces = GoogLeNetPlaces()
let image = UIImage.init(named: "timg")
let vnCoreModel = try! VNCoreMLModel.init(for: leNetPlaces.model)
let vnCoreMLRequest = VNCoreMLRequest.init(model: vnCoreModel) { (request:VNRequest, error:Error?) in
            guard let result = request.results as? [VNClassificationObservation] else{
                fatalError("Requset Error")
            }
            for classification in result {
                if classification.confidence > 0.8 {
                //confidence 识别率,值越高越接近
				//identifier 识别结果
                    print(classification.identifier)
                    print(classification.confidence)
                }
            }
        }
let vnImageRequestHandler = VNImageRequestHandler.init(cgImage: (image?.cgImage)!)
guard(try? vnImageRequestHandler.perform([vnCoreMLRequest])) != nil else {
            fatalError("Error!")
}

这里使用了Vision库中的VNCoreMLModel , VNCoreMLRequest , VNImageRequestHandler。

Vison是苹果在WWDC2017上推出的另一个全新框架,其具有高性能的图像分析和计算机视觉能力,应用于图像和视频分类的场景中识别面孔和检测功能。

下面来看一下识别结果如何:

一些疑问

  • 在模型训练阶段,在尽可能不收集用户数据的前提下,如何优化模型?既使像苹果在去年的 WWDC 上宣称的「我们不需要收集所有用户拍的照片,才知道山长什么样子」,也依然不能回避的事实是,在模型的调优方面,少不了大量的数据支撑。想从 95% 的水平提升到 99% 的水平,数据还是不可缺少的一环。
  • 在模型应用阶段,如何做到尽可能在设备本地完成处理?早期受限于设备的性能和功耗,特别是移动设备的电量问题,许多公司选择将数据上传至云端后,由云端服务器来进行运算,只将结果返回给终端设备。

总结下来,苹果的目标,就是在尽可能不收集用户数据的基础上,也能调校出足够好用的模型,同时尽可能只在消费者的设备本地运用模型进行计算处理。而对从业者来说,如何利用好这一优秀条件创造出更好的应用也至关重要。

知识共享许可协议
文章四川掌麦科技有限公司创作,采用知识共享署名 4.0 国际许可协议进行许可。