在NVIDIA Jetson Nano上實現JetBot AI自駕車專案-04道路跟隨篇(下)-訓練模型、應用範例

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

作者/攝影 郭俊廷
難度

★★★☆☆

所需時間 2小時

一、前言介紹

在前篇介紹了如何使用JetBot進行道路跟隨的資料蒐集,本篇要介紹如何訓練模型、應用範例的教學。道路跟隨是模擬車子在路上自動駕駛的情況,讓JetBot可以在道路上自動駕駛,遇到轉彎處即會轉彎,直線時即會直行。

注意:

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

 

二、Train Model 訓練模型

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

執行第1個區塊,匯入函式庫PyTorch, NumPy, Python Imaging Library等函式庫。

第2個區塊,可以選擇性執行。是解壓縮之前搜集的資料集,要解壓縮的檔名可以更改以下指令的ZIP檔名(如下圖紅框所示)。

!unzip -q road_following.zip

第3個區塊,定義資料前處理方式,資料夾用dataset_xy的資料夾。

第4個區塊,將資料集分成訓練集跟驗證集。

第5個區塊,建立DataLoader,設定模型訓練細節。

第6個區塊定義神經網絡模型,使用ResNet-18 model檔。第一次使用時需要下載ResNet-18模型檔。

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

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

第8個區塊將會開始訓練神經網路模型,原始程式碼是訓練70回合,更改NUM_EPOCHS數字為50訓練50回合就可以了。模型檔名稱可以更改以下best_steering_model_xy.pth檔案名稱為自己想要的模型檔名稱。

NUM_EPOCHS = 50
BEST_MODEL_PATH = 'best_steering_model_xy.pth'

訓練時旁邊的方框會顯示星號下面會顯示訓練的best_loss跟test_loss,直到顯示50次旁邊的方框星號變為數字代表訓練完成。

訓練完成會產生一個best_steering_model_xy.pth模型檔。
根據每個人的搜集資料數量不同而會影響訓練時間,以本文171張照片大約訓練20分鐘。

四、Live Demo應用範例

點選左邊的路徑”Home > Notebooks >road_following > train_model.ipynb”,就能打開以下的JupyterLab的Road Following – Live demo畫面。

這裡將會將攝影機看到的畫面根據之前X軸跟Y軸所指向的方向做出相對應的前進方向,這裡需要有相對應的模型檔才可以執行該檔案。

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

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

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

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

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

第5個區塊創建一個攝影機畫面。

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

robot = Robot(driver_board="dfrobot")

第7個區塊,定義滑塊來控制JetBot,這裡目前只是定義還沒連結功能所以目前改變數值並不會使車子移動,以下是四個滑塊的數值的解釋。

Speed Control (speed_gain_slider): 直線速度,預設是0,請慢慢增加速度不要一開始就調整至最大值。

Steering Gain Control (steering_gain_sloder): 搖擺程度,如果看到JetBot搖擺不定,則需要減小此數值。

Steering kd (steering_dgain_slider): 微分控制,計算誤差的斜率,斜率越大,系統會對輸出結果做更快的反應。速度緩慢的系統不需要。

Steering Bias control (steering_bias_slider): 修正左右馬達偏差,如果看到JetBot偏向道路的最右側或最左側,則應控制此滑塊,直到JetBot在道路正中間行駛。

系統建議慢慢修改數值,以較低的速度控制上述滑塊,才能得到效果較好的JetBot道路跟隨行為。

第8個區塊這裡會定義四個滑塊,分別代表目前X軸、Y軸的數值還有JetBot的直線速度跟搖擺程度的數值。

第9個區塊這裡開始JetBot會移動並定義執行辨識跟控制馬達的函式,會根據攝影機的畫面判斷X軸、Y軸的位置並決定該直行還是左轉右轉。並把X軸、Y軸的值傳回第8個區塊,連結第7個區塊並可透過第7個區塊的值來改變JetBot的速度、搖擺程度等等數值。

第10個區塊這裡會更新攝影機畫面傳回去給程式判斷,如果沒有執行這一步驟,攝影機的畫面將一直是沒有同步的狀態,執行完這個區塊可以回到第7個區塊控制JetBot的速度搖擺程度等等數值並將狀態顯示在第8個區塊。

執行完第10個區塊回到第7個區塊慢慢改變speed gain讓JetBot慢慢前進,避免暴衝不受控制。根據JetBot的前進方向跟偏移更改相對應的數值讓JetBot在道路上能平穩的自動行駛。其相對應的數值也會顯示在第8個區塊。

第11個區塊將停止同步畫面傳送,移動路徑判斷也會停止。並停止JetBot的移動。

在這邊提醒一下,如果在道路跟隨時某個轉彎或某個路徑道路跟隨的效果不好的時候,可以嘗試在效果不好的地方搜集更多的資料並重新訓練模型並重新執行,會讓JetBot道路跟隨的效果更好。

以下是我們樂高的道路跟隨影片

 

還有另外的綠色地圖場景的道路跟隨影片

以上Jetson nano上執行JetBot專案Part4道路跟隨篇後篇-訓練模型、應用範例的講解到這邊告一段落,各位有沒有成功讓車子自動在道路上行駛呢?接著我們會繼續介紹更多Jetson nano相關的範例,有興趣的人歡迎繼續關注我們。

 

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

發佈留言

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