端智能技术演进与实践|青训营笔记

126 阅读7分钟

端智能技术演进与实践

这是我参加「第四届青训营」笔记创作活动的第五天,介绍端智能技术有关知识。

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年,深度学习被提出,得益于大数据的发展和硬件算法的提升,深度学习的算法和框架不断严谨,人工智能领域迎来了一次大发展。
  • 与此同时,端侧设备在算例、算法和框架同样由突飞猛进的发展,各类端侧机器学习框架和应用案例层出不穷。

端侧机器学习框架

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分类模型,全连接神经网络

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')
])

模型训练

完整参考代码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) 卷积神经网络

模型训练和转换

  • 训练样本处理
  • 模型训练
  • 验证模型准确度

完整参考代码OperatingHandRecognition/ohr_recognition.ipynb at main · ahcyd008/OperatingHandRecognition (github.com)

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基础知识,了解业内端智能框架 -->理解怎么做端智能,可以协作完成端智能技术解决实际业务问题的需求落地

学习资料:

进阶

达成:对移动端技术、端智能技术和负责业务有更深入的理解,可以站在更全面的视野上设计端上智能解决方案,建设端上智能架构