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

*本文由RS components 贊助發表,轉載自DesignSpark部落格原文連結

作者/攝影 張嘉鈞
難度

★★☆☆☆(普通)

材料表
  1. Jetson Nano
  2. Webcam

物件辨識Objected Detection

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

 

執行 detectnet

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

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

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

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

如果要使用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:

ped-100:

語意分割Image Segmentation

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

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

 

執行 segnet

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

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

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

可以分割哪些物件?

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

 Dataset Resolution CLI Argument Accuracy
Cityscapes 512×256 fcn-resnet18-cityscapes-512×256 83.3%
Cityscapes 1024×512 fcn-resnet18-cityscapes-1024×512 87.3%
Cityscapes 2048×1024 fcn-resnet18-cityscapes-2048×1024 89.6%
DeepScene 576×320 fcn-resnet18-deepscene-576×320 96.4%
DeepScene 864×480 fcn-resnet18-deepscene-864×480 96.9%
Multi-Human 512×320 fcn-resnet18-mhp-512×320 86.5%
Multi-Human 640×360 fcn-resnet18-mhp-512×320 87.1%
Pascal VOC 320×320 fcn-resnet18-voc-320×320 85.9%
Pascal VOC 512×320 fcn-resnet18-voc-512×320 88.5%
SUN RGB-D 512×400 fcn-resnet18-sun-512×400 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

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

$ cat -n classes.txt

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

 

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

使用其他神經網路模型的方法也是一樣的,使用–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的資料集訓練客製化的模型,也會教導如何蒐集自己的資料,可以盡請期待哦!

 

*本文由RS components 贊助發表,轉載自DesignSpark部落格原文連結

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *