在NVIDIA Jetson Nano上實現JetBot AI自駕車專案-03迴避障礙篇(上)

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

作者/攝影 郭俊廷
難度

★★★☆☆

所需時間 2小時

上次介紹了如何讓JetBot基本移動功能可以在網頁上操控JetBot移動,並且使用搖桿控制JetBot移動,拍照等等功能。

這次開始會使用JetBot的攝影機讓JetBot達成避開障礙物的功能。

JetBot的迴避障礙效果是使用深度學習來達成的,經過資料搜集、訓練模型之後,執行程式才會有避障的效果。根據你標記的標籤來判斷JetBot透過攝影機看到的畫面該避開障礙物還是繼續行走。

首先來看看我們訓練好的成果是如何呢?

當我們看到綠色的場地直走,看到三角錐或白色的牆壁就會左轉。

 

接著介紹深度學習

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

下圖是人工智慧、機器學習、深度學習的關係圖。

機器學習可以分成四大分類:

  • 監督式學習Supervised learning
  • 非監督式學習Unsupervised learning
  • 自監督式學習Self-supervised learning
  • 增強式學習Reinforcement learning

 

監督式學習是有標準答案、標註 (Annotation),所有資料都有標籤過,每個標籤提供機器相對應的值來讓機器學習輸出時判斷誤差使用。  Ex. ig、fb廣告推薦

非監督式學習是無標準答案  Ex: 分群、找關聯、編碼、異常檢測

自監督式學習則是自己根據歷史資料產生答案,對部分資料進行標籤,電腦只透過有標籤的資料找出特徵並對其它的資料進行分類。

增強式學習是觀察後,選擇最大化獎勵的行動。

 

而我們的JetBot使用的是監督式學習,把搜集到的資料標註到相對應的類別,執行相對應的動作。

機器學習跟一般傳統程式學習的差別在哪裡呢?

傳統程式是使用規則加上資料經過程式後得出答案的

機器學習是先有答案加上資料經過訓練模型後產生規則來處理後續新的資料

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

 

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

Step 1. 定義問題

Step 2. 建立資料集

Step 3. 選擇評量的成功準則

Step 4. 根據資料量決定驗證方法

Step 5. 資料預處理

Step 6. 建立並訓練模型

Step 7. 開發出Overfitting的模型

Step 8. 粗胚的精雕細琢 – 調整參數使其變成通用模型

Step 9. 應用

 

JetBot把避障使用的神經網路模型精簡分為三大步驟

Data Collection  資料搜集

Train Model   訓練模型

Live Demo  應用範例

 

接著我們一一介紹這三大步驟如何操作使用,本篇先教大家如何資料搜集,以及資料搜集的一些小技巧。

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

避障資料夾的檔案位置

 

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

 

二、Data Collection資料搜集

首先點選左邊的路徑”Home > Notebooks >collision_avoidance > data_collection.ipynb”,就能打開以下的JupyterLab的Collision Avoidance – Data Collection畫面。

JupyterLab的Collision Avoidance – Data Collection畫面

 

以下是Data Collection資料搜集之流程圖,根據流程圖我們要先決定資料搜集時的場地背景跟燈光,還有決定甚麼是障礙物甚麼是可自由行走的分類,搜集資料拍照分類時的時間會比較快資料的辨識率也會比較準確。

以下是Data Collection資料搜集執流程圖

 

在範例說明中提到:

要解決最重要的問題之一是防止JetBot進入危險的狀態!我們稱這種行為為避免碰撞。

嘗試使用深度學習和一個非常通用的感測器:相機來解決問題。

採取避免碰撞的方法是在機器人周圍創建一個虛擬的“安全氣泡”,在此安全氣泡內,機器人可以繞圈旋轉而不會撞到任何物體。

執行此操作的方法如下:

首先我們將JetBot放置在違反其“安全氣泡”的場景中,並將這些場景拍照並添加分類為blocked。

之後我們手動將機器人放置在可以安全向前移動的場景中,並為這些場景拍照並添加分類為free。

 

因為是使用照片來訓練模型的關係,我們在搜集資料和實際執行所使用的場景跟光源請在同一場景並使用同樣的光源,不然執行起來的效果會很差。

我們使用場景如下:綠色的地板為(free)

三角錐、其他障礙物、白色牆壁背景為(blocked)

 

首先執行第1個區塊,該區塊的程式先創建一個224×224像素攝影機的畫面即時顯示在畫面上。

第2個區塊,建立一個dataset資料夾裡面有blocked跟free兩個資料夾,用來儲存等等要拍照分類的照片。

第3個區塊會建立一個增加free類別跟增加blocked類別的按鈕,並顯示該類別有幾張照片的數量。此時只是建立元件而以按下去並無任何反應。

第4個區塊將定義並連結按下free跟blocked按鈕所執行的動作,按下add free跟add blocked按鈕會使用uuid1的命名格式儲存jpg檔到相對應的資料夾。

第5個區塊,顯示目前攝影機看到的畫面,並顯示add free、add blocked類別的按鈕跟相片數量的視窗,此時按下去即會儲存照片到相對應的資料夾。

如下圖所示,目前攝影機看到的畫面是有三角錐的畫面,應該使用blocked類別,按下add blocked的按鈕之後會在dataset資料夾裡面的blocked資料夾裡新增一張照片(如圖的紅框所示)

拍好的照片可以直接在JupyterLab點選照片檔案名稱開啟查看,如發現照片拍得不好或是分類錯誤可直接點選該檔案右鍵選擇Delete刪除該檔案。

接著重複執行搜集資料分類的動作,根據檔案上的說明每個類別至少需要100張照片,嘗試不同拍照的方向、不同拍照的光源、嘗試各種物體/碰撞類型。

根據我們的場景blocked類別的拍照技巧為拍攝單一障礙物在正前方(各色測試)、單一障礙物在左側、單一障礙物在右側、雙障礙物在正前方、雙障礙物在兩側、手或腳遮住等等情況。

blocked資料夾的照片內容blocked資料夾的照片內容

 

free類別的照片則是拍攝各種光影角度跟位置來增加照片。

free資料夾的照片內容

 

第6個區塊,可以把我們搜集到的資料壓縮成zip檔,預設壓縮成dataset.zip為檔名,可以根據您執行的日期或場景來決定該zip檔的命名方式,這樣下次想使用不同的情境的場地不同的障礙物才容易分辨。

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

!zip -r -q dataset.zip dataset

以上障礙迴避篇(上)資料搜集的講解到這邊告一段落,各位有沒有順利的搜集好資料呢?

下一篇要接著講解如何訓練模型並把模型應用到範例上。接著我們會繼續介紹更多JetBot相關的範例,有興趣的人歡迎繼續關注我們!

 

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

發佈留言

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