#AI挑战营终点站# 使用RV1106通过摄像头实时识别手写数字
[复制链接]
本帖最后由 MioChan 于 2024-5-31 14:29 编辑
上个帖子忘记考虑转换到RKNN模型,也要适配对应的开发版型号,RV1106所支持的rknn-toolkit2只能在Ubuntu使用,包括后面编译文件也需要Ubuntu,所以我们从转换模型开始就换用Ubuntu进行了。我这里是直接在装了ESXI的服务器上直接创建了台新的Ubuntu虚拟机。因为没接触过嵌入式开发,板子上调用模型完成推理的那部分C代码直接抄了论坛大佬们的作业,推理用的模型是我自己训练的。
ONNX模型转RKNN模型(这部分的操作都在自己创建的Ubuntu虚拟机或实体机上进行,而不是开发版)
wget -c https://mirrors.bfsu.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod 777 Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
会出现提示协议,一直按回车然后输入yes,出现下面提示就安装成功
然后开始创建rknn所需的虚拟环境
source ~/miniconda3/bin/activate
conda create -n rknn python=3.9
输入y即可完成创建,接下来cd到一个合适的位置准备下载tknn-tool kit的文件,然后输入下面的命令克隆仓库
git clone https://github.com/airockchip/rknn-toolkit2
别忘切换到刚刚建好的conda环境
conda activate rknn
接下来直接运行这一行安装依赖
pip install ./rknn-toolkit2/rknn-toolkit2/packages/rknn_toolkit2-2.0.0b0+9bab5682-cp39-cp39-linux_x86_64.whl
到此,环境安装完毕。
下一步,使用下面的python代码,开始转换onnx模型,代码训练集文件建议都放一起,一共需要mnist_cnn.onnx、data.txt、Image0_0.png 这三个文件,Image0_0.png就是一张手写体训练集的图片,data.txt 里就是写了这个图片的路径,你可以直接在附件下载这些。
from rknn.api import RKNN
# 创建 RKNN 对象
rknn = RKNN()
# 配置 RKNN 对象
rknn.config(mean_values=[[128]], std_values=[[128]],target_platform='rv1106') #图片归一化到【-1,1】
# 加载模型
ret = rknn.load_onnx(model='mnist_cnn.onnx')
ret = rknn.build(do_quantization=True) # 量化
# 保存 RKNN 模型
ret = rknn.export_rknn('mnist_cnn.rknn')
# 释放 RKNN 对象
rknn.release()
我这里直接用vim创建这个python文件,上面的代码贴进来就行
vi makerknn.py
按i进入编辑模式,然后粘贴代码后按esc键退出编辑模式,接下来按 shift+:键,输入wq 回车即可退出
确保之前提到的文件和这个py文件都在同一目录下,然后输入下面的即可完成转换
python makerknn.py
到此模型转换完成。
Ubuntu编译环境配置(这部分的操作都在自己创建的Ubuntu虚拟机或实体机上进行,而不是开发版)
只是用摄像头识别手写数字这种功能,并不需要刷系统,用出场自带的即可
具体可以参考 https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-SDK
安装依赖环境
sudo apt update
sudo apt-get install -y git ssh make gcc gcc-multilib g++-multilib module-assistant expect g++ gawk texinfo libssl-dev bison flex fakeroot cmake unzip gperf autoconf device-tree-compiler libncurses5-dev pkg-config bc python-is-python3 passwd openssl openssh-server openssh-client vim file cpio rsync
找一个合适的位置克隆 SDK仓库
git clone https://gitee.com/LuckfoxTECH/luckfox-pico.git
进入这个位置,安装交叉编译工具链,luckfox-pico就是刚刚下载的文件目录
cd ./luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/
source env_install_toolchain.sh
到此就可以了。
接下来直接克隆论坛这位大佬的仓库抄作业 https://bbs.eeworld.com.cn/thread-1280038-1-1.html
先设置环境变量,这个只是临时设置,每次重新使用ssh终端时都要执行一次
export LUCKFOX_SDK_PATH=输入你上一步下载的SDK目录
我的是这样,需要根据自己实际下载的位置进行设置
克隆仓库
git clone https://github.com/knva/luckfox_pico_rtsp_opencv
直接进去
cd luckfox_pico_rtsp_opencv
创建一个build文件目录,然后再进去
mkdir build
cd build
开始编译生成执行文件
cmake ..
make && make install
返回上一级找到luckfox_rtsp_opencv_demo这个文件夹,这里建议用smb挂载虚拟机和开发版的共享目录,方便后续移动文件
这里开始的操作就要在开发板上进行了
将luckfox_rtsp_opencv_demo这个文件夹内的luckfox_rtsp_opencv和lib整个文件夹(里面有librga.so和librknnmrt.so两个文件)复制到开发版里,以及之前转换好的rknn文件,位置自己选个合适的就好,注意lib必须复制luckfox_rtsp_opencv_demo这个文件里的,不要自行复制项目根目录的lib,否则会报错
然后同样的方法用ssh连接开发版,进入刚刚的文件夹,再次确定有这些内容
先停止默认运行的rtsp
RkLunch-stop.sh
然后输入下面这个即可运行,其中luckfox_rtsp_opencv是可执行文件, mnist_cnn.rknn是对应的模型(附件中的mnist_demo.zip就是编译好的程序,解压到开发板里就能直接运行,想要编译源码可以参考https://bbs.eeworld.com.cn/thread-1280038-1-1.html,我用的就是这个这里就不放了)
./luckfox_rtsp_opencv mnist_cnn.rknn
使用装有VLC的设备,输入开发版的rtsp地址即可查看摄像头的画面
我直接抽取了数据集的部分数字,给他们打印了出来
视频中分别测试了mnist训练集、mnist测试集、自己手写字体。
luckfox
根据识别结果可以得到如下结论,对于mnist数据集,整个识别率基本能达到90%,但是有些数字对识别方向可能比较敏感例如测试集中的6(视频中0:14),如果斜着识别容易识别成5,但摄像头摆正后就会识别正确,这从一定程度上说明在训练时做一些数据增强操作是非常有必要的,例如我们可以给图片加入适当噪声、进行一些旋转和缩放操作再进行识别。对于mnist测试集中的9(0:47)各个角度尝试都无法识别正确,也可能这个确实有点抽象,之后从测试集重挑了一个9反复尝试可以正常识别但识别率还是不高非常容易识别错误。对于自己手写的数字识别,只要字体比较粗都能顺利识别,但发现9还是比较容易识别错误(1:06),大概原因可能是外国人的数字写法和中国人还是有些不同,还有就是因为模型量化可能对网络识别率造成一些影响。
对于容易出错的数字6和9,后续也尝试自己写了各种样子的,最终实现了准确识别。特别是9,写的斜一点上端开口下端短一点可能会比较容易识别正确。
|