【FRDM-MCXN947测评】使用NPU对象检测测试
[复制链接]
1、测试介绍
测试是基于 TensorFlow Lite 模型的“对象检测器”实现对象检测测试。 此测试是使用eQI工具经过调整后的TensorFlow Lite模型,转换后的模型可在带有NPU的MCXN MCU 上运行。
程序将三通道彩色图像转化为量化 Mobilenet 的卷积神经网络模型输入,该输入通过“对象检测器模型”在NPU运算后输出为1000种图像分类之一。
程序静态图像为输入。NPU运算结果通过UART进行输出。
待识别的图像为:
该图像需要预先转换为C语言的数组文件image_data.h,该文件代替摄像头输入。
硬件:
FRDM-MCXN947开发板一块
USB Type-C电缆一条
软件:
GCC ARM Embedded 13.2.1编译器
PUTTY 串口终端软件
eIQ_Toolkit 模型工具软件
2、模型转换
测试的模型可以从http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.25_128.tgz处下载。
输入文件 https://commons.wikimedia.org/wiki/File:Stopwatch2.jpg
(1)将Stopwatch2.jpg文件使用python脚本转成OpenCV格式数组
import cv2
import numpy as np
img = cv2.imread('test/Stopwatch2.jpg')
img = cv2.resize(img,(128,128))
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
with open('image_data.h','w') as fout:
print('#define STATIC_IMAGE_NAME "stopwatch"',file=fout)
print('static const uint8_t image_data[] = {',file=fout)
img.tofile(fout,', ','0x%02X')
print('};\n',file=fout)
(2)使用eIQ_Toolkit软件将TensorFlow Lite 模型模型转换成MCXN947 NPU能够使用的int8结构模型
使用MODEL TOOL将模型转换成MCXN NPU格式
模型的层次信息
使用软件左上角Covert功能转换格式
目标文件custom_model_converted.tflite
转后的文件格式为int8格式,该格式可以运行在MCXN NPU上面。
3、模型引入
将custom_model_converted.tflite文件放入model_data.h格式当中。
整个文件成为uint8_t model_data[]数组。
总结一下就是将eIQ转换的模型放到一个C语言数组当中。这是我看了好几遍文档才明白过来的。
4、项目介绍
使用MCUXpresso Config Tools 引入项目
整个程序主要为两部分
一、对使用的模型进行初始化;
二、将输入数据转换成NPU数组;
int main(void)
{
BOARD_Init();
TIMER_Init();
DEMO_PrintInfo();
if (MODEL_Init() != kStatus_Success)
{
PRINTF("Failed initializing model" EOL);
for (;;) {}
}
tensor_dims_t inputDims;
tensor_type_t inputType;
uint8_t* inputData = MODEL_GetInputTensorData(&inputDims, &inputType);
tensor_dims_t outputDims;
tensor_type_t outputType;
uint8_t* outputData = MODEL_GetOutputTensorData(&outputDims, &outputType);
while (1)
{
/* Expected tensor dimensions: [batches, height, width, channels] */
if (IMAGE_GetImage(inputData, inputDims.data[2], inputDims.data[1], inputDims.data[3]) != kStatus_Success)
{
PRINTF("Failed retrieving input image" EOL);
for (;;) {}
}
MODEL_ConvertInput(inputData, &inputDims, inputType);
auto startTime = TIMER_GetTimeInUS();
MODEL_RunInference();
auto endTime = TIMER_GetTimeInUS();
MODEL_ProcessOutput(outputData, &outputDims, outputType, endTime - startTime);
}
}
5、测试过程
使用USB type-c连接开发板和PC
打开Putty终端
测试结果:
秒表 stopwatch
置信度:(86%)
6、总结
该测试是为了测评进行的,我之前尝试了好多次的摄像头实时取数的程序,但是摄像头的调试关于复杂,而且我没有显示屏也不能实时看到结果。但是整个NPU项目的流程已经搞清楚了。
非常期待手头阔绰的网友能够给出更加精彩的测评。
|