基于MAX78000FTH完成对传统指针式模拟表盘进行AI视觉识别,并输出相应数字信息基于
1.项目介绍
本项目将在Linux环境下对各种指针数字表盘进行AI视觉模型训练后,使用MAX78000FTHR开发板的板载摄像头对数字表盘的数值进行识别,并通过串口和搭配另外的TFT屏幕对识别的数值进行输出。
2.MAX78000FTHR 板卡介绍
该评估板包括用于电池和电源管理的MAX20303 PMIC,并提供0.9“ x 2.6”双排接头尺寸。板上集成的外围设备包括CMOS VGA图像传感器,数字麦克风,低功耗立体声音频编解码器,1MB QSPI SRAM,微型SD卡连接器,RGB指示灯和用户按钮。详细如下:
其核心为MAX78000微控制器
带FPU的Arm Cortex-M4处理器,100MHz,RISC-V协处理器,60MHz双核
512KB闪存
128KB SRAM
16KB缓存
卷积神经网络加速器
12位并行摄像头接口
MAX20303便携式PMIC,带电量计
从USB充电
带有FPU的Arm Cortex-M4处理器的板载DAPLink调试和编程接口
面包板兼容接头
微型USB连接器
Micro SD卡连接器
集成外设
RGB指示灯LED
用户按钮
CMOS VGA图像传感器
低功耗立体声音频编解码器
数位麦克风
SWD调试器
虚拟UART控制台
RISC-V协处理器的10引脚Cortex调试接头
美信半导体MAX78000FTHR应用平台提供了功耗优化的灵活平台,可用于实施概念验证和早期软件开发。根据相关资料,MAX78000FTHR应用平台应用领域包括:
音频处理
多关键字识别
声音分类
噪音消除
面部识别
对象检测与分类
时间序列数据处理
心率/健康信号分析
多传感器分析
预测性维护等
MAX78000FTHR应用平台顶部组件
MAX78000FTHR应用平台底部侧面组件
3.项目设计思路
MAX78000FTHR开发板是板载摄像头的,所以只需额外购买一块屏幕即可满足项目所需。
项目整体大致分为5步:
1) 搜集各种表盘图片,并通过板载摄像头搭配屏幕拍下来,存入SD卡。注意,为了减小难度提高项目的完成机会,所有模拟表盘均选用单指针,刻度与表针唯一成正比的表盘。诸如下图:
2)摄像头将会怼在指针式表盘的脸上拍和识别。但是考虑到表盘样式不同,仍需要对图片进行分割和标注工作,此处根据资料应使用Qt编写标注软件进行。
3)板载摄像头拍摄下来的图片,拷回电脑,通过搭建好的Linux开发环境,对搜集的图片进行训练和量化,根据前辈们的教程使用工具为pytorch+cuda。使用自带的代码可以生成相应网络的cnn源文件,这些源文件可以直接移植到板卡上运行。
4)移植之前训练好的网络权重(cnn源文件),使用摄像头搭配屏幕,使用按键作为识别起始信号,其实这个板卡还有语音识别功能,据说默认就是说一些简单词语,然后板载指示灯就能做出相应反馈,如果学的比较明白,可以用这个语音作为识别的起始信号,可惜我不太会(捂脸哭)。
4.搜集素材的思路
素材其实最好是拍摄各种真正的表显测量装置,,可是受疫情影响,先是在家放假,然后在家养病,只能在网络上搜集相关训练素材。收到funpack2-1的影响,那个板卡通过自身麦克风录的数据会更加准确一些(不排除是心理作用,但肯定符合逻辑吧)。为了提高识别率(可能没用,哭)。因此使用板载的摄像头搭配另外的屏幕以及一张SD卡,参照各位大神的思路和教程做一个照相机录制好素材保存到SD卡中。然后在电脑上对录制好的图像进行分割与标注,以完成素材搜集。
抄袭的Pulsar2大神的照相机核心代码(详见螺钉、螺母、螺栓识别 - 电子森林 (eetree.cn))实现如下:
while (!camera_is_image_rcv());
camera_get_image(&raw, &imgLen, &w, &h);
MY_TFT_ShowImageCameraRGB565(0,0,raw,w,h);
if(keypressed==1)
{
for(uint32_t i=0;i<imgLen;i+=2)
{
temp = raw[i];
raw[i] = raw[i+1];
raw[i+1] = temp;
}
while(1)
{
memset(filename, 0, 24);
snprintf(filename, 24, "/pic/img%d.bmp", i++);
fr = f_stat(filename, &fno);
if (fr == FR_NO_FILE) {
printf("will save pic to %s\n",filename);
break;
} else if (fr != FR_OK) {
printf("Error while searching for next available file: %d\n", fr);
break;
}
}
fr = f_open(&fd,filename,FA_WRITE | FA_CREATE_NEW);
if(fr == FR_OK)
{
printf("file open OK!\n");
f_write(&fd,&bfType, 2, &wrote);
f_write(&fd,&bfh, 12, &wrote);
f_write(&fd,&bih, 40, &wrote);
f_write(&fd,&bmiClr, 12, &wrote);
f_write(&fd, raw, w*h*2, &wrote);
f_close(&fd);
printf("all pic data write OK!\n");
}
else
{
printf("file open failed!\n");
}
keypressed=0;
}
5.预训练实现过程
受疫情影响,自己得病,家里人得病,您懂得的,很抱歉,目前还在学习中,这个板卡的中文资料相对非常少,而英文资料则受到了网络不能访问和英语水平的双重毒打,好苦。。。。原本相关的资料只有微信上的一位大佬提供了一部分教程,但是我的水平比较低,没搞得太懂(真是水平低,目前只是会用arduino IDE点灯,vscode和python都没玩明白)。但是目前在cnds上又有一位大佬提供了一部分教程,我估计也是参加本次活动的学长,所以教程的针对性相对更强一点,网址见(8条消息) MAX78000_Iron2222的博客-CSDN博客 。 我估计把大佬的教程走一遍应该能实现较好的训练。
6.项目程序的实现思路
我的思路是通过训练,先确定出来有效刻度的范围,设初始为0,满量程为100%,然后再通过确认指针的位置,来确定测量值的相对位置(Y),例如50%。然后通过识别满量程的数字(设为X),来确定测量的最终结果 C=X*Y. 然后输出结果就没有什么复杂的了,加入串口和屏幕的相关的代码,直接将结果打印到串口和屏幕。
还有一些相关程序上的逻辑是在测量指针位置的时候,先是读2s,看指针是否移动,不移动那就万事大吉直接输出,如果指针非要抖抖点点,那就测几个值,通过滤波算法再进行输出。同时于此也就得出另一个逻辑。 就是在实际使用时,这个识别开始的命令应该是不可以利用仪表(比如万用表)进行测量的命令兼做使用,要到测量值相对稳定,才能开始进行识别和输出。也就是要么用两个命令分别控制仪器开始测量和开发板识别仪器测量数值。要么只用一个命令控制仪器开始测量,并加入一个延时来启动开发板的识别工作。
7.结语
首先还是要感谢硬禾提供和组织了这个活动,开发板选的很好,趣味性很强、应用的场景很多、最重要的是可以学到很多有用的知识。
其次是感谢各位同学各位大佬,没有各位大佬,这个项目报告是肯定没法完成的,借鉴了各位大佬很多,请求各位大佬轻拍,还请人艰不拆(哭着抱拳感谢)
还有就是特别感谢Lucia小姐姐,为这次活动付出了很多,我这个项目完成的没达到预期的效果,感觉很是愧对。。。以后的活动我会尽力进行的。
写在最后,现在已经临近春节了,祝硬禾的各位员工,我借鉴过的各位大佬,还有群里一直参与硬禾各种项目、相互讨论提高的同学新年快乐,身体健康,读书的学业有成,工作的事业更进一步!!!