NVIDIA TensorRT使用记录
1. 准备工作
1) Pipeline
- train: 在Host PC的GPU上训练
- test/deployment: 在TX1/TX2上部署使用
2) 主机部署步骤
- Running JetPack on the Host
$ ./JetPack-L4T-3.0-linux-x64.run
- Installing NVIDIA Driver on the Host
- Installing cuDNN on the Host
$ sudo dpkg -i libcudnn6_6.0.20-1+cuda8.0_amd64.deb
$ sudo dpkg -i libcudnn6-dev_6.0.20-1+cuda8.0_amd64.deb
- Installing NVcaffe on the Host
$ sudo apt-get install --no-install-recommends build-essential cmake git gfortran libatlas-base-dev libboost-filesystem-dev libboost-python-dev libboost-system-dev libboost-thread-dev libgflags-dev libgoogle-glog-dev libhdf5-serial-dev libleveldb-dev liblmdb-dev libprotobuf-dev libsnappy-dev protobuf-compiler python-all-dev python-dev python-h5py python-matplotlib python-numpy python-opencv python-pil python-pip python-protobuf python-scipy python-skimage python-sklearn python-setuptools
$ sudo pip install --upgrade pip
$ git clone -b caffe-0.15 http://github.com/NVIDIA/caffe
$ cd caffe
$ sudo pip install -r python/requirements.txt
$ mkdir build
$ cd build
$ cmake ../ -DCUDA_USE_STATIC_CUDA_RUNTIME=OFF
$ make --jobs=4
$ make pycaffe
- Installing DIGITS on the Host
NVIDIA DIGITS is a Python-based web service which interactively trains DNNs and manages datasets.
$ sudo apt-get install --no-install-recommends graphviz python-dev python-flask python-flaskext.wtf python-gevent python-h5py python-numpy python-pil python-pip python-protobuf python-scipy python-tk
$ git clone http://github.com/nvidia/DIGITS
$ cd DIGITS
$ sudo pip install -r requirements.txt
安装完以后,运行 ./digits-devserver就可以打开DIGITS, 但是, 什么都不会发生, 我还以为会自动打开网页啥的, 这只是打开服务器, 要在浏览器中输入网址:http://localhost:5000/ 自己手动打开.
3) TX1/TX2部署步骤
- Cloning the Repo
$ sudo apt-get install git cmake
$ git clone http://github.com/dusty-nv/jetson-inference
- compile
注意: 在cmake时,会调用脚本CMakePrebuild.sh去下载一些依赖的包和训练好的网络, 那些训练好的网络需要翻墙下载, 可以自己下载完以后解压到jetson-inference/data/networks目录下.
$ cd jetson-inference
$ mkdir build
$ cd build
$ cmake ..
$ make
- 测试编译是否成功, 运行一个classification的栗子, 如果output_0.jpg左上角有识别结果, 说明编译成功,能够正常使用了.
$ cd jetson-inference/build/aarch64/bin
> ./imagenet-console orange_0.jpg output_0.jpg
2. DIGITS训练自己的模型并使用
1) 训练步骤
- 下载/构建数据集.
数据集的文件夹格式为: 根目录下有train(训练集),val(验证集),test(测试集)三个文件夹, 每个文件夹下面有images和labels两个子文件夹. images下是图片数据(.png), labels下是标签数据(.txt), 每个图片a.png都有对应的一个标签a.txt. 用的kitti的数据, 标签数据的格式采用kitti的数据格式
验证集与测试集的区别?
验证集是在训练时使用, 用来调节网络中的超参数. 测试集不参与训练, 在整个网络训练完成后来测试训练结果的性能.
- 打开DIGITS
在jetson-inference目录下运行digits-devserver打开DIGITS服务器, 然后在浏览器中输入 http://localhost:5000/ 进入DIDITS客户端. - 导入DIGITS数据集
参照git上的readme, 在datasets标签页导入刚才的数据集.
导入数据集时, 图像的尺寸是可以改的, 用640480的图片做过训练,把尺寸改成640480, 是可以用的.
- 训练模型
参照readme构建模型, 教程中是用的custom模型, 自己写入model.prototxt描述网络的结构, 然后在pretrained models填入googlenet的caffemodel, 应该是使用之前已经训练过的权值. 创建完以后,就自动训练了, 然后就等待训练完成.
训练的过程中需要看mAP是否在增加, 如果一直是0, 那肯定是有问题的, 应该停掉训练排查问题
- 测试模型
训练完成后, 在标签页可以选择测试图片或测试数据集.
- **遇到的坑: 在自己构建数据集训练前, 一定要确认一下数据标注没问题, **不然就白训练了. 训练一次少说也要半天, 这个确认还是很有必要.
- 训练过程中是可以用中间结果去测试单张图片(不能测试多张,因为测试多张需要用GPU, 而训练过程中GPU资源被占用掉了), 在前期经常输入一些图像看测试结果, 这个步骤很重要, 能够在早期发现训练任务是不是有问题,从而避免了花了几天时间训练完发现输入错了的尴尬, 如果用train的图像取做test都啥都检测不出来, 说明肯定是训练任务有问题, 比如label错了什么的.
- 一般趋势是: 模型在刚开始是误检比较多, 随着epoch增加, 误检越来越少, bbox越来越准
2) TX2上跑自己训练好的模型
当DIGITS训练好模型后, 用DIGITS测试过模型没问题后, 可以把模型放到tx2上使用了,步骤如下:
- 选择最后一个epoch然后点download model, 会下载一个压缩包, 名字类似于20170801-222946-5eb0_epoch_100.0.tar.gz.将该压缩包用U盘,网线等任何方式拷贝到tx2上
- 将压缩包解压到jetson-inference/data/networks目录下, 可以看到解压后里面有好几个文件, 其中deploy.prototxt是描述网络结构的, snapshot_iter_37100.caffemodel(名字不一定完全一样)是网络的权值, 其他的还不知道是啥
- 运行处理离线图片的程序, input_blob, output_cvg, output_bbox貌似可以不要设, 只要设置一下模型结果的prototxt文件和模型权值caffemodel文件就行.
./detectnet-console dog_0.jpg output_0.jpg
--prototxt=<你的模型目录>/deploy.prototxt
--model=<你的模型目录>/snapshot_iter_38600.caffemodel
--input_blob=data \
--output_cvg=coverage
--output_bbox=bboxes
- 运行在线程序(需要连接相机): 如果是用USB相机, 需要改下源码, 打开jetson-inference/detectnet-camera/detectnet-camera.cpp, 把DEFAULT_CAMERA宏从-1改成0(如果0不行再改成1依次加1试吧, 最好先用cheese确认USB相机能成功连上)
./detectnet-camera
--prototxt=<你的模型目录>/deploy.prototxt
--model=<你的模型目录>/snapshot_iter_38600.caffemodel
3 在Host PC上安装jetson-inference
操作环境: Host PC x86_64平台, Ubuntu14.04, GPU: Geforce GTX 1050, cuda8.0.
默认已经装好了NVIDIA驱动和CUDA, 可参见之前的主机部署.
1) 安装tensorRT
进入官网https://developer.nvidia.com/tensorrt, 点击download下载, 需要注册用户并登录才能下载. 登录后, 就会看到下载连接和安装提示, 选择Debian安装, 提示如下.
![](./Screenshot from 2017-09-20 11:38:32.png)
根据操作系统14.04和CUDA版本8.0选择第二个package. 然后根据提示安装即可.
2) 安装jetson-inference
- 先下载jetson-inference代码, 代码在x86平台不能直接编译, 需要做一些修改
- 把CMakePrebuild.sh中下面两行注释掉:
# sudo rm /usr/lib/aarch64-linux-gnu/libGL.so
# sudo ln -s /usr/lib/aarch64-linux-gnu/tegra/libGL.so /usr/lib/aarch64-linux-gnu/libGL.so
或者可以干脆不运行这个脚本, 这个脚本主要是apt-get安装依赖库和wget下载网络模型. 自己apt-get安装,自己下模型也是一样的.
- 修改CMakelist.txt, 增加x86平台的GPU架构, 我的GPU是GTX1050, 架构是61, 所以在第32~38中, 增加一行. 如果是别的GPU,可以去https://developer.nvidia.com/cuda-gpus上查看, 架构就是Compute Capability, 如果Compute Capability是6.1那就写61,如果Compute Capability是5.2,那就写52.
set(
CUDA_NVCC_FLAGS
${CUDA_NVCC_FLAGS};
-O3
-gencode arch=compute_53,code=sm_53
-gencode arch=compute_62,code=sm_62
-gencode arch=compute_61,code=sm_61 #这是我增加的行
)
- 修改CMakelist.txt, 在上面文本的后面添加一行, 以使CUDA支持c++11
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};--disable-warnings;--ptxas-options=-v;-use_fast_math;-lineinfo;-std=c++11)
- 编译安装, 参见1-3)
网友评论