RK-Jetbot機器學習道路識別競賽 操作手冊

1.連上JupyterLab

首先我們會先把網路線接上jetbot,透過筆電共用網路給jetbot,使用Wireless Network Watcher這套軟體來掃描同網段的IP,並連線進JupyterLab,即可開始我們的道路識別操作流程。

打上你掃描的IP:8888進入JupyterLab

例如我的IP是192.168.137.227

就在網址列輸入192.168.137.227:8888 即可進入以下畫面

密碼是jetbot

1.1 進入道路跟隨範例

進入JupyterLab之後進入以下資料夾可以進入我們修改過的道路跟隨範例

Home>jetbot_CAVEDU>road_following

 

道路跟隨的範例分為三大步驟:資料搜集、訓練模型、即時展示

 

在以下路徑“Home>jetbot_CAVEDU>road_following”可以看到以下三個檔案,如下圖的紅框處所示。

分別是

  • Data Collection資料搜集
  • Train Model 訓練模型
  • Live Demo 即時展示

2.Data Collection資料搜集

2.1打開Data Collection畫面

點選左邊的路徑”Home>jetbot_CAVEDU>road_following > data_collection.ipynb“,就能打開以下的JupyterLab的Road Following – Data Collection畫面。

在資料搜集前先介紹場地與賽道地圖(如下圖)。

賽道地圖

2.2JupyterLab中執行方法跟呼叫函式庫

首先移動到第1個區塊執行第1個區塊Import Libraries,匯入函式庫OpenCV, JetBot, Jupyter Widgets, NumPy等等函式庫,並呼叫馬達參數等等設定。

在JupyterLab中執行程式碼的方式為點選程式碼區塊,然後按下快捷鍵”Shift+Enter”,或上面RUN的按鈕來執行程式。

 

RUN的按鈕位置如下圖紅色框框所示

*號代表程式正在執行(右上角Python3旁邊的黑色圈圈也一樣),請不要急著執行下一個區塊,要等一個區塊執行完在執行下一個區塊,*號變成數字後代表區塊執行完畢。(如下圖紅框處)

2.3更改資料搜集資料夾名稱

接著第2個區塊[Collect data]就會開始進行資料搜集了,這一步驟要注意的是要先更改你的資料搜集資料夾名稱,避免跟別人搜集的資料重複。

規定更改的資料夾名稱為參賽組別_dataset_日期

例如是第一組1030收集的資料可以命名為01_dataset_1030

更改以下程式碼引號內容的資料夾名稱 (如下圖紅框處)

DATASET_DIR = ’01_dataset_1030’

執行完第2個區塊[Collect data]可以看到旁邊新增你剛剛輸入名稱的的資料夾,下面也會顯示出資料搜集的介面了。

可以利用右邊的前、後、左、右、停止控制JetBot移動,或是一個人移動車子一個改變滑桿數值這樣搜集的效率比較快

 

利用中間的滑桿改變X軸、Y軸的數值使綠色圓點在道路的中心點,並按下[save]按鈕,將照片儲存至指定資料夾。

中間的count是顯示目前搜集了幾張照片

2.4搜集資料技巧

基本搜集的資料的訣竅如上述所說是利用中間的滑桿改變X軸、Y軸的數值使綠色圓點在道路的中心點

但你可以決定讓車子是要走在道路的中間,還是道路的內側或外側。車子走在道路的中間最安全車子最不容易跑處賽道外,車子走在道路的內側行走的時間最短但沒有訓練好轉彎很容易跑出賽道外,車子走在道路的外側轉彎比較容易通過但行走的時間也較長。一開始就要先想好你的車子要如何在賽道中行走。

搜集資料示意圖

 

建議階段二、四收集較多資料

 

2.5顯示搜集幾張照片

第3個區塊[Next]執行後會顯示目前共搜集了幾張照片。

2.6壓縮搜集資料夾

第4個區塊執行後會壓縮你搜集好的資料夾,會根據壓縮的資料夾名稱日期來命名。(如下圖的紅框所示)

壓縮好記得要把搜集資料檔案傳入隨身碟才不會不見

下載壓縮檔方式,在左邊檔案處點選右鍵Download,即可將檔案下載至你的電腦中在從電腦傳送至隨身碟。

 

2.7關閉連結攝影機

第5個區塊執行後,會關閉攝影機的連結,攝影機畫面會沒有及時同步在網頁上。

2.8關閉檔案和kernel

執行完一個檔案之後記得關閉kernel和使用視窗,即點選正在使用的視窗上的叉叉還有左邊目錄第二個選項的人離開的圖案,按SHUTDOWN關閉正在使用的所有kernel才可執行下一個檔案,才不會發生攝影機被占用等錯誤訊息。接下來執行完每個檔案都要這樣做。

3.Train Model 訓練模型

3.1打開Train Model畫面

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

3.2匯入函式庫

執行第1個區塊[Road Follower – Train Model],匯入函式庫PyTorch, NumPy, Python Imaging Library等函式庫。

3.3解壓縮檔案(從別的地方複製壓縮檔才需要執行)

第2個區塊[Downlad and extract data],可以選擇性執行,如果已有蒐集好的資料夾則不用執行。這裡是解壓縮之前搜集的資料集,要解壓縮的檔名可以更改以下指令的ZIP檔名(如下圖紅框所示)。

!unzip -q road_following.zip

3.4更改訓練時使用資料夾名稱

第3個區塊[Create Dataset Instance],定義資料前處理方式,資料夾用你在搜集資料時所命名的資料夾,例如剛剛我們使用01_dataset_1030為命名資料夾,最下面程式碼引號裡面紅字資料夾的部分要改成對應的名稱。

 

dataset = XYDataset(’01_dataset_1030′, random_hflips=False)

3.5將資料集分成訓練集跟驗證集

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

3.6設定模型訓練細節

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

3.7使用ResNet-18

第6個區塊定義神經網絡模型,使用ResNet-18 model檔。第一次使用時需要下載ResNet-18模型檔。(這裡我們都預先下載好了)

3.8轉移模型在GPU上執行

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

3.9更改訓練回和數和模型檔名稱

第8個區塊[Train Regression]將會開始訓練神經網路模型,原始程式碼是訓練50回合,更改NUM_EPOCHS數字為35就會訓練35回合(目前測試150張圖片50回合為20分鐘35回合為15分鐘),根據你想訓練的回和數和剩下的時間來評估你要訓練的回和數。

模型檔名稱可以更改以下best_steering_model_xy.pth檔案名稱為自己想要的模型檔名稱。

這裡我們規定的模型檔名稱為:組別_model_收集的日期

將以下更改為

NUM_EPOCHS = 50

BEST_MODEL_PATH = 'best_steering_model_xy.pth'

 

NUM_EPOCHS = 10

BEST_MODEL_PATH = '01_model_1030.pth'

訓練完成會顯示D one!並產生一個對應檔名的模型檔.pth檔。

以這裡為例是你剛剛修改檔名的01_model_1030.pth

注意最後要把你的模型檔放入你的隨身碟才不會不見或搞混

根據每個人的搜集資料數量不同而會影響訓練時間,以150張照片35回合大約訓練15分鐘,10回合大約5分鐘。

3.10關閉檔案和kernel

執行完一個檔案之後記得關閉kernel和使用視窗,即點選正在使用的視窗上的叉叉還有左邊目錄第二個選項的人離開的圖案,按SHUTDOWN關閉正在使用的所有kernel才可執行下一個檔案,才不會發生攝影機被占用等錯誤訊息。。接下來執行完每個檔案都要這樣做。

4.Live Demo

4.1打開Live demo畫面

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

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

4.2使用PyTorch函式庫設定模型參數

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

4.3更改模型檔名稱

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

例如我們剛剛命名的模型檔為01_model_1030.pth即更改為01_model_1030.pth

 

model.load_state_dict(torch.load(’01_model_1030.pth’))

 

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

4.4定義影像預處理方法

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

4.5創建攝影機畫面、定義馬達參數

4.6定義JetBot控制滑塊和顯示滑塊

第6個區塊定義JetBot控制滑塊和顯示滑塊

右邊定義滑塊來控制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道路跟隨行為。

 

另外左邊定義

四個滑塊,分別顯示目前X軸、Y軸的數值還有JetBot的直線速度跟搖擺程度的數值。

 

4.7定義執行辨識跟控制馬達的函式

這一步驟要注意車子會開始移動,請注意車子的位置不要擺在桌子上或使用東西讓車子墊高避免車子摔落或撞壞(如下圖)實際執行時車子都放到賽道上

第7個區塊這裡開始JetBot會移動並定義執行辨識跟控制馬達的函式,會根據攝影機的畫面判斷X軸、Y軸的位置並決定該直行還是左轉右轉。並把X軸、Y軸的值傳回第6個區塊,連結第6個區塊並可透過第6個區塊的值來改變JetBot的速度、搖擺程度等等數值。(這時候攝影機畫面還沒同步,車子還沒同步更新改變車子的速度也不會有反應)

4.8傳回攝影機畫面、車子開始移動

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

4.9停止傳回攝影機畫面、車子停止移動

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

4.10關閉檔案和kernel

執行完一個檔案之後記得關閉kernel和使用視窗,即點選正在使用的視窗上的叉叉還有左邊目錄第二個選項的人離開的圖案,按SHUTDOWN關閉正在使用的所有kernel才可執行下一個檔案,才不會發生攝影機被占用等錯誤訊息。接下來執行完每個檔案都要這樣做。

發佈留言

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