端智能技术演进与实践
这是我参加「第四届青训营」笔记创作活动的第五天,介绍端智能技术有关知识。
01.什么是端智能技术
从端智能是什么、为什么要做端智能、端智能的发展历程带大家认识端智能技术
端智能(On—Device Machine Learning):是指把机器学习/深度学习算法模型应用和部署到端设备上,这里“端设备”是相对于云服务而言的,可以是手机,也可以是物联网IoT设备。 On-Device Machine Learning | Google Developers 一些客户端案例: 抖音换装特效,离线文字识别,肢体检测,手势识别
为什么要做端智能? Advantages and limitations of on-device ML | Google Developers
- Low Latency:低延迟、实时性高
- Privacy:保护隐私
- Power:端设备算力越来越强大
- Offline:可离线
- Low Cost:低成本
端云协同:端智能不是云智能的替代,二是云端机器学习的延伸,是要结合云和端各自的优势,在云端之间合理分配任务以获取问题的最优解。
发展历程
- 2006年,深度学习被提出,得益于大数据的发展和硬件算法的提升,深度学习的算法和框架不断严谨,人工智能领域迎来了一次大发展。
- 与此同时,端侧设备在算例、算法和框架同样由突飞猛进的发展,各类端侧机器学习框架和应用案例层出不穷。
端侧机器学习框架
- Google:TensorFlow Lite、ML Kit
- Meta:PyTorch Mobile、PlayTorch Live
- Apple:Core ML
- 腾讯:Tencent/NCNN、Tencent/TNN
- 阿里:MNN
- 百度:Paddle-Lite
- 华为:HiAI、ML Kit
- 小米:MaceMace
- 其他:字节(ByteNN、Pitaya),快手(KwaiNN、YKit)
02.端智能技术实践案例
通过两个案例理解如何做端智能
端智能案例落地的套路
问题和方案
graph TD
问题描述和定义 --> 设计机器学习解决方案
训练AI模型
graph TD
数据收集 --> 模型设计模型训练 --> 模型压缩模型转换
AI模型在移动端部署应用
graph TD
模型部署到移动端 -->收集输入推理预测 --> 拿到结果执行业务策略
案例一:手写数字识别
要求:app要做一个手写输入法模块,支持输入数字0~9
问题和方案
问题:app要做一个手写输入法模块,支持输入数字0~9,如何实现?
解决方案:
- 训练一个可以识别手写数字的机器学习模型
- 将此模型部署应用到app中,实现手写输入到十倍的过程,并将识别结果供给用户选择输入
机器学习部分:
- 输入:手写输入数字(图片)
- 输出:其可能代表的数字数值,多种可能时给出各自置信度(0.0~1.0)
数据收集
数据来源方式
- 开源方式(MNIST)
- 合成数据
- 人工收集和标注的数据(设计和实际需求贴合的一个数据采集程序,兼顾不同年龄段、性别、左/右手等)
数据增广 -旋转、平移、缩放变换
数据同步缓存到云端DataCache、数据缓存云端的django web服务 (github.com)
模型设计
一个可以在线模拟演示网络模型设计网站A Neural Network Playground (tensorflow.org) 10分类模型,全连接神经网络
- 参考Tensorflow官方样例(www.tensorflow.org/tutorials/q…)
model=tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28,28)),
tf.keras.layers.Dense(128,activation=‘relu’),
tf.keras.layers.opout(0.2),
tf.keras.layers.Dense(10,activation='softmax')
])
模型训练
- 1.搭建训练环境——tensorflow Working with Jupyter Notebooks in Visual Studio Code
- 2.训练样本处理
- 3.模型构建Keras
- 4.模型训练
- 5.验证模型准确度
完整参考代码DigitalRecognition/digital_recognition.ipynb at develop · ahcyd008/DigitalRecognition (github.com)
模型压缩和转换
为什么要做模型压缩和转换?
- 移动端使用的时被优化的推理引擎,可以在不同CPU和GPU架构下更高效的执行模型推理计算
这里我们使用Tensorflow Lite作为移动端上推理引擎
- Tensorflow模型在被提供Tensorflow Lite使用前,必须转换为Tensorflow Lite支持的格式。
- Tensorflow Lite提供转换器TensorFlow Lite
#self tflite model
coverter=tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model=converter.convert()
open("mymodel.tflite","wb").write(tflite_model)
模型部署到移动端
核心:让移动端可以加载到前面转化的模型
- 简单做法:放在app包体内assets目录下
- 进阶做法:通过url动态下载,支持动态更新,同时减少包体积 TensorFlow Lite inference
移动端推理预测
推理预测是指设备上执行Tensorflow Lite模型。Tensorflow Lite将模型的加载和执行封装在Interpreter类中,位于代码tflite/DigitalClassifier.kt
- 加载模型
var model:ByteBuffer=load(mymodel.tflite)
val interpreter=Interpreter(model,options)
inputShape:[1,28,28],outputShape:[1,10]
- 构造模型输入
图片resize ->转灰度 ->转input byteBuffer(Model输入28*28单通道灰度图)
- 执行推理预测
val result=Array(1){FloatArray(10)}
interpreter.run(input byteBuffer,result)
- 获取推理运行结果
result[0]中的10个数值代表0~9 10个数字置信度分数,对分值进行排序,把排序前三的数字作为输出供用户使用。
案例回顾
一个端智能案例的落地套路完成流程
graph TD
问题描述和定义 --> 设计机器学习解决方案 --> 数据收集 --> 模型设计模型训练 --> 模型压缩模型转换 --> 模型部署到移动端 --> 收集输入推理预测 --> 拿到结果执行业务策略
DigitalRecognition: 端智能手写数字识别学习Android Demo + 模型训练 (github.com)
案例二:左右手智能识别和应用(抖音案例)
需求背景:很多app会以右手习惯来设计交互,并以此取引导用户点击他们期望的选项。 存在问题:用户左手使用手机时,引导效果会变差,有没有更智能更个性化的交互体验方式?
问题和方案
问题:设计一种方法检测用户是左手操作手机还是右手操作手机,然后依据检测结果动态调整交互,提升用户体验
调研:手指在屏幕滑动轨迹识别左右手Recognizing the Operating Hand and the Hand-Changing Process for User Interface Adjustment on Smartphones - PMC (nih.gov)
机器学习方案:训练一个二分类的CNN神经网络来识别用户是左手or右手操作
- 输入:用户在屏幕上的滑动轨迹
- 输出:左手or右手
数据收集
数据格式:
- X格式:
[p0,p1,p2,p3,···],p=(x,y,wh,density,dtime) - Y格式:left/right
收集方式:(特殊客户端,内侧客户收集)
- 滑动轨迹:拦截Activity的dispathTouchEvent时间,缓存手指华东产生的MotionEvent序列
- 左右手标签
- 左手样本收集时,只用左手持机操作
- 右手样本收集时,只用右手持机操作
override fun dispathTouchEvent(ev:MotionEvent?):Boolean{ev?.let{
tracker?.recordMotionEvent(it)
}
return super.dispathTouchEvent(ev)
}
数据同步缓存到云端DataCache (github.com/ahcyd008/Da…)
模型设计
二分类模型(left or right) 卷积神经网络
模型训练和转换
- 训练样本处理
- 模型训练
- 验证模型准确度
def getX(points):
size = len(points)
if size < 6 : # 过滤误触
return None
sample_count = 9
tensor_size = 6
step = size * 1.0 / sample_count
x = []
for i in range(sample_count):
p = points[int(i*step)]
if len(p) == 6:
x.append(p) # x, y, w, h, density, dtime
return x
model.fit(train_x, train_y, batch_size=batch_size, epochs=epochs, verbose=1)
model.save(model_path)
#save tflite model
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
open(tflite_name, "wb").write(tflite_model)
return model
移动端推理预测&业务应用
- 接入模型,滑动后触发预测,将结果缓存,业务使用时获取
- 位于代码
加载模型-->构造模型输入-->执行推理预测-->获取推理运行结果-->业务应用
左右手案例课后作业 ahcyd008/OperatingHandRecognition: 端智能左右手识别学习Android Demo + 模型训练 (github.com)
案例Demo的数据很少,模型准确率不高,需要完善。
- 搭建好左右手是被案例Demo运行环境
- 收集更多左右手训练数据,优化模型让其准确率更高,适应性更好
- 将模型替换到案例Demo中,实测效果
OperatingHandRecognition: 端智能左右手识别学习Android Demo + 模型训练 (github.com)
03.端智能工程师学习路线
回顾端智能技术完整落地流程,并给出一些端智能技术的学习指引
回顾端智能完整流程
入门
达成:对端智能技术有一定认识,可写作完成端智能技术的需求落地
了解端智能技术是什么,可以做什么 -->掌握移动端开发、Machine Learning基础知识,了解业内端智能框架 -->理解怎么做端智能,可以协作完成端智能技术解决实际业务问题的需求落地
学习资料:
- 了解端智能可以做哪些事情 Google ML Kit、华为ML Kit
- 机器学习入门 TensorFlow入门、 Machine Learning速成课、微软AI-EDU
- 机器学习在移动端应用 TensorFlow Lite入门
- 机器学习原理 吴恩达机器学习课程
进阶
达成:对移动端技术、端智能技术和负责业务有更深入的理解,可以站在更全面的视野上设计端上智能解决方案,建设端上智能架构