1. 项目概述
作为一名嵌入式开发新手,我在寒假期间完成了一个极具挑战性的任务——将LPRNet车牌识别模型部署到飞凌嵌入式ELF-RV1126B开发板上。这个项目最特殊的地方在于,由于异地环境限制,所有操作都是通过远程连接完成的,开发板和我并不在同一个局域网内。这种"远程作战"的模式让整个部署过程充满了意外和挑战,但也让我积累了宝贵的实战经验。
ELF-RV11266B是一款基于瑞芯微RV1126芯片的开发板,搭载了强大的NPU(神经网络处理单元),非常适合边缘计算场景下的视觉检测任务。LPRNet是一种轻量级的车牌识别神经网络,在嵌入式设备上能够实现高效的车牌检测和识别。将这两者结合起来,可以构建一个性能优异的边缘端车牌识别系统。
2. 环境准备与远程连接
2.1 远程连接方案选择
由于开发板位于异地,首先需要解决远程连接问题。传统的SSH连接要求设备在同一局域网内,显然不适用我们的场景。经过调研,我选择了cpolar-connect工具建立远程隧道。
cpolar的工作原理是在开发板上运行客户端,将本地服务暴露到公网,生成一个临时的公网访问地址。这样我就可以在任何地方通过这个地址连接到开发板,就像在本地操作一样。
注意:使用这类工具时要特别注意安全性,建议设置强密码并限制访问IP,避免设备暴露在公网带来安全隐患。
2.2 开发环境搭建
在本地Windows主机上,我使用VMware Workstation创建了Ubuntu虚拟机作为开发环境。飞凌嵌入式提供了预配置的开发环境镜像,包含必要的工具链和依赖库。
安装步骤:
- 下载并安装VMware Workstation
- 解压提供的Ubuntu开发环境压缩包
- 在VMware中加载该虚拟机镜像
- 启动虚拟机,使用提供的账户登录(用户名:elf,密码:elf)
虚拟机启动后,第一件事就是更新系统并安装必要的开发工具:
bash复制sudo apt update
sudo apt upgrade -y
sudo apt install -y git cmake build-essential python3-pip
3. 模型转换环境配置
3.1 Python环境搭建
由于RKNN-Toolkit2对Python版本有特定要求,我们需要创建一个隔离的Python环境。我选择了Miniforge作为Python环境管理工具,相比Anaconda更加轻量。
安装Miniforge:
bash复制wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh -b
source ~/miniforge3/bin/activate
3.2 RKNN-Toolkit2环境准备
RKNN-Toolkit2是瑞芯微提供的模型转换工具,可以将常见的深度学习模型转换为RKNN格式,以便在瑞芯微NPU上运行。
创建并激活conda环境:
bash复制conda create -n rknn python=3.8 -y
conda activate rknn
安装RKNN-Toolkit2:
bash复制pip install rknn-toolkit2==1.4.0
验证安装是否成功:
bash复制python -c "from rknn.api import RKNN; print('RKNN-Toolkit2 import successful')"
3.3 RKNN Model Zoo准备
RKNN Model Zoo是瑞芯微提供的模型仓库,包含多种预训练模型和示例代码,其中就有LPRNet的实现。
下载并配置Model Zoo:
bash复制wget https://github.com/rockchip-linux/rknn-model-zoo/archive/refs/heads/main.zip
unzip main.zip -d ~/
mv ~/main ~/rknn_model_zoo-main
4. 模型转换实战
4.1 准备ONNX模型
将预训练的LPRNet模型(lprnet.onnx)复制到正确位置:
bash复制cp lprnet.onnx ~/rknn_model_zoo-main/examples/LPRNet/model/
4.2 执行模型转换
进入LPRNet示例目录:
bash复制cd ~/rknn_model_zoo-main/examples/LPRNet/python
修改convert.py脚本,确保输入输出路径正确后,执行转换:
bash复制python convert.py
转换过程中我遇到了第一个坑——路径嵌套问题。由于解压时自动创建了嵌套目录,导致脚本找不到正确的路径。解决方法很简单:
bash复制mv ~/rknn_model_zoo-main/rknn_model_zoo-main/* ~/rknn_model_zoo-main/
rmdir ~/rknn_model_zoo-main/rknn_model_zoo-main
成功转换后,会在output目录下生成lprnet_rv1126b.rknn文件,这是我们需要的NPU可执行模型。
5. 模型部署与调试
5.1 远程文件传输
由于开发板是通过cpolar远程连接的,常规的scp命令无法直接使用。需要指定cpolar提供的端口进行传输:
首先在开发板上创建目标目录:
bash复制mkdir -p /home/elf/qyk
然后在开发主机上执行传输:
bash复制scp -v -P 10007 ~/rknn_model_zoo-main/examples/LPRNet/model/lprnet_rv1126b.rknn elf@34.tcp.cpolar.top:~/qyk
提示:这里的10007是cpolar映射的端口号,实际使用时需要替换为你自己的端口。
5.2 开发板环境配置
在开发板上安装RKNN-Toolkit-Lite2:
bash复制pip install rknn-toolkit-lite2==2.3.2
5.3 运行推理脚本
将推理脚本和测试图片也传输到开发板后,尝试运行:
bash复制python3 infer.py
这时遇到了几个关键问题:
-
环境激活问题:在root用户下安装的环境,elf用户无法直接使用。解决方法是在elf用户下重新创建conda环境。
-
架构误识别问题:错误提示"Unsupported run platform: Linux aarch64"。这是RKNN-Toolkit-Lite2 v2.3.2的一个已知bug,会错误地将aarch64识别为x64。临时解决方法是通过修改rknn_platform_utils.py文件中的硬编码。
-
权限问题:elf用户没有访问RKNPU驱动的权限。临时解决方案是切换到root用户运行。
-
.so文件缺陷:即使解决了上述问题,仍然无法初始化NPU运行时。这可能是官方发布的二进制文件存在适配问题,需要等待官方修复。
6. 经验总结与优化建议
6.1 部署流程关键点
-
环境一致性:确保开发环境和目标设备的Python版本、依赖库版本完全一致,可以避免大部分兼容性问题。
-
模型优化:在模型转换阶段,可以尝试不同的量化策略和优化选项,以提升在嵌入式设备上的推理性能。
-
远程调试技巧:在远程部署时,建议先在小批量数据上测试,确认基本流程没问题后再进行完整部署。
6.2 性能优化建议
-
模型剪枝:可以考虑对LPRNet模型进行剪枝,减少参数数量,提升推理速度。
-
内存优化:嵌入式设备内存有限,可以通过调整模型输入尺寸或批处理大小来降低内存占用。
-
多线程处理:利用RV1126的多核CPU,可以实现图像采集和模型推理的流水线处理,提高整体吞吐量。
6.3 后续改进方向
-
完整pipeline实现:当前只完成了模型部署,后续可以集成图像采集、预处理和后处理模块,构建完整的车牌识别系统。
-
模型量化对比:尝试不同的量化策略(如动态量化、静态量化),比较精度和性能的权衡。
-
NPU利用率监控:开发工具监控NPU的利用率,找出性能瓶颈并进行针对性优化。
这次部署经历让我深刻体会到嵌入式AI开发的挑战和乐趣。每一个问题的解决都像是解开一个谜题,需要结合理论知识、实践经验和调试技巧。虽然遇到了官方库的适配问题暂时阻碍了最终验证,但整个过程中的收获已经远超预期。
