在这里插入图片描述

* 安装vnc(可选)  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

安装命令如下

# a安装软件包  
apt install x11vnc  
# 设置密码  
# 设置后会有一个保存路径,如果读者用的不是root账号,下面脚本内容要相应修改。  
x11vnc -storepasswd  
# 创建开机服务  
vim /lib/systemd/system/x11vnc.service  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

开机脚本

[Unit]  
Description=Start x11vnc at startup.  
After=multi-user.target  
[Service]  
Type=simple  
ExecStart=/usr/bin/x11vnc -auth guess -forever -loop -capslock -nomodtweak -noxdamage -repeat -rfbauth /root/.vnc/passwd -rfbport 5900 -shared  
[Install]  
WantedBy=multi-user.target  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

启动服务

systemctl daemon-reload  
systemctl enable x11vnc.service  
systemctl start x11vnc.service  
systemctl status x11vnc.service  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

操作完毕后,继续使用MOBAXterm,新建Session -> VNC
端口在开机脚本中,要一致。
在这里插入图片描述

在这里插入图片描述

需要注意,桌面的默认登录账号密码为sunrise/sunrise。
故,在这里输入某些命令,是需要加sudo的,不要和上面串口的root账号搞混。

三)ONNX实机测试

笔者以下命令是通过vnc打开板子里的终端操作的,不是串口。
先使用FileZilla上传onnx_v1的代码。
笔者用的是usb 摄像头,使用以下命令查找摄像头。

# 这里会有很多个设备,如果不确定是哪个,先拔掉输入一次命令,再插入输入一次  
ls /dev/video*  
# 改为你上传的路径  
cd /home/sunrise/LPR/onnx_v1/ppocr_onnx  
# 改为你的摄像头索引  
python3 main.py 8  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

至此笔者能完整运行的部分,已说明完毕。
下面的BPU篇,笔者能力有限,并未实现一个完整的落地方案。

四)BPU加速推理篇

先重新说明一下转换路线,paddleocr -> onnx -> onnx bpu。
onnx转onnx bpu需要在天工开物的docker交叉编译环境中进行。
首先,强烈建议你读完这两篇文章中的bpu模型转换部分再来操作,否则可能会有点一头雾水。
[BPU部署教程] 一文带你轻松走出模型部署新手村
[BPU部署教程] 教你搞定YOLOV5部署 (版本_ 6.2)
在这两篇文章中,你需要搞懂:

# 笔者用的是Ubuntu虚拟机里运行docker,和上面文章里的不要一样  
# 第一个-v参数,为了方便上传文件到宿主后,不用再复制进docker容器  
# 第二个-v参数,是天工开物工具包的文件路径  
sudo docker run -it --rm \  
-v /home/walker/horizon:/horizon \  
-v /home/walker/horizon/horizon_xj3_open_explorer_v2.3.3_20220727:/open_explorer \  
hub.hobot.cc/aitools/ai_toolchain_centos_7_xj3:v2.3.3  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
# convert_det.yaml  
model_parameters:  
  onnx_model: 'model.onnx'  
  output_model_file_prefix: 'model'  
  march: 'bernoulli2'  
input_parameters:  
  input_type_train: 'bgr'  
  input_layout_train: 'NCHW'  
  input_type_rt: 'nv12'  
  norm_type: 'data_scale'  
  scale_value: 0.003921568627451  
  input_layout_rt: 'NCHW'  
calibration_parameters:  
  cal_data_dir: './calibration_data'  
  calibration_type: 'max'  
  max_percentile: 0.9999  
compiler_parameters:  
  compile_mode: 'latency'  
  optimize_level: 'O3'  
  debug: False  
  core_num: 2  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
# convert_rec.yaml  
model_parameters:  
  onnx_model: 'model.onnx'  
  output_model_file_prefix: 'model'  
  march: 'bernoulli2'  
input_parameters:  
  input_type_train: 'bgr'  
  input_layout_train: 'NCHW'  
  input_type_rt: 'nv12'  
  norm_type: 'data_scale'  
  scale_value: 0.003921568627451  
  input_layout_rt: 'NCHW'  
calibration_parameters:  
  cal_data_dir: './calibration_data'  
  calibration_type: 'max'  
  max_percentile: 0.9999  
compiler_parameters:  
  compile_mode: 'latency'  
  optimize_level: 'O3'  
  debug: False  
  core_num: 2  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

其次,你需要重新回顾paddle2onnx的内容。因为paddleocr的例子,输入的sharp是动态的,需要将sharp修改为静态。
❗️以下命令在paddlepaddle的环境里执行。

# 转化det模型  
paddle2onnx --model_dir ./det/LPR_db_mv3_det/inference ^  
--model_filename inference.pdmodel ^  
--params_filename inference.pdiparams ^  
--save_file ./det/LPR_db_mv3_det/det_onnx/model.onnx ^  
--opset_version 10 ^  
--input_shape_dict="{'x':[1,3,480,640]}" ^  
--enable_onnx_checker True ^  
--enable_dev_version False  
# 转化rec模型  
paddle2onnx --model_dir ./rec/LPR_svtr_mv1e_rec/inference ^  
--model_filename inference.pdmodel ^  
--params_filename inference.pdiparams ^  
--save_file ./rec/LPR_svtr_mv1e_rec/rec_onnx/model.onnx ^  
--opset_version 10 ^  
--input_shape_dict="{'x':[1,3,48,320]}" ^  
--enable_onnx_checker True ^  
--enable_dev_version False  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

按PaddleOCR官方说明,改为静态精度会有所降低。
一些说明:

按笔者的理解,这两个sharp估计不会减少转换的精度。

❗️以下命令在天工开物的环境操作(docker)执行。
由于笔者没有完整实现,就不放测试代码了,因为比较混乱可能会误导读者。这里以onnx_v1为例。

# 先cd到output父目录再执行  
hb_mapper checker --model-type onnx --march bernoulli2 --model output/det/LPR_db_mv3_det/det_onnx/model.onnx  
hb_mapper checker --model-type onnx --march bernoulli2 --model output/rec/LPR_svtr_mv1e_rec/rec_onnx/model.onnx  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

最后没报错即可。
在这里插入图片描述

# 先cd到det_onnx  
hb_mapper makertbin --config convert_det.yaml --model-type onnx  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

成功转接的截图,bin模型文件会输出在model_output里。
在这里插入图片描述

同理rec的转化:

# 先cd到rec_onnx  
hb_mapper makertbin --config convert_det.yaml --model-type onnx  
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

截图
在这里插入图片描述

❗️以下命令在paddlepaddle的环境里执行

rec测试
在这里插入图片描述

虽然无法确定结果正不正确,但从性能方面分析,det≈220ms,rec<100ms,预估性能从cpu的1帧每秒提升到2~3帧每秒吧。

五、结语

对笔者来说,是首次接触arm方面的编程,过程也是一波三折,借了3块板子才做到现在的程度。只可惜最后还是能力有限,没完成后处理部分,略感遗憾。
至于车牌识别这个立项,是笔者毕业那年所在公司的主营业务。当时笔者作为一个新手,并未接触甚至完全不清楚其中用到什么技术。现在能用自己的技术经验,做个技术路线不一样的车牌识别demo出来,也算是人生的一个回顾吧。

此文章为搬运
原项目链接

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/m0_63642362/article/details/127517717","extend1":"pc","ab":"new"}">>
注:本文转载自blog.csdn.net的AI Studio的文章"https://blog.csdn.net/m0_63642362/article/details/127517717"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!