使用TensorRT和Jetson TX1 / TX2部署深度学习推理网络和深度视觉原语的指南 学习一。

使用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按钮开始训练

图片描述



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值