说明
Create ML 是苹果于2018年 WWDC 推出的生成机器学习模型的工具。它可以接收用户给定的数据,生成 iOS 开发中需要的机器学习模型(Core ML 模型)。
2019 年的WWDC 上 Create ML 在易用性上更进一步:无需编程即可完成操作、独立成单独的 Mac OS App、支持更多的数据类型和使用场景。
故胤道长在去年写过机器学习新工具: Create ML App 、机器学习新工具: Create ML App 介绍过用法。
2020 年WWDC 也进行了增强,增加了风格迁移等,同时优化了 App 的界面:
- Control training in Create ML with Swift
- Build an Action Classifier with Create ML
- Build Image and Video Style Transfer models in Create ML
本文是我在 ARKit 中试用 CreateML App 后的一点点实践经验,主要试用了图片分类和物体检测这两个功能,侧重于傻瓜式入门。
基本使用
这个 App 是集成在 Xcode 中的,打开后是各种分类。
图片分类 Image Classifier
先试用第一个图片分类功能。支持常见图片格式,jpg/png/HEIC等
所以一般我们选择第一项 Training Data 的文件夹,和 Testing Data 文件夹,前者是必须的,后者可以不添加,也能训练出模型,只是你无法快速知道训练出的模型在新数据上表现好不好而已。
它的基本工作流程是:从 Training Data 中提取特征,然后在 Validation Data 中检测提取的对不对,对的保留,错的重新提取。
数据集可以用微软的Cat and Dog 猫狗分类数据集,点击可以免费下载,速度很快。 下载后的文件夹格式如下,文件夹名称会被做为分类后的标签:
点击左上角 Train 按钮开始训练,一般来说图片分类的训练过程非常快,几千张图片只需要不到 10 分钟就能得到模型。
Xcode 中使用
在 Xcode 中的使用其实是依赖 Vision 框架,可以参考苹果官方代码Classifying Images with Vision and Core ML 主要过程:
- 加载模型
let model = try VNCoreMLModel(for: MyImageClassifier_1().model)
let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
self?.processClassifications(for: request, error: error)
})
request.imageCropAndScaleOption = .centerCrop
- 发起处理请求
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: orientation, options: [:])
do {
try handler.perform([classificationRequest])
} catch {
/*
This handler catches general image processing errors. The `classificationRequest`'s
completion handler `processClassifications(_:error:)` catches errors specific
to processing that request.
*/
print("Failed to perform classification.\n\(error.localizedDescription)")
}
- 得到结果并显示
guard let results = request.results else {
self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)"
return
}
// The `results` will always be `VNClassificationObservation`s, as specified by the Core ML model in this project.
let classifications = results as! [VNClassificationObservation]
self.classificationLabel.text = classifications.first?.identifier
经过测试,图片分类速度很快,在我的 iPhone 8 Plus 上,开启 ARKit 追踪的同时,还能以 1 秒 30 帧处理图片分类,基本无卡顿。
物体检测 Object Detector
支持常见图片格式,jpg/png等,但是不支持 HEIC(我测试时标注工具已经支持了,但 CreateML App还不支持)
物体检测的使用,其实和图片分类也差不多。不同的是,不再以文件夹形式分类了,而是需要给一个 .json 文件,格式如下,包含了图片名,标签名,和标签的坐标,一个图片中可以有多个不同的物体:
[{
"image": "IMG_2447.png",
"annotations": [{
"label": "B",
"coordinates": {
"y": 1871,
"x": 727,
"width": 1441,
"height": 2141
}
}]
}, {
"image": "IMG_2449.png",
"annotations": [{
"label": "G",
"coordinates": {
"y": 1029,
"x": 1606,
"width": 326,
"height": 565
}
}, {
"label": "R",
"coordinates": {
"y": 1067,
"x": 1277,
"width": 369,
"height": 612
}
}, {
"label": "H",
"coordinates": {
"y": 2441,
"x": 1301,
"width": 1265,
"height": 1766
}
}]
}]
.json文件名称不限,只要有一个就行。训练过程和图片分类差不多,但是非常耗时,几百张图片就要跑一天。
json 文件生成
可以使用其他图片标注工具,将图片标注好,生成适合其他模型的 json 或 xml 格式,再用 python 处理成目标格式。在 Mac 平台上,也可以使用 Rectlabel 这个标注工具,免费试用期一个月。
标注完成后导出为 CreateML即可
Xcode 中使用
在使用模型时,同样也是依赖 Vision 框架,参考官方代码: Recognizing Objects in Live Capture 主要步骤与图片分类相同,主要是最后一步需要图形化展示,较为费力,不过官方代码已经给我们写好了:
- 加载模型
- 发起处理请求
- 得到结果并显示
经过测试,物体检测较为耗时,在我的 iPhone 8 Plus 上,开启 ARKit 追踪的同时,只能以 1 秒 10 帧处理物体检测,速度较慢。
最后
可以看到苹果推出的工具,虽然支持种类不多,性能也许不是最好,但是非常简单好用。
CreateML 训练模型,导入 Xcode 中使用,与 ARKit 集成也非常简单,借助 Vision 模型,只需要将CVPixelBuffer传给模型就可以了。