NVIDIA Jetson 是NVIDIA为新一代自主机器设计的的嵌入式系统,是一个AI平台,它的优势就是可以覆盖不同领域、不同行业。目前Jetson产品线已经有四个产品系列,包括Jetson Nano、Jetson TX2、Xavier NX和AGX Xavier。四个产品系列的定位不同:
Jetson TX2 是NIVDIA瞄准人工智能在Jetson TK1和TX1推出后的升级,适用于各种终端服务的基于NVIDIA Pascal™架构的AI单模块超级计算机。GPU和CPU都进行了升级,内存增加到8GB、存储增加到32GB,支持Wifi和蓝牙,编解码支持H.265,体型小巧,资源配置丰富且强大。
具体性能指标与和NVIDIA相关系列产品的对比图如下:
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
统一计算设备架构(Compute Unified Device Architecture, CUDA),是由NVIDIA推出的通用并行计算架构。解决的是用更加廉价的设备资源,实现更高效的并行计算。
CUDA是利用GPU流处理器的特性,对矩阵运算这种做任务分解,分解的任务同时进行运算,再合并从而加速计算。CUDA提供给编程人员这种和GPU硬件沟通的接口。
GPU 最初只是显卡的核心部件。当时显卡主要是用来显示的。主要运算都是图像方面的,专用性很高,有点 DSP 的味道。但NVIDIA发现 GPU 稍作改造可以做很多科学计算相关的事情(图像上的运算很多是矩阵运算,毕竟万物皆矩阵),于是发明了 CUDA。经过几年的完善,不仅在 GPU 驱动上附加很多库,还提出了 GPGPU的概念(面向通用计算的GPGPU)。这时反应过来的AMD和Intel已经算是掉队了,AMD推出OpenCL,Intel推出众核(>=60)处理器 Xeon Phi,这些不仅不好用而且对 GPU 高性能计算能力的使用效率都没 CUDA 高。
毕竟绝大多数科研工作者都希望性能好,稳定可靠,不出幺蛾子,花钱买舒心,自然就不会去贪小便宜买个不好用的了。
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 计算、多媒体处理等众多功能。
实际测试中,这个接口不能外接DP的显示器(主机HDMI接显示器DP口本身不支持),通过转接接VGA也不行,会出现各种奇怪的BUG,所以最保险的就是直连一个HDMI的显示器
按上图所示插上显示器,通上电源,按下开机键之后,稍等片刻,熟悉的ubuntu命令行界面就呈现出来了,此时用户界面下有一个名为NVIDIA-INSTALLER
的文件夹,如果想使用图形界面,可以运行其下的installer.sh
进行用户图形界面的安装,之后重启机器便可以进行使用。
执行以下命令:
cd NVIDIA-INSTALLER & sudo ./installer & sudo reboot
在对板子进行简单配置之后,我们使用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提供端到端的开发环境设置解决方案。
系统需求
SDK Manager下载安装
sudo apt install ./sdkmanager_[version].[build#].deb
按实际的下载的deb文件的版本来定
sdkmanager
命令启动SDK管理器。
如果连接了Jetson TX2设备,SDK管理器将在目标硬件下拉列表中自动选择该设备。如果设备没有被自动检测到,请单击刷新,或者尝试更换USB数据线。
在目标操作系统面板中,选择操作系统和JetPack版本。注意:若无需在Ubuntu主机上安装项目可取消勾选Host Machine,推荐取消,不影响TX2刷机和使用。
TX2进入RCM模式可选自动与手动,若自动进入失败推荐进入手动安装模式。
恢复模式操作如下:
a. 确认已经连接电源适配器且处于关机状态
b. 按一下power键开机(按下后松开,稍微有一定的按键时长)
c. 按下REC(RECOVERY FORCE)不要松开
d. 再按下RST(reset按下松开,稍微有一定的按键时长)
e. REC保持两秒后松开按下并松开TX2的POWER键S4
在下载安装完成后Jetson TX2设备环境即搭建完成。
注意:在网络状态不好的情况下容易出现环境安装包下载失败的情况,若一直下载失败请尝试更换时间段进行下载,实际测试在上午下载相较晚上与下午不容易出现网络中断或者下载失败的情况。
刷机完成之后,更换国内apt源,这里要注意TX2要更新的是ARM的源,不要使用pc的,否则会报错
替换/etc/lib/apt/sources.list改为国内源,要注意将原文件备份
将原始文件内容替换为下面的即可
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
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
sudo apt-get update
下载网址: setuptools
sudo python3 [setup.py](http://setup.py/) install
下载网址:pip
sudo python3 [setup.py](http://setup.py/) install
安装好了pip和pip3
临时使用pip源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
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
sudo apt-get install fcitx-googlepinyin
reboot
sudo -H pip install jetson-stats
jtop
TX2共有5种功率模式:
其中最high的Mode 0
是其的最佳性能模式。注意实际过程中是否性能全开
查看当前设备模式:sudo nvpmodel -q verbose
切换到性能模式:sudo nvpmodel -m 0
小风扇转起来:cd /usr/bin/ & ./jetson_clocks
参考:关于TX2-压力测试CPU、GPU100%运行,及FPGA监控温度
需要注意MAXN是最大火力,但是实际测试中2颗Denver的芯片没有动!
NVIDIA Jetson TX2 ARM64安装软件教程_帕帕尼的博客-CSDN博客
sudo dpkg -i 安装包名
安装vscode 先去vscode官网的下载页面下载ARM64版本的.deb安装包
下面进入的文件夹按照你所安装的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
可以先创建一个项目文件夹
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'
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也不知道。所以首先先要删除以前版本然后安装就结束了。参考链接
此处的ARCH的配置可以在下面的注释中找到,这是针对TX2的配置,将之粘贴上去,然后将先前的注释掉就可以了。
sudo find /usr -iname "nvcc"
然后再把该路径赋值给NVCC。
nvcc是什么?
nvcc其实就是CUDA的编译器,可以从CUDA Toolkit的/bin目录中获取,类似于gcc就是c语言的编译器。由于程序是要经过编译器编程成可执行的二进制文件,而cuda程序有两种代码,一种是运行在cpu上的host代码,一种是运行在gpu上的device代码,所以nvcc编译器要保证两部分代码能够编译成二进制文件在不同的机器上执行。
在yolo4目录下进行编译工作。
对于编译这一步的理解(忘了,复习一下)以及代码的含义
sudo make -j8
make -j命令扩展
注意:每次修改完makefile都要重新Make一下才能生效。
编译时,比如cpu是i7-8700,是12线程的6核的,所以使用指令j12,每次使用make指令时都要加上j12,会加快编译速度。
这里的权重文件指的是什么?
权重文件保存的就是训练好的网络各层的权值,也就是通过训练集训练出来的。训练好之后,应用时只要加载权值就可以,不再需要训练集了。
#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目录下进行。
工业级别的目标检测关注的不仅仅是精度,还有速度,能达到实时是最理想状态,一般来讲,目标检测实时大于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
./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
./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,暂未调通
./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
最需要注意的是:
./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.
以上完成之后,记得要重新编译,特别注意改动后代码的变化!!!
参考链接
现在的疑问是,摄像头到tx2的信号传输,是一直都是摄像头的最大分辨率吗?
就算用opencv改的分辨率很有可能也只是设置了接收到的图像的大小,但其实从摄像头到板子的数据还是按照最大的分辨率在传输,所以才会出现这么卡的情况。
Python OpenCV设置摄像头分辨率
Droidcam ip摄像头
7. 使用网络摄像头(手机)之一
可以WiFi连接摄像头测试,但具体效果怎么样不知道,需要实际自己测试
./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
这是很早之前在tx2板子上部署yolov4的时候做的一点笔记,所有的部署都在板子上实际运行过,所以问题不大,供大家参考,也有内容参考来自网络,已经尽量标出了参考的来源,如有遗漏引用未标明或者侵权部分,请联系,也欢迎大家交流