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

深入使用NVIDIA Jetson Inference機器學習專案 - 物件辨識、語意分割以及訓練自己的物件辨識模型

 

作者

張嘉鈞

難度

普通

材料表

1.     Jetson Nano

2.     Webcam

 

物件辨識Objected Detection

物件辨識與圖片分類的最大差別就在於會提供「座標資訊」,並且通常會用於「多個物件」上面;因此訓練的時候就不是提供一個照片跟標籤,而是提供照片、標籤以及座標資訊等其他資訊 ( Xmin、Xmax、Ymin、Ymax )。

0141_c6dd7007edd182c693b561c8e3fb6e0c84e69c39.png

 

執行 detectnet

由於三個電腦視覺的範例執行方法都雷同,這部分就不多做解釋

$ cd build/aarch64/bin
$ ./detectnet.py ./images/airplane_1.jpg ./images/test/airplane_1.jpg

 

推論完會將輸出的資訊覆寫在圖片上,與圖片分類不同的地方在於因為objected detection有提供座標資訊,所以我們可以在inference的圖片上看到座標框出來的內容,並且也有辨識的結果:

0235_4f0c34bb4a42396b60cf459805a874f38798f644.jpg

 

此外終端機的內容也提供相當多的資訊,辨識到幾個物件,每個物件的開頭會是 <detectNet.Detection object>,接下來的ClassID就是在標籤當中編號第幾個,Confidence則是信心指數,接著就是座標的資訊。

0336_f804f7ab834a93e8c6aef96b3dd2fd36267f2325.png

 

如果要使用USB網路攝影機運行即時影像的話則是使用:

$ ./detectnet.py /dev/video0

 

 

可以辨識哪些種類?

Jetson-Inference在物件辨識的部分提供了不同種的神經網路模型,同時也有不同的數據集,接下會稍微介紹一下各神經網路模型可以辨識的類別。

 

可以使用哪些神經網路模型?

我們預設使用的神經網路模型是用ssd-mobilenet-v2,而所有神經網路的資訊如下

 Model

CLI argument

NetworkType enum

Object classes

SSD-Mobilenet-v1

ssd-mobilenet-v1

SSD_MOBILENET_V1

91 (COCO classes)

SSD-Mobilenet-v2

ssd-mobilenet-v2

SSD_MOBILENET_V2

91 (COCO classes)

SSD-Inception-v2

ssd-inception-v2

SSD_INCEPTION_V2

91 (COCO classes)

DetectNet-COCO-Dog

coco-dog

COCO_DOG

dogs

DetectNet-COCO-Bottle

coco-bottle

COCO_BOTTLE

bottles

DetectNet-COCO-Chair

coco-chair

COCO_CHAIR

chairs

DetectNet-COCO-Airplane

coco-airplane

COCO_AIRPLANE

airplanes

ped-100

pednet

PEDNET

pedestrians

multiped-500

multiped

PEDNET_MULTI

pedestrians, luggage

facenet-120

facenet

FACENET

faces

在最後一個欄位是他所使用的數據集,從數據集可以看出這個神經網路模型可以辨識什麼樣的資料,第一個coco dataset就是日常所見的91個類別,像是人、電腦、水果、食物類的都有,而接下來的神經網路使用的類別,感覺是從COCO當中取出特定類別;官方提供的ped是pedestrians只有行人的意思,multiped則包含luggage (行李),dacenet則是只有臉。

 

該如何使用其他神經網路模型?

三種電腦視覺任務都可以使用 --network來使用其他模型:

$ ./detectnet.py --network=pednet ./images/peds_1.jpg ./images/test/peds_1.jpg

 

這邊我使用的是peds_1.jpg,照片包含一個人跟一台車,如果使用預設的神經網路模型的話 (SSD_MOBILENET_V2) 車子將會被辨識到;若使用pednet的話,由於只辨識行人所以車子就不會被匡列進去。

SSD-Mobilenet-v2:

0432_1d22a68cc3e75730442754c2841d68a9e9af09a6.jpg

 

ped-100:

0527_7c287d86c0eda478a2796ac820f10df07e98ff1b.jpg

 

 

語意分割Image Segmentation

語意分割、語意分析,在三種電腦視覺的任務當中算是最難的一個,因為它需要把所有的像素(pixel)都進行分類;圖片分類只需要在圖片中辨識到對應物件就好;物件辨識需要將圖片每個物件辨識、並框出位置;語意分割則是把每個像素都進行辨識,最後可以框出該物件的輪廓,因為每個像素都被進行分類了!

常常用於無人機的環境了解,畢竟這個比物件辨識還要更細部,通常可以獲得更多資訊;常見的AI去背景,有些也是用類似的技術。

 

執行 segnet

由於三個電腦視覺的範例執行方法都雷同,所以我就不多做解釋,在這邊我們使用的是segnet.py。

$ cd build/aarch64/bin
$ ./segnet.py ./images/horse_0.jpg ./images/test/horse_0.jpg

 

推論完會將輸出的資訊一樣會覆寫在圖片上,這邊會提供給你一張含有分割色塊的原圖,並一個則是單純色塊能更清楚的了解語意:

0626_e7b11875f7b85b9263e942d11672ffa513ea5c2e.jpg

 

可以分割哪些物件?

可以注意到這裡用其不太一樣,也沒有提到神經網路模型,因為我們使用的都是fcn-resnet18這個模型,差別只在於數據集而已,所以我們稍後會針對數據集介紹一下,這裡我們預設使用的神經網路模型是用PascalVOC,而所有的資訊如下

 Dataset

Resolution

CLI Argument

Accuracy

Cityscapes

512x256

fcn-resnet18-cityscapes-512x256

83.3%

Cityscapes

1024x512

fcn-resnet18-cityscapes-1024x512

87.3%

Cityscapes

2048x1024

fcn-resnet18-cityscapes-2048x1024

89.6%

DeepScene

576x320

fcn-resnet18-deepscene-576x320

96.4%

DeepScene

864x480

fcn-resnet18-deepscene-864x480

96.9%

Multi-Human

512x320

fcn-resnet18-mhp-512x320

86.5%

Multi-Human

640x360

fcn-resnet18-mhp-512x320

87.1%

Pascal VOC

320x320

fcn-resnet18-voc-320x320

85.9%

Pascal VOC

512x320

fcn-resnet18-voc-512x320

88.5%

SUN RGB-D

512x400

fcn-resnet18-sun-512x400

64.3%

 

Pascal VOC Dataset ( default )

這個數據集總共可以辨識19個物件,在該數據集的介紹當中區分為四個類別Vehicles、Household、Animals、Person又各分細項:

Vehicles 汽車

Car、Bus、Bicycle、Motorbike、Boat、Train

Household 家庭

Chair、Sofa、Dining table、TV/monitor、Bottle、Potted plant

Animals 動物

Cat、Dog、Cow、Horse、Sheep、Bird

Person 人

Person

 

Cityscapes

這個也是能辨識19個類別,他是在不同的程式去蒐集「街景」,所以日常在街景可以看到的東西,都被收納在這個數據集當中。

 

DeepScene

這個數據集則比較小一點,能辨識的類別也只有6個,分別為 無效(void),道路(trail),草叢(grass),植被(vegetation),天空(sky)和障礙物(obstacle)。

 

SUN RGB

這個數據集主要用於室內設計上面,提供了10,335張不同的室內圖片,總共的類別有牆、地板、門、窗戶、桌子、檯燈等21個類別。

 

Multi-Human

這個部分也是提供了21個類別,但主要著重在人體上的語意分割,像是 頭髮、T-shirt、襪子、腳、眼鏡等等的。

 

如何查看神經網路模型辨識的標籤

我們可以在工作的資料夾發現除了有Images的資料夾也有Network資料夾,這個Network存放的是所有下載的神經網路模型,我們可以透過進入那些神經網路的資料夾尋找classes.txt來獲取它所有的標籤類別哦!這邊以Pascal為例:

$ cd /jetson-inference/data/networks/FCN-ResNet18-Pascal-VOC-320x320
$ ls -la

0736_bd6ccb6debb3bc17ba6d05114edbc4009fc5a666.png

 

接著我們可以直接使用cat來查看內容,這邊我加上了 -n 讓內容可以顯示行號,進而知道我們的標籤總共有多少個哦!

$ cat -n classes.txt

0831_2026a65374d8e82be237617d475c0aa9b2cb4cdf.png

 

這樣你就知道怎麼樣去查到一個神經網路模型到底可以辨識哪一些類別了!

 

如何使用其他神經網路模型?

使用其他神經網路模型的方法也是一樣的,使用--network即可。

$ ./segnet.py --network= fcn-resnet18-mhp-512x320 ./images/peds_1.jpg ./images/test/peds_1.jpg

 

 

程式解析

在這裡我們將會解析Jetson Inference的imagenet.py、detectnet.py、segnet.py,這將能幫助到想要使用Jetson Inference來開發的使用者,因為Jetson Infernece已經提供訓練好的模型,並且已經轉成可以用TensorRT加速的onnx了 ( 這部分下一篇會再介紹 ),所以使用Jetson Inference開發真的是快速又方便;可以注意到我上述的介紹式寫 .py代表我們接下來會介紹的都是Python語言,而PyTorch底層是C++所以Inference也有提供C++的程式。

 

Imagenet.py

1、首先一定要導入它提供的API:

#!/usr/bin/python3

import jetson.inference	
import jetson.utils

 

2、這邊的範例使用的是影像串流,所以他會先擷取到攝影機物件,接著再用While迴圈不斷擷取當前畫面,來達到即時影像的功能:

net = jetson.inference.detectNet("ssd-mobilenet-v2", threshold=0.5)
camera = jetson.utils.videoSource("csi://0")      # '/dev/video0' for V4L2

while display.IsStreaming():

 

3、在迴圈當中,第一步要擷取當前影像,接著將影像丟進模型當中,這邊會自動幫你做overlay的動作,也就是辨識完的結果會直接顯示在圖片上:

    img = camera.Capture()
    detections = net.Detect(img)

 

4、最後使用Render將圖片覆寫,使用SetStatus設定標題的內容:

    display.Render(img)
    display.SetStatus("Object Detection | Network {:.0f} FPS".format(net.GetNetworkFPS()))

 

 

使用Docker的請注意

使用Docker的同學,記得先新增一個資料夾、並且每次開啟Docker的時候都要做mount的動作,當然也可以寫進.sh當中,每次執行就不用再額外宣告。

1、新建要掛載的目錄,並將程式改為執行檔:

$ cd ~/
$ mkdir my-recognition-python
$ cd my-recognition-python
$ touch my-recognition.py
$ chmod +x my-recognition.py

 

2、開啟Docker的時候需要進行mount:

$ docker/run.sh --volume ~/my-recognition-python:/my-recognition-python   # mounted inside the container to /my-recognition-python

 

結論

到目前為止,一些基本的使用方式都已經帶給各位了,也有教基本的程式碼使用,因為Jetson Inference的整合讓整個AI應用變得相當簡單,未來會在出一篇進階版本的,會教導如何使用Open Image的資料集訓練客製化的模型,也會教導如何蒐集自己的資料,可以盡請期待哦!

 

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