Core ML 人工智能快速上手

519 阅读6分钟
原文链接: swiftcafe.io
Core ML 人工智能快速上手

swift 发布于 2017年09月12日

今年的 WWDC 开发者大会上, 苹果发布了运行在 iOS 设备上的 AI 库, Core ML。 AI 相关的内容基本上是这两年最火的话题之一,相关的开发库层出不穷,基础技术架构越来越成熟。

关于苹果发布的 Core ML 能做什么,今天和大家聊聊。

最容易上手的 AI 库

初步看了 Core ML 相关文档,我对它的感觉是,定位为一个易用的 AI 库,把 AI 的使用做到了非常简便。 首先,Core ML 需要使用扩展名为 .mimodel 的文件作为 AI 模型。 这个模型相当于大多数 AI 所建立的模型一样,可以是神经网络,线性模型等等。 对于纯粹的使用者来说这些细节可以不用深究。 苹果的官网提供了自己个内置的模型,在这个页面 developer.apple.com/machine-lea…

比如 MobileNet 这个模型,提供了识别图片中物体的能力:

以这个为例,我们来看看如何在 iOS APP 中使用 Core ML 模型。

首先,我们把这个模型下载下来,这样就得到了一个 .mimodel 文件, 然后打开 Xcode 9(注意一定要 Xcode 9 才行,旧版本的 Xcode 不能正确识别这个文件)。

把这个 .mimodel 文件拖动到 Xcode 9 的文件列表中, 随后你就会看到模型的详细信息被解析出来了:

最上面列出了模型的名称,简介,尺寸,作者等基础信息。 中间的 Model Class 列出了模型文件对应生成的代码接口。 这里面列出的是 MobileNet, 这个是我们可以在代码中直接引用的类名。

紧接着, Model Evalutation Parameters 表示模型接受的输入参数, 以及输出参数。 这里面的输入参数毫无疑问,是一张图片, 注意参数类型的后两个数字,代表只能接受一张分辨率为 224x224 的图片。 如果你之前简单了解过机器学习的知识,就不难理解为什么需要一张固定分辨率的图片了。

然后就是输出参数, classLabelProbs 是一个字典集合,里面列出的是图片中出现每一种物体的概率,供你参考。 第二个输出参数是 classLabel, 表示的是这张图片最可能的类型。

闲言少叙,速上代码。 做完了这些基础准备工作后, 我们就可以开始编码了, 首先初始化模型实例:

let model = MobileNet()

这里面的 MobileNet 类是 Core ML 为我们的模型文件生成的,前面也介绍过了,直接用就可以。 然后我们需要准备要输入的图片:

两只可爱的小猫,为了简化流程,我们直接把这样图片保存成 224x224 分辨率。 然后在项目中使用这张图片:

let imageView = UIImageView(frame: self.view.bounds)
imageView.image = UIImage(named: "cats")
imageView.contentMode = .scaleAspectFit
self.view.addSubview(imageView)

先把它添加到视图中, 然后取出图片对象:

if let imageToPredict = imageView.image?.cgImage {

    if let buffer = ImageProcessor.pixelBuffer(forImage: imageToPredict) {

        //...

    }

}

注意我们取图片的方式,因为这个 Core ML 模型使用的输入图片类型是 CVPixelBuffer, 我们不能用 UIImage 对象直接传递进去,需要进行一下转换。 这里用到的 ImageProcessor 提供的就是这个转换,来自 Github 的一个贡献者: github.com/brianadvent…,感谢一下。

图片数据准备完成后,我们直接调用:

do {

        let output = try model.prediction(image: buffer)
        print("label \(output.classLabel)")
        print("\(output.classLabelProbs)")

} catch {

        print("error occured")

}

Core ML 模型有一个 prediction 方法, 我们直接传入刚才生成的 buffer 图片数据,它就会给我们提供一个输出,也就是 .mimodel 文件中制定的输出格式。这里直接把输出内容打印到控制台上:

看输出中, label 打印的是 tabby cat, 不但识别除了是猫,连猫的品种也都识别出来了, 还是比较有意思的。 下面的详细输出中,也列出了各种物体识别的概率,也可作为参考。如果感兴趣的话,你可以试着切换不同的图片,看看是否都能准确的识别。

简单的几行代码,我们的 App 就有了 "视觉" 能力。 如果恰巧你的 APP 有可以应用这个能力的场景,你就可以用非常低的成本大大提升 APP 的用户体验,还是非常划算的。

注意: 如果你编译失败,可以试着把 Deployment Target 提升到 iOS 11 以上,因为 Core ML 只在 iOS 11 以上的设备才能正常运行。另外,如果你收到类似于 "Image is not valid width 224, instead is 852" 这样的错误,请检查你的图片尺寸,一定要符合这个模型的规范, 224x224 分辨率。

Core ML 浅谈

刚才,我们用一个最简单的例子演示了 Core ML 的强大能力。 现在来对它做一个简单的总结。 首先 Core ML 中最重要并且最复杂的并不是我们调用的代码,而是它的模型。 所谓模型,就是经过足够量数据训练的决策模型。 比如我们例子中的这个图片识别模型。 虽然我们可以拿过来就用,但是这个模型的产生却是一个比较复杂的过程。

这里其实可以确认一个定位,你是机器学习的使用者还是创造者? 人工智能发展到现在,其实已经产生了很多成熟的基础库了。 就像我们正在使用的 Core ML 模型。你不必了解所有细节,也可以使用前人设计好的 AI 模型,来达成你的需求。

并且在不久的将来,我相信这样的基础架构会越来越完善,会有越来越多的人有机会在不需要充分的人工智能知识下,也能使用人工智能提供的能力。这一定是一个必然趋势。 就像我们现在用到的很多第三方库一样,我们不一定了解其中所有细节,但是他们就是在那里正常工作。

这也就是 Core ML 出现的原因之一。 它不止服务于机器学习的创造者们,也为更多的使用者服务。

使用已存在的成熟模型

Core ML 除了使用这几个内置模型外,还可以使用很多已经存在的成熟模型,它们可以不是 Core ML 的 .mimodel 格式, Core ML 提供了转换工具来将其他类型的模型转换过来。 这个页面里面有详细的介绍 developer.apple.com/documentati…

总结

通过对 Core ML 这个简短的体验,相信你会感觉到它使用起来非常方便。 并且它是直接运行在 AI 的入口,移动终端上。你不需要专门架设后端服务器,就可以使用 AI 能力。当然这仅限于特定的场景,并不是所有的 AI 计算都适合直接在终端上进行。

但如果你恰巧有一个需求,而 Core ML 的模型也满足你的需求,场景也合适,那么它还是一个不错的选择。

本文章中实例完整代码已为你准备好,请到 Github 自取:github.com/swiftcafex/…


如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。
关注微信公众号
发现更多精彩
swift-cafe