NVIDIA Jetson Nano 2GB 系列文章(21): “Hello AI World”图像分类指令

前面我们花了不少篇幅,以“10行python代码”为基础,更深入地讲解了Hello AI World项目的输入(videoSource)、输出(videoOutput)以及参数解析的功能,就是为了让大家能更了解这个项目提供的工具是如此好用。

前面我们花了不少篇幅,以“10python代码为基础,更深入地讲解了Hello AI World项目的输入(videoSource)、输出(videoOutput)以及参数解析的功能,就是为了让大家能更了解这个项目提供的工具是如此好用。

接下来我们回到Hello AI World的三大深度学习推理识别应用,依序是图形分类(image classification)、物件检测(object detection)与语义分割(semantic segmentation)。Hello AI World项目针对这三个应用,分别提供专门的函数库,协助使用者轻松调用。

本期将介绍“图像分类”这个应用的相关资源,包括项目已经编译好的相关工具,以及代码级别的函数调用方式,协助用户能更进一步地利用这些资源进行学习,并且开发出自己的应用代码。

当我们安装jetson-inference开源项目之后,系统已为我们的Jetson设备上安装好了“imagenet”这个执行指令以及“imagenet.py”这个可直接执行的Python代码。请开启一个终端,并且执行以下指令:

 

 

  • imagenet
  • imagenet.py

 

由于系统预设的输入源是CSI摄像头,如果您的设备上已经装好CSI摄像头的话,就会正常启动摄像头的画面,如下图:

 

NVIDIA Jetson Nano 2GB 系列文章(21): “Hello AI World”图像分类指令

如果设备上没安装CSI摄像头,就会出现以下的错误信息:

NVIDIA Jetson Nano 2GB 系列文章(21): “Hello AI World”图像分类指令

 

假如您的设备上装有USB摄像头的话,可以执行以下指令,将输入源改成USB摄像头:

 

 

  • imagenet /dev/video0
  • imagenet.py /dev/video0

 

如果您的设备上没有任何摄像头的话,可以试试用视频文件或图像文件作为输入源。设备里面的/usr/share/visionworks/source/data下面有些测试可用的视频,在~/jetson-inference/data/images里面也有100多张图片,它们都可以妥善用来进行以下的测试:

 

 

  • imagenet /usr/share/visionworks/sources/data/signs.avi
  • imagenet ~/jetson-inference/data/images

 

好了,现在至少确认您已经有了能够作为测试的数据源。

  • 图像分类简介

这是图像识别之后最入门的应用,深度学习之父Geoffrey Hinton为了让计算机能够识别最简单的“手写数字(如下图)”,几乎穷其一生的精力,开发堪称深度卷积神经网络(DCNN)鼻祖的LeNet神经网络算法。

NVIDIA Jetson Nano 2GB 系列文章(21): “Hello AI World”图像分类指令

后来经过他的爱徒Alex Krizhevsky改良的AlexNet神经网络,在2013年全球LSVRC图像识别竞赛中一举成名,才让深度神经网络的用途得到充分的验证,从此打开“深度学习”的康庄大道,在人工智能应用上得到了爆炸性的突破。而当时AlexNet的崛起,其实是高度依赖NVIDIA GPU的众核(ManyCores)架构,换言之,如果没有NVIDIA GPU的计算架构,如今深度学习可能还无法得到如此大的突破发展。

图像识别的应用,是以“图像”为单位去识别图像分类归属问题的。例如下图,每张图都属于一个分类,左边两种的特性还比较明显,最右边一张图里面虽然有“珊瑚”、“热带鱼”等,但是在归类过程就只归属于“珊瑚礁”类别。这是图像识别的基本原则。

NVIDIA Jetson Nano 2GB 系列文章(21): “Hello AI World”图像分类指令

接下来我们就使用Hello AI World项目为我们准备好的“imagenet”工具以及100多张已下载的图像,来进行图像分类的推理识别实验。

  • 使用imagenet进行图像分类识别

一开始我们已经简单了解了imagenet指令的简单用法,事实上在项目编译好之后,与图像分类有关的指令一共有6个,分别为imagenet、imagenet-camera、imagenet-console、imagenet.py、imagenet-camera.py与imagenet-console.py,经过测试之后,发现功能都一样,所以大家只要简单记住imagenetimagenet.py这两个就可以

其中imagenet指令作为这部分的测试用途,imagenet.py作为下一部分的Python代码说明使用。

作为图像分类的推理识别应用,是由以下这几个部分所组成:

  • 输入的数据源:可以是一张(批)图像、视频文件、摄像头等
  • 输出的结果:可以打印在显示器,或者存到一个视频文件
  • 选择已支持的预训练模型:

这是由其他人已经训练好的模型文件,包括NVIDIA、Google等非常多业界先进,且都已预先训练好的优异模型。

由于这些模型的训练非常耗费时间与精力,并且需要有经过长期维护与筛选的数据集做基础,因此一开始使用别人已经训练好的模型,能减少大量的时间成本。

本项目已经预先建立了以下10种模型,我们可以非常轻松地调用:

NVIDIA Jetson Nano 2GB 系列文章(21): “Hello AI World”图像分类指令

这些模型都是NVIDIA从ILSVC大赛的ImageNet数据集中,挑选了1000类的图像数据,在最高端的DGX服务器上(价值至少50万人民币),基于Caffe这个深度学习框架,经过数天时间所训练出来的模型。

而每个神经网络模型还包含以下三类文件:

  • .caffemodel:存放特征内容的模型文件
  • .prototxt:存放神经网络结构的文件
  • Ilsvrc12_synset_words.txt:存放1000个类别名称与描述

这些相关文件都在“安装过程”的“Download Models”时,放置在了对应的路径下。

好了,在了解整个图像分类所需要的内容之后,就能明白imagenet指令所需要的参数了,主要就是“input”、“output”与“--network=”这三个部分,每个部分在系统里面都有预设值,因此,假设什么都不给,这个指令还是可以执行的。

由于这些指令的执行,一开始都需要载入TensorRT加速引擎,因此一次检测一张图像,就会相当没效率,我们的测试就用批次方式来进行测试,请执行以下指令:

 

  • cd ~/jetson-inferecne/data/images
  • mkdir fruit output
  • cp fruit_* fruit
  • imagenet fruit output 

然后就可以在output目录中,看到fruit目录下所有图像的检测结果(如下图),请自行打开每张图片看看输出的结果。

NVIDIA Jetson Nano 2GB 系列文章(21): “Hello AI World”图像分类指令

系统预设的网络模型是GOOGLENET,我们可以透过“ --network”参数来选择其他预训练的模型,请试试以下指令:

 

  • imagenet --network=resnet-18
  • imagenet fruit --network=vgg-16 output

请自行比对一下,调用不同的模型,会产生怎么不同的结果。

由于篇幅有限,关于图像分类的代码imagenet.py将放在下一篇内容去说明。

来源:业界供稿

0赞

好文章,需要你的鼓励

2021

06/01

09:47

分享

点赞

邮件订阅
白皮书