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 效果预览

  • 效果预览

b站视频链接

二、操作步骤

大致操作步骤按顺序概括如下:

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.

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐