1. 引言
非常感谢极术社区和聆思科技提供的这次试用机会,让我再一次被幸运击中,因为今年年初的时候,刚被赠了一本《AI嵌入式系统:算法优化与实现》AI算法书。书看完还没多久,AI开发套件又接踵而至了【你们衔接得挺好啊!】。这真可谓授人以渔还授人以鱼、专门利人毫不利己啊!
本文将分别从硬件资源、AI实际案例两方面与STM32F469I-DISCO 开发板进行对比,至于为什么是STM32F469I-DISCO 开发板呢?【吕子乔语录:跟我们赌,不是看你要什么,而是看我们有什么】
2. 硬件资源
CSK6011-NanoKit V1 开发板板载CSK6011A芯片模组,该芯片是聆思科技新一代的 AI 芯片 SoC 产品系列,采用多核异构架构,集成了 ARM Star MCU,HiFi4 DSP,以及聆思全新设计的 AI 神经网络处理内核 NPU,算力达到 128 GOPS。MCU和DSP的最高主频均达到300Mhz,内置最高支持8MB Flash,1MB SRAM,最高 8MB PSRAM。板载DAPLink调试器IC,外接一条USB 线即可实现供电、烧录、调试、串口监控。
STM32F469I-DISCO 是ST公司推出的一款针对高性能STM32F4系列设计的Cortex-M4开发板,180MHz STM32F469NIH6 Cortex-M4F 微控制器,具有 2MB Flash、384KB SRAM,板载 128MB(4M x 32 位)SDRAM 存储器,嵌入式 ST-LINK/V2-1 调试器/编程器,支持 USB 仿真功能,用于 USB 虚拟 COM 端口、大容量存储或调试。
3. 案例部署
3.1 csk6头肩&手势识别体验
功能介绍:
头肩检测:检测图像中所有人体的头肩位置,返回每个头肩的唯一id、位置坐标、检测得分等;手势识别:通过头肩检测识别用户的手势,返回当前目标的手势、得分等;支持5种手势,分别为LIKE(👍)、OK(👌)、STOP(🤚)、YES(✌️)、SIX(🤙);
案例体验:官网的教程非常详细,很细心,同时B站还有视频教程,在此就不画蛇添足了。
环境安装:https://docs.listenai.com/chips/600X/application/getting_start
开发指引:https://docs.listenai.com/chips/600X/ai_usage/hsgd/user_guide
PC端查看: https://docs.listenai.com/chips/600X/ai_usage/hsgd/viewer_usage
B站视频:[https://www.bilibili.com/video/BV1SG4y1h7hL/?spm_id_from=333.999.0.0&vd_source=1eafe261c5ad38826cc0bcdc91481c1e](https://www.bilibili.com/video/BV1SG4y1h7hL/?spm_id_from=333.999.0.0&vd_source=1eafe261c5ad38826cc0bcdc91481c1e)
实验结果:
3.2 f469水果识别部署
功能介绍:识别图像中的水果种类,支持3种水果,分别苹果、香蕉、橙子。
案例部署:
水果识别模型使用经典的LeNet-5网络,使用tensorflow 2.1.0框架中的tf.keras训练网络,得到.h5模型文件,使用tf.lite.TFLiteConverter量化模型,得到量化后的.tflite模型文件。
converter = tf.lite.TFLiteConverter.from_keras_model(model) # 用于转换 Keras 模型(tf2.0)
converter.target_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]
converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
converter.representative_dataset = lambda: rep_data_gen(x_val)
tflite_quant_model = converter.convert()
打开STM32CubeMx新建工程,选择Sofrware Packs->Select Components->STMicroelectronics.X-CUBE-AI,进入后把AI相关的两个包点开,第一个打上勾,第二个选择 System Performance。确定后若cube.ai工具没下载会自动重新下载。(Validation工程:可以用于验证模型在MCU中的推理结果,通过usart向端侧传输用户测试数据,验证返回的结果)
在下图1处选择tflite框架(目前支持Keras、tflite、ONNX),在2处选择STM32Cube.AI推理框架(还支持TFlite Micro),然后将上面量化后的.tflite模型导入即可;点击按钮Analyze,生成分析结果。
最后选择自己的IDE,就可以一键生成代码了,其中核心代码如下。配置好摄像头,将采集到的图像数据作为网络的输入数据,调用ai_mnetwork_run() 函数api,即可得到网络的推理结果。
const ai_buffer_format fmt = AI_BUFFER_FORMAT(&ai_input[i]);
ai_i8 *in_data = (ai_i8 *)ai_input[i].data;
for (ai_size j = 0; j < AI_BUFFER_SIZE(&ai_input[i]); ++j)
{
/* uniform distribution between -1.0 and 1.0 */
const float v = 2.0f * (ai_float) rand() / (ai_float) RAND_MAX - 1.0f;
*(ai_float *)(in_data + j * 4) = v;
}
ai_mnetwork_run(net_exec_ctx[idx].handle, ai_input, ai_output);
ai_float *out_data = (ai_float *)ai_output[0].data;
LC_PRINT("\r\n Mnist random data interfer output \r\n");
for(int i = 0; i < AI_BUFFER_SIZE(&ai_output[0]); i++)
LC_PRINT(" %f \t",*(out_data+i));
实验结果:
Results for "network", 16 inferences @180MHz/180MHz (complexity: 11131952 MACC)
TFLite file : 0x0802a638 (293112 bytes)
duration : 456.640 ms (average)
CPU cycles : 82195318 (average)
CPU Workload : 45% (duty cycle = 1s)
cycles/MACC : 7.38 (average for all layers)
4. 对比
4.1 硬件资源对比
浅显的认为AI开发板中的芯片、SRAM和Falsh比较重要。芯片决定模型的推理速度,SRAM则限制了模型输入数据尺寸和中间层输出结果尺寸的大小,而Flash则限制了模型参数所占内存。如果只从AI应用场景来比较,csk6比f469多一张NPU芯片,最高主频高120Mhz,SRAM多640k,Flash多14M,最关键的是价格还不到它的一半,这样看来,csk6的确是小甜甜啊。
4.2 实例案例对比
其实如果能够在csk6上部署水果识别模型,是对比两套开发板AI性能最直观的方法,但官方目前还没有开源其Tinker推理框架,不过在社区里有看到用TinyMaix推理模型部署手写数字识别的(https://aijishu.com/a/1060000000367824),挖个坑,下次补上。不过在ai应用方面,f469和csk6实在不是level,所以还是能用肉眼看出差距的。在f469上,水果识别模型推理一次平均需要456ms,加上图像采集、传输、显示,1秒最多1帧,能看出明显的卡顿。而csk6上的头肩&手势识别,应用很流畅,帧率能达到10FPS,精度能满足实际应用需求,官网显示:头肩跟踪识别率达到95%,手势识别达到91%。粗略的估计,csk6上模型输入图片尺寸为480×640×3,f469为120×160×3,大致得看做csk6模型参数是f469的16倍,帧率是10倍,整体AI性能大概是f469的160倍。
5. 总结
总而言之,CSK6011-NanoKit 开发板在图像视频 AI 应用方面,性能还是非常优秀的,你值拥有。同时期待官方后续提供更加完整的支持,如果能开放模型的推理框架,以及基于DSP、NPU核实现的各种不同算子api,那就更完美了。