写在前面

作为主播,你会不会为你的“吃鸡”技术高超却无法被观众知道而感觉才华被埋没了?作为观众,你会不会为错过主播的决赛圈而感到惋惜?

而爱奇艺近期新上线的移动端AI数字识别系统,让这些烦恼都将成为过去!有了移动端的AI数字识别系统,打开最新版爱奇艺App中的游戏直播,进入「刺激战场」频道,只要是使用爱奇艺直播机直播的主播,进入决赛圈的时候你就会收到系统贴心的提示,并且还能给主播打个小广告,求一波关注。

背景

 

由于硬件性能和技术的原因,传统的深度神经网络一般是在服务器中进行推断的,但随着各芯片厂商在AI技术方向上的发力,最新的移动端芯片像苹果的A11、A12,高通的骁龙845、710,华为的麒麟970、980均搭载了独立的AI芯片或引擎,这就给了移动端更多参与AI计算的可能性,对于一些轻量的AI推断,我们完全可以使用TensoFlow Lite或者CoreML来做。

而对“吃鸡”游戏击杀数和剩余人数的识别恰恰满足这些条件,所以我们决定尝试使用移动端来进行数字识别,在爱奇艺的开播助手上进行推断,这样既不用布新的服务器,又提高了识别的实时性。

核心模型训练

 

训练数据的收集与制作

通过分解与简化,可以将识别的对象具体为0~9的10个印刷体数字,而印刷体可以认为是特殊的规范化手写体。
       训练数据集的来源主要有两个:

第一部分由MNIST数据集提供的部分,MNIST数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)。 训练集由来自 250 个不同人手写的数字构成,其中 50% 是高中学生,50% 来自人口普查局的工作人员。测试集也是同样比例的手写数字数据。这部分数据有利于保证在收集数据数量有限的条件下,不会出现过拟合的情况。

第二部分的数据来源于爬虫或者人工收集的印刷体数据,使得模型对于印刷体数据的识别准确率变强。

收集与预处理图片的流程大致如下:

 

“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发

 

为了提高识别率,降低噪声的干扰,对于收集的数据图片进行二值化处理,过滤掉图片中的噪声。为了方便数据的保存,将图片转化成与MNIST数据集相同的格式,关于MNIST数据集的格式与具体内容可以查看:链接

模型的选择与调整

实际上Google提供了许多强大的模型,例如MobileNet和Inception V3等等,这些网络被广泛使用,表现稳定、准确率很高、性能优异。

然而本次实践,本文选用仍最基础的CNN,主要原因有:

一、足够使用,在TensorFlow早先的官方文档中,简单的CNN就可以实现MNIST测试集上超过99%的识别准确率;

二、结构简单,便于理解与修改。并且针对移动端的特性,我们也对模型做了一些调整,下面两张图就是调整前后的深度神经网络模型。

“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发_02

 

上图为TensorFlow官网教程中对于MNIST数据集进行识别所使用的CNN简化结构,可以看到该网络中主要包括两个卷积池化层与两个全链接层。通过迭代训练,该网络最终可以实现超过百分之九十九的识别准确率。显然这个准确率已经足够使用。

然而该网络也存在一些问题,它全链接层太过庞大,过多的权重值,使得保存的模型体积超过13MB,对于移动端而言,显然是很难接受的。而且在实际使用中,过大的模型也会消耗过多的内存。于是,对于现成的卷积神经网络进行调整,就有了较强的现实意义。

“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发_03

 

上图是经过调整的网络结构,可以看到新的网络剔除了一层权重过多的全链接层,增加了一层卷积池化层,使用avg进行池化。与原网络相比,改良后的模型文件获得了较大的缩减,从原本的13MB降低到不足500K,对于手机RAM的占用也从原先的10MB缩减到5MB。

模型的具体表现

经过上一步的调整,模型的内存占用有了显著的减少,但如果效果大打折扣的话显然得不偿失。所以,我们将调整前后的网络做了准确率和收敛速度对比测试。

对于网络的调整可能造成对于网络的收敛速度、准确度和训练时间造成影响。这里在系统ubuntu 18.04,软件tensorflow-gpu 1.2,硬件gtx 1060 6G等相同条件下考察调整后网络与原网络在各个方面上的具体区别。由于.tflite格式的模型不支持dropout算子,因此训练模型中剔除了该算子,也因此导致原模型在训练超过一万次后出现过拟合状态。

“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发_04

 

上面两幅图为模型调整前后的准确率情况,经过统计可以看出,通过训练改动后的模型也可以获得99%的准确率。

“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发_05

 

上面两幅图是模型调整前后的收敛情况,可以看出收敛速度上新模型仍旧变化不大。

因此对于原模型的简单调整,并没有影响网络的性能就可以使模型的体积显著下降。

数据获取和预处理

 

为了简化卷积神经网络和提高识别率,我们只希望前面的模型做单个数字的推断,但“吃鸡”游戏的人数是多位数字的,所以我们对获取到的图像做了预处理,主要步骤如下:
1、从输出图像数据中截取目标数字区域的图像;
2、将步骤1的输出图像转换成灰度图;
3、将步骤2获取到的灰度图做一次二值化(阈值设定);
4、遍历步骤3获取到的二值化图像数据,查找单个数字的像素区域,并截断成单个数字。

主要流程和如下图所示:

“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发_06

 

由上面四个步骤我们就能得到单个数字的图片,最后将这些单个数字的图片交给训练好的神经网络模型,推断出来后计算出实际数值。

模型在移动平台的应用

 

在iOS端上的应用

  • 模型的处理和转换

归根结底就是框架的选择,一旦确定了使用的框架,将.pb模型文件通过python脚本转换成对应框架所依赖的格式的模型文件即可。在iOS平台上,可以选择的框架就只有两种,Apple的CoreML和Google的TensorFlow Lite。

我们最后基于如下几点选择了苹果原生的CoreML框架:
1、包大小的问题,CoreML不需要引入额外的库
2、Core ML对于Classification的支持是足够的
3、CoreML支持动态compile模型文件
4、代码友好,可以使用Swift进行开发(直播机iOS App目前是Swift开发)
5、未来Apple对CoreML framework的改进和技术支持

确定好了使用的框架,剩下的就是写一下模型转换脚本;我们可以通过tf-coreml这个python库来实现,按照官方的Sample Code,即可将.pb模型文件转换为.mlmodel的模型文件。

  • 应用模型

就是根据第二步的输出图像构造输入数据,创建模型对象,并进行预测。

这一步,又分为两种情况:

内置模型:

系统会自动为我们生成三个Class,一个Input Class, 一个Output Class, 以及一个Model Class。譬如我这里有个模型文件,需要的输入是MultiArray(Double 784),遍历步骤二获得的单个数字的图像数据,填充MLMultiArray对象;然后在实例化Input Class时将multiArray作为参数传递进去;再实例化一个Model Class对象,然后调用它的 predication(input: ) 方法执行预测。这个方法的返回值是一个Output Class的实例,我们可以从中解析出预测值;

 

“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发_07

 

动态加载模型:

这种情况下,系统没有为我们生成Input Class,我们需要自己手动创建;至于如何实现Input Class,只需要参考内置模型生成的Input Class即可,主要是遵守 MLFeatureProvider 这个协议。

同时,Model Class也不再是某个细分的类,而是MLModel;我们需要调用MLModel.compilepileModel(at:) 去解析模型,并通过 MLModel(contentsOf:) 来实例化模型对象,然后调用模型对象的prediction(from:)方法,来获得一个feature provider;这个provider遵循了MLFeatureProvider协议,我们需要传入outputFeatureName来获取预测结果。

  • 应用预测数据

最后一步,将预测数据通过Http请求传递给服务器,再由观众端拉取服务端数据,展示出来即可。

在Android端上的应用

在Android端上应用深度学习模型采用与iOS端相似的预处理方式,从游戏画面中分离出具体的数字,将数字交给模型识别.后处理也采用相同的将识别结果交给服务器处理的方式.

与iOS的主要区别在于,Android端使用Google推出的tflite格式模型,将训练好的.pb格式文件转化为tflite格式文件.谷歌对于tflite有强大的支持,在Android端的使用也极为便利,具体的使用方法,可以参考:链接 。

 

模型在iOS和Android双平台的实际性能测试

 

这里采用推断置信度、推断耗时和CPU占用率三个标准衡量该方案的实际使用效果,测试硬件为iphone8和小米mix2S,游戏为刺激战场。

“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发_08“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发_09“吃鸡”结果早知道——爱奇艺直播移动端AI数字识别系统_软件研发_10

小结,实际使用中对于数字3和数字5识别率稍微低一些,但是仍能满足使用需求,单次识别消耗时间与手机CPU占用率受手机的状态影响较大,但平均耗时在10ms以内,平均占用率也在5%以下,对机器性能影响不大。

 

写在最后

 

今后我们也计划在移动端AI发力,一是基于AI开发更多酷炫的功能,二是对于现有的模型持续的进行优化,对更多的新机型进行适配,充分利用新机型的AI核心,提高识别效率和准确率。随着移动端AI单元计算性能的逐渐强大,我们有理由相信今后的移动AI大有可为。

 

End