深度学习&计算机视觉系列---TensorRT&DIGITS(二)

Classifying Images with ImageNet

本文是从https://github.com/dusty-nv/jetson-inference翻译的,您可以在这里下载源码

这里有多种类型的深度学习网络可以利用,包括识别,检测/定位,和分割。第一个在本教程中重点出现的是利用’imageNet’来实现的图像识别功能,它是被训练来识别相似物体的。

imageNet会输入一个图片,然后输出这张图片中的物体是各个类别的概率。上面step2中下载的模型,是利用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

然后用imagenet-console来识别样例图片。imagenet-console允许两个命令行参数:输入图片的路径和输出图片(会加盖类别信息的水印)的路径

$ ./imagenet-console orange_0.jpg output_0.jpg

External Media

$ ./imagenet-console granny_smith_1.jpg output_1.jpg

External Media

接下来,我们将会利用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

在OpenGL的窗口最上面的TitleBar里面,会打印出当前视频识别的FPS(frames per second),识别类别的名字和识别类别的置信值(是某种类别的可能性或者概率)。系统默认这个程序可以识别最多1000种不同种类的物体。具体原因是这里面用的GoogleNet和AlexNet都是基于ILSVRC12 ImageNet的数据库训练的,这个数据库包含了1000种不同的物体。您可以在这里找到每一张图片对应的1000种不同物体的名字

注:系统默认中Jetson的板载CSI摄像头将会作为输入视频。如果你想用usb 摄像头来代替它,你可以在imagenet-camera.cpp中改变DEFAULT_CAMERA的值。当前的测试是利用罗技 C920来做的。

External Media

External Media

Re-training the Network with DIGITS

我们刚才用过的下载好的GoogleNet和AlexNet的模型,是基于已经标记好的ImageNet ILSVRC12训练好的。

.

如果来识别新的目标类别,您可以使用DIGITS来基于新的数据重新训练一个网络模型。您还可以以不同的方式组织现有的类,包括将多个子类组合成一个。例如在本教程中,我们将采用1000个类别中的230个,将这些类别分为12个班级,并重新训练网络。

接下来我们来下载ILSVRC12的图片来训练,或者你可以把自己的数据库放到ImageFolder中来替代

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/st … p3higw6lzhcysj.gz-O ilsvrc12_urls.tar.gz

$ tar -xzvf ilsvrc12_urls.tar.gz

$ wgethttps://rawgit.com/dusty-nv/jets … magenet-download.py

$ python imagenet-download.py ilsvrc12_urls.txt . --jobs 100 --retry 3 --sleep0

上面的命令会下载图片的URLs地址的列表。

注:运行这个下载图像数据集的脚本时间可能很长(100GB的文件,下载也许会过夜),所以请确保网络的通畅

下载脚本会在对应的子文件夹里面存储这些图片。每一类图片将会存在对应的名字的文件夹下面,一共1000个文件夹对应ILSVRC12的每一个类。文件夹会以下面的形式组织起来:

n01440764/

n01443537/

n01484850/

n01491361/

n01494475/

这些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)

因为ILSVRC12中有太多了类别,为了方便大家生成目录结构和数据集路径链接,我们提供了一个脚本imagenet-subset.sh。在DIGITS服务器上执行以下命令:

$ wget https://rawgit.com/dusty-nv/jets … /imagenet-subset.sh

$ chmod +x imagenet-subset.sh

$ mkdir 12_classes

$ ./imagenet-subset.sh /opt/datasets/imagenet/ilsvrc1212_classes

在这个例子中,会生成一个12个类的链接,第一个参数代表着之前步骤中下载的ILSVRC12的文件夹的路径。

Importing Classification Dataset into DIGITS

通过浏览器登陆上DIGITS,选择Dataset中右上角的New Dataset中的Classification。

External Media

将图片路径设置为之前的12类数据集的文件夹路径,然后:

· 将for validation 设置为10

· Group Name设置为:ImageNet
[list]

[*]Dataset Name 设置为:ImageNet-ILSVRC12-subset
[/list]
External Media

然后点击最下面的Create按钮开始创建数据库。数据集大小是20GB左右,根据电脑的IO性能,大概需要处理10~15分钟。接下来我们会创建模型并训练模型。

Creating Image Classification Model withDIGITS

当创建数据集完成,返回到DIGITS的主页中。选择Models,然后选择右上角的New Model,然后选择Classification来创建一个新的模型。

External Media

在后面的页面中,按照下面来设置:
[list]

[]Select Dataset: ImageNet-ILSVRC12-subset
[
]Subtract Mean: Pixel
[]Standard Networks: GoogleNet
[
]Group Name: ImageNet
[*]Model Name: GoogleNet-ILSVRC12-subset
[/list]

选择一个GPU来训练,点击Create按钮开始训练

External Media