YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO

1 一些概念

Jetson Tx2

NVIDIA Jetson 是NVIDIA为新一代自主机器设计的的嵌入式系统,是一个AI平台,它的优势就是可以覆盖不同领域、不同行业。目前Jetson产品线已经有四个产品系列,包括Jetson NanoJetson TX2Xavier NXAGX Xavier。四个产品系列的定位不同:

  • Jetson Nano比较适合和体量较小的设备,定位入门级,售价99美元;
  • Jetson TX2比Jetson Nano支持的摄像头数量更多,而且有专门的安全核心,售价249美元起;
  • Xavier NX的尺寸最小,但性能却是Jetson Nano的50倍,并且Xavier NX可以与Jetson Nano的主板兼容,价格399美元;
  • AGX Xavier是一个全功能平台,用户可通过AGX Xavier打造机器人,比如送货机器人,AGX Xavier可以实现自主驾驶。

Jetson TX2 是NIVDIA瞄准人工智能在Jetson TK1和TX1推出后的升级,适用于各种终端服务的基于NVIDIA Pascal™架构的AI单模块超级计算机。GPU和CPU都进行了升级,内存增加到8GB、存储增加到32GB,支持Wifi和蓝牙,编解码支持H.265,体型小巧,资源配置丰富且强大。

具体性能指标与和NVIDIA相关系列产品的对比图如下:

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第1张图片
Jetson TX2由一个GPU和一个CPU集群组成,CPU集群由双核丹佛2处理器和四核ARM Cortex-A57组成,通过高性能互连架构连接。

拥有6个CPU核心和一个GPU,您可以不必自行运行所有性能/功耗来测试最佳的运行状态,因为NVIDIA的新的命令工具Nvpmodel,提供了5种模式。

TX2默认采用模式1,即Max-Q模式,此模式下,2块丹佛处理器不工作,4块ARM A57工作,GPU工作频率为0.85Ghz,可以看到该模式是比较均衡/节能的模式。查看CPU状态:cat /proc/cpuinfo

希望开启火力全开的模式,当然是模式0:sudo nvpmodel -m 0

CUDA

统一计算设备架构(Compute Unified Device Architecture, CUDA),是由NVIDIA推出的通用并行计算架构。解决的是用更加廉价的设备资源,实现更高效的并行计算。

CUDA是利用GPU流处理器的特性,对矩阵运算这种做任务分解,分解的任务同时进行运算,再合并从而加速计算。CUDA提供给编程人员这种和GPU硬件沟通的接口。

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第2张图片
GPU 最初只是显卡的核心部件。当时显卡主要是用来显示的。主要运算都是图像方面的,专用性很高,有点 DSP 的味道。但NVIDIA发现 GPU 稍作改造可以做很多科学计算相关的事情(图像上的运算很多是矩阵运算,毕竟万物皆矩阵),于是发明了 CUDA。经过几年的完善,不仅在 GPU 驱动上附加很多库,还提出了 GPGPU的概念(面向通用计算的GPGPU)。这时反应过来的AMD和Intel已经算是掉队了,AMD推出OpenCL,Intel推出众核(>=60)处理器 Xeon Phi,这些不仅不好用而且对 GPU 高性能计算能力的使用效率都没 CUDA 高。

毕竟绝大多数科研工作者都希望性能好,稳定可靠,不出幺蛾子,花钱买舒心,自然就不会去贪小便宜买个不好用的了。

JetPack

Jetson Development Pack(JetPack) 是一个按需提供的一体化软件包,捆绑并安装了适用于 NVIDIA Jetson 嵌入式平台的所有开发用软件工具。NVIDIA JetPack SDK是构建AI应用程序的最全面的解决方案。它捆绑了所有Jetson平台软件,包括TensorRT,cuDNN,CUDA工具包,VisionWorks,Streamer和OpenCV,这些都是基于LTS Linux内核的L4T。

Jetson Tx2 自带软件包配置JetPack 4.x,这款功能强大的开发者套件能够使主板的硬件功能和接口充分发挥效用,预装 Linux 开发环境。同时,它还支持 NVIDIA Jetpack SDK,包括 BSP、深度学习库、计算机视觉、GPU 计算、多媒体处理等众多功能。

2 Jetson Tx2刷机

  • 显示:TX2只支持HDMI接口的显示器,所以你需要准备一台这样的显示器

实际测试中,这个接口不能外接DP的显示器(主机HDMI接显示器DP口本身不支持),通过转接接VGA也不行,会出现各种奇怪的BUG,所以最保险的就是直连一个HDMI的显示器

  • 控制:TX2只有一个usb接口,所以你需要准备一个usb扩展器
  • 电源:TX2是三孔插头,注意接地线的插头是不常见的圆头,所以你需要一个适配的插板
  • 开机:TX2上有四个红色按钮,其中开机按钮下面标注了POWER BTN字样,顺着开机按钮分别是Force Recovery Button按钮、User Defined Button和Reset Button。
  • 系统:预装有ubuntu16.04系统,其默认的用户名和密码都是nvidia

按上图所示插上显示器,通上电源,按下开机键之后,稍等片刻,熟悉的ubuntu命令行界面就呈现出来了,此时用户界面下有一个名为NVIDIA-INSTALLER的文件夹,如果想使用图形界面,可以运行其下的installer.sh进行用户图形界面的安装,之后重启机器便可以进行使用。
执行以下命令:

cd NVIDIA-INSTALLER & sudo ./installer & sudo reboot

2.1 NVIDIA SDK Manager下载安装

在对板子进行简单配置之后,我们使用NVIDIA SDK Manager进行系统的更新和CUDA、AI、Computer Vision、Multiply media等模块的安装以获取最新的系统和程序与程序接口。准备一台Ubuntu主机进行NVIDIA SDK Manager的下载安装,之后的工作主要会在这台主机上完成。
注意:安装过程主机需要全程联网,并且需要使用官方提供的usb线连接主机与TX2。

NVIDIA Software Development Kit (SDK) Manager
NVIDIA软件开发工具包(SDK)管理器是一款集开发人员软件于一体的工具,为NVIDIA SDK提供端到端的开发环境设置解决方案。

系统需求

  • 在PC上用虚拟机上安装Ubuntu Desktop 16.04 on x64 system做主机用,建议分配80G磁盘空间和8G以上内存( 16.04比18.04稳定可靠少bug)
  • 部署SDK版本,系统卷上至少需要25GB的空闲磁盘空间
  • 连接TX2与Ubuntu主机之间的USB数据线(官方的黑色数据线)
  • TX2与Ubuntu主机需要在同一个局域网下,推荐使用网线连接到同一个路由器下

SDK Manager下载安装

  1. 打开下载网址,登陆NVIDIA账号下载SDK Manager到Ubuntu主机
  2. 打开终端安装Debian软件包:
sudo apt install ./sdkmanager_[version].[build#].deb
按实际的下载的deb文件的版本来定
  1. 在主机运行SDK Manager:
    打开终端,使用sdkmanager命令启动SDK管理器。
  2. 登陆SDK Manager,选择登陆方式为Developer账户(跳转到NVIDIA网页登陆确认)

2.2 使用SDK Manager安装Jetson软件

Step1:配置开发环境

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第3张图片
如果连接了Jetson TX2设备,SDK管理器将在目标硬件下拉列表中自动选择该设备。如果设备没有被自动检测到,请单击刷新,或者尝试更换USB数据线。
YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第4张图片
在目标操作系统面板中,选择操作系统和JetPack版本。注意:若无需在Ubuntu主机上安装项目可取消勾选Host Machine,推荐取消,不影响TX2刷机和使用。

Step2:检查组件并接受许可

在这里插入图片描述

  1. 展开主机组件和目标组件面板,以查看将安装在系统上的组件。
  2. 选中复选框接受许可协议的条款。
  3. 如果希望SDK管理器将所有安装文件下载到默认路径以外的位置,请进入屏幕底部的下载和安装选项,然后手动选择希望使用的路径。

Step3:安装

  1. 在安装开始之前,SDK管理器会提示输入主机密码。
    YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第5张图片
  2. 显示软件下载和安装的进度。

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第6张图片

  1. 在顶部,可以在细节选项卡和终端选项卡之间切换。Terminal选项卡显示有关下载和安装的详细信息,并突出显示任何错误。
  2. 在Terminal选项卡上,可以使用Filter文本字段来筛选和搜索特定的信息。
  3. SDK管理器在准备好刷新目标设备时打开一个对话框。提示提供了如何准备设备以便为Flash做好准备的说明。
    注意:开发工具包必须处于强制恢复模式(RCM),以便安装程序能够将系统软件传输到Jetson模块。
TX2进入RCM模式可选自动与手动,若自动进入失败推荐进入手动安装模式。
恢复模式操作如下:
a. 确认已经连接电源适配器且处于关机状态
b. 按一下power键开机(按下后松开,稍微有一定的按键时长)
c. 按下REC(RECOVERY FORCE)不要松开
d. 再按下RST(reset按下松开,稍微有一定的按键时长)
e. REC保持两秒后松开按下并松开TX2的POWER键S4

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第7张图片

  1. 在SDK管理器完成Flash过程后,连接到TX2系统的监视器将显示初始设置提示。
  • 在初始设置过程中,设置Jetson系统的用户名和密码,初始设置过程完成后,Jetson系统将引导至Linux桌面。
  • 将在Jetson配置期间创建的用户名和密码输入到SDK Manager的对话框中。
    YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第8张图片
    SDK Manager现在将完成软件库的安装。跳过此步骤将不会在目标硬件上安装任何SDK组件,并将在设备上保持干净的操作系统。

Setp4:完成设置

在下载安装完成后Jetson TX2设备环境即搭建完成。
YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第9张图片
注意:在网络状态不好的情况下容易出现环境安装包下载失败的情况,若一直下载失败请尝试更换时间段进行下载,实际测试在上午下载相较晚上与下午不容易出现网络中断或者下载失败的情况。

2.3 更换国内apt源

刷机完成之后,更换国内apt源,这里要注意TX2要更新的是ARM的源,不要使用pc的,否则会报错
替换/etc/lib/apt/sources.list改为国内源,要注意将原文件备份
将原始文件内容替换为下面的即可

  1. 备份原始sources.list文件
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
  1. 打开并编辑sources.list文件,替换为如下源
sudo vim /etc/apt/sources.list

TX2 Ubuntu16.04 arm版本

注意换源需要针对相应的Ubuntu版本

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe

TX2 Ubuntu18.04 arm版本

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
  1. 最后运行更新源
sudo apt-get update

2.4 安装setuptools

下载网址: setuptools

  1. 下载setuptools-41.0.1.zip
  2. 解压,cd进目录
sudo python3 [setup.py](http://setup.py/) install

2.5 安装pip

下载网址:pip

  1. 下载pip-19.2.1.tar.gz
  2. 解压,cd进目录
sudo python3 [setup.py](http://setup.py/) install

安装好了pip和pip3
临时使用pip源:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

2.6 安装cmake

sudo apt-get install python-dev
sudo pip3 install utils
sudo apt remove cmake
sudo apt purge --auto-remove cmake
version=3.12
build=3
mkdir ~/Downloads/temp
cd ~/Downloads/temp
wget https://cmake.org/files/v$version/cmake-$version.$build.tar.gz
tar -xzvf cmake-$version.$build.tar.gz
cd cmake-$version.$build
./bootstrap
make -j4
sudo make install

查看是否安装成功:

cmake --version

2.7 安装谷歌拼音输入法(可省)

  1. 指令安装:
sudo apt-get install fcitx-googlepinyin
  1. 在settings>language support里将keyboard input method system 设置为fcitx:
  2. 在状态栏右上角输入法设置中选择 Configure,添加输入法注意要取消2中的勾选

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第10张图片

  1. 选中Google pinyin为默认输入法之后重启设备
reboot

2.8 安装jtop查看CPU、内存、GPU以及安装环境详情

  1. 安装方法:
sudo -H pip install jetson-stats
  1. 使用方法:
jtop

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第11张图片
YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第12张图片

2.9 功率模式

TX2共有5种功率模式:

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第13张图片

其中最high的Mode 0是其的最佳性能模式。注意实际过程中是否性能全开

查看当前设备模式:sudo nvpmodel -q verbose

切换到性能模式:sudo nvpmodel -m 0

小风扇转起来:cd /usr/bin/ & ./jetson_clocks

参考:关于TX2-压力测试CPU、GPU100%运行,及FPGA监控温度

需要注意MAXN是最大火力,但是实际测试中2颗Denver的芯片没有动!

2.10 各种软件下载

NVIDIA Jetson TX2 ARM64安装软件教程_帕帕尼的博客-CSDN博客

sudo dpkg -i 安装包名

安装vscode 先去vscode官网的下载页面下载ARM64版本的.deb安装包

2.11 运行samples程序

下面进入的文件夹按照你所安装的cuda和tensorRT而定

  • 海洋
cd /usr/local/cuda-10.0/samples/5_Simulations/oceanFFT & sudo make & ./oceanFFT
  • 设备
cd /usr/local/cuda/samples/1_Utilities/deviceQuery & sudo make & ./deviceQuery

更多例程使用参见:https://cloud.tencent.com/developer/article/1400032

3 部署YOLOv4

3.1 下载源码

可以先创建一个项目文件夹

cd ~
mkdir project
cd project
**git clone https://github.com/AlexeyAB/darknet.git yolo4**
cd yolo4

具体可参见:https://github.com/AlexeyAB/darknet

出现BUG,解决办法如下:

问题描述: git clone的时候,报错gnutls_handshake() failed: The TLS connection was non-properly terminated.

原因: 代理设置出错

解决方案: 重置代理

git config --global --unset https.https://github.com.proxy git config --global --unset http.https://github.com.proxy

若需使用代理,http协议和socket协议的配置分别如下,以8080端口为例:

http
git config --global http.https://github.com.proxy http://127.0.0.1:7890
git config --global https.https://github.com.proxy https://127.0.0.1:7890
socket
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

3.2 配置Makefile文件

Makefile文件做一个复习补充

针对每一行代码的意思都做一个扩展注释补充说明

GPU

什么是CUDA?(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。

什么是CUDNN?NVIDIA cuDNN是用于深度神经网络的GPU加速库。参考资料

OPENCV设置

首先是OpenCV配置,如果要求使用板载摄像头,是必须要有OpenCV3.4版本以上的,而且要有gstreamer等一系列摄像头支持的依赖。TX2原本装有CV2.4的版本,但是多个OpenCV版本共存是非常危险的,你自己都不知道import的是哪一个,你的TX2也不知道。所以首先先要删除以前版本然后安装就结束了。参考链接

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第14张图片
此处的ARCH的配置可以在下面的注释中找到,这是针对TX2的配置,将之粘贴上去,然后将先前的注释掉就可以了。

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO_第15张图片
NVCC的路径需要自己找,可以使用如下的命令:

sudo find /usr -iname "nvcc"

然后再把该路径赋值给NVCC。

nvcc是什么?

nvcc其实就是CUDA的编译器,可以从CUDA Toolkit的/bin目录中获取,类似于gcc就是c语言的编译器。由于程序是要经过编译器编程成可执行的二进制文件,而cuda程序有两种代码,一种是运行在cpu上的host代码,一种是运行在gpu上的device代码,所以nvcc编译器要保证两部分代码能够编译成二进制文件在不同的机器上执行。

3.3 编译

在yolo4目录下进行编译工作。

对于编译这一步的理解(忘了,复习一下)以及代码的含义

sudo make -j8

make -j命令扩展

注意:每次修改完makefile都要重新Make一下才能生效。

编译时,比如cpu是i7-8700,是12线程的6核的,所以使用指令j12,每次使用make指令时都要加上j12,会加快编译速度。

3.4 下载权重文件

这里的权重文件指的是什么?

权重文件保存的就是训练好的网络各层的权值,也就是通过训练集训练出来的。训练好之后,应用时只要加载权值就可以,不再需要训练集了。

#yolov4-tiny.weights
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights
#yolov4.weights
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4.weights

注意:需要在yolo4目录下进行。

3.5 运行测试(yolov4 and yolov4-tiny)

工业级别的目标检测关注的不仅仅是精度,还有速度,能达到实时是最理想状态,一般来讲,目标检测实时大于12.5fps能被认为是实时。

这里测试的时候是什么物体都能检测吗?yolov4训练的时候用了多少标签?

'person',
'bicycle',
'car',
'motorcycle', 
'airplane',
'bus',
'train', 
'truck',
'boat', 
'traffic light', 
'fire hydrant', 
'stop sign', 
'parking meter', 
'bench', 
'bird', 
'cat', 
'dog', 
'horse', 
'sheep', 
'cow', 
'elephant', 
'bear', 
'zebra', 
'giraffe', 
'backpack', 
'umbrella', 
'handbag', 
'tie', 
'suitcase', 
'frisbee', 
'skis', 
'snowboard', 
'sports ball', 
'kite', 
'baseball bat', 
'baseball glove', 
'skateboard', 
'surfboard', 
'tennis racket', 
'bottle', 
'wine glass', 
'cup', 
'fork', 
'knife', 
'spoon', 
'bowl', 
'banana', 
'apple', 
'sandwich', 
'orange', 
'broccoli', 
'carrot', 
'hot dog', 
'pizza', 
'donut', 
'cake', 
'chair', 
'couch', 
'potted plant', 
'bed', 
'dining table', 
'toilet', 
'tv', 
'laptop', 
'mouse', 
'remote', 
'keyboard', 
'cell phone', 
'microwave', 
'oven', 
'toaster', 
'sink', 
'refrigerator', 
'book', 
'clock', 
'vase', 
'scissors', 
'teddy bear', 
'hair drier', 
'toothbrush'

COCO数据集的简单介绍

其中种类包含在路径为:yolo4/cfg/coco.names

Test1:测试图片

./darknet detector test cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg 
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg

Test2:测试视频

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/sample.mp4
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4-tiny.weights data/sample.mp4
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights data/sample.mp4

这里有一个小错误,第二行不是tiny

并且运行第一个tiny的时候出现bug,暂未调通

Test3:实时测试板载摄像头 (CSI摄像头实时检测)

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=30/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink"
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=30/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink"

使用正确的管道
GStreamer使用管道(pipelines)进行配置,使用高效的gstreamer管道可以使CSI获得高质量性能,以下为常用的一条管道:

nvcamerasrc ! video/x-raw(memory:NVMM), width=1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1 ! nvvidconv flip-method=2 ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink

这里非常重要的部分是video/x-raw, format=(string)BGRx ! videoconvert ! video /x-raw, format=(string)BGR,它确保来自CSI相机的原始视频转换为BGR色彩空间。在OpenCV和许多其他程序里,图像都是按照BGR格式存储。通过图像管道预转换为BGR,在TX2上,我们需要确保使用硬件模块来转换图像而不是CPU。在实验中中,如果不使用转换的管道会导致性能严重的下降,在TX2上获取1080p视频的最高速度只有10fps。

经常使用的命令行工具
gst-launch
可以使用gst-launch-1.0 运行GStreamer管道。

示例1:查看相机的1080p视频

gst-launch-1.0 nvcamerasrc ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)60/1' ! nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)I420' ! nvoverlaysink -e

示例2:查看相机的1080p视频并将真实的fps输出到控制台。

gst-launch-1.0 nvcamerasrc ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)60/1' ! nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)I420' ! fpsdisplaysink text-overlay=false -v

gst-inspect
可以使用gst-inspect-1.0来检查管道元素

例如:检查CSI摄像头接口的功能。

gst-inspect-1.0 nvcamerasrc

最需要注意的是:

  • 在编译OpenCV之前要把TX2自带的 OpenCV4Tegra 删除,否则会出现兼容性问题
  • 在编译安装OpenCV的时候, 需要在编译选项中打开gstreamer -> WITH_GSTREAMER=ON
  • 建议通过命令行参数使用,通过传入video file用pipeline

Test4:实时检测usb摄像头

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights  -c 1
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights  -c 1

如果你有多个摄像头,可以使用-c 参数指定使用哪一个摄像头

如何调试USB摄像头的分辨率

ls /dev/video*

/dev/video0 是 TX2 开发板上自带的 CSI 摄像头,/dev/video1 就是刚连接上的USB摄像头了。

如果没法通过命令lsusb检测到设备,可能是驱动没安装,进行内核编译增加UVC支持,具体参考此链接

**!!!**在OpenCV和许多其他程序里,图像都是按照BGR格式存储。如果不转换,后面无法使用。通过图像管道预转换为BGR,我们确保使用这些硬件模块来转换图像而不是CPU。如果不使用转换的管道会导致性能严重的下降,在TX2上1080p视频的最高速度只有10fps。

这里不仅仅指的是USB,也包括CSI摄像头也需要通道转换。

USB的最大问题是带宽处理能力。USB 3.0可以推送5Gbps,技术上足以接受60 fps/1080p或20fps/4K(3840p)未压缩的视频流。但是,这仅仅基于带宽,并没有揭示处理视频时额外处理和内存管理瓶颈的真相。 例如,See3CAM_CU130 USB 3.0相机应该可以达到60fps 1080p,但在TK1上真测结果,只能支持18 fps/1080p压缩格式,而未压缩的格式只有1fps。虽然在计算性能更强的机器上性能会更好,但这是问题的根源。
相反,Jetson TX1和TX2支持6个专用的MIPI CSI-2摄像机端口,每通道(lans)带宽可达2.5 Gb/s,双图像服务处理器(ISP)提供1.4 Gigapix/s处理能力,换句话说,它具有三个4k摄像机(或者六个30fps/1080p相机)带宽。当然,带宽并非全部,因为这些图像需要移动和处理,但通过使用硬件视觉管道,图像可以跳过加载到DRAM中,并通过独立于主CPU处理视频来减少CPU负载。根据我自己的经验,通过利用TX2上的这些硬件功能,我能够以接近20 fps速度运行4k视频。这就是为什么视频可以通过CSI摄像头如此高效地工作 - 专用于视频的独立硬件,就像GPU专门用于3D图形一样。

安装应用程序显示摄像头捕捉到的视频 :

1)使用应用程序camorama 输入命令:sudo apt-get install camorama 安装完成后,在终端中输入命令:camorama,即可显示出视频信息;或在菜单“应用程序”中可以打开程序。

2)使用应用程序茄子(cheese) 输入命令:sudo apt-get install cheese 装好后,用命令:cheese,即可打开。(测试有效)

指定摄像头1 cheese -d /dev/video1

最终的解决办法:

自定义usb摄像头的resolution:

In the darknet/src/ folder is a file named "image_opencv.cpp". At lines 597 and 598 you will find the following 2 commented commands:

//cap->set(CV_CAP_PROP_FRAME_WIDTH, 1280);
//cap->set(CV_CAP_PROP_FRAME_HEIGHT, 960);

After trying out these commands a lot more errors showed up, this is due to yolov4 (and my install) using OpenCV 4.1.1. Which has a different syntax. Your resolution should change to 1920x1080 if you replace the two aforementioned commands with these:

cap->set(cv::CAP_PROP_FRAME_WIDTH, 1920);
cap->set(cv::CAP_PROP_FRAME_HEIGHT, 1080);

Notice that the comment slashes have been removed as to activate the commands.

以上完成之后,记得要重新编译,特别注意改动后代码的变化!!!

参考链接

  • 网上的资料显示:有人能用webcamera跑到30帧 链接

现在的疑问是,摄像头到tx2的信号传输,是一直都是摄像头的最大分辨率吗?

就算用opencv改的分辨率很有可能也只是设置了接收到的图像的大小,但其实从摄像头到板子的数据还是按照最大的分辨率在传输,所以才会出现这么卡的情况。

  • 如何在opencv代码中设置视频格式和分辨率

    参考链接

Python OpenCV设置摄像头分辨率

  • 另外找到一种可以用手机摄像头的方式

Droidcam ip摄像头

7. 使用网络摄像头(手机)之一

可以WiFi连接摄像头测试,但具体效果怎么样不知道,需要实际自己测试

Test5:rstp实时检测

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights rstp://admin:[email protected]/0
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights rstp://admin:[email protected]/0

4 小结

这是很早之前在tx2板子上部署yolov4的时候做的一点笔记,所有的部署都在板子上实际运行过,所以问题不大,供大家参考,也有内容参考来自网络,已经尽量标出了参考的来源,如有遗漏引用未标明或者侵权部分,请联系,也欢迎大家交流

Reference

  1. NVIDIA Jetson Tx2从刷机到Yolo部署
  2. NVIDIA Jetson TX2入门傻瓜教程:带你30分钟跑完这几个经典程序
  3. NVIDIA Jetson TX2 上手指南
  4. YOLOv4直接部署到TX2上
  5. TX2利用yolov4实时目标检测
  6. YOLOv3 Darknet安装编译与训练自己的数据集

你可能感兴趣的:(YOLO部署实战,YOLO,NVIDIA,Jetson,Tx2)