这是我参与「第四届青训营 」笔记创作活动的第5天,随着课程深入,越来越多新知识了。 这次课程就主要讲述了端智能技术,之前讲述的内容大多只是获取数据,发送数据,并不涉及数据的处理(计算)因为设备本身的算力有限。但是随着技术的发展,移动终端的算力也日渐强大,手机芯片的算力甚至达到了26Tops,越来越强大的算力为端智能的出现提供了硬件基础。 什么是端智能呢?端智能指把机器学习/深度学习的算法模型应用和部署到端设备上,端设备是相对于云服务而言,可以是手机电脑,及其他物联网IOT设备,常见的案例就是相机的特效,美颜,文字识别等功能。 为什么要做端智能呢?因为云服务尤其本身的缺陷,延迟高,实时性差,不能离线,成本高等等,而端设备恰恰相反,唯一的缺陷是算力比较差,但是随着技术的发展,端设备本身的算例已经足够支撑一些场景的智能服务。要明白的是,端智能和云服务并非绝对对立的概念,端智能是云端机器学习的延申,要结合二者的优势,在云端之间合理分配任务以获得问题最优解。 随着大数据的发展和硬件算力的提升,深度学习的算法和框架不断演进,人工智能领域迎来了一次大发展。同样的在端侧,各种端侧机器学习框架和应用案例也是层出不穷,其中不乏国内外的互联网巨头,如Google的TensorFlow Lite,ML Kit,Meta的Pytorch Mobile/Live,Apple的CoreML,腾讯的TNN,NCNN,阿里的MNN,百度的Paddle Lite,华为的HIAI,小米的MACE等。 那么端智能是如何落地到手机上的呢?首先要问题和方案(问题描述和定义,设计机器学习解决方案),其次要训练AI模型(数据收集,模型设计及训练-模型压缩及转换),最后就是要将AI模型部署到移动端(部署-收集输入推理预测-拿到结果执行业务策略)。以手写体数字识别为例,问题描述和定义就是一个手写体识别模块,支持输入数字0-9;解决方案就是训练一个可以识别手写数字的机器学习模型,然后将模型部署到APP中,实现手写输入到识别的过程,并将识别结果提供给用户选择输入。简单来说就是手写输入数字,输出可能代表的数字数值,多种可能时输出各自的置信度。训练模型阶段,首先要收集数据,可以是开源的数据集也可以自己合成数据,亦可以人工收集和标记数据,要求数据集贴合实际,兼顾不同年龄段,性能,左右手等,还可以使用数据增广(旋转,平移,放缩等)手写体识别对应分类问题,这里采用全连接神经网络搭建分类模型。首先搭建训练环境TensorFlow,接着是训练样本处理划分数据集,数据清洗,降维等等,然后构建模型,进行训练,用回归数据集验证模型准确度。这样就可以得到正确率不错的模型了,但是为什么要对模型进行压缩呢?因为移动端使用的是优化后的推理引擎,可以在不同的CPU/GPU架构下高效执行模型推理计算。接着就来到实现端智能的核心步骤,将我们训练好的模型部署到移动端,也就是让移动端可以加在转化后的模型。可以简单了当的的直接将其放到APP包体assets目录下,当然通过URL动态加载,支持动态更新,同时减少包体积的方式更为稳妥,部署成功后就要收集输入进行推理预测,也就是在设备上执行我们训练好的模型,过程为:加载模型-构造模型输入-执行推理预测-获取推理结果。拿到推理的结果经过处理执行业务策略,使其呈现在用户面前,整体的流程如图所示:
我们再介绍一个案例来实现下端智能的部署过程,这就是左右手智能识别功能。目前主流的APP大多以右手习惯来设计交互,并以此来引导用户点击,但是左右习惯的用户使用时效果就会很差,那么就需要设计一种检测左手还是右手在操作手机,然后根据检测结果动态调整交互,提升体验。一般可以通过手指在屏幕上的滑动轨迹识别左右手,这里采用二分类的CNN神经网络模型来识别左右手,首先要收集数据,样本数据要包括轨迹的坐标,长,款目的地和时间,结果就是左还是右,收集时可以在内测阶段手机滑动轨迹(通过拦截dispatchTouchEvent事件,缓存手指滑动产生的MotionEvent序列,并给其打上不同的标签然后就和手写体数字识别差不多,对收集到的数据样本进行处理,进行模型训练,验证准确度,部署到移动端,进行推理预测及业务应用。
讲了这么多,要做端智能需要哪些技能呢?要入门的话,当然首先要对端智能技术有一定的了解,然后可以协作完成端智能技术的需求落地。这就需要不仅知道端智能是什么,可以做什么,还要掌握移动端开发。机器学修的基础知识,了解业内智能框架,最终理解怎么做端智能并可以协作完成端智能技术解决实际业务问题的需求落地。再进一步,就需要对移动端技术,端智能技术和负责的业务有更深入的理解,可以站在更全面的视野上设计端上智能解决方案,建设端上智能架构。