AIoT应用创新大赛-基于TFML的迁移学习实践

2022-02-23 19:33:32 浏览数 (1)

1. eIQ@Toolkit概述

NXP eIQ平台提供了嵌入式平台集成化的机器学习应用部署能力,支持BYOD(Bring Your Own Data)和BYOM(Bring You Own Model)的两种建模应用的工作流。

BYOD and BYOMBYOD and BYOM

BYOM相对更灵活,模型选择、训练及转换更自由。TFLM(TensorFlow Lite Micro)是BYOM的实现方式之一,是TensorFlow ML框架的一员,用来转换TensorFLow 模型到嵌入式可使用的模式。TFLM的嵌入式部署实现分为运行框架(解释器)和模型文件,这和GLOW模型直接转换为可执行的二进制文件不同。

本文使用迁移学习技术使用mobilenet-v2的预训练模型,加上少量数据数据(flower)实现对5中花的识别。

  • 硬件平台:TencentOS Tiny AIoT开发套件
  • 模型训练:Linux, python 3.8, tflite_model_maker
  • 嵌入式开发:WIn10, mcuxpresso IDE

2. 总体流程

TensorFlow Lite For Microcontrollers Process

model workflow of fine-tune and deploy model workflow of fine-tune and deploy

3 模型构建环境

模型环境用于下载预训练模型,基于少量应用场景数据进行迁移学习(transfer-learning or fine-tune),比较适合的开发环境是Linux,可以无缝和主流模型开发环境契合。

代码语言:python代码运行次数:0复制
conda create -n eiq python=3.8
conda activate eiq

python -m pip install -U pip
python -m pip install -U setuptools
python -m pip install tflite-model-maker
python -m pip install onnxmltools mmdnn tensorflow-datasets opencv-python PILLOW
python -m pip install numpy scipy matplotlib ipython jupyter pandas sympy nose imageio 
python -m pip install netron

4 迁移学习及输出模型文件(基于tflite-model-maker)

1) 下载及解压数据文件

代码语言:shell复制
wget http://download.tensorflow.org/example_images/flower_photos.tgz
tar -xvzf flower_photos.tgz

下载完,目录结构如下

目录结构目录结构

2)训练及输出tflite(flower_lab.py)

代码语言:python代码运行次数:0复制
import os
import tensorflow as tf
from tflite_model_maker import image_classifier
from tflite_model_maker import ImageClassifierDataLoader
from tflite_model_maker.config import QuantizationConfig

#Specify image directory
image_path = os.path.join(os.getcwd(), 'flower_photos')

#Split up images into different training categories for training, validation, and testing. 
data = ImageClassifierDataLoader.from_folder(image_path)
train_data, rest_data = data.split(0.8)
validation_data, test_data = rest_data.split(0.5)

mobilenetv1_spec = image_classifier.ModelSpec(uri='https://tfhub.dev/google/imagenet/mobilenet_v1_025_128/feature_vector/4',input_image_shape=[128,128], name='mobilenet_v1')
model = image_classifier.create(train_data, model_spec=mobilenetv1_spec, validation_data=validation_data)
model.summary()

#Evaluate final model
print('Done trainingn')
loss, accuracy = model.evaluate(test_data)

#Write out .tflite file
print('Write out modeln')

config = QuantizationConfig.for_int8(representative_data=test_data, inference_input_type=tf.int8, inference_output_type=tf.int8,
    supported_ops=tf.lite.OpsSet.TFLITE_BUILTINS_INT8) 

model.export(export_dir='.',tflite_filename='flower_model_int8.tflite',label_filename='flower_labels.txt',with_metadata=False,quantization_config=config)

3)转成.h文件

代码语言:shell复制
xxd -i flower_model.tflite > flower_model.h

生成的头文件大小约为 5.5MB,需要稍作修改以将其集成到 MCUXpresso SDK 中。 打开flower_model.h 文件并对文件顶部进行以下更改。

代码语言:txt复制
#include <cmsis_compiler.h>
#define MODEL_NAME "mobilenet_v1_0.25_128_flower"
#define MODEL_INPUT_MEAN 127.5f
#define MODEL_INPUT_STD 127.5f
const char flower_model_tflite[] __ALIGNED(16) = {

根据flower_labels.txt构造flower_labels.h文件

代码语言:txt复制
const char* labels[] = {
    "daisy",
    "dandelion",
    "roses",
    "sunflowers",
    "tulips"
};

4)IDE的样本工程中导入模型文件

IDE首先导入样本工程evkmimxrt1060_tensorflow_lite_micro_label_image,接着导入模型。

导入文件导入文件

要导入步骤3输出的文件:flower_model.h 和 flower_labels.h,将分别取代model_data.h和labels.h(引用时取代)。

然后需要修改model/model.cpp修改对应的模型数据文件的应用;修改output_postproc.cpp完成对应显示标签的引用修改。

5)运行

如果时导入rt1062官方开发板,那基本上完成;导入硬件平台TencentOS Tiny AIoT开发套件由于硬件底层的不同(引脚使用不同,camera和lcd的不同),需要做一定的驱动移植适配。和本文主旨无关,加篇幅所限。

运行时,可以从lcd看到camera的摄像画面,下面同步输出识别的结果。

串口输出串口输出

5. 总结及扩展阅读

个人认为NXP RT1060系列及eIQ工具链最强大的在于建立了方便的工作流,把通用模型导入到受限的嵌入式上去。这次大赛原本想做点有意思的模型,挑战客制化的手势识别,声音关键字,及多模型协调。主客观原因都有,预定时间内恐怕不能完成。

-eIQ Toolkit

-Machine Learning on MCUs

0 人点赞