使用TensorRT和Jetson TX1 / TX2部署深度学习推理网络和深度视觉原语的指南 学习一。
感谢Dustin Franklin,NVIDIA技术大牛的分享。
Classifying Images with ImageNet
TensorRT下载地址:https://developer.nvidia.com/nvidia-tensorrt-download
TesnsoRT介绍文档:https://devblogs.nvidia.com/tensorrt-3-faster-tensorflow-inference/
TensorRT开发者指南:http://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html
TensorRT样例代码:http://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#samples
这里有多种类型的深度学习网络可以利用,包括识别,检测/定位,和分割。第一个在本教程中重点出现的是利用’imageNet’来实现的图像识别功能,它是被训练来识别相似物体的。
imageNet会输入一个图片,然后输出这张图片中的物体是各个类别的概率。上面step 2中下载的模型,是利用ImageNet数据库(1000种类别)训练的AlexNet和GoogleNet的网络模型。作为样例,它提供了一个命令行的接口(imagenet-console) 和一个实时的摄像头程序(imagenet-camera)。
Using the Console Program on Jetson
首先,尝试使用imagenet-console程序在测试图片上试验一下图像识别功能。它会加载一张图片,使用TensorRT和imageNet的类别来进行推演。推演完成后,他会把推演的结果(类别信息或者编号)加载到图片上(类似水印的方式),并且将输出结果保存。
在编译好jetson-inference之后,进入aarch64/bin这个文件夹:
$ cd jetson-inference/build/aarch64/bin
- 1
然后用imagenet-console来识别样例图片。imagenet-console允许两个命令行参数:输入图片的路径和输出图片(会加盖类别信息的水印)的路径
$ ./imagenet-console orange_0.jpg output_0.jpg
- 1
$ ./imagenet-console granny_smith_1.jpg output_1.jpg
- 1
接下来,我们将会利用imageNet来识别一个基于Jetson板载摄像头的实时视频
Running the Live Camera Recognition Demo
就像上面最后一个例子,实时图像识别Demo是在/aarch64/bin的下面的一个叫做imagenet-camera的程序。通过设置参数,可以利用googleNet/Alexnet和TensorRT来对实时视频流进行识别。
$ ./imagenet-camera googlenet # to run using googlenet
$ ./imagenet-camera alexnet # to run using alexnet
- 1
- 2
在OpenGL的窗口最上面的Title Bar里面,会打印出当前视频识别的FPS(frames per second),识别类别的名字和识别类别的置信值(是某种类别的可能性或者概率)。系统默认这个程序可以识别最多1000种不同种类的物体。具体原因是这里面用的GoogleNet和AlexNet都是基于ILSVRC12 ImageNet的数据库训练的,这个数据库包含了1000种不同的物体。您可以在这里找到每一张图片对应的1000种不同物体的名字。
注:系统默认中Jetson的板载CSI摄像头将会作为输入视频。如果你想用usb 摄像头来代替它,你可以在imagenet-camera.cpp中改变DEFAULT_CAMERA的值。当前的测试是利用罗技 C920来做的。
Re-training the Network with DIGITS
我们刚才用过的下载好的GoogleNet和AlexNet的模型,是基于已经标记好的ImageNet ILSVRC12训练好的。
.
如果来识别新的目标类别,您可以使用DIGITS来基于新的数据重新训练一个网络模型。您还可以以不同的方式组织现有的类,包括将多个子类组合成一个。例如在本教程中,我们将采用1000个类别中的230个,将这些类别分为12个班级,并重新训练网络。
接下来我们来下载ILSVRC12的图片来训练,或者你可以把自己的数据库放到Image Folder中来替代。
Downloading Image Recognition Dataset
一个图像数据集包含了大量的图片,他们会根据不同的类别存放在不同的文件夹中。ILSVRC12数据集被用于训练默认的GoogleNet和AlexNet模型。它大概有100GB的大小,包含1000种不同类别的1百万张图片。您可以利用imagenet-download.py这个脚本来下载数据集到您的DIGITS中。如果想下载这个数据集,首先要确认您的DIGITS服务器有足够的空间(120GB以上的预留空间),然后再您想要下载的服务器上运行以下命令:
$ wget --no-check-certificate https://nvidia.box.com/shared/static/gzr5iewf5aouhc5exhp3higw6lzhcysj.gz -O ilsvrc12_urls.tar.gz
$ tar -xzvf ilsvrc12_urls.tar.gz
$ wget https://rawgit.com/dusty-nv/jetson-inference/master/tools/imagenet-download.py
$ python imagenet-download.py ilsvrc12_urls.txt . --jobs 100 --retry 3 --sleep 0
- 1
- 2
- 3
- 4
上面的命令会下载图片的URLs地址的列表。
注:运行这个下载图像数据集的脚本时间可能很长(100GB的文件,下载也许会过夜),所以请确保网络的通畅
下载脚本会在对应的子文件夹里面存储这些图片。每一类图片将会存在对应的名字的文件夹下面,一共1000个文件夹对应ILSVRC12的每一个类。文件夹会以下面的形式组织起来:
n01440764/
n01443537/
n01484850/
n01491361/
n01494475/
...
- 1
- 2
- 3
- 4
- 5
- 6
这些8个数字的id用n作为前缀,每个类代表了相近类别的代号。每一类的名字你可以在ilsvrc12_synset_words.txt查看。举个例子:n01484850 great white shark
Customizing the Object Classes
我们上一步下载的数据库会用来训练默认的AlexNet和GoogleNet,它会分为1000个类,包括鸟类,水果,植物,鱼类,狗,猫科动物和交通工具等等。出于实践的目的,让我们考虑一下Google网模型的一个同类,该模型识别由最初的1000个类组成的十几个核心组(举个例子:把所有的不同的狗类,都算成狗一个类)。这12个核心组可能比1000个单独的同步集更实用,并且跨类组合可以获得更多的培训数据和更强的性能。
DIGITS中的数据要求存储在分层次的文件夹中,因此我们为每个核心组创建一个文件夹,并且对应每一个文件夹到之前下载的ILSVRC12的同步集中。DIGITS会自动组合来自顶层组下所有文件夹的图像。文件夹结构就像下面展示的,类名字后面括号里的数值代表包含的类的数量,括号里面箭头后面的数值代表同步集合每一个类对应的编号,
‣ ball/ (7)
• baseball (→n02799071)
• basketball (→n02802426)
• soccer ball (→n04254680)
• tennis ball (→n04409515)
• ...
‣ bear/ (4)
• brown bear (→n02132136)
• black bear (→n02133161)
• polar bear (→n02134084)
• sloth bear (→n02134418)
• bike/ (3)
• bird/ (17)
• bottle/ (7)
• cat/ (13)
• dog/ (122)
• fish/ (5)
• fruit/ (12)
• turtle/ (5)
• vehicle/ (14)
• sign/ (2)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
因为ILSVRC12中有太多了类别,为了方便大家生成目录结构和数据集路径链接,我们提供了一个脚本imagenet-subset.sh。在DIGITS服务器上执行以下命令:
$ wget https://rawgit.com/dusty-nv/jetson-inference/master/tools/imagenet-subset.sh
$ chmod +x imagenet-subset.sh
$ mkdir 12_classes
$ ./imagenet-subset.sh /opt/datasets/imagenet/ilsvrc12 12_classes
- 1
- 2
- 3
- 4
在这个例子中,会生成一个12个类的链接,第一个参数代表着之前步骤中下载的ILSVRC12的文件夹的路径。
Importing Classification Dataset into DIGITS
通过浏览器登陆上DIGITS,选择Dataset中右上角的New Dataset中的Classification。
将图片路径设置为之前的12类数据集的文件夹路径,然后:
• 将for validation 设置为10
• Group Name设置为:ImageNet
• Dataset Name 设置为:ImageNet-ILSVRC12-subset
然后点击最下面的Create按钮开始创建数据库。数据集大小是20GB左右,根据电脑的IO性能,大概需要处理10~15分钟。接下来我们会创建模型并训练模型。
Creating Image Classification Model with DIGITS
当创建数据集完成,返回到DIGITS的主页中。选择Models,然后选择右上角的New Model,然后选择Classification来创建一个新的模型。
在后面的页面中,按照下面来设置:
• Select Dataset: ImageNet-ILSVRC12-subset
• Subtract Mean: Pixel
• Standard Networks: GoogleNet
• Group Name: ImageNet
• Model Name: GoogleNet-ILSVRC12-subset
选择一个GPU来训练,点击Create按钮开始训练