本文是 WWDC 2020 Session 10043 和 10099 的读后感,其视频及配套 PDF 文稿链接如下:Build an Action Classifier with Create ML,Explore the Action & Vision app。
本文首先回顾 Create ML 的发展并讲解其基本知识,接着讲解其最新的运动分类器模板,最后用 Create ML 视觉框架和运动分类器来打造一款智能运动 App。
Create ML 背景介绍
Create ML 是苹果于2018年 WWDC 推出的生成机器学习模型的工具。它可以接收用户给定的数据,生成 iOS 开发中需要的机器学习模型(Core ML 模型)。2018年刚推出时,它还需要依靠 Playground ,通过编程来导入数据、训练模型;2019年,Create ML 已经独立成为一个单独的开发工具——它集成在 Xcode中,整个模型的训练和生成无需任何编程操作。
iOS 开发中,机器学习模型的获取主要有以下几种:
从苹果的官方主页下载现成的 Core ML 模型。2017年有4个现成的模型,2018年有6个,2019年增加到了9个(8个图片、1个文字),2020年数量依然只有11个(10个图片、1个文字),可谓进步速度缓慢。
通过第三方的机器学习框架生成模型,再用 Core ML Tools 转成 Core ML 模型。2017年苹果宣布支持的框架有6个,包括 Caffee、Keras。2018年宣布支持的第三方框架增加到了11个,包括了最知名的 TensorFlow、IBM Watson、MXNet。至此 Core ML 已经完全支持市面上所有主流的框架。
用 Create ML 直接训练数据生成 Core ML 模型。2018年的 Create ML 支持图片、文本、表格3种场景,2019年增加到了5个为图片、文本、表格、声音、活动5种,今年则是增加了对视频场景的支持。
视觉(Vision)框架和运动(Activity)分类器
视觉框架是苹果人工智能框架(API)中的一部分,是2020年推出诸多新功能并着重强调的框架。在人工智能时代,苹果在2017年推出了 Core ML 框架,作为机器学习的基础框架;之后,针对视觉、图片、声音、文本,苹果又在 Core ML 的基础上推出了适合各种场景的专用框架。在过去的两年,苹果主要宣传的是他们的图片分类器和自然语言处理模型;今年因为疫情的原因,远程的视频需求大幅提升。苹果敏锐的感觉到这一点,故而在视频、视觉、运动方面发力,希望解决用户在家运动、远程培训方面的需求。
如何让你的 App 可以实时识别你的动作?在 WWDC 20的《用 Create ML 构建动作分类器》视频中,苹果给出了答案。主要分为两步:
第一步:用 Create ML 训练出动作分类器的 Core ML 模型
Create ML 的模型训练过程是:打开 Create ML App -> 选择运动分类器模板 -> 导入训练数据 -> 训练并生成模型 -> 用测试数据评估模型 -> 观察模型参数。这里有几个要注意的点:
- Create ML 支持的训练数据可以使
.mov
格式的视频,亦可以是JSON
和CSV
格式的动画文件。 - 为了能够准确的训练出每个动作,苹果推荐每个动作类别需要50个数据以上;目前训练效率不是很高,在演示中,苹果的开发者导入了300多个视频作为模型的训练数据,结果 Create ML 需要花费30分钟才能训练出模型。
- 训练完成后,开发者可以直接导入新的模型去检验模型精度——训练出的动作分类器模型会在播放视频的同时实时判定动作类型,并给出置信度。
- 整个过程无需任何编程知识,用简单的鼠标拖拽即可完成。
第二步:利用视觉(Vision)框架去识别动作
用 Create ML 训练生成分类器模型后,我们就可以用它来判定动作了。这里的原理也很简单:
- 首先 iPhone 会将摄影的内容会逐帧转化为视觉框架所认知的数据点
- 接着这些数据点会被传入分析窗口,它一般间隔为2秒钟(2秒钟的视频内容足以让分类器识别出视频中的动作)
- 用分类器模型分析窗口中的数据,并生成识别出的动作结果
相关代码如下:
/// 将视频逐帧转化为视觉框架的数据点
func processFrame(_ samplebuffer: CMSampleBuffer) throws -> [VNRecognizedPointsObservation] {
// 抓取出视频中的动作
let framePoses = extractPoses(from: samplebuffer)
// 选择视频中最明显的那个人
let pose = try selectMostProminentPerson(from: framePoses)
// 将数据点导入分析窗口
posesWindow.append(pose)
return framePoses
}
/// 分析视频动作并给出结果
func makePrediction() throws -> PredictionOutput {
// 将数据识别点转化为多维特征矩阵
let poseMultiArrays: [MLMultiArray] = try posesWindow.map { person in
guard let person = person else {
return zeroPaddedMultiArray()
}
return try person.keypointsMultiArray()
}
// 数据处理
let modelInput = MLMultiArray(concatenating: poseMultiArrays, axis: 0, dataType: .float)
// 调用分类器模型对数据进行分析
let predictions = try fitnessClassifier.prediction(poses: modelInput)
// 重置分析窗口
posesWindow.removeFirst(predictionInterval)
// 返回动作类型及其相关的置信度
return (
label: predictions.label,
confidence: predictions.labelProbabilities[predictions.label]!
)
}
基于动作分类模型和视觉框架,苹果展示了一个示例 App:用户可以选择想要训练的动作和规定时间,然后打开摄像头,App就会根据用户的动作实时判定运动状态,还能记录和给出评分。
从0打造一款智能运动 App
为了全面的展示在机器学习方面的新进展,苹果官方开发出了一款运动分析的 App——一款沙包游戏(Cornhole/Bean Bag Toss)App,基于运动模型和视觉框架来实现。
沙包游戏,是美国人爱玩的户外草地游戏。简单的说,就是找一块开阔的草地,把有洞的斜坡板放在一边,然后人们站在远处对准斜坡板上的洞开始扔沙包——沙包停在板上则得分,若正好扔进洞里,则可以获得额外奖励分。这个游戏一般是多人竞赛,美国还有官方的选手排名。
苹果的这款 App,可以实时分析选手投掷沙包的角度、速度,并给出相应得分。下面我们就来根据 App 的流程,来分析其需要运用何种框架和机器学习模型。
整个 App 流程分为3步:
检测斜坡板并判断整个游戏场景(镜头)的稳定性
检测斜坡板,我们可以用机器学习模型 GameBoardDetector.mlmodel
来进行判断。它可以用斜坡的图片(不同角度、大小、背景),通过 Create ML 来训练生成。有了模型,我们就可以配合其调用苹果的视觉框架中的两个API:
-
VNCoreMLRequest
用来检测斜坡板在视频中是否存在以及相应的位置 -
VNDetectContourRequest
用来精准勾勒斜坡板的轮廓和斜坡板上洞的位置
检测游戏场景(镜头)的稳定性,苹果提供了VNTranslationImageRegistrationRequest
:它比较两帧图像之间x轴和y轴的变化,如果变化小于一定的范围,就认为整个游戏场景稳定。
当人进入摄像头范围内,沙包游戏开始
针对任务检测,苹果在iOS 14中提供了全新的视觉 API:VNDetectHumanBodyPoseRequest
,它用来检测人脸、躯干、肢体动作。在 App 中,我们用它来对每一帧的视频内容进行分析,当检测到有人出现时,游戏正式开始。
当人开始投掷沙包时,分析投掷情况并给出反馈数据
游戏开始后,App需要检测三个要素:丢沙包的开始动作;丢沙包的姿势;丢沙包的速度。
VNDetectTrajectoriesRequest
是苹果提供的,用于检测物体运动轨迹的 API。它将多帧视频内容进行分析,然后识别出其中运动物体的轨迹,其经典的运用场景是足球、篮球、网球的运动轨迹。在这个App中,当人们开始丢沙包后,沙包的运动轨迹就可以被捕获并追踪。值得注意的是,即使是视频中有多个同时运动的物体,这个 API 也可以精准的全部检测出来。所以在这个 App 中,我们需要限定运动轨迹的起始点为人手(上文中VNDetectHumanBodyPoseReequest
可以精准判断出人手位置),终止点为斜坡板(上文中VNDetectContourRequest
可以精准判断斜坡板位置)。
当VNDetectTrajectoriesRequest
检测到沙包的轨迹时,我们可以判断丢沙包动作已经开始;再根据轨迹的路线和时间,我们可以计算出丢沙包的对应速度。
最后关于丢沙包的姿势,则可以用动作分类器模型去判断。我们可以用上文中"用 Create ML 训练出动作分类器的 Core ML 模型"类似的方法,我们可以训练出一个专门的模型PlayerActionClassifier.mlmodel
来对人丢沙包的姿势进行分类。
下图展现了整个 App 的完整工作流程:
阅读更多
更多关于视觉框架和机器学习的内容,可以参见以下两个 Sessions:
Detect Body and Hand Pose with Vision
Explore Computer Vision APIs