注:此文章转载于本人的微信公众号:Young L童鞋
关注我,走进嵌入式江湖
电赛期间,在实验室学长的引领下入手了一块K210,在很多比赛中,K210的作用是用来做视觉部分,当然也可以用到OpenMv,但是由于自带计算卷积人工神经网络加速器 KPU,对于一些要跑深度学习模型的任务,K210成了首选,而本次自己做的也是用 K210基于yolov2模型去做数字识别,通过串口发送给STM32C8T6实现控制舵机。
本次用一共识别了数字"3"、"4"、"5",每个数字先拍摄280张照片,然后用LabelImg来打标签(之前用的微软官方的VoTT,结果发现无法生成标签文件,这里强烈推荐LabelImg)然后用学长推荐的Mx yolov3进行神经网络本地训练。
需要的图片 进行训练
训练出来后会生成一个tflite文件,用Mx_yolov3自带的模型转换软件转换为kmodel,至此,模型训练结束。
转化后的Kmodel模型 转换模型 训练完后tflite文件
k210有内置的flash 存储空间,但是,由于kmodel文件很大,内置Flash 太小,不推荐(之前队伍也买了块k210,后来莫名奇妙坏了,估计就是flash不够,烧录坏了)所以就直接用SD卡脱机运行。
这里是K210的代码,其它的不用说明,主要就是串口的传输:首先在代码3、4行按定义了7引脚和6引脚为串口Tx和Rx的两个端口,在5行定义串口传输,没有奇偶校验,波特率为115200,在10行定义clsses数组(注意里面的初始化一定要和标签文件里的顺序相同,不然在后面识别出后会出现传输出错的情况)
最后在18行用串口传输出去(这里我在写在了Draw_rectangle语句的后面,这样才做到没识别到就不用传输,识别到并画框了才传输数据)
这里是用屏幕观察识别的情况,用于调试,可以看出能准确识别出数字,后面脱机的时候把屏幕拆了,因为没找到合适的固定地方,转动时容易把屏幕的线扯坏
这里用的是Xcom查看串口传输情况,结合上一张图,可以看出K210识别出了数字"3",并且通过串口准确地传输了出来。
下位机的编写用的是Cubemx HAl库 写的程序,底层配置是图形式编程,很简单 ,用了定时器3的通道1(虽然使能了通道2但一直没用)和串口引脚,在下位机接收数据时,用的时中断处理,这里之前一直遇到一个坑,就是在写中断回调函数时,我直接在中断缓冲区里面去读取数据,后来发现一直只能触发一次中断,识别一次就不能识别了,后来才发现不能这么做,在收取中断数据后,要进行一次数据的转存才可以。
cubemx 的配置
C8T6代码
VID20220807220843