网上有一个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的源设置,中文输入等。
步骤如下
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的帧率,没有滞后感。