RK-JETBOT 避開障礙物功能多類別辨識教學 – 收集資料篇

前言

NVIDIA JetBot 是基於NVIDIA Jetson Nano的一個開源自主機器人平台,而 Jetson Nano 是NVIDIA 推出的邊緣運算裝置之一,專為運行現代 AI 任務而設計,針對不同的算力需求提供儒門到高階的 Jetson 規格。JetBot結合了Jetson Nano的這些特點,使其成為進行AI實驗和開發的理想平台,特別是在機器人學、自動駕駛、機器視覺等領域。

本文將延伸 Jetbot 原廠教學,讓機器人可以辨識更多類別且可自行定義的障礙物!

CAVEDU 教育團隊針對 Jetbot 已辦理過多次 Jetbot 道路識別競賽,有興趣的單位歡迎洽詢,我們可提供研習、師資訓練與比賽相關設備!

本文

JetBot 原廠教學中已說明如何偵測自定義的物體,並根據偵測結果來執行不同的動作,簡單來說就是避開障礙物啦。但這份教學中只教了如何辨識兩種類別,如果要辨識更多類別並有著不同的行為,應該怎麼做呢?

撰寫/攝影 郭俊廷
時間 2 小時 (看要花多少時間收集資料) 材料表
難度 3(滿分5)

由於 JetBot 是一台純視覺的機器人,換言之,它對於環境的理解全部來自於攝影機,並經由自身的神經網路模型推論出它所看到的當下畫面屬於哪個類別,再讓 JetBot 執行對應的動作,例如前進、轉彎或停止等等。這些功能並非開箱即用,必須經過資料搜集、訓練模型之後,執行程式才會有避障的效果。

首先來看看訓練好的成果是如何呢?以這次蒐集的資料為例,機器人看到灰色的地板會直走 (代表無障礙物),看到紅色或藍色三角錐就會左轉或右轉 (代表兩種不同的障礙物,執行的動作也不同)。

深度學習

深度學習是機器學習的一個分支,它是以神經網路為架構對資料進行特徵學習的演算法。機器學習則是從過往資料和經驗中學習並找到其運行規則,而人工智慧則是包含所有機器學習和深度學習的範疇,期望能讓機器展現人類的智慧可以感知、推論、交流、學習、行動。

下圖是人工智慧、機器學習、深度學習的關係圖,這類圖片在網路上相當常見,可以自行搜尋一下或問問 chatGPT 囉。

 

機器學習可以分成三大分類,如下圖 (圖片來源),分成:

  • 監督式學習 (Supervised learning)
  • 非監督式學習 (Unsupervised learning)
  • 增強式學習 (Reinforcement learning)
  1. 監督式學習是有標準答案、標註 (Annotation),所有資料都加註了標籤(標註, labeled),每個標籤提供機器相對應的值來讓機器學習輸出時判斷誤差使用,常見應用以視覺來看的話,包含了視覺分類與物件偵測等等,當然學習的效果就取決於資料集品質囉。JetBot使用的是監督式學習,把搜集到的資料標註到相對應的類別,執行相對應的動作。
  2. 非監督式學習則是沒有標準答案,常見的應用包含分群、找關聯、編碼、異常檢測
  3. 增強式學習則是專注於如何讓智能代理(agent)在環境中採取行動來最大化獎勵。不同於監督學習,強化學習不依賴於預先標記的輸入/輸出對,而是通過智能體與環境的互動學習策略,從成功和失敗的經驗中學習。常見應用包含遊戲、機器人等等。

額外延伸還有自監督式學習,讓系統根據歷史資料產生答案,對部分資料進行標籤,電腦只透過有標籤的資料找出特徵並對其它的資料進行分類。

機器學習跟一般傳統程式學習的差別

傳統程式是使用規則加上資料,經過邏輯判斷之後得出答案,機器學習則是資料搭配正確答案,模型經過訓練後找出兩者之間的規則來處理後續新的資料
深度學習神經網路模型建立流程

深度學習通用的神經網路模型建立流程可以分為九個步驟:

  • Step 1. 定義問題
  • Step 2. 建立資料集
  • Step 3. 選擇評量的成功準則
  • Step 4. 根據資料量決定驗證方法
  • Step 5. 資料預處理
  • Step 6. 建立並訓練模型
  • Step 7. 開發出Overfitting的模型
  • Step 8. 粗胚的精雕細琢 – 調整參數使其變成通用模型
  • Step 9. 應用

JetBot 則把上述簡化為三大步驟:

  1. 資料搜集 (Data Collection)
  2. 訓練模型 (Train Model)
  3. 應用範例 (Live Demo)

接著要依序介紹這三大步驟如何操作使用,以及如何將原本的兩個類別改為三個類別的分類避開障礙物。考量到篇幅,本文只介紹到資料收集,接著會另寫一篇文章來介紹。

Jetbot 開機並連入其 jupyter notebook 介面之後,在以下路徑  home > jetbot_CAVEDU/collision_avoidance 可以看到以下檔案,如下圖紅框處。

其中以C3結尾的檔案,就是由原本雙類別避障功能修改過後的三種類別另存新檔後避開障礙物的檔案

  • data_collectionC3.ipynb (三種類別資料蒐集)
  • live_demoC3.ipynb (三種類別應用範例)
  • train_modelC3.ipynb (三種類別訓練模型)

Collision Avoidance – Data Collection  資料收集

首先點選 home > jetbot_CAVEDU/collision_avoidance/data_collectionC3.ipynb,就能打開以下的JupyterLab 的 Collision Avoidance – Data Collection 畫面。

data_collectionC3 這個檔案可以在收集資料後歸類到三種類別中,您可根據實際需要來修改相關設定,目前試過最多五種類別都沒問題。

第1個區塊設定要蒐集資料夾的命稱,更改 ‘   ‘ 引號裡面的紅字資料夾名稱例如我目前是三種類別的資料取名為class3

第2~3個區塊是設定功率模式與開啟風扇,這個的程式碼不需要也不建議修改,設定功率模式到10W可以加快系統的效能。

執行第4個區塊,該區塊程式會建立一個 224×224 像素的方塊來即時顯示攝影機畫面。

第5個區塊,原本的教學是建立一個 dataset 資料夾,裡面有 blockedfree 兩個資料夾,用來儲存後續要拍照分類的照片。

但本範例要調整為三個類別,所以改用 a b c三個資料夾來命名(請取名a b c因為這在之後辨識lable的時候會使用英文字母順序來辨識不同的標籤,後續會再說明),並且下面的建立資料夾指令也要呼叫OS指令建立三個對應的資料夾(如下圖紅框處)

第6個區塊,新增了按鈕來建立三個類別的圖片(按鈕上的文字可自行修改,例如我們有other、blue、red就可以寫上add這三個類別的說明),並顯示該類別有幾張照片的數量。請注意,此時只是建立元件,尚未決定按下按鈕後的行為,所以按鈕不會有任何反應,修改的地方如下圖紅框處,從原本的兩個類別變成三個。

第7個區塊將定義並連結按下上述三個按鈕所要執行的動作,按下add otheradd blueadd red按鈕會使用uuid1的命名格式,將圖片以 jpg 檔儲存到對應的資料夾中。通用唯一辨識碼(英語:Universally Unique Identifier,縮寫:UUID)

第8個區塊負責顯示攝影機的最新畫面,並顯示add otheradd blueadd red按鈕與相片數量的視窗,此時按下按鈕,就會拍照並儲存到相對應的資料夾。

第9個區塊,會斷開攝影機,代表不會再更新攝影機影像啦。請注意不要一口氣或從頭到尾一直執行所有區塊,這會導致攝影機連結中斷,請在資料收集完畢之後不再需要攝影機時,再執行此區塊。

第10個區塊會把所收集的資料壓縮成 .zip檔,預設檔名為 dataset.zip。請根據您執行的日期或場景來修改檔名,後續才不會搞混喔!更改以下dataset.zip的名稱來更改為壓縮的檔名,更改以下dataset名稱為我們預設使用的 class3。

第11個區塊執行後會關閉風扇,風扇將會慢慢減速不會瞬間關閉請耐心等候。

蒐集資料的方法

本範例將所要辨識的類別從原本的兩種,再多加了一種。您可根據實際需要來擴充更多類別,當然啦更多資料也會需要更多的訓練時間才能完成喔!

無障礙物(other)

這裡的照片會被歸類到 dataset/other 資料夾中。正前方無障礙物的場地上(各種光影角度跟位置),我知道看起來差不多,但收集資料就是要耐心囉~

藍色障礙物(blue)

這裡的照片會被歸類到 dataset/blue 資料夾中。請注意本範例的影像分類屬於一張圖一個標籤( one image one label),所以請不要在同一個畫面中同時出現兩種障礙物。更進階的物件偵測模型或甚至影像分割模型就能做到更好的偵測結果,但不是本範例所要討論的內容。

紅色障礙物(red)

這裡的照片會被歸類到 dataset/red 資料夾中。

關閉檔案和kernel

執行完這個 ipynb 檔案之後記得關閉 kernel 和使用視窗,即點選正在使用的視窗上的叉叉還有左邊目錄第二個小圖示,按SHUTDOWN關閉正在使用的所有kernel才可執行下一個檔案,才不會發生攝影機被占用等錯誤訊息。接下來執行完每個檔案都要這樣做,不然 Jetson Nano 的記憶體會被吃光喔 (原本就不多了呀)

總結

本文根據 JetBot 原廠教學,將原本的雙類別辨識擴充為多類別。由於篇幅考量,本文只介紹到收集資料,下一篇再介紹訓練模型與實際展示。

發佈留言

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