本帖最后由 北方 于 2024-6-12 22:25 编辑
在Luckfox Pico上部署MNIST数字识别
1 概述
在完成第一站和第二站的任务后,具备在Luckfox上部署AI模型的条件了。参考,
#AI挑战营第一站#Pytorch 安装和MNIST识别 - Linux与安卓 - 电子工程世界-论坛 (eeworld.com.cn)
【AI挑战营第二站】MNIST转RKNN格式并算法工程化部署打包成SDK - Linux与安卓 - 电子工程世界-论坛 (eeworld.com.cn)
2 更新firmware
在刚拿到开发板的时候,就可以用adb连接,并读取文件系统,但是连接CSI摄像头后,无法按照手册的说明读取视频。根据下述wiki的资料可知,
CSI Camera | LUCKFOX WIKI
出厂的是一个测试版映像,只能测试开发板的正常工作,具体实现什么功能都需要自行编译系统。可选的有buildroot和ubuntu,其中ubuntu会更大些,需要在SD卡上加载,而buildroot精简很多,可以适用menuconfig定义,然后自行编译,所以,选择用buildroot来实现,直接写入SPI内存中。
根据手册,需要从github上clone源代码,配置交叉编译工具,使用脚本编译。因为gitee也同步了源码,所以,从gitee上可以快速搞定,避免了github的长久期待。
因为交叉编译工具只是适用于Linux系统,所以,直接在ubuntu上做这个步骤更便捷,否则就需要WSL或者虚拟机了。
下面是编译的过程,在一个老爷笔记本上,大概搞了4个小时,整个过程只是出现一些warning,非常顺畅。丝滑。
编译成果如下图,并提示build输出的路径。
进入目录,生成下述文件,其中需要写入的只有一个文件,就是uboot.img
其实,通过云盘也提供了一个可以直接写入的映像,可以下载后解压,看如下,和上面的其实是一回事
按着Boot键加电,就可以找到这个开发板,如Fuzhou Rockchip.... 所示,
然后适用upgrade_tool这个工具下载到Luchfox开发板上,upgrade_tool也是需要下载安装的,只适合Linux系统
升级成功
这时搜索一下连接的网口,发现用172.32.0.93,连不上这个开发板了。
这个花了很长时间,最后发现这个是Luchfox pico pro,网口被配置成另一个192.168.10.x起手的网址了。需要用RNDS来连接usb口虚拟的网口,才可以继续用这个网址连接。
虽然没有实际适用,在windows实现上述功能需要使用另一个工具,
不再重复,直接查上面的wiki就可以。
3 实现视频流捕捉
连接好视频摄像头,注意luchfox pico pro的连接和普通pico是不同的,使用可以直接捕捉视频流的VLC,
选择rtsp://172.32.0.93的第0个通道的实时视频,显示如下,花花草草
另外可以用用ssh连接,用户名root,密码luckfox,使用MobaXterm可以用GUI模式,这样直观很多,
上传文件,也可以用scp命令行命令,
同样,adb也可以,先搜索设备,只有一个就用adb shell就可以。这个adb是android device连接工具,如果装了android studio就自带,否则就需要单独下载后解压使用,
在这个目录中找到rkipc.ini,这个是CSI摄像头连接成功的意思,原来的出厂测试版是没有的
使用adb push可以上传文件
这样具备了视频识别MNIST的条件了。
4 调用SDK实现基于视频流的MNIST数字识别
4.1如前所述,首先需要训练除自己的AI模型,然后转换成公用ONNX格式,再用专业工具压缩后转换成rknn格式,这个压缩后参数都整数化,识别精度都有一定的损失。
这个代码是用c语言编写的,视频的数据读取是实用的opencv库,这里实用lib的方式编译的
void *data = RK_MPI_MB_Handle2VirAddr(stVpssFrame.stVFrame.pMbBlk);
cv::Mat frame(height,width,CV_8UC3,data);
读取的mat矩阵数据,在推理命令下读取输出,这个就是前面编译的sdk
inference_mnist_model(&rknn_app_ctx, sub_pics[i], detect_results);
总体来说,上面的推理命令,就是实用自带的AI数据处理API实现对应的高强度卷积计算,输出结果,对照选择数字的结果。
这个是基于yolo8范例代码更改的,其他的模型,都还是用这个开发的编程顺序实现的,不同的是采用的model模型参数。
这样,通过对于不同模型的计算,代码变化几乎不大,但是通过分离训练的模型,就可以实现多种功能。
4.2 编译后直接使用可执行文件,结果文件中断了,
这是需要用RkLunch-stop.,sh先停止启动的自动调用摄像头,注意其中的小写和大写字母,
再启动代码,就显示连续识别的输出命令行,
输出效果可以看到,不够标准的2识别为3
不够标准的3识别为5,
这次识别正确,手写比较规范的3,字体模糊一些也没有关系。而且识别速度很快,可以达到21fps,就是连续视频30fps,基本上不太讲究的话,可以实时识别数据。
5 小结
经过这个过程,可以发现MNIST可以比较实用地实现数字识别功能,速度也很可以。中间需要注意,MNIST模型一般是需要经过压缩的,识别率明显不如测试的时候,普遍置信度再50%作业,而训练时已经超过90%,在第一站的训练,实际是99%。看起来数据很差,但是比较规范的书写是可以完美读出。
这个是一个偏向实用的,均衡性价比和功耗的平衡选择。