玩转Jetson Nano(四):TensorRT图像识别
- 前言
- TensorRT简介
- TensorRT搭建
- 安装所需的依赖
- 安装jetson-inference
- 配置cmake
- 下载所需的模型文件
- 编译
- 测试
- CSI摄像头实时图像识别
- 常见问题
- 参考文献
前言
- 本文是个人使用Jetson Nano的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。
- 更多精彩内容,可点击进入
玩转Jetson Nano专栏或我的个人主页查看
TensorRT简介
- NVIDIA TensorRT™是一个高性能深度学习推理平台,用于优化经过训练的深度学习模型以实现高性能推理。它包括深度学习推理优化器和运行时,可为深度学习推理应用程序提供低延迟和高吞吐量。在推理期间,基于TensorRT的应用程序比仅CPU平台的执行速度快40倍。
- 使用TensorRT,您可以优化在所有主要框架中培训的神经网络模型,以高精度校准低精度,最后部署到超大规模数据中心,嵌入式或汽车产品平台。
- TensorRT构建于NVIDIA的并行编程模型CUDA之上,使您能够利用CUDA-X AI中的库,开发工具和技术,为人工智能,自动机器,高性能计算和图形优化所有深度学习框架的推理。
- TensorRT为深度学习推理应用的生产部署提供INT8和FP16优化,例如视频流,语音识别,推荐和自然语言处理。降低精度推断可显着减少应用程序延迟,这是许多实时服务,自动和嵌入式应用程序的要求。
- 您可以将训练有素的模型从每个深度学习框架导入TensorRT。应用优化后,TensorRT选择特定于平台的内核,以最大限度地提高数据中心,Jetson嵌入式平台和NVIDIA DRIVE自动驾驶平台中Tesla GPU的性能。
- 为了在数据中心生产中使用AI模型,TensorRT推理服务器是一种容器化微服务,可最大化GPU利用率,并在节点上同时运行来自不同框架的多个模型。它利用Docker和Kubernetes无缝集成到DevOps架构中。
- 使用TensorRT,开发人员可以专注于创建新颖的AI驱动的应用程序,而不是用于推理部署的性能调整。
- 使用 TensorRT 的典型深度学习开发周期,如在下图所示。
TensorRT搭建
安装所需的依赖
sudo apt-get install libpython3-dev python3-numpy
sudo apt-get install git cmake
安装jetson-inference
git clone https://github.com/dusty-nv/jetson-inference
cd jetson-inference
git submodule update --init
配置cmake
mkdir build # 创建build文件夹
由于download-models.sh所需模型文件的下载链接为外网,国内网络无法访问,要编辑jetson-inference/CMakePreBuild.sh,把./download-models.sh和./install-pytorch.sh注释掉。 jetson-inference需要的模型文件另外下载,再传输到data/networks目录下。
vi CMakePreBuild.sh
cd build # 进入build
cmake ../ # 运行cmake,它会自动执行上一级目录下面的 CMakePreBuild.sh
下载所需的模型文件
下载地址 提取码:jsdm
cd Downloads
unzip jetson-inference-download-models.zip
mv ~/Downloads/jetson-inference-download-models/* ~/jetson-inference/data/networks/
cd ~/jetson-inference/data/networks/
ls
for tar in *.tar.gz; do tar xvf $tar; done
ls
编译
cd jetson-inference/build
# -j4 使用 4 个 CPU 核同时编译
make -j4
sudo make install
编译成功,会生成下列文件夹结构
build
├── aarch64
│ ├── bin
│ │ ├── images -> /home/ubuntu/jetson-inference/data/images
│ │ └── networks -> /home/ubuntu/jetson-inference/data/networks
│ ├── include
│ │ ├── jetson-inference
│ │ └── jetson-utils
│ └── lib
│ └── python
│ ├── 2.7
│ └── 3.6
├── CMakeFiles
│ ├── 3.10.2
│ │ ├── CompilerIdC
│ │ │ └── tmp
│ │ └── CompilerIdCXX
│ │ └── tmp
│ ├── CMakeTmp
│ ├── Export
│ │ └── share
│ │ └── jetson-inference
│ │ └── cmake
│ └── jetson-inference.dir
│ ├── c
│ ├── calibration
│ └── plugins
│ └── pose
│ └── trt_pose
│ └── parse
├── docs
│ └── CMakeFiles
├── examples
│ ├── CMakeFiles
│ ├── depthnet
│ │ └── CMakeFiles
│ │ └── depthnet.dir
│ ├── detectnet
│ │ └── CMakeFiles
│ │ ├── detectnet-camera.dir
│ │ ├── detectnet-console.dir
│ │ └── detectnet.dir
│ ├── imagenet
│ │ └── CMakeFiles
│ │ ├── imagenet-camera.dir
│ │ ├── imagenet-console.dir
│ │ └── imagenet.dir
│ ├── posenet
│ │ └── CMakeFiles
│ │ └── posenet.dir
│ └── segnet
│ └── CMakeFiles
│ ├── segnet-camera.dir
│ ├── segnet-console.dir
│ └── segnet.dir
├── python
│ ├── bindings_python_2.7
│ │ └── CMakeFiles
│ │ └── jetson-inference-python-27.dir
│ ├── bindings_python_3.6
│ │ └── CMakeFiles
│ │ └── jetson-inference-python-36.dir
│ ├── bindings_python_3.7
│ │ └── CMakeFiles
│ └── CMakeFiles
├── tools
│ ├── camera-capture
│ │ ├── camera-capture_autogen
│ │ │ ├── EWIEGA46WW
│ │ │ └── include
│ │ └── CMakeFiles
│ │ ├── camera-capture_autogen.dir
│ │ └── camera-capture.dir
│ │ └── camera-capture_autogen
│ ├── CMakeFiles
│ └── depth-viewer
│ └── CMakeFiles
└── utils
├── camera
│ └── camera-viewer
│ └── CMakeFiles
│ └── camera-viewer.dir
├── CMakeFiles
│ ├── Export
│ │ └── share
│ │ └── jetson-utils
│ │ └── cmake
│ └── jetson-utils.dir
│ ├── camera
│ ├── codec
│ ├── cuda
│ ├── display
│ ├── image
│ ├── input
│ ├── network
│ ├── threads
│ └── video
├── display
│ └── gl-display-test
│ └── CMakeFiles
│ └── gl-display-test.dir
├── python
│ ├── bindings_python_2.7
│ │ └── CMakeFiles
│ │ └── jetson-utils-python-27.dir
│ ├── bindings_python_3.6
│ │ └── CMakeFiles
│ │ └── jetson-utils-python-36.dir
│ ├── bindings_python_3.7
│ │ └── CMakeFiles
│ └── CMakeFiles
└── video
└── video-viewer
└── CMakeFiles
└── video-viewer.dir
测试
cd jetson-inference/build/aarch64/bin
./imagenet-console ./images/cat.jpg output.jpg
第一次执行需要等待一段时间,后面执行就会很快了。
CSI摄像头实时图像识别
cd jetson-inference/build/aarch64/bin
./imagenet-camera --network=googlenet # 使用googlenet运行
常见问题
注意:CSI摄像头会出现视频画面颠倒,可用以下方法设置修改。
cd ~/jetson-inference/utils/camera/
sudo vi gstCamera.cpp
进入文件之后,将
if( mOptions.flipMethod == videoOptions::FLIP_NONE )
mOptions.flipMethod = videoOptions::FLIP_ROTATA_180;
else if( mOptions.flipMethod = videoOptions::FLIP_ROTATA_180 )
mOptions.flipMethod = videoOptions::FLIP_NONE;
中的前三条语句注释掉,
//if( mOptions.flipMethod == videoOptions::FLIP_NONE )
//mOptions.flipMethod = videoOptions::FLIP_ROTATA_180;
//else if( mOptions.flipMethod = videoOptions::FLIP_ROTATA_180 )
mOptions.flipMethod = videoOptions::FLIP_NONE;
注释完成之后,保存并退出,然后对其进行编译即可。
cd ~/jetson-inference/build/
make
sudo make install
如果没报错,则编译成功。
参考文献
[1] Jetson Nano Developer Kit User Guide [2] TensorRT官方教程 [3] 官方Demo
- 更多精彩内容,可点击进入
玩转Jetson Nano专栏或我的个人主页查看