这是我参与「第四届青训营 」笔记创造活动的的第11天

一、前言

今天学习到的是Android 客户端专场 学习材料二】第四届字节跳动青训营中的Android的第六节:端智能技能演进与实践,根据学习材料中的内容和本节课的学习,将本文供给的两个事例——手写数字辨认和左右手辨认进行事例剖析,到达巩固本节课的学习,其理论知识的总结笔记能够参阅Android 智能技能演进与实践 | 青训营笔记

本节课事例完结效果图:
手写数字辨认:
image.png

image.png

左右手辨认:

image.png

二、本节课知识点大纲:

– 手写数字辨认

完结思路

  • 分三个步骤

    • 首先,把问题描绘和界说清楚,并调研出经过机器学习处理问题的办法。
    • 然后,规划和练习出机器学习模型,并针对端侧设备优化和转化模型。
    • 最后,把优化后模型布置和集成到端侧设备运用中,履行推理猜测,并以进猜测结果处理界说的问题。

计划

  • 计划:

    • 练习一个能够辨认手写数字的机器学习模型。
    • 将此模型布置运用到App中,完结手写输入到辨认的过程,并将辨认结果供给用户挑选输入。
  • 机器学习部分:

    • 输入:手写输入数字(图片)
    • 输出:其或许代表的数字数值,多种或许时给出各自置信度(0.0~1.0)。

练习AI模型

数据搜集
  • 数据搜集来源方法

    • 人工搜集和标示的数据 (本次模型练习仅运用此种方法)

      • 规划和实际需求贴合的一个数据采集程序
      • 兼顾不同年龄段、性别、左手/右手等

TensorFlow模型规划与练习

模型规划和练习

  • 模型规划
    环境中心:matplotlib numpy Pillow tensorflow torch torchvision

image.png

  • 模型练习

    • 模型Summary

    image.png

    • 模型练习

    • # 全连接网络
      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)
      

      image.png

    • 验证模型准确度

    • 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目录下

image.png

  • 加载模型

    • 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
      
  • 模型练习

image.png

  • 验证模型准确度

image.png

端智能工程师进阶

入门

  • 达到:对端智能技能有一定知道,能够协作完结端智能技能的需求落地

    • 了解端智能技能是什么、能够做什么
    • 把握移动端开发、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!