基于沁恒CH32V407的端侧AI蔬果识别分类
2026年5月11日更新:最近后台有一些同学私信我要工程代码,这里上传一个基于TFLM的手写数字识别工程,输入用数组模拟,在main.cc里面。通过替代mnist_model_data.h的网络模型,在main.cc的MicroMutableOpResolver里注册相应的操作,就可以跑自己的模型了。(以下是正文部分)
本文是《基于沁恒CH32V407的卷积神经网络手写数字AI识别》的姊妹篇,在CH32V407上实现了基于TensorFlow Lite Micro(TFLM)的人工智能蔬果识别,具体涉及苹果、香蕉、菠萝、火龙果4种水果,以及黄瓜、西红柿、白菜、胡萝卜4种蔬菜,算是手写数字识别的进阶版吧。
关于如何将TFLM适配到CH32V407,如果感兴趣的朋友比较多,后面可以考虑写个移植篇,这里我们直奔主题。
一、多物体识别的AI神经网络
在琢磨AI模型的时候,最初想走迁移学习(Transfer Learning)的路线。所谓迁移学习,简单说就是把一个已经训练好的具有相似功能的模型拿过来,基于新的数据集训练这个模型,让模型快速掌握处理目标数据的能力。举个例子,MobileNet是Google发布的著名机器视觉模型,直接给预训练过的MobileNet投喂目标物体的图片,就可以让它获得识别新物体的能力。
迁移学习的优点是不用手搓模型,使用现成的经过大量验证的模型,物体识别的准确性也更容易保证。下图给出了在MobileNetV2上实施迁移学习的流程。

MobileNetV2训练好后,放到工程里发现RAM消耗有点大。虽然优化RAM占用应该也能放进去,但这块没什么经验,所以还是用了手搓的神经网络模型,MobileNetV2后面再慢慢研究吧。
本次构建的神经网络可以实现8种蔬菜和水果的智能识别,与手写数字识别不同的是,这个模型使用RGB888彩色图像作为输入,图片分辨率是64*64。8类蔬果的基本识别流程是这样的。

由于OV5640摄像头不支持直接输出RGB888数据格式,图像的预处理环节不能少,只不过这次不是RGB565转灰度,而是RGB565转RGB888。为什么用RGB888?因为MobileNetV2的默认输入好像是RGB888,这里用RGB888方便后面研究MobileNetV2。用于8种蔬果识别的神经网络结构如下图。

考虑到有些朋友可能没看过我上个文,这里把系统结构放一下。这个系统用OV5640摄像头拍摄蔬菜水果,通过CH32V407自带的DVP接口获取图像,将获取的图像缩放并转换为RGB888后输入神经网络,通过TensorFlow Lite Micro框架执行AI推理,再将推理结果和原始图像合并输出到LCD显示屏上。

模型训练用的图片都是网上现找的。苹果、香蕉、菠萝、火龙果四种水果,以及黄瓜、西红柿、白菜、胡萝卜四种蔬菜,每类都准备了700张图片,560张用于训练,140张用于验证。模型的量化同样选取INT8方式,量化后将模型转换成TFLM上使用的C语言数组,再用数组覆盖之前手写数字识别工程中的mnist_model_data.h,新模型中使用的所有操作,比如Conv2D、DepthwiseConv2D和Mean,都要注册到tflite::MicroMutableOpResolver中。
二、系统运行和测试
路边摊买了一袋苹果,找了个卖相好点的试了一下,效果还可以。

对于上述蔬果识别卷积神经网络,CH32V407每秒可执行10次推理。对比了有无并行计算加速状态下CH32V407的推理次数,有向量加速时,速度提升了8倍。测试数据如下。
| / |
不使用向量扩展 |
使用向量扩展加速 |
|---|---|---|
|
每秒推理次数 基于前述神经网络 |
约1次 |
约10次 (性能提升8倍左右) |
P.S.
上篇文在RGB565转灰度的图像处理函数中发现青稞V3V的向量扩展可以提升图像处理效率,这次在RGB565转RGB888的函数中发现也是如此。截图源自工程的.lst文件:

以上是在CH32V407上运行端侧人工智能实现水果、蔬菜识别的简单记录,后面计划再试试MobileNet之类的预训练模型。由于V407放MobileNet有点挤,考虑换用带8MB PSRAM的CH32V467,同时把RGB888图像尺寸提升到96*96或者更高,搞好了再写文更新。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)