WWDC 2020: 用 Create ML 打造智能运动 App

本文是 WWDC 2020 Session 10043 和 10099 的读后感,其视频及配套 PDF 文稿链接如下:Build an Action Classifier with Create MLExplore 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种,今年则是增加了对视频场景的支持。

Create ML 支持的模型

视觉(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格式的视频,亦可以是 JSONCSV格式的动画文件。
  • 为了能够准确的训练出每个动作,苹果推荐每个动作类别需要50个数据以上;目前训练效率不是很高,在演示中,苹果的开发者导入了300多个视频作为模型的训练数据,结果 Create ML 需要花费30分钟才能训练出模型。
  • 训练完成后,开发者可以直接导入新的模型去检验模型精度——训练出的动作分类器模型会在播放视频的同时实时判定动作类型,并给出置信度。
  • 整个过程无需任何编程知识,用简单的鼠标拖拽即可完成。
image

第二步:利用视觉(Vision)框架去识别动作

用 Create ML 训练生成分类器模型后,我们就可以用它来判定动作了。这里的原理也很简单:

  1. 首先 iPhone 会将摄影的内容会逐帧转化为视觉框架所认知的数据点
  2. 接着这些数据点会被传入分析窗口,它一般间隔为2秒钟(2秒钟的视频内容足以让分类器识别出视频中的动作)
  3. 用分类器模型分析窗口中的数据,并生成识别出的动作结果

相关代码如下:

/// 将视频逐帧转化为视觉框架的数据点
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 的流程,来分析其需要运用何种框架和机器学习模型。

image

整个 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 的完整工作流程:


image

阅读更多

更多关于视觉框架和机器学习的内容,可以参见以下两个 Sessions:

Detect Body and Hand Pose with Vision
Explore Computer Vision APIs

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容