嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

深入使用NVIDIA Jetson Inference机器学习项目 - 计算机视觉图片分类任务

作者

张嘉钧

难度

普通

安装Jetson Nano指南,请参考原厂网站:

https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#setup

下载映像档:

https://developer.nvidia.com/jetson-nano-sd-card-image

Jetson Inference

这个是官方推出的体验套件,它提供了三种最常见的AI应用于计算机视觉的类型,imagenet用于图像辨识 ( Image Recognition )、detectNet用于对象辨识 ( Object Detection )、segNet用于语意分割。

API 的介绍再这里,今天会想办法尽量深入了解,以往的文章只有初步探讨与实作,这次会带到更多的细节,而我们今天都是使用 Python的程序执行。

建置环境

建置方法

我们跟着教学走会先遇到 Hello AI World,再这里是教大家怎么去建置 Jetson Inference的环境,有两种使用方法:

  • 使用Docker Container ( 30 分钟 )
  • 从来源建置 ( 1.5小时 )

通常为了教学顺畅,会从头建置刻录SD卡,但有时映像档过于庞大,搬运不易,所以使用 Docker来做相对而言会比较容易,如果想要从头建置可以参考这边。

今天我们使用Docker来运作,开始之前须要先将jetson Inference下载下来:

$ git clone --recursive https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ docker/run.sh

0140_87a6501ed4f4c0c7fbf4930a15d7bb21725c7cf7.png

执行run.sh之后会自动根据你现在的JetPack版本去DockerHub抓取对应的容器 (Contrainer),并且如果你有使用摄影机的话这时候也会自动读取

Docker Container

关于Docker Container的叙述这边简单介绍一下,可以想象是一个独立的虚拟环境,使用者,进入容器之后会与你原生系统的档案区隔开来,但也是可以透过「挂接」的方式到容器中,像这次如果直接执行run.sh的话,会自动将jetson-inference/data挂载到docker的 /jetson-inference/build/aarch64/bin/ 当中,所以你可以在外部新增或删除图片。

下载DNN模型、安装PyTorch

按下Enter开始建构环境,建置环境的过程中还有两个要进行下载的动作,分别是「下载DNN模型」、「是下载PyTorch」,整个run的过程耗费时间相当久,但你也会注意到大部分都是因为要下载DNN模型的关系;基本上PyTorch会选择Python3.6版本的,模型除非自己要其他的不然就是直接按确定就可以了,默认的情况下图片分类会载两个、对象辨识会载四个、语意分割会载六个模型。

02-12_a06da5b01bec41531b30797281437950c16f6c28.png 02-21_9b7ae719ca347cba40e84402b1d3a6b26785203e.png

如果不小心按到Skip跟Quit可以再到jetson-inference/tools里面去执行程序,就会看到跟刚刚一样的画面了:

$ cd tools
$ ./download-models.sh
$ ./install-pytorch.sh

顺道一提,我发现一个很好玩的现象,如果我们直接在上一层来呼叫程序的话会出现不同的颜色,这或许是NVIDIA的小彩蛋?

03-11_552849a20ed7ddfdfed03406267b75466ea7546c.png 03-21_ca7c7d20eb306bc5b307829e1f249b331337fbf2.png

小技巧分享,在Jetson Nano当中要安装套件其实有时候蛮麻烦的,像是PyTorch跟Tensorflow都要去找特定版本安装,如果你已经有Jetson-Inference又想要在原生环境中安装PyTorch的话,可以直接执行jetson-inference/tools/install-pytorch.sh ( 不用进docker ),给他一段时间他就会在你的原生系统中安装好PyTorch跟TorchVision啰!这其实跟从头建置环境的原理一样,可以注意到的地方是跟在docker当中不同他只让我下载Python3.6版本的。

0437_4d78a5a6c1b2dee3ebd1f64642d103066f99ef59.png

执行位置与方式

一般的执行方式

刚刚已经完成整个环境的建置了,接着需要先移动到运行程序的文件夹:

$ cd jetson-inference/build/aarch64/bin
$ ls

0535_84ec443f5d58f6591f8425672910bde31ef5f8a5.png

从上方的图可以个别找到 imagenet、detectnet、segnet三个档案,这三个是我们这次主要的运作程序,有.py代表是Python程序所撰写的,而没有附档名的部分则是C++程序所撰写,而这些都已经是执行档了,所以都可以直接执行!

$ ./imagenet
$ ./imagenet.py

远程的执行方式

这三个程序需要注意的地方如果使用「远程」的方式要执行程序,需使用含有 “-console”的程序,不然会因为远程软件无法开启图片 ( OpenGL窗口 ) 而导致程序中断,两只程序其实内容是一样的但是在程序的前半段会去侦测是否有 console的字样,有的话会开启Headless模式。

$ cat imagenet.py

0634_c7932bd24c5d8b3be841766b41aa2ab3bc754d77.png

常用参数

这三个CV任务的外部参数皆是相同的,这边讲外部参数的意思是指在命令行执行程序的时候后面可以给定特定参数的数值,这样的使用方法非常方便不用再开启档案调整;这边三个计算机视觉任务常用的参数主要就是,要输入到神经网络的内容是「档案」、「影片」还是「实时影像」。

1、如果是档案或影片的话我们可以直接填写档名,此外还会搭配一个输出的档名:

$ ./imagenet images/orange_0.jpg images/test/output_0.jpg
$ ./imagenet jellyfish.mkv images/test/jellyfish_resnet18.mkv

2、如果是实时影像,他们主要提供CSI (Camera Serial Interface)、V4L2 (Video4Linux)、RTP/RTSP (Real Time Streaming Protocol ) 三种协议,各别使用的方法是:

$ ./imagenet.py csi://0                 # MIPI CSI camera
$ ./imagenet.py /dev/video0             # V4L2 camera
$ ./imagenet.py /dev/video0 output.mp4  # save to video file

除了三个计算机视觉的任务之外,他还有提供一些工具,比较常用的可能是给你检查影像串流的 camera-viewer,因为影像来源有很多种,最常用的是CSI跟USB但也有网络串流的部分 (rtsp),或者说是图片、影片都有可能,所以无法确保Jetson Inference能否开启摄影机的话可以使用这个程序,其中参数 –camera 预设是0,是CSI摄影机的,但我这边都使用USB网络摄影机所以需要额外宣告。

$ ./camera-viewer /dev/video0

其余功能

那也有提供一个程序可以搜集数据,选择储存位置、选择卷标文件,选择类别,全部都选定之后便可以开始进行拍照。

$ ./caemra-capture /dev/video0

0724_37ae43ffa659d6548741d3b99d5252833aaf48fd.jpg

图片分类Image Classification

执行 Imagenet

Jetson Inference提供的第一个范例是图片分类,执行方法就如同上面介绍执行方法一样,这边我们使用 black_bear这张图片,并且将推论完的图片储存在test当中:

$ cd build/aarch64/bin
$ ./imagenet.py ./images/black_bear.jpg ./images/test/black_bear.jpg

推论完会将输出的信息覆写在图片上:

0824_25c31b72f1d091987001f914650c2143190c5c17.jpg

如果要使用USB网络摄影机运行实时影像的话则是使用:

$ ./imagenet.py /dev/video0

0925_30dc01b4619ee7850bc2fd8984120c61844392e0.jpg

这边也提供影像的DEMO:

可以辨识哪些种类?

神经网络模型可以辨识的类别会取决于当初训练的数据集,Jetson-Inference在影像分类的部分采用的数据集是ILSVRC ImageNet,这个数据集拥有1000个常见的类别,所以基本上日常所见都可以被辨识出来,详细的介绍连结如下:

可以使用哪些神经网络模型?

我们默认使用的神经网络模型是Googlenet,除此之外还可以使用不同的模型进行辨识,图片分类可用的神经网络模型有

神经网络名称

参数

神经网络名称

参数

AlexNet

alexnet

ResNet-101

resnet-101

GoogleNet

googlenet

ResNet-152

resnet-152

GoogleNet-12

googlenet-12

VGG-16

vgg-16

ResNet-18

resnet-18

VGG-19

vgg-19

ResNet-50

resnet-50

Inception-v4

inception-v4

该如何使用其他神经网络模型?

三种计算机视觉任务都可以使用 --network来使其他模型:

$ ./imagenet.py --network=resnet-18 ./images/black_bear.jpg ./images/test/black_bear_resnet18.jpg

1162_e1ce2bdc479f25df2f381ad533c0df3b0c852fe5.png

可以注意到准确度为94%与googlenet的98%有些许差距,可以尝试变换不同的模型,观察哪一个模型适合便是哪一种对象。

结语

基本的Jetson Inference已经介绍得差不多了,也带大家认识了第一个计算机视觉任务 - 图片分类,接下来也会带大家体验其他的计算机视觉任务。

CAVEDU Education is devoted into robotics education and maker movement since 2008, and is intensively active in teaching fundamental knowledge and skills. We had published many books for readers in all ages, topics including Deep Learning, edge computing, App Inventor, IoT and robotics. Please check CAVEDU's website for more information: http://www.cavedu.com, http://www.appinventor.tw
DesignSpark Electrical Logolinkedin