D32558ddccf067211489eba4eea89552
CreateML App 极简使用说明

说明

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)")
      }
  • 得到结果并显示
    ```swift
    guard let results = request.results else {
    self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)"
    return
    }
top Created with Sketch.