在NVIDIA Jetson Nano上實現JetBot AI自駕車專案-03迴避障礙篇(下)-訓練模型、應用範例

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

作者/攝影郭俊廷
難度

★★★☆☆

所需時間2小時

一、前言

前篇介紹了機器學習與深度學習的相關基礎知識,並且介紹了如何搜集資料。

後篇我們來介紹如何將搜集好的資料訓練成模型檔,並且實際應用到JetBot小車上,讓JetBot可以判斷前方有無障礙物,該前進還是轉彎呢。

 

注意:如果你是接續前一個專案繼續執行此專案,執行完前一個檔案的功能之後記得關閉kernel和使用視窗,才不會發生攝影機被占用等錯誤訊息。(相關教學請參考在Jetson nano 上執行JetBot專案Part2 移動篇之說明)

 

二、Train Model 訓練模型

點選左邊的路徑”Home > Notebooks >collision_avoidance > train_model.ipynb”,就能打開以下的JupyterLab的Collision Avoidance – Train Model畫面。

這裡是負責把之前搜集到的資料集訓練成模型檔的程式。

以下是Train Model 訓練模型流程圖

首先執行第1個區塊,JetBot使用深度學習庫PyTorch來訓練模型並且使用了多種PyTorch函式庫來訓練模型。

第2個區塊是解壓縮dataset.zip檔,這是給已經搜集完資料想更換搜集資料集的人使用的指令,如果Data Collection程式已搜集完資料並有dataset資料夾者不用執行這一區塊,如果有想要更改資料集的人可以根據剛剛更改壓縮的檔名來解壓縮該檔案。

更改以下指令dataset.zip檔名來更改要解壓縮的檔案名稱。

!unzip -q dataset.zip -y

第4個區塊創建dataset的實例,把dataset資料夾裡面搜集的資料使用torchvision.datasets數據包跟torchvision.transforms數據包來分類跟轉換資料。

第5個區塊將數據集拆分為訓練集和驗證集

第6個區塊將會設定訓練集和驗證集的參數

第7個區塊將會定義我們的神經網路,並且設定使用alexnet模型,初次使用會下載alexnet模型,這裡執行的時間會根據網路的速度而異,請耐心等候,並區塊前面顯示*號。

下載完之後顯示畫面如下圖。

第8個區塊是將alexnet模型原本1000個類別標籤的數據集訓練的轉換成2個輸出。

第9個區塊是將轉移模型在GPU上執行。

第10個區塊即開始將資料集訓練成模型檔,預設訓練30回合,根據建議各類別100張左右的照片訓練時間大約為十分鐘。訓練完成會產生一個best_model.pth的模型檔(如下圖左邊紅框所示)

可以更改以下指令數字更改訓練回合數。

NUM_EPOCHS = 30

更改以下指令best_model.pth檔名可以將訓練的檔案儲存為不同檔名。

BEST_MODEL_PATH = 'best_model.pth'

 

三、Live Demo應用範例

點選左邊的路徑”Home > Notebooks >collision_avoidance > live_demo.ipynb”,就能打開以下的JupyterLab的Collision Avoidance – Live Demo畫面。

這裡將會將看到的畫面根據是free或是blocked做出相對應的動作,這裡需要有相對應的模型檔才可以執行該檔案。

注意這裡執行場地的背景跟燈光請跟訓練時的狀況一樣,否則執行辨識的效果會不好。

Live Demo應用範例執行步驟流程圖

首先執行第1個區塊宣告使用PyTorch函式庫設定模型參數

第2個區塊使用模型檔best_model.pth為模型,如果之前有儲存模型檔檔名為別的檔名一樣在這個部分更改為自己的模型檔名。(如下圖的紅框所示)

model.load_state_dict(torch.load('best_model.pth'))

第3個區塊是把模型權重從CPU內存轉移到GPU上執行。

第4個區塊是定義影像預處理方法

從BGR轉換為RGB模式

從HWC佈局轉換為CHW佈局

使用與訓練期間相同的參數進行標準化(我們的攝像機提供[0,255]範圍內的值,並在[0,1]範圍內訓練加載的圖像,因此我們需要縮放255.0

將數據從CPU內存傳輸到GPU內存

批量添加維度

第5個區塊創建一個攝影機畫面,大小是224*224,並且創建一個滑桿可以顯示攝影機目前看到的畫面是blocked的機率為多少(機率由0.00至1.00)。

第6個區塊,定義馬達參數,這裡使用之前文章講解過的DFrobot馬達驅動板的馬達參數。

robot = Robot(driver_board="dfrobot")

第7個區塊,這裡會開始JetBot會開始移動請注意不要將JetBot放在桌上或是容易摔落撞到的地方。

根據下列程式碼,會執行以下動作當判斷blocked的機率小於0.5的時候就以40%的速度前進,當判斷blocked的機率大於0.5就以40%的速度左轉。可以根據自己的使用情境更改下面的機率跟速度的數值。

    if prob_blocked < 0.5:
        robot.forward(0.4)
    else:
        robot.left(0.4)
    
    time.sleep(0.001)

第8個區塊這裡會更新攝影機畫面傳回去給程式判斷,如果沒有執行這一步驟,攝影機的畫面將一直是沒有同步的狀態,執行完這個區塊可以回到第5個區塊查看JetBot避障效果如何。

當看到綠布的畫面blocked的機率為0.07遠小0.5,所以是free的狀態車子會直走。

當看到三角錐的畫面blocked的機率為1.00遠大0.5,所以是blocked的狀態車子會向左轉。

第9個區塊,這裡會停止同步畫面傳送,blocked的機率判斷會停止執行,JetBot也會停止。

第10個區塊、第11個區塊這裡可以設定是否要將攝影機畫面連結到JupyterLab同步顯示,第10個區塊是中斷連結,第11個區塊是繼續連結。

 

車子避障實際影片:

以上避障篇後篇-訓練模型、應用範例的講解到這邊告一段落,各位有沒有成功讓車子避開障礙物呢?接著我們會繼續介紹更多JetBot相關的範例,有興趣的歡迎繼續關注我們。

 

 

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

發佈留言

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