# 夜市小霸王 AMB82 MINI +YOLO V4 # AMB82 ## 簡介 * 安裝開發板 * 功能表/file/perferences/ 複製貼上以下紅字區域內容在空白處: > https://github.com/ambiot/ambpro2_arduino/raw/main/Arduino_package/package_realtek_amebapro2_index.json * 安裝開發版核心 * 輸入關鍵字 AMB82 * 請選擇最新4.0.5版本 如果編譯錯誤請選擇4.0.3版本 * 確認comport * 調整燒錄選項(理論上不用設定) -> 功能表/Tools查看選項  * 轉換燒錄模式 1. 先按住左側「下載按鈕」不放 2. 按右側「重開機按鈕」一下馬上放開「重開機按鈕」 3. 最後再放開「下載按鈕」 4. 完成模式轉換,藍燈會慢慢亮起 5. 燒錄完畢,還要按右側RST按鈕 重開機,才會開始執行  * 測試LED 燈   # Yolo.v4 ## 簡介 * YOLO=You Only Look Once * 目前 阿米巴僅支援v4、v7 (使用Darknet模型) * Darknet 是一種演算法、YOLO是一種結果 ## 自建YOLO步驟 1. Darknet下載及測試 2. 收集自己的資料集 3. roboflow資料處理 4. 在colab中處理設定檔 5. 修改yolo.cfg設定檔 6. 開始darknet訓練 7. 阿米巴載入自建訓練模型 8. 調整 Arduino IDE 程式燒錄阿米巴 ## 1 Darknet下載及測試 * 進行Darknet體驗(可以跳過) > Colab網址 > https://colab.research.google.com/drive/1L29oiSoE08Coi75nRbTgDASB8gCJVWTR?usp=sharing * 雲端硬碟檢查是否有 Colab Notebooks (名稱、大小寫、空白需要一致) * step3 查看系統顯示卡規格(NVIDIA AI加速) * 如果沒有取得顯示卡,可以換電腦,或是花錢訂閱  * step6 確認是否執行成功,可檢查是否出現183行,如下圖,就可以解讀成編譯Darknet成功  * Setp7 下載空的模型,有V4與V7版本,各又分為 全模型(要求辨識準度,不要求速度) 與 tiny精簡模型(不要求準度,要求辨識速度) * ==我們在這裡選擇tiny,因為阿米巴容量大小,僅適合tiny== * Setp9 模型選擇,這裡要確定好選擇模型 > 最後記得執行關機  ## 2 收集自己的資料集 * 收集自己的照片 * awake * sleep * InBed  ## 3 roboflow資料處理 * 透過 roboflow 達到資料擴增的效果 https://roboflow.com/ * 步驟如下 1. 建立計畫 * 建立專案實選擇 public plan (免費)  * 內建有一個範例是安全帽辨識 * 專案類型選擇 Object Detection (yolov4、v7 只有這個可以選擇) * 在'what are you detecting' 隨意填寫一個要辨識的項目   3. 上傳圖片 * 上傳照片,記得點選'save and continue'  4. 標記圖片-任務分配 * 選擇自己進行(免費)  5. 標記圖片 * 進行標標籤作業 -> 'start annotating'  * 僅能使用英文名 * 如果標錯,進行刪除即可(先點右邊的 手 ,再點該物件,再點刪除) * 盡量將要辨識的物件匡滿,可以超出去但不要沒框到  * 標記完畢後退到最外面去,檢視已經標示張數與未標張數  6. 調整比例 * 點'add images to dataset'  * 選擇訓練比例 'add all images to training set' -> 因為實際訓練與驗證都在colab  * 在左手邊'images'檢查照片是否正確 7. 資料擴增 : 泛化 * 左手邊 'generate' 資料產生器  * 進行 preprocessing 前置處理 * 預設的 auto-orient(自動轉向) 與 resize(自動改大小) 這兩個都不要   * 再到 augmentation 資料擴增  * 擴增有兩種 1. 整張圖(image lebile augmentions) 2. 只針對我們框選起來(bounding box level augmentions) * 我們使用 1.整張圖  * 使用底下特效 1. flip : 翻轉 水平或是垂直 (X) 2. 90 rotate : 90度翻轉(X) 3. Corp : 裁剪(X) 4. ==rotation :旋轉 選擇度數範圍(O)== 5. ==shear : 拉升 模擬變形狀況,都改成20度範圍(O)== 6. grayscaie :變黑白(X) 7. ==Hue : 色調發生改變(O) 例如陽光、光線改變 25度範圍== 8. ==Saturation : 飽和度 25度範圍(O)== 9. ==brightness :亮度 25度範圍(O)== 10. exposure :曝光(X) 11. ==Blur : 模糊(O) 2.5px== 12. ==Noise : 雜訊 5% (O)== 13. ==Cutout : 黑框 預設 (O)== 14. mosaic : 馬賽克 (X)  * 'create' 3X(免錢的好像只能選這個)  8. 匯出資料檔 * 'version' -> 'EXPORT dataset'  * Format 選擇 YoloDarknet * 選擇 download zip to computer  * 產生的檔案在train 資料夾中 * 會有一個 txt檔,內容為此次==標籤清單,清單順序從0開始==  * 將tran 資料夾更名為yolo * 上傳到雲端硬碟 ## 4 在colab中處理設定檔 * 將整個資料夾上傳到 ==Colab Notebooks/darknet/bread/== (有新增bread資料,可以自己更名)  * 資料預處理 : 拆分資料檔為訓練(80%)、測試(20%),以及產生訓練用相關資料,這些資料都將放置於cfg資料夾 > Colab網址 > https://colab.research.google.com/drive/1RJNQVaje_EwgdmHVOFMeXXUgGiMXgAW2?usp=sharing * ==程式要修改setp3 資料夾名稱,要與剛剛上傳的資料夾名稱一致== * ==類別名稱也需要與剛剛的txt檔中的標籤名稱、順序一致==  * 產生檔案 (執行上述程式後自動產生) 1. train.txt(<-訓練用檔案列表) 2. test.txt(<-測試(驗證)用檔案列表) 3. obj.data(<-訓練設定檔) 4. obj.names(物件名稱列表)  * setp5 產生檔案1、2 在cfg資料夾中 * setp6 產生檔案3、4 在cfg資料夾中 * setp7 下載空的訓練模型 v4、v7 + 全模組、tiny 都下載(資料夾名稱記得修改)  ## 5 修改yolo.cfg設定檔 * 全模組與tiny模組方式不同 * 使用notpad修改 * 全模組 請下載Colab上的 darknet/cfg/yolov4.cfg到電腦中,並用記事本開啟,修改以下4個參數 ```bash= 一、訓練批次 batch=64 #一批次 subdivisions=32 #批次再細分幾份(可減少記憶體用量) 二、訓練總次數 max_batches = 12000 #class x 2000=12000且大於4000 steps=9600,10800 #max_batches x 0.8 ~ x 0.9 ``` ```bash= 在cfg檔案中找第965到3個yolo區塊(,1053,1141) 三、修改其classes為6(種類數量) classes=6 並在每個yolo區塊上方找到convolutional區塊 四、修改其filters=(classes+5)*3 卷積核 filters=(classes+5)*3= 33 五、完成後存檔,上傳到bread/cfg資料夾 ``` > subdivision與記憶體 > batch/subdivision=每次輸入圖片量,影響記憶體用量 下圖為batch=64時的記憶體用量 subdivision數值越大,使用記憶體越少,訓練時間越長 > 全模型時盡量調整大一點 * tiny 請下載Colab上的 darknet/cfg/yolov4-tiny.cfg到電腦中,並用記事本開啟,修改以下4個參數 * 參數的設定主要是根據 class 標籤種類數而定 ```bash= 一、訓練批次 batch=64 #一批次 subdivisions=2 #批次再細分幾份(可減少記憶體用量) 二、訓練總次數 max_batches = 12000 #class x 2000=12000且大於4000 steps=9600,10800 #max_batches x 0.8 ~ x 0.9 ```  * scales 學習率 : 主要依循梯度下降,越到後面步伐要越小,才能找到最低點 * ==在cfg檔案中找到yolo區塊(第226、277行)== ```bash= 三、修改其classes為6(種類數量) classes=6 並在每個yolo區塊上方找到convolutional區塊 四、修改其filters=(classes+5)*3 卷積核 filters=(classes+5)*3= 33 ``` > ==有兩個地方要改(行數不一樣)==   * 完成後存檔,上傳到darknet/bread/cfg資料夾(bread 是根據自己的專案) * 確認最後須要有五個檔案  ## 6 開始darknet訓練 > Colab網址 > https://colab.research.google.com/drive/1m21BN0aqDY2_0qMNAfv1626aR64tIObU?usp=sharing > 訓練前可以添加底下指令,避免被踢出 ```javascript= function ClickConnect(){ console.log("Working"); document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click(); } setInterval(ClickConnect,60000) ``` * 訓練指令有兩種 * 第一次訓練 yolov4-tiny.conv.29 * 接續訓練 yolov4-tiny_last.weights 每100次自動存檔 * 使用時可以自行mark程式來選擇要哪種訓練 * ==記得路徑需要調整名稱(三個地方要修改)==    * 可以觀察訓練誤差值,理論上會越來越低,最少要1以下,最好0.0x ## 7 阿米巴載入自建訓練模型 * 訓練結果在colab notebooks/darknet/bread/cfg * 包含權重檔與設定檔 * 權重檔:weights/yolov4-tiny_final.weights * 設定檔:yolov4-tiny.cfg * 將weights及cfg壓縮成一個檔案 *  * 透過線上轉換檔案格式(YOLO .weights->AMB .nb) * 註冊並登入realtech AMB網站 * https://www.amebaiot.com/zh/amebapro2-ai-convert-model/ * 轉換時 選擇模型為 'yolo-tiny' * 選擇類行為 模型精細度 'INT16' * UINT8:不帶符號8 bit整數,模型約4-5Mb,正確率普通,速度快約5-6 fps * INT16:帶符號16位元整數,模型約9-10Mb,正確率較高,速度慢約2-3 fps * 上傳 weights + cfg * 至少給一張圖片(隨意) * 可將YOLO模型(.weight, cfg)轉成AMB專屬的.nb檔案 * 會在註冊郵箱中收到amb檔案 .nb 檔  * 取代原本的YOLO AI模型檔案 * 開啟檔案總管,尋找預設的類神經.nb檔案位置 %USERPROFILE%\AppData\Local\Arduino15\packages\realtek\hardware\AmebaPro2\版本\variants\common_nn_models * 如果是4.0.5版本 %USERPROFILE%\AppData\Local\Arduino15\packages\realtek\hardware\AmebaPro2\4.0.5\variants\common_nn_models * 先備份yolov4_tiny.nb,例如更名為yolov4_tiny(預設).nb * 下載的network_binary.nb,更名為yolov4_tiny.nb,貼到資料夾內。  ## 8 調整 Arduino IDE 程式燒錄阿米巴 * 選擇 AmebaNN -> ObjectDetectionCallback  * 修改wifi  * 修改 ObjectClassList.h * 把自己的類別名稱(可以參考 txt檔案) * 從第一個開始貼上 * 後面可以不用理會(模型只會判斷我們有的類別)  * 上傳 > 請記下網址,可以使用瀏覽器直接觀看  * 辨識結果     > 教學內容來自 夜市小霸王YT頻道 > https://www.youtube.com/watch?v=yi9TWcVY0xE
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up