---
# System prepended metadata

title: 夜市小霸王 AMB82 MINI +YOLO V4
tags: [專題]

---

# 夜市小霸王 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查看選項
![image](https://hackmd.io/_uploads/Sy386cFoR.png)
* 轉換燒錄模式
    1. 先按住左側「下載按鈕」不放
    2. 按右側「重開機按鈕」一下馬上放開「重開機按鈕」
    3. 最後再放開「下載按鈕」
    4. 完成模式轉換，藍燈會慢慢亮起
    5. 燒錄完畢，還要按右側RST按鈕 重開機，才會開始執行
![image](https://hackmd.io/_uploads/Skf6T9tsR.png)
* 測試LED 燈
![image](https://hackmd.io/_uploads/r1bKVGcoR.png)
![image](https://hackmd.io/_uploads/rkG3rzcs0.png)

# 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加速)
    * 如果沒有取得顯示卡，可以換電腦，或是花錢訂閱 
    ![image](https://hackmd.io/_uploads/HyvoZ2YiA.png)

* step6 確認是否執行成功，可檢查是否出現183行，如下圖，就可以解讀成編譯Darknet成功
![image](https://hackmd.io/_uploads/SJvXmAOsC.png)
* Setp7 下載空的模型，有V4與V7版本，各又分為 全模型(要求辨識準度，不要求速度) 與 tiny精簡模型(不要求準度，要求辨識速度)
    * ==我們在這裡選擇tiny，因為阿米巴容量大小，僅適合tiny==
* Setp9 模型選擇，這裡要確定好選擇模型
> 最後記得執行關機
![image](https://hackmd.io/_uploads/Byw3vAujC.png)

## 2 收集自己的資料集
* 收集自己的照片
    * awake
    * sleep
    * InBed
![image](https://hackmd.io/_uploads/rJbKSjYjA.png)


## 3 roboflow資料處理
* 透過 roboflow 達到資料擴增的效果 https://roboflow.com/
* 步驟如下
    1. 建立計畫
        * 建立專案實選擇 public plan (免費)
        ![image](https://hackmd.io/_uploads/Sy0eIjFs0.png)

        * 內建有一個範例是安全帽辨識
        * 專案類型選擇 Object Detection (yolov4、v7 只有這個可以選擇)
        * 在'what are you detecting' 隨意填寫一個要辨識的項目
        ![image](https://hackmd.io/_uploads/SkxsvsFiR.png)
        ![image](https://hackmd.io/_uploads/HJ_aDiFjA.png)



    3. 上傳圖片
        * 上傳照片，記得點選'save and continue'    
        ![image](https://hackmd.io/_uploads/Hydl_otjR.png)


    4. 標記圖片-任務分配
        * 選擇自己進行(免費)    
        ![image](https://hackmd.io/_uploads/S1QE_sFoR.png)


    5. 標記圖片
        * 進行標標籤作業 -> 'start annotating'    
        ![image](https://hackmd.io/_uploads/Hydd_oFo0.png)

        * 僅能使用英文名
        * 如果標錯，進行刪除即可(先點右邊的 手 ，再點該物件，再點刪除)
        * 盡量將要辨識的物件匡滿，可以超出去但不要沒框到
        ![image](https://hackmd.io/_uploads/SJzhOitj0.png)
        * 標記完畢後退到最外面去，檢視已經標示張數與未標張數
        ![image](https://hackmd.io/_uploads/HJu7hitjC.png)



    6. 調整比例
        * 點'add images to dataset'
        ![image](https://hackmd.io/_uploads/HJBvnstsA.png)

        * 選擇訓練比例 'add all images to training set' -> 因為實際訓練與驗證都在colab
        ![image](https://hackmd.io/_uploads/rymchstiA.png)

        * 在左手邊'images'檢查照片是否正確
    7. 資料擴增 : 泛化
        * 左手邊 'generate' 資料產生器
        ![image](https://hackmd.io/_uploads/BJflTotoC.png)
 
        * 進行 preprocessing 前置處理
        * 預設的 auto-orient(自動轉向) 與 resize(自動改大小) 這兩個都不要
        ![image](https://hackmd.io/_uploads/SkvM6jFi0.png)
        ![image](https://hackmd.io/_uploads/H1TEajKo0.png)

        * 再到 augmentation 資料擴增
        ![image](https://hackmd.io/_uploads/ryXIpitsR.png)

        * 擴增有兩種 1. 整張圖(image lebile augmentions) 2. 只針對我們框選起來(bounding box level augmentions)
        * 我們使用 1.整張圖
        ![image](https://hackmd.io/_uploads/HJaTy2Ks0.png)

        * 使用底下特效
            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)
        ![image](https://hackmd.io/_uploads/H1kW0iYsA.png)

        * 'create' 3X(免錢的好像只能選這個)
        ![image](https://hackmd.io/_uploads/S1-G0oKjA.png)

    8. 匯出資料檔
        * 'version' -> 'EXPORT dataset'
        ![image](https://hackmd.io/_uploads/SyC8RjFj0.png)

        * Format 選擇 YoloDarknet
        * 選擇 download zip to computer
        ![image](https://hackmd.io/_uploads/ryzcAoKiC.png)

        * 產生的檔案在train 資料夾中
        * 會有一個 txt檔，內容為此次==標籤清單，清單順序從0開始==
        ![image](https://hackmd.io/_uploads/SJGJy3KsC.png)

        * 將tran 資料夾更名為yolo 
        * 上傳到雲端硬碟
## 4 在colab中處理設定檔
* 將整個資料夾上傳到 ==Colab Notebooks/darknet/bread/== (有新增bread資料，可以自己更名)
![image](https://hackmd.io/_uploads/rkNYLhKjR.png)

* 資料預處理 : 拆分資料檔為訓練(80%)、測試(20%)，以及產生訓練用相關資料，這些資料都將放置於cfg資料夾
> Colab網址
> https://colab.research.google.com/drive/1RJNQVaje_EwgdmHVOFMeXXUgGiMXgAW2?usp=sharing

* ==程式要修改setp3 資料夾名稱，要與剛剛上傳的資料夾名稱一致==
* ==類別名稱也需要與剛剛的txt檔中的標籤名稱、順序一致==
![image](https://hackmd.io/_uploads/Hkgk_hFsR.png)

* 產生檔案 (執行上述程式後自動產生)
    1. train.txt(<-訓練用檔案列表)
    2. test.txt(<-測試(驗證)用檔案列表)
    3. obj.data(<-訓練設定檔)
    4. obj.names(物件名稱列表)
![image](https://hackmd.io/_uploads/Bk5odhYjC.png)

* setp5 產生檔案1、2 在cfg資料夾中
* setp6 產生檔案3、4 在cfg資料夾中
* setp7 下載空的訓練模型 v4、v7 + 全模組、tiny 都下載(資料夾名稱記得修改)
![image](https://hackmd.io/_uploads/SkVXFnFi0.png)

## 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

```
![image](https://hackmd.io/_uploads/HyEF5hKjC.png)

* scales 學習率 : 主要依循梯度下降，越到後面步伐要越小，才能找到最低點
* ==在cfg檔案中找到yolo區塊(第226、277行)==
```bash=
三、修改其classes為6（種類數量）
classes=6
並在每個yolo區塊上方找到convolutional區塊
四、修改其filters＝(classes+5)*3 卷積核
filters＝(classes+5)*3= 33

```
> ==有兩個地方要改(行數不一樣)==
![image](https://hackmd.io/_uploads/Byuys2KsA.png)
![image](https://hackmd.io/_uploads/ByXzj2tsA.png)

* 完成後存檔，上傳到darknet/bread/cfg資料夾(bread 是根據自己的專案)
* 確認最後須要有五個檔案
![image](https://hackmd.io/_uploads/rJ-us2ti0.png)

## 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程式來選擇要哪種訓練
    * ==記得路徑需要調整名稱(三個地方要修改)==
    ![image](https://hackmd.io/_uploads/r1zB63ti0.png)

![image](https://hackmd.io/_uploads/SkGWQTFjA.png)

![image](https://hackmd.io/_uploads/HJmqNTtsA.png)

* 可以觀察訓練誤差值，理論上會越來越低，最少要1以下，最好0.0x

## 7 阿米巴載入自建訓練模型

* 訓練結果在colab notebooks/darknet/bread/cfg
* 包含權重檔與設定檔
    * 權重檔：weights/yolov4-tiny_final.weights
    * 設定檔：yolov4-tiny.cfg
* 將weights及cfg壓縮成一個檔案
* ![image](https://hackmd.io/_uploads/rk9ddb5iR.png)
* 透過線上轉換檔案格式(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 檔
    ![image](https://hackmd.io/_uploads/H1ZXYWco0.png)

* 取代原本的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，貼到資料夾內。
![image](https://hackmd.io/_uploads/ByRPLfcj0.png)

## 8 調整 Arduino IDE 程式燒錄阿米巴
* 選擇 AmebaNN -> ObjectDetectionCallback
![image](https://hackmd.io/_uploads/rkSn8zcoA.png)

* 修改wifi
![image](https://hackmd.io/_uploads/SyCeKf5iR.png)

* 修改 ObjectClassList.h
    * 把自己的類別名稱(可以參考 txt檔案)
    * 從第一個開始貼上
    * 後面可以不用理會(模型只會判斷我們有的類別)
![image](https://hackmd.io/_uploads/Hy1ztfqsC.png)

* 上傳
> 請記下網址，可以使用瀏覽器直接觀看
![image](https://hackmd.io/_uploads/B1q4Fzqs0.png)
* 辨識結果
![image](https://hackmd.io/_uploads/BJNJ3z5o0.png)
![image](https://hackmd.io/_uploads/BkPHhz5oC.png)
![image](https://hackmd.io/_uploads/HyUnnGcoR.png)
![image](https://hackmd.io/_uploads/SkR8Tzqi0.png)

> 教學內容來自 夜市小霸王YT頻道
> https://www.youtube.com/watch?v=yi9TWcVY0xE