这里回顾一下码率(比特率)
表示单位时间内传送 bit 的数目,单位bps,表示是单位时间播放连续的媒体如
压缩后
的音视频的bit数量,也称为
码流
。
这种bps的单位电信领域上表示速度,就是我们常说的网速了。比如 100Mbps(兆位每秒),要换算成一般下载时显示的速度则除以 8,即 100 / 8 = 12.5mb/s 。
端智能是什么
端智能(On-Device Machine Learning)是指把机器/深度学习算法模型应用和部署到端设备上,这里“端设备”是相对于云服务而言的,可以是手机,也可以是物联网IoT设备。
Google对端智能的介绍
developers.google.com/learn/topic…
案例如:抖音换装特效,离线文字识别,肢体检测,手势识别等
机器学习已进入生活中各个方面,在移动端上也有着非常多的应用场景:
视觉:扫码、人脸手势识别、肢体姿态估计、目标检测跟踪、图像分割、OCR文字识别提取、图片视频实时超分等
语音:语音分类识别等
文本:翻译、对话系统、文本分类、智能回复等
其他:推荐精排、无人驾驶、运动检测、智能预加载、AR、VR等
Google提供的端上机器学习能力介绍
developers.google.com/learn/topic…
为什么要做端智能
低延迟、实时性高(Low Latency)
:特征收集、模型推理、业务逻辑均在端侧完成,无需网络交互,端侧也更能够实时感应用户状态。
保护隐私(Privacy)
:数据只在端侧使用,无需上传云端,可更好地保护用户隐私数据。
算力(Power)
:移动端设备越来越强大,算力越来越高。
可离线(Offline)
:可以离线使用。
低成本(Low Cost)
:在端侧计算,利用端侧算力和存储空间,可节省大量的云端计算和存储资源。
端云协同:
端智能并不是云智能的替代,是云端机器学习的延伸,是要结合云和端各自的优势,在云端之间合理分配任务以获取问题最优解。
端设备上算力、内存、存储和功耗受限,运行的模型大小有限制;云端有海量数据和充足算力资源,两者配合协同可以发挥各自优势;典型的场景如移动端上的智能精排场景。
数字识别是很多机器学习的入门第一个案例,相关资料很多如:
www.tensorflow.org/tutorials/q…
(全连接模型)
此例完整代码和数据集已存于
github.com/ahcyd008/Di…
App要做一个手写输入法模块,支持输入数字0~9,如何实现?
效果类似手机上的手写输入法
端智能案例落地套路
分三个步骤
首先,把问题描述和定义清楚,并调研出通过机器学习解决问题的方法。
然后,设计和训练出机器学习模型,并针对端侧设备优化和转换模型。
最后,把优化后模型部署和集成到端侧设备应用中,执行推理预测,并以进预测结果解决定义的问题。
问题和方案
问题:App要做一个手写输入法模块,支持输入数字0~9。
解决方案:
训练一个可以识别手写数字的机器学习模型。
将此模型部署应用到App中,实现手写输入到识别的过程,并将识别结果供给用户选择输入。
机器学习部分:
输入:手写输入数字(图片)
输出:其可能代表的数字数值,多种可能时给出各自置信度(0.0~1.0)。
训练AI模型
数据收集来源方式
~~开源数据 - ~~~
MNIST
~
adb pull /storage/emulated/0/Android/data/com.clientai.recog.digital/files/Track/ ./
数据上传的云端为 http://129.204.41.76:8000/
临时供课程学习收集数据使用,web数据存储服务介绍参考github.com/ahcyd008/Da…
trans = torchvision.transforms.Compose([
torchvision.transforms.RandomAffine(translate=(0.25, 0.25), scale=(0.8, 1.2), degrees=40, interpolation=torchvision.transforms.functional.InterpolationMode.NEAREST),
torchvision.transforms.RandomHorizontalFlip(p=0.2),
torchvision.transforms.RandomCrop(size=(h, w))])
for i in range(16):
if i == 0:
img = org
else:
img = trans(org)
img = img.resize((28, 28), Image.ANTIALIAS)
gray = img.convert("L")
x = np.asarray(gray)/255.
y = label
X.append(x)
Y.append(y)
模型构建-Keras
def creat_nn(print_summary=False):
model = Sequential()
model.add(layers.Flatten(input_shape=(28, 28)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
if print_summary:
model.summary()
return model
train_x = X
train_y = tf.keras.utils.to_categorical(Y, num_classes=10)
model.fit(train_x, train_y, batch_size=24, epochs=16, verbose=1)
验证模型准确度
y_pred = model.predict(valid_x)
// 用y_pred预测值与真值对比,计算准确度
模型压缩和转换
为什么要做模型转换?
移动端使用的是被优化的推理引擎,可以在不同CPU和GPU架构下高效的执行模型推理计算。
这里我们使用Tensorflow Lite作为移动端上推理引擎。
TensorFlow Lite 的设计旨在在各种设备上高效执行模型。这种高效部分源于在存储模型时,采用了一种特殊的格式。
TensorFlow模型在被TensorFlow Lite 使用前,必须转换成这种格式。
Tensorflow Lite 提供转换器 TFLite Convert。
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
open(tflite_name, "wb").write(tflite_model)
www.tensorflow.org/lite/guide/…
代码参考 DigitalClassifier
Tensorflow Lite 将模型的加载和执行封装在Interpreter类中
public Interpreter(File modelFile, Options options)
public Interpreter(ByteBuffer byteBuffer, Options options)
var model: ByteBuffer = load(mymodel.tflite)
val interpreter = Interpreter(model, options)
// 可通过 interpreter 查看输入和输出格式
// inputShape:[1, 28, 28], outputShape:[1, 10]
构造输出buffer,调用run执行计算
val result = Array(1) { FloatArray(10) }
interpreter.run(inputByteBuffer,result)
视频中可以看出在输入8时不够准确,这受限于数据不足、模型简单。在实际场景中我们落地一个场景后,也需要不断迭代优化,让我们的智能方案更佳完善。
在demo中也提供了cnn版本的优化模型,准确率更高一些。
一个端智能案例的落地套路流程
架构部分:问题发现和定义 -> 设计解决方案
算法部分:训练数据收集 -> 训练数据收集 -> 算法设计 -> 模型训练 -> 模型压缩/转换(云端) -> 迭代调优
工程部分:模型部署(云端) -> 预测样本采集 -> 推理预测 -> 业务调用
最后:结果应用
左右手智能识别和应用(抖音案例)
左右手识别案例在GitHub上也有一份样例可参考 github.com/ahcyd008/Op…
案例Demo中放置的数据不多,模型准确率不高,作为同学们课后作业,继续:
搭建好左右手识别案例Demo运行环境
收集更多左右手训练数据,优化模型让其准确率更高,适应性更好。
将模型替换到案例Demo中,实测效果。
很多App会以右手习惯来设计交互,并以此去引导用户点击它们期望的选项。
存在问题:用户左手使用手机时,引导效果会变差,有没有更智能更个性化的交互体验方式?
左手和右手单手拇指操作时的舒适区是相反的,针对右手的UI交互可能对左手并不友好。特别随着屏幕尺寸再不断增大,这种差异更明显。
另外一些数据统计看左手用的比例并不低。
def creat_cnn(input_shape=(9, 6), print_summary=False):
model = Sequential()
model.add(layers.Conv1D(6, kernel_size=3, input_shape=input_shape, padding='same', activation='relu'))
model.add(layers.Conv1D(12, kernel_size=3, padding='same', activation='relu'))
model.add(layers.Conv1D(24, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
if print_summary:
model.summary()
return model
模型训练和转换
训练样本处理
滑动轨迹X样本需要采样对齐成9个固定点输入方式
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)
return x
了解端智能可以做哪些事情:Google MLKit、华为 MLKit
机器学习入门: Tensorflow入门、机器学习速成课、微软AI-EDU
机器学习在移动端应用:TensorflowLite入门
机器学习原理:吴恩达课程
达成:对移动端技术、端智能技术和负责业务有更深入的理解,可以站在更全面的视野上设计端上智能解决方案,建设端上智能架构。
什么是端智能技术
端智能是什么 (what):是将AI算法模型部署和应用到端侧
为什么要做端智能 (why):端智能的优势 Latency、Privacy、Power、Offline、Cost
端智能的发展历程