这是我参与「第四届青训营 」笔记创造活动的的第11天
一、前言
今天学习到的是Android 客户端专场 学习材料二】第四届字节跳动青训营中的Android的第六节:端智能技能演进与实践,根据学习材料中的内容和本节课的学习,将本文供给的两个事例——手写数字辨认和左右手辨认进行事例剖析,到达巩固本节课的学习,其理论知识的总结笔记能够参阅Android 智能技能演进与实践 | 青训营笔记
本节课事例完结效果图:
手写数字辨认:
左右手辨认:
二、本节课知识点大纲:
– 手写数字辨认
完结思路
-
分三个步骤
- 首先,把问题描绘和界说清楚,并调研出经过机器学习处理问题的办法。
- 然后,规划和练习出机器学习模型,并针对端侧设备优化和转化模型。
- 最后,把优化后模型布置和集成到端侧设备运用中,履行推理猜测,并以进猜测结果处理界说的问题。
计划
-
计划:
- 练习一个能够辨认手写数字的机器学习模型。
- 将此模型布置运用到App中,完结手写输入到辨认的过程,并将辨认结果供给用户挑选输入。
-
机器学习部分:
- 输入:手写输入数字(图片)
- 输出:其或许代表的数字数值,多种或许时给出各自置信度(0.0~1.0)。
练习AI模型
数据搜集
-
数据搜集来源方法
-
人工搜集和标示的数据 (本次模型练习仅运用此种方法)
- 规划和实际需求贴合的一个数据采集程序
- 兼顾不同年龄段、性别、左手/右手等
-
TensorFlow模型规划与练习
模型规划和练习
- 模型规划
环境中心:matplotlib numpy Pillow tensorflow torch torchvision
-
模型练习
- 模型Summary
-
模型练习
-
# 全连接网络 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 # 将label转成向量,如 2 => [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] 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
-
#save tflite model converter = tf.lite.TFLiteConverter.from_keras_model(model) tflite_model = converter.convert() open(tflite_name, "wb").write(tflite_mode
模型布置到移动端
-
中心:让移动端能够加载到前面转化的模型
- 简略做法:放在App包体内assets目录下
-
加载模型
-
var model: ByteBuffer = load(mymodel.tflite) val interpreter = Interpreter(model, options) // 可经过 interpreter 检查输入和输出格式 // inputShape:[1, 28, 28], outputShape:[1, 10]
-
-
结构模型输入
- 模型的输入28×28单通道灰度图,而用手写输入是数据是存在bitmap中
- 需求将bitmap图片 resize 缩放到28×28像素,转灰度,再转成bytebuffer,这是 interpreter 接受的输入格式。
-
履行推理猜测
- 结构输出buffer,调用run履行计算
-
val result = Array(1) { FloatArray(10) } // outputShape:[1, 10] interpreter.run(inputByteBuffer,result)
-
获取推理猜测结果
- result中的10个数值代表手写输入是 0~9 这10个数字置信度分值,对分值进行排序,把排序前三的数字作为猜测输出,供用户挑选。
小结
- 一个端智能事例的落地套路流程
四、左右手智能辨认和运用:
练习AI模型
数据搜集
-
数据格式:
- X样本:[p0, p1, p2, p3, p4, … ] ,p=(x, y, w, h, density, dt)。
- Y样本:left / right
-
搜集方法:(特别客户端,内测用户搜集)
-
滑动轨道:阻拦Activity的dispatchTouchEvent
-
工作,缓存手指滑动产生的MotionEvent序列。
-
左右手标签:
- 敞开左手样本搜集时,只用左手持机操作,只录制左手滑动数据。
- 敞开右手样本搜集时,只用右手持机操作,只录制右手滑动数据。
-
模型规划
- 二分类模型( Left or Right ),卷积神经网络。
# 卷积神经网络
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) # x, y, w, h, density, dtime return x
- 模型练习
- 验证模型准确度
端智能工程师进阶
入门
-
达到:对端智能技能有一定知道,能够协作完结端智能技能的需求落地
- 了解端智能技能是什么、能够做什么
- 把握移动端开发、Machine Learning 基础知识,了解业界端智能框架
- 理解怎么做端智能,能够协作完结端智能技能处理实际业务问题的需求落地
进阶
- 达到:对移动端技能、端智能技能和担任业务有更深入的理解,能够站在更全面的视野上规划端上智能处理计划,建造端上智能架构。
引证参阅:
课外补充引证:
- Google对端智能的介绍 developers.google.com/learn/topic…
- 了解端智能能够做哪些工作:Google MLKit、华为 MLKit、Pytorch Live
- 机器学习入门: Tensorflow入门、机器学习速成课、微软AI-EDU
- 机器学习在移动端运用:TensorflowLite入门
- 机器学习原理:吴恩达课程
-
端智能框架
- Google:Tensorflow Lite、ML Kit
- Meta:PyTorch Mobile、PyTorch Live
- Apple: CoreML
文章学习来源:
- 【Android 客户端专场 学习材料 二】第四届字节跳动青训营(第六节:端智能技能演进与实践)
感谢以上作者的文章,今天的学习收成满满!!Thanks and HappyCoding!