作者|MNN团队
出品|阿里巴巴新零售淘系技术部
端智能(On-Device AI)近年来已经从移动开发中的有意思的尝试,慢慢发展成为移动开发工程师核心的工具。今天的移动开发,AI随处可见:从手机淘宝里的拍立淘,到淘宝直播里的商品识别,到头条的个性化推荐,到抖音直播里的人脸识别,人工智能在移动app里发挥的作用越来越大。它也逐渐从Snapchat那些社交软件的一些比较好玩的属性(如人脸贴纸),慢慢发展到了淘宝里面那些能够真正为商业赋能的应用场景。
在这样的背景下,阿里巴巴淘系技术的MNN团队,近日发布了开箱即用的工具集MNN Kit。
MNN Kit是什么?
MNN Kit是阿里巴巴把经过多次战役实战考验的常用业务场景的模型进行封装,得到的一系列简单易用的SDK。它底层的技术基石是推理引擎是2019年5月开源的MNN(https://github.com/alibaba/MNN)。
急于尝试的同学们:MNN Kit 使用文档与开源的Demo工程的GitHub地址在此:https://github.com/alibaba/MNNKit
这些模型的背后,是淘系内部算法团队多年的技术沉淀。比如,MNN Kit 的人脸检测所使用的一系列模型,是由淘系专注于客户端深度学习视觉算法的 PixelAI 团队提供。
MNN Kit的模型简介
MNN Kit目前开放了以下三种场景的SDK:
人脸检测;【使用文档】
人像分割;【使用文档】
手势识别;【使用文档】
▐ 人脸检测
人脸检测是 MNNKit 提供的 AI 解决方案 SDK ,在端上提供了高精度、实时、功能丰富的人脸检测能力,能满足各种基于人脸检测的业务场景。
它提供了人脸基本信息(人脸的矩形坐标,106个关键点坐标,置信度),人脸三个维度(Yaw, Pitch, Roll)的欧拉角度,以及人脸在视频流中的动作(眨眼,点头等)。
106 个关键点的效果图如下:
下面的视频是 MNN Kit Demo 中实际展示的效果:
https://ucc-vod.alicdn.com/sv/1967515e-1707c240053/1967515e-1707c240053.mp4
人脸检测模型是一个非常通用的能力。在它的基础上,我们可以做出各种有意思的玩法,比如美颜,人脸贴纸,换脸,人脸老化效果等。2018 年双十一晚会现场的“笑脸大作战”互动节目,让明星互动 PK 笑脸数。它的背后是用人脸检测结合笑脸检测模型,实时识别出视频流中的笑脸,并与 emoji 进行匹配。
▐ 手势识别
手势检测是 MNNKit 提供的移动端 AI 解决方案 SDK,在端上提供了实时的手势检测和识别能力,基于它应用可以拓展丰富的业务场景和玩法。比如,你可以基于手势检测的模型,开发出猜拳的游戏;或者你可以基于它开发一款用受手势控制 App ,可以让用户在手指不方便接触屏幕的时候(比如吃饭时),可以远程刷手机。你的脑洞是玩法应用的边界。
手势识别的 Demo 见下面的视频:
▐ 人像分割
人像分割是 MNNKit 提供的移动端 AI 解决方案 SDK ,在端上提供了实时的人像分割能力。它也是一个基础的模型能力,可以应用到比如证件照自动抠图,协助PS等场景。
效果图如下:
极简的接入流程
MNN Kit 诞生于阿里巴巴淘系,一个需要针对诸如双 11,双 12 ,年货节等大促活动快速上线业务的环境。简单快速将模型整合到 app 里,是 MNN Kit 的必备的特性。
MNN Kit 的基本 API 只有三个:创建实例、推理、释放实例。使用流程如下图所示:
下面以Android中的人脸检测为例,简要介绍一下接入的代码。
▐ 创建实例
我们异步创建FaceDetector实例,它会在主线程中回调onSucceeded:
void createKitInstance() {
// 定义Detector Config
FaceDetector.FaceDetectorCreateConfig createConfig = new FaceDetector.FaceDetectorCreateConfig();
createConfig.mode = FaceDetector.FaceDetectMode.MOBILE_DETECT_MODE_VIDEO;
FaceDetector.createInstanceAsync(this, createConfig, new InstanceCreatedListener<FaceDetector>() {
@Override
public void onSucceeded(FaceDetector faceDetector) {
// 获取回调实例
mFaceDetector = faceDetector;
}
@Override
public void onFailed(int i, Error error) {
Log.e(Common.TAG, "create face detetector failed: " + error);
}
});
}
▐ 推理
我们从Android Camera API的onPreviewFrame callback中,可以获得相机帧的数据data。定义好需要在视频流中的人脸动作(如眨眼,张嘴等),即可在当前帧进行人脸检测。
// 从相机API回调中获取视频流的一帧
byte[] data = ....;
// 定义哪些人脸的动作需要在视频流中进行检测
long detectConfig =
FaceDetectConfig.ACTIONTYPE_EYE_BLINK |
FaceDetectConfig.ACTIONTYPE_MOUTH_AH |
FaceDetectConfig.ACTIONTYPE_HEAD_YAW |
FaceDetectConfig.ACTIONTYPE_HEAD_PITCH |
FaceDetectConfig.ACTIONTYPE_BROW_JUMP;
// 进行推理
FaceDetectionReport[] results = mFaceDetector.inference(data, width, height,
MNNCVImageFormat.YUV_NV21, detectConfig, inAngle, outAngle,
mCameraView.isFrontCamera() ? MNNFlipType.FLIP_Y : MNNFlipType.FLIP_NONE);
▐ 释放实例
App 需要根据自己应用场景,主动释放模型所占用的内存。以我们的 Demo 为例,在 Activity 的 onDestroy ,释放掉模型占用的内存。你可以根据自己 app 的流程,来决定在什么时间节点进行释放。
protected void onDestroy() {
super.onDestroy();
if (mFaceDetector!=null) {
mFaceDetector.release();
}
}
▐ 前后处理最佳实践
在一个真正的落地场景中,除了以上三步以外,还有一些针对相机视频流的前后处理。这些处理,在很多时候都是类似的。比如前处理方面,如何正确地处理相机帧,需要考虑摄像头是前置还是后置,相机的旋转;后处理方面,需要把模型输出的结果(例如人脸关键点坐标)映射到原图进行渲染。MNN Kit 把这些最佳工程实践作为参考实现放在了 Demo 里面。这 Demo 的代码在 MNN Kit的GitHub 开源。
未来
MNN Kit 目前极大的简化了移动开发流程中使用通用模型能力的流程。如果你的应用场景不是完全契合这个通用的场景呢?很多情况下,以一个优秀的基础模型为起点,进行迁移学习,就可以得到适合你自己应有场景的模型。MNN 团队会后续发布产品来帮助大家更加轻松高效地进行迁移学习。
另外,MNN Kit 会逐步覆盖到其他的通用场景的模型。请大家拭目以待!
用户协议
MNN Kit 有它自己的用户协议【用户协议】。
有几个重点强调一下:
- MNN Kit 本身不开源,模型不单独提供。使用这些模型的能力需要通过 MNN Kit 的 API 。用户协议中禁止了针对MNN Kit进行逆向工程。
- 不允许以商业或者盈利的目的对MNN Kit进行二次封装。比如,将 MNN Kit 进行封装为其他的 SDK,从事商业或者盈利的目的。
- 遵守 MNN Kit License 的前提下,允许应用集成 MNNKit SDK ,并因此产生商业价值或利益。
贴心的小橙也为大家准备了一场直播
MNN Kit 最新解读
▼
We are hiring
淘宝基础平台部-端智能团队欢迎移动端计算优化工程师和推理引擎架构师的加入。对新技术感兴趣,善于创新突破,渴望用新技术给用户带来创新体验的同学请联系我们。简历投递至吕行:chengfei.lcf@alibaba-inc.com
更多技术干货,关注「淘系技术」微信公众号!