| 開發者 |
袁佑緣 蔡雨錡-(更新於2020/02/20-新增jetson-inference專案各個範例程式說明) |
| 時間 | 包含燒錄系統70分鐘 |
| 難度 | ★★★☆☆ |
| 材料表 |
|
今天要跟大家分享如何在Jetson Nano上執行NVIDIA提供的jetson-inference範例,其中包含了影像辨識 (Image Recognition)、物件偵測 (Object Detection)、以及影像分割 (Segmentation)。這幾個項目都可以分別應用在靜態影像以及用攝影鏡頭取得的影像串流上。
JetsonNano安裝作業系統的部分,請參考: NVIDIA Jetson Nano 實際使用難不難?從入手到安裝系統、開機與遠端連線。
影像辨識範例是辨識圖片中的動物,下圖是執行範例後,將辨識結果顯示在圖片上,辨識圖片中的動物為「北極熊」,辨識信心指數為100%。

物件偵測程式則可以幫你辨識出圖片或是影像串流中的物件名稱或是偵測人臉。
而影像分割程式則是可以幫你分離出前景中的物體或人。
本文大綱:
- 下載並編譯套件
- 執行深度學習範例-影像辨識、物件偵測、影像分割
一、軟體環境安裝
Step1:Jetson Nano開機之後,點選左上角的圖示搜尋Terminal。

開啟後會看到終端機的介面,接下來的指令都會在終端機裡執行。

Step2: 輸入以下的指令安裝git、cmake套件。
[pastacode lang=”python” manual=”sudo%20apt-get%20install%20git%20cmake” message=”” highlight=”” provider=”manual”/]
Step3:下載jetson-inference專案程式
[pastacode lang=”bash” manual=”git%20clone%20https%3A%2F%2Fgithub.com%2Fdusty-nv%2Fjetson-inference” message=”” highlight=”” provider=”manual”/]
由於在這個repo裡面會用到 jetson-utils 這個額外的submodule,所以要
一併把它載下來

Step4: 使用CMake來準備編譯所需的相依套件
[pastacode lang=”bash” manual=”mkdir%20build%0Acd%20build%0Acmake%20..%2F” message=”” highlight=”” provider=”manual”/]過程中會呼叫一個叫CMakePrebuild.sh的腳本,其中會需要超級使用者的權限(sudo), Jetson Nano中預設使用者就有sudo的權限,請直接輸入使用者的密碼即可。

接下來程式就會自動下載各種相依的函式庫跟一些訓練完的模型,如下圖(下載googlenet.caffemodel中)。

由於要下載的模型眾多,整個過程會花上不少時間, 所以在一步可以先讓機器跑一陣子再回來看。
Step5: 使用make編譯程式碼
[pastacode lang=”python” manual=”make” message=”” highlight=”” provider=”manual”/]編譯完成!

執行make install,最後完整的輸出檔案將會在 jetson-inference/build/aarch64 這個資料夾中, 接下來所有要執行的範例程式都能夠在 jetson-inference/build/aarch64/bin 資料夾中找到。
[pastacode lang=”python” manual=”make%20install” message=”” highlight=”” provider=”manual”/]二、執行深度學習範例
Jetson-Inference專案中,提供以下的範例程式讓試用者體驗影像辨識(Image Recognition)、物件偵測(Object Detection)、以及影像分割(Segmentation),也分成可以應用在靜態影像上(Images)或是攝影鏡頭的串流影像上(Camera)。

1、影像辨識 (Image Recognition)
我們先來測試影像辨識應用在靜態影像上的範例程式:imagenet-console.py。
Step1:我們先將工作目錄移到以下的資料夾中
[pastacode lang=”python” manual=”cd%20~%2Fjetson-inference%2Fbuild%2Faarch64%2Fbin” message=”” highlight=”” provider=”manual”/]Step2:呼叫影像辨識範例來辨識NVIDIA提供的影像
本範例中辨識官方提供的影像之一:北極熊的圖片polar_bear.jpg, 然後將辨識完的結果儲存為 polar_bear_inferenced.jpg。
[pastacode lang=”python” manual=”.%2Fimagenet-console%20polar_bear.jpg%20polar_bear_inferenced.jpg” message=”” highlight=”” provider=”manual”/]第一次跑的時候,會需要耐心等待幾分鐘, 這是因為TensorRT會花上些許的時間來最佳化這個網路,之後再次執行程式就會快很多。



原圖

辨識結果:北極熊
除了北極熊的圖片,在下圖的影像資料夾下有許多jetson-inference專案提供的圖片可供大家測試用。

下指令呼叫靜態影像辨識程式時,必要格式如下:
[pastacode lang=”python” manual=”.%2Fimagenet-console%20%E8%A6%81%E8%BE%A8%E8%AD%98%E7%9A%84%E5%BD%B1%E5%83%8F%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D%20%E8%BC%B8%E5%85%A5%E8%BE%A8%E8%AD%98%E5%BD%B1%E5%83%8F%E7%B5%90%E6%9E%9C%E7%9A%84%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D” message=”” highlight=”” provider=”manual”/]這個範例程式中可以調整的參數為network,預設為GoogleNet。
可以使用的Network如下表,所以舉例來說,想要使用AlexNet做辨識可以使用以下指令:
[pastacode lang=”python” manual=”.%2Fimagenet-console%20%E8%A6%81%E8%BE%A8%E8%AD%98%E7%9A%84%E5%BD%B1%E5%83%8F%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D%20%E8%BC%B8%E5%85%A5%E8%BE%A8%E8%AD%98%E5%BD%B1%E5%83%8F%E7%B5%90%E6%9E%9C%E7%9A%84%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D%20–network%20alexnet” message=”” highlight=”” provider=”manual”/]
下指令呼叫攝影鏡頭做影像辨識程式時,必要格式如下:
[pastacode lang=”python” manual=”.%2Fimagenet-camera%C2%A0″ message=”” highlight=”” provider=”manual”/]這個範例程式中可以調整的參數為network、camera、width、 height。
範例預設network是GoogleNet、camera預設為使用CSI Camera、width預設為1280、height預設為720。
在本篇文章中統一使用Logitech 的C270 的USB Camera,所以需要將camera指定為 /dev/video0, 也就是一般USB Camera的預設位置。
所以舉例來說,想要使用VGG-16、USB Camera做辨識可以使用以下指令:
[pastacode lang=”python” manual=”.%2Fimagenet-camera%20–network%20vgg-16%20–camera%20%3D%2Fdev%2Fvideo0″ message=”” highlight=”” provider=”manual”/]
影像串流成果如下:

2、物件偵測 (Object Detection)
下指令呼叫靜態物件偵測程式時,必要格式如下:
[pastacode lang=”python” manual=”.%2Fdetectnet-console%20%E8%A6%81%E8%BE%A8%E8%AD%98%E7%9A%84%E5%BD%B1%E5%83%8F%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D%20%E8%BC%B8%E5%85%A5%E8%BE%A8%E8%AD%98%E5%BD%B1%E5%83%8F%E7%B5%90%E6%9E%9C%E7%9A%84%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D” message=”” highlight=”” provider=”manual”/]
使用範例圖片airplane_0.jpg的辨識成果如下:

這個範例程式中可以調整的參數為network、overlay(物件偵測的呈現方式,包含 box, labels, conf, none)、threshold(設定偵測到物件可顯示的閾值)。
其中,netwok預設為ssd-mobilenet-v2、overlay的預設為 box, labels, conf,threshold預設為0.5。
可以使用的Network如下表,可以根據想偵測的物件需求來選擇。舉例來說,想要使用SSD-Inception-v2做物件偵測並只顯示box跟物件名稱可以使用以下指令:
[pastacode lang=”python” manual=”.%2Fdetectnet-console%20%E8%A6%81%E8%BE%A8%E8%AD%98%E7%9A%84%E5%BD%B1%E5%83%8F%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D%20%E8%BC%B8%E5%85%A5%E8%BE%A8%E8%AD%98%E5%BD%B1%E5%83%8F%E7%B5%90%E6%9E%9C%E7%9A%84%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D%20–network%20ssd-inception-v2%20–overlay%3Dbox%2C%20labels%20–threshold%200.4″ message=”” highlight=”” provider=”manual”/]
修改後的物件偵測指令及成果如下,可以看到圖片上就沒有顯示confidence了:


下指令呼叫攝影鏡頭做物件偵測程式時,必要格式如下:
[pastacode lang=”python” manual=”.%2Fdetectnet-camera%C2%A0″ message=”” highlight=”” provider=”manual”/]這個範例程式中可以調整的參數為network、camera、width、 height、overlay、threshold。範例每項的預設值都跟本文前面提及的相同。
使用預設的ssd-mobilenet-v2物件偵測成果如下:

所以舉例來說,想要使用facenet、USB Camera做人臉辨識可以使用以下指令:
[pastacode lang=”python” manual=”.%2Fdetectnet-camera%20–network%20facenet%20–camera%20%3D%2Fdev%2Fvideo0″ message=”” highlight=”” provider=”manual”/]影像串流人臉辨識成果如下:
成功執行人臉辨識!

3、影像分割 (Segmentation)
下指令呼叫靜態影像分割程式時,必要格式如下:
[pastacode lang=”python” manual=”.%2Fsegnet-console%20%E8%A6%81%E8%BE%A8%E8%AD%98%E7%9A%84%E5%BD%B1%E5%83%8F%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D%20%E8%BC%B8%E5%85%A5%E8%BE%A8%E8%AD%98%E5%BD%B1%E5%83%8F%E7%B5%90%E6%9E%9C%E7%9A%84%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D” message=”” highlight=”” provider=”manual”/]影像成果如下圖:

這個範例程式中可以調整的參數為network(預設為fcn-resnet-18-voc)、visualize(影像呈現模式,有overlay、mask兩種可以選,預設為overlay)、filter-mode(過濾模式,有linear、point可以選,預設為linear)、ignore-class(想要忽略的類別,預設為空)、alpha(用於設定在overlay狀態下跟原圖混合的程度,範圍為0~255,預設為120)。
可以使用的Network如下表,所以舉例來說,想要使用Pascal VOC快的版本做辨識可以使用以下指令:
[pastacode lang=”python” manual=”.%2Fsegnet-console%20%E8%A6%81%E8%BE%A8%E8%AD%98%E7%9A%84%E5%BD%B1%E5%83%8F%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D%20%E8%BC%B8%E5%85%A5%E8%BE%A8%E8%AD%98%E5%BD%B1%E5%83%8F%E7%B5%90%E6%9E%9C%E7%9A%84%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%AA%94%E5%90%8D%20–network%20fcn-resnet-18-voc-320×320″ message=”” highlight=”” provider=”manual”/]
下指令呼叫攝影鏡頭做物件偵測程式時,必要格式如下:
[pastacode lang=”python” manual=”.%2Fsegnet-camera%C2%A0″ message=”” highlight=”” provider=”manual”/]這個範例程式中可以調整的參數為network、filter-mode、ignore-class、alpha、camera、width、 height。每項的預設值都跟本文前面提及的相同。
使用預設的影像分割成果如下:

jetson-inference專案的範例程式介紹到這邊告一個段落,有任何你感興趣的Jetson Nano相關議題,都可以跟我們分享唷!





Hi, Mr. Hsu, thank you for your sharing… I have a C270 camera, and I follow your article step and step to go… everything went well, but the last one failed.
It didnʼt pop out a screem to catch me face… but shown below information…
detectnet-camera: camera open for streaming
GST_ARGUS: Creating output stream
CONSUMER: Waiting until producer is connected…
GST_ARGUS: Available Sensor modes :
Segmentation fault (core dumped)
Any advice? Thank you very much ~
I am using jetson nano, donʼt know how to input in Chinese…
Patrick