【AI达人创造营三期】Jetson Nano商品识别(通用检测)部署
Jetson Nano商品识别(通用检测)部署
Jetson Nano商品识别(通用检测)部署
一、项目简介
1.1 背景与意义简介
-
随着无人超市、新零售等商业模式的发展,越来越多的品牌商及商超零售企业开始引进人工智能技术,探索商品管理、成本控制、用户体验等多维度的数字化转型,转型中所涉及的货架陈列分析、智能结算、智能库存管理、智能货柜、电商平台等以图搜图的场景背后的核心技术都离不开商品识别算法。PaddleClas团队开源的图像识别PP-ShiTu技术方案,主要由主体检测、特征学习和向量检索三个模块组成,是一个实用的轻量级通用图像识别系统。基于此技术方案,商超零售企业可实现大量商品的一键式智能化识别,大大提高识别效率,节省人工及时间成本。此外,当新品迭代更新时,PP-shitu无需重新训练模型,能够做到“即增即用”,完美解决上述痛点问题,大大提高了人工智能在商超零售行业的应用落地可能性。
-
JetsonNano是NVIDIA推出的高性能边缘端部署小型计算设备
-
可以在JetsonNano上实现部署商品识别端侧系统,实时进行推理处理,从而可以将该端侧系统部署在普通零售超市。
-
本项目基于基于PP-ShiTu的商品识别系统中已经训练好的模型,在Jetson Nano上部署
1.2 部署思路
-
实现功能如下:推理图片、推理视频、录制视频、实时推理
-
通过CSI摄像头实时读取图像,对每一帧图像进行商品检测和识别,显示到前端的同时保存视频文件,使用PaddleInference来进行推理,为了实现实时性,实时推理过程中采用每两帧推理一次,两帧共用同一次结果,可以将fps提高一倍左右。另外,考虑到JetsonNano端的性能有限,因此需要通过CSI摄像头实现录制功能,对一段时间的画面进行录制,之后在Jetson Nano端使用模型进行推理,最后输出视频文件。
1.3 效果预览
- 效果预览
二、操作步骤
大致操作步骤按顺序概括如下:
1、根据官方教程使用VMware烧录emmc引导
2、利用读卡器向SD卡烧录操作系统(Ubuntu 18.04)
3、外接HDMI显示器开机(密码nvidia)并扩展内存
4、修改国内镜像源
5、安装python3-pip并更新软件安装包
6、根据jetpack到paddleinference官网下载对应的C++/Python预测库
7、安装相关的库(numpy、opencv、faiss等)
8、将训练好的模型导出为静态图
9、编写前后处理代码和推理逻辑,实现端侧部署
三、开发环境搭建
【注意】此处省略emmc引导和TF卡烧录过程,这部分在官方提供的视频教程有详细讲解
3.1 硬件
-
收到Jetson Nano B01套件后进行简单的组装
组装完成效果如下 -
上电开机,接入HDMI显示器。
-
为了让风扇运转可以使用
$ sudo sh -c 'echo 150 > /sys/devices/pwm-fan/target_pwm'
进行调节,其中150可以是0~255任意整数,越大风扇转速越高
3.2 测试摄像头
CSI摄像头连接方式如下图所示:

连接好后测试摄像头是否正常:
$ ls /dev/video*
运行结果为 /dev/video0
说明安装成功!
然后运行以下摄像头测试代码:
## test_video.py
import cv2
cap = cv2.VideoCapture("nvarguscamerasrc \
!video/x-raw(memory:NVMM), width=640, height=480, format=NV12, framerate=30/1\
!nvvidconv flip-method=0 ! videoconvert ! video/x-raw, format=BGR ! appsink")
while True:
sucess, img=cap.read()
cv2.imshow("capture", img)
k=cv2.waitKey(1)
if k == 27:
cv2.destroyAllWindows()
break
elif k==ord("s"):
cv2.imwrite("video.jpg",img)
cv2.destroyAllWindows()
break
cap.release()
3.3 SSH连接
-
为了开发方便,可以在上位机(Windows主机)使用SSH远程连接jetson nano,需要注意的是上位机和下位机需要在同一局域网内才可以连接。
-
为了进行SSH远程连接,首先要在jetson nano上修改配置文件
/etc/ssh/sshd_config
允许SSH登录,具体来说,需要添加PermitRootLogin yes
,可参考此博文 -
配置密码:
passwd nvidia
然后输入密码即可(开机密码也会随之修改!!)
- 配置完成后可使用Mobaxterm进行SSH连接,输入jetson nano的IP地址,端口号默认为22,用户名为nvidia,密码自己设置即可,连接成功后如下图所示:

3.4 安装依赖库
- 更换国内源,用以下命令打开文件(建议先拷贝一份再修改)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
sudo gedit /etc/apt/sources.list
- 使用如下内容替换文件内容(对应Ubuntu 18.04)
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
- 然后更新安装pip
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-pip
pip3 install --upgrade pip
注意:
执行sudo apt-get update
的时候有时会出现E: Unable to lock directory /var/lib/apt/lists
,此时在命令行执行以下指令即可:
sudo fuser -vki /var/lib/apt/lists/lock
然后重新执行sudo apt-get update
执行sudo apt-get upgrade
由于网络问题可能很慢,容易出错,一定耐心等待,否则,无法安装python3-pip或者其他软件。
这里有个小问题记录一下,我在我的jetsonanno上安装python3-dev会报错,按照很多教程都无法解决。但是不安装也暂时没啥问题
。
- 更新pip源
sudo mkdir .pip
cd .pip
sudo touch pip.conf
sudo gedit pip.conf
然后输入以下内容,保存关闭
[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = https://pypi.tuna.tsinghua.edu.cn
-
接下来安装paddlepaddle
-
输入如下命令查看jetpack版本:
$ cat /etc/nv_tegra_release
得到jetpack版本为4.6.1,Python的预装版本为3.6.9,在PaddleInference官网下载nano,jetpack 4.6.1,python3.6对应的paddlepaddle,然后利用Mobaxterm上传到jetson nano即可。
$ pip3 install paddlepaddle_gpu-2.3.0-cp36-cp36m-linux_aarch64.whl
如果安装报错可能是网络不稳定,可以重试一下!
3.5 配置CUDA
首先打开配置文件
$ sudo gedit ~/.bashrc
在文件末尾添加以下路径:
export CUDA_HOME=/usr/local/cuda-10.2
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-10.2/bin:$PATH
运行
$ source ~/.bashrc
查看cuda版本:
$ nvcc -V
3.6 安装向量检索库faiss
方式一:
faiss的安装,所有的地方都推荐用conda安装,又方便又快捷。但是,conda不支持nano这种arm linux环境。
所以安装大神编译好的Archiconda,Archiconda是用于64位ARM平台的Conda发行版,从https://github.com/Archiconda/build-tools/releases/download/0.2.3/Archiconda3-0.2.3-Linux-aarch64.sh 下载,进入下载的文件夹,在终端执行:
$ sudo sh Archiconda3-0.2.3-Linux-aarch64.sh
最后设置是否将路径写入.bashrc,键入yes,提示Thank you for installing Archicinda3!表明安装成功,再执行
$ source ~/.bashrc
安装之后,python环境已经默认修改为conda,这时候需要重新安装numpy和opencv:
pip install opencv-python
方式二:
还是用原来的pip3,这事是无法安装faiss的,但是可以通过下载源码自己编译,操作如下:
下载faiss源码:
git clone https://github.com/facebookresearch/faiss.git
进入faiss目录,建立build文件夹
cd faiss
mkdir build
开始编译,不编译GPU
cmake -B build . -DFAISS_ENABLE_GPU=OFF -DBUILD_SHARED_LIBS=ON
make -C build -j faiss
sudo make -C build install
…后面测试代码就跟github上的文档一样了,有兴趣的可以自己看下,测试成功则表示安装成功
四、界面开发
4.1 安装PyQt5
- 由于官方镜像中PyQt5使用的gtk不适配,需要输入以下命令
$ sudo apt-get build-dep qt5-default
$ sudo apt install libcanberra-gtk-module
$ sudo apt install qt5-style-plugins
$ echo "export QT_QPA_PLATFORMTHEME=gtk2" >> ~/.profile
- 下载之后链接到Python3中:
ln -s /usr/lib/python3/dist-packages/PyQt5/ ~/.virtualenvs/xxx/lib/python3.x/site-packages/
ln -s /usr/lib/python3/dist-packages/sip* ~/.virtualenvs/xxx/lib/python3.x/site-packages/
- 进入python3终端输入,不报错就成功了:
>>> import PyQt5
>>>
4.2 写代码
- 利用pyqt5搭建界面,实现功能包括测试摄像头、录制视频、推理图片/文件夹、推理视频、实时推理,逐个功能实现,最终界面如下图所示:

4.3 Illegal instruction(core dumped)问题解决
- 这个是Python脚本运行时,导入依赖库可能出现异常退出进程,解决方式参考这篇博客
1.终端运行
sudo gedit ~/.bashrc
2.末尾添加如下内容,保存并关闭:
export OPENBLAS_CORETYPE=ARMV8
3.终端运行
source ~/.bashrc
五、模型部署
-
利用项目基于PP-ShiTu的商品识别系统中已经训练好的模型进行部署,该项目涉及到两个模型,一个是picodet主体检测模型,另一个是pplcnet分类模型,分别下载两个静态图模型。
-
推理逻辑:image输入主体检测模型得到若干预测框,根据预测框裁剪图像,resize到原图尺寸输入分类模型,得到每个预测框的类别。
-
由于端侧性能有限,为了防止出现卡帧,采用每两帧推理一次,相邻两帧使用第一帧的推理结果,在视觉上不会有差异,但是fps可以提高一倍。
六、项目总结
第一次给Jetson nano裸机配置环境,难度不大但是坑巨多,感觉把所有的坑踩遍了,因为误操作烧录了两次操作系统,代码总共就调了就差不多一天,但是配置环境和安装软件包花了一周时间,好在最后成功了,精度和速度都不错,每两帧推理一次,两帧共用一次的结果,这样可以在端侧实时跑起来。
赵祎安 大连理工大学领航团团长 大四 计算机专业
请点击此处查看本环境基本用法.
Please click here for more detailed instructions.
此文章为搬运
原项目链接
更多推荐
所有评论(0)