NXP eIQ平台提供了嵌入式平台集成化的机器学习应用部署能力,支持BYOD(Bring Your Own Data)和BYOM(Bring You Own Model)的两种建模应用的工作流。
BYOM相对更灵活,模型选择、训练及转换更自由。TFLM(TensorFlow Lite Micro)是BYOM的实现方式之一,是TensorFlow ML框架的一员,用来转换TensorFLow 模型到嵌入式可使用的模式。TFLM的嵌入式部署实现分为运行框架(解释器)和模型文件,这和GLOW模型直接转换为可执行的二进制文件不同。
本文使用迁移学习技术使用mobilenet-v2的预训练模型,加上少量数据数据(flower)实现对5中花的识别。
TensorFlow Lite For Microcontrollers Process
模型环境用于下载预训练模型,基于少量应用场景数据进行迁移学习(transfer-learning or fine-tune),比较适合的开发环境是Linux,可以无缝和主流模型开发环境契合。
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
wget http://download.tensorflow.org/example_images/flower_photos.tgz
tar -xvzf flower_photos.tgz
下载完,目录结构如下
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 training\n')
loss, accuracy = model.evaluate(test_data)
#Write out .tflite file
print('Write out model\n')
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)
xxd -i flower_model.tflite > flower_model.h
生成的头文件大小约为 5.5MB,需要稍作修改以将其集成到 MCUXpresso SDK 中。 打开flower_model.h 文件并对文件顶部进行以下更改。
#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文件
const char* labels[] = {
"daisy",
"dandelion",
"roses",
"sunflowers",
"tulips"
};
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完成对应显示标签的引用修改。
如果时导入rt1062官方开发板,那基本上完成;导入硬件平台TencentOS Tiny AIoT开发套件由于硬件底层的不同(引脚使用不同,camera和lcd的不同),需要做一定的驱动移植适配。和本文主旨无关,加篇幅所限。
运行时,可以从lcd看到camera的摄像画面,下面同步输出识别的结果。
个人认为NXP RT1060系列及eIQ工具链最强大的在于建立了方便的工作流,把通用模型导入到受限的嵌入式上去。这次大赛原本想做点有意思的模型,挑战客制化的手势识别,声音关键字,及多模型协调。主客观原因都有,预定时间内恐怕不能完成。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。