网上有一个10行代码搞定目标检测的视频教程

参考网址:https://www.bilibili.com/video/av91150116/

经测非常实用,通过10行代码实现目标检测,在Jetson Nano上迅速搭建一个目标识别的示例和开发环境。

视频例程使用Jetson官方的深度学习库(jetson_inference)进行目标检测程序实现

项目链接:https://github.com/dusty-nv/jetson-inference

项目介绍页面中Building the Project from Source给出了从源代码进行安装和配置的指南

指南链接:https://github.com/dusty-nv/jetson-inference/blob/master/docs/building-repo-2.md

概要步骤如下

建议在进行安装之前先进行系统环境配置,如apt、pip的源设置,中文输入等。

一、jetson-inference下载和安装

步骤如下

1. 预安装软件

首先安装需要用到的软件包

$ sudo apt instal git cmake libpython3-dev python3-numpy

假定apt update在系统配置时已经运行过了,这里不再重复。

2. 下载代码库

然后下载软件源代码库

$ git clone --recursive https://github.com/dusty-nv/jetson-inference

这一步比较费事,这是一个递归的源代码库,包含多个子代码库,因为国内外网络环境的问题,从Github下载会出现连接不稳定,不能下载全的情况。这种情况建议多尝试几次,或者从其它地方进行下载。

3. 编译安装

之后进入代码目录进行编译安装

$ cd jetson-inference

创建一个cmake编译目录

$ mkdir build
$ cd build

进行cmake

$ cmake ..

在cmake过程中会弹出对话框让选择下载模型和安装pytorch,因为国内连接国外不稳定,建议选择不安装(通过TAB键选择Quit和Skip,按回车),后面进行离线下载和安装。

cmake完成之后,进行编译和安装

$ make -j4
$ sudo make install

这样jetson-inference库就安装完成了。编译之后会在build目录下生成jetson-inference库相关文件,包括头文件、库文件、帮助文件、脚本工具、示例程序等。make install会把相关的文件复制到对应的系统目录。

其中download-model.sh和install-pytorch.sh文件分别是下载模型和安装pytorch的脚本文件,可以查看参考文件,进行离线下载和安装。

其中会生成一个aarch64目录,里面包含jetson-inference库的相关文件,目录结构如下

其中lib目录包含库文件,include目录包含头文件,bin目录包含一些图像分类、目标识别等相关的命令和工具。

4. 测试

安装完成之后,build/aarch64/bin目录包含了一些图像分类、目标识别等方面的执行文件,如下 

可以用这些程序进行目标识别的测试。在bin目录下运行

$ ./imagenet.py --network=resnet-18 images/jellyfish.jpg images/test/output_jellyfish.jpg

就可以对imags/jellyfish.jpg图片进行分类识别。识别结果输出在images/test/output_jellyfish.jpg文件。

因为安装时没有选择在线下载模型,这个程序运行不能成功。可以自己下载模型和建立python文件来进行基于jetson-inference库的例程开发。

5. 模型下载

Github提供了离线下载模型的方法,通过

模型下载链接:https://github.com/dusty-nv/jetson-inference/releases

可以根据需要下载对应的模型,下载到data/networks目录,然后解压,比如

$ tar -zxvf SSD-Mobilenet-v2.tar.gz

常见的有GoogleNet,ResNet,SSD-Mobilenet等,如下

下载和解压到data/networks目录之后,就可以在程序中使用jetson-inference库调用这些模型了。

二、例程编写和测试

这里用一个10行代码的例程来实现目标识别。参考视频,代码如下

import jetson.inference
import jetson.utils
 
net = jetson.inference.detectNet('SSD-Mobilenet-v2', threshold=0.5)
camera = jetson.utils.gstCamera(1280,720,'0')
display = jetson.utils.glDisplay()
 
while display.IsOpen():
    img, width, height = camera.CaptureRGBA()
    detections = net.Detect(img, width, height)
    display.RenderOnce(img, width, height)
    display.SetTitle('Object Detection | Network %.1f FPS'%net.GetNetworkFPS())

采用SSD-Mobilenet-v2网络对摄像头视频进行在线目标识别。假定命名程序文件detect_net.py,然后运行

$ python3 detect_net.py

程序结果就会出现摄像头的画面和在线识别的结果,如下 

实际测试响应效果良好,能够达到20多fps的帧率,没有滞后感。