CreateML App 极简使用说明

3,446 阅读5分钟

说明

Create ML 是苹果于2018年 WWDC 推出的生成机器学习模型的工具。它可以接收用户给定的数据,生成 iOS 开发中需要的机器学习模型(Core ML 模型)。

2019 年的WWDC 上 Create ML 在易用性上更进一步:无需编程即可完成操作、独立成单独的 Mac OS App、支持更多的数据类型和使用场景。

故胤道长在去年写过机器学习新工具: Create ML App机器学习新工具: Create ML App 介绍过用法。

2020 年WWDC 也进行了增强,增加了风格迁移等,同时优化了 App 的界面:

本文是我在 ARKit 中试用 CreateML App 后的一点点实践经验,主要试用了图片分类和物体检测这两个功能,侧重于傻瓜式入门。

基本使用

这个 App 是集成在 Xcode 中的,打开后是各种分类。

图片分类 Image Classifier

先试用第一个图片分类功能。支持常见图片格式,jpg/png/HEIC等

可以看到界面中央有三个按钮:Training Data, Validation Data, Testing Data 一般来说,只要你的数据足够多,App 会自动从 Training Data 中划分出一部分,作为 Validation Data,所以第二个显示为Automatic。当数据太少时,第二项不可用。

所以一般我们选择第一项 Training Data 的文件夹,和 Testing Data 文件夹,前者是必须的,后者可以不添加,也能训练出模型,只是你无法快速知道训练出的模型在新数据上表现好不好而已。

它的基本工作流程是:从 Training Data 中提取特征,然后在 Validation Data 中检测提取的对不对,对的保留,错的重新提取。

数据集可以用微软的Cat and Dog 猫狗分类数据集,点击可以免费下载,速度很快。 下载后的文件夹格式如下,文件夹名称会被做为分类后的标签:

我们手动分出一部分,用来当作 Testing Data,以便快速检测训练出的模型质量如何。
将对应文件夹导入到 CreateML 中,一般来说,默认最大迭代次数是够用的。如果图片数据集比较小,还可以选择下方的增强,添加旋转或翻转效果。

点击左上角 Train 按钮开始训练,一般来说图片分类的训练过程非常快,几千张图片只需要不到 10 分钟就能得到模型。

点击 Get 或 Share 可以导出训练的模型。也可以找到项目,显示包内容,去里面拿到模型。

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传给模型就可以了。