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

在NVIDIA Jetson nano 上執行深度學習範例:影像辨識、物件偵測、影像分割

一、深度學習介紹

深度學習是機器學習的一種,機器學習是讓機器可以自我學習,透過將資料處理讓機器有人工智慧。而深度學習就是是機器學習的一種方式,它可以讓電腦像有了神經網路一樣,進行複雜的運算,運用各種演算法運算呈現出像人一樣的判斷或行為,例如之前很紅的AlphaGo打敗圍棋冠軍、照片人臉偵測標記等等應用都是深度學習的應用。

以下就是我們使用Jetson nano執行jetson-inference範例的畫面截圖

0117_c730aa82d4fc81300842856b3acfee307054b5d1.jpg

二、jetson-inference相關軟體安裝

我們使用NVIDIA提供的jetson-inference範例,其中包含了影像辨識 (Image Recognition)、物件偵測 (Object Detection)、以及影像分割 (Segmentation)。它是使用TensorRT來將神經網路部屬到Jetson nano上。jetson-inference它可以使用C++ 或 Python來跑我們的範例,以下我們都使用Python來介紹。

0216_4a01bc9b792d20e4612c76fcc5e964fb02973f03.jpg

我們使用之前文章所使用的官方提供的映像檔來安裝此jetson-inference範例的相關軟體。

我們使用之前介紹過的MobaXterm來遠端連線安裝相關軟體

Step1 輸入以下指令取得遠端更新伺服器的套件檔案清單(此指令需要輸入使用者密碼請輸入你設定的密碼,如果是按照之前教學皆設定為jetsonnano)

 sudo apt-get update

0314_360c1e67789c3577445e20629691f73e74c6c522.jpg

Step2 輸入以下指令安裝git、cmake套件、Python 3.6開發包(如果已經安裝過會顯示已安裝)。

sudo apt-get install git cmake libpython3-dev python3-numpy

0415_7d44ae88d8118ce6ff9e690d3b8a1b8e1978717f.jpg

Step3 使用git下載jetson-inference專案程式

git clone --recursive https://github.com/dusty-nv/jetson-inference

059_343eb5e67ed8fbdd85dcca9297a2a3b7efca274a.jpg

Step4 移動到jetson-inference資料夾

cd jetson-inference

068_48ab0649d88fb245dc4af2d0cf98711b569530a3.jpg

Step5 創建build資料夾並移動到該資料夾

mkdir build
cd build

076_5615496e556bdbf223bc7485eb4cb0a8a105c7ff.jpg

Step6 接著使用CMake來準備編譯所需的相依套件

cmake ../

編譯到一半時會問你要下載甚麼模型,以下是TensorRT有支援的模型,如果選擇全部檔案下載需要一些時間,可以根據你需要的模型選擇下載或是使用下面預設的模型來下載。

086_ac9d8451a7cb46f96348548dfce97ddec7ca1434.jpg

選擇需要下載的模型

096_5a8e50ce8749d6db2ba47a0e5f8bc4c2517b2340.jpg

下載的過程

下載完模型後會詢問另外一個是否下載Python的PyTorch軟體包,這裡我們選擇安裝Python 3.6的PyTorch軟體包版本。

1031_a61a556056a65a6c6da466248cd095ad3ce4f609.jpg

Step7 使用make編譯程式碼

1426_36725fa3962869a0f799bfda692aa5a729f28415.jpg

1141_4e425928a4a24ca999ed0037da7e0c835de44901.jpg

編譯中

1233_ed20c6b65f3c3dcb388838c0c960683c4ceac762.jpg

編譯完成

Step8 執行sudo make install

最後完整的輸出檔案將會在 jetson-inference/build/aarch64 這個資料夾中, 接下來所有要執行的範例程式都存放在 jetson-inference/build/aarch64/bin 資料夾中。

1331_193b2649228e925fd06cbec3b287e62bccfbdc76.jpg

安裝中

1427_36725fa3962869a0f799bfda692aa5a729f28415.jpg

安裝成功時可以看到bin底下有要執行的範例程式

三、影像辨識 (Image Recognition)

範例分成可以應用在靜態影像上(Images)或是攝影鏡頭的串流影像上(Camera)的辨識。

Step1 我們先將工作目錄移到以下範例資料夾中

cd ~/jetson-inference/build/aarch64/bin

首先來辨識靜態影像上的範例程式:imagenet-console.py

Step2 呼叫影像辨識範例來辨識NVIDIA提供的影像

NVIDIA提供的影像預設路徑是jetson-inference/data/images/

可以看到下面有很多圖片可以供你測試使用,也可以使用自己的圖片來測試,以下我們使用black_bear.jpg來測試

1526_22e541c8d002fbc557e5bb786f2e2ac05fe23f3b.jpg

NVIDIA提供的影像預設路徑

下指令呼叫靜態影像辨識程式時格式如下:(影像預設路徑如上圖)

./imagenet-console 要辨識的影像路徑及檔名 辨識影像結果的路徑及檔名

執行以下指令來辨識範例中黑熊的圖片black_bear.jpg, 然後將辨識完的結果儲存為 black_bear_ima.jpg。(辨識完的結果圖片儲存的目錄預設在jetson-inference/build/aarch64/bin裡面)

./imagenet-console black_bear.jpg black_bear_ima.jpg

第一次跑的時候,需要等待幾分鐘,因為TensorRT會花上些許的時間來最佳化這個網路,之後再次執行程式就會快很多。

1625_3b254b8a6053de6691283491aa3f3c5504b02850.jpg

1725_01bd7e79bf7f527523206a9bf1b8bf1d652a230a.jpg1825_951948e46c211b182b6bad5d65eda3acaa90ece9.jpg

原圖

1923_4bfc60def7cce0ce14ad53f9b37d27fe37e5555c.jpg

辨識結果98%為美洲黑熊、黑熊

Step3 接著是攝影鏡頭的串流影像上(Camera)的辨識(注意這使用攝影機時的操作畫面需要在Jetson nano上接螢幕才可以看到鏡頭的畫面遠端連線操作時則無法顯示鏡頭的畫面)

在本篇文章中統一使用Logitech 的C270 的USB Camera,所以需要將ca裡mera指定為 /dev/video0, 也就是一般USB Camera的預設位置。

執行以下指令來讓我們USB攝影機串流影像即時辨識

./imagenet-camera --camera /dev/video0

執行後的結果拿取手邊可得的東西來辨識,可以發現辨識成功。

207_6502b35c2be279a92c8f87ef684affce5b4ffc21.jpg2120_b1f7dd05789f46f2d68cfabe46441159c45acc22.jpg2220_ea91c2db88250133c1b53975097078729dfd7e00.jpg

四、物件偵測 (Object Detection)

下指令呼叫靜態物件偵測程式時格式如下:

範例分成可以應用在靜態影像上(Images)或是攝影鏡頭的串流影像上(Camera)的偵測。

Step1 我們先將工作目錄移到以下範例資料夾中

cd ~/jetson-inference/build/aarch64/bin

Step2 呼叫物件偵測範例來偵測NVIDIA提供的影像

下指令呼叫靜態物件偵測程式時格式如下:(影像預設路徑跟預設儲存目錄同上)

./detectnet-console 要偵測的影像路徑及檔名 偵測影像結果的路徑及檔名

執行以下指令來偵測範例中飛機的圖片airplane_0.jpg, 然後將偵測完的結果儲存為 airplane_0det.jpg。(偵測完的結果圖片儲存的目錄預設在jetson-inference/build/aarch64/bin裡面)

./detectnet-console airplane_0.jpg airplane_0det.jpg

使用範例圖片airplane_0.jpg的偵測結果如下,可以看到偵測出飛機這個物件並把它框起來

2317_510032cd133884123b8072783cfb9ad381530137.jpg

Step3 接著是攝影鏡頭的串流影像上(Camera)的物件偵測

執行以下指令來讓我們USB攝影機串流影像進行物件偵測可以看到以下結果

2420_32e5a251704a72a93c86e03583247bb085e0f06b.jpg

偵測結果可以看到有偵測到鍵盤、滑鼠還有手(人類)

五、影像分割 (Segmentation)

下指令呼叫靜態影像分割程式時格式如下:

範例分成可以應用在靜態影像上(Images)或是攝影鏡頭的串流影像上(Camera)的影像分割。

Step1 我們先將工作目錄移到以下範例資料夾中

cd ~/jetson-inference/build/aarch64/bin

Step2 呼叫影像分割範例來偵測NVIDIA提供的影像

下指令呼叫靜態物件影像分割程式時格式如下:(影像預設路徑如上)

./segnet-console 要分割的影像路徑及檔名 影像分割結果的路徑及檔名

執行以下指令來分割範例中馬的圖片horse_0.jpg,然後將分割完的結果儲存為 horse_0seg.jpg。(分割完的結果圖片儲存的目錄預設在jetson-inference/build/aarch64/bin裡面)

2517_a28d1104ad152c9e6cbd22af2b42030f3ef657ec.jpg

可以看到有分割成馬跟人兩種顏色

每種顏色所代表的物件如下圖

2618_f194eb8c34df074bc43db30afb054e2b809c9ff8.jpg

Step3 接著是攝影鏡頭的串流影像上(Camera)的影像分割

執行以下指令來讓我們USB攝影機串流影像進行影像分割可以看到以下結果

./segnet-camera --camera /dev/video0

2716_18ae2797f2a15d111df46e8564bac7531abe0d64.jpg

分割後看到黃色的是狗 粉紅色的是貓

以上就是我們的在Jetson nano上執行Deep Learning深度學習範例的介紹與教學,大家有沒有成功的執行影像辨識、物件偵測 、以及影像分割三種範例呢?未來我們將會推出更多豐富的內容,有興趣歡迎關注我們!

資料來源&相關連結:

nvidia官網介紹Deploying Deep Learning

https://developer.nvidia.com/embedded/twodaystoademo

jetson-inference github網站

https://github.com/dusty-nv/jetson-inference

什麼是深度學習 類神經網絡的卷土重來

https://speech.ee.ntu.edu.tw/~tlkagk/document/Basic.pdf

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