文章目錄
神器!200元開發板運行神經網絡模型,吊打OpenMV!(保姆級教程)
一、前言
2021年電賽馬上就要開始了,在過去電賽中,當我們遇到需要用視覺的題目時,第一時間想到的就是使用openmv來做視覺處理,雖然說可以勉強達到設計目標,但整體上的性能上還是太弱,尤其在檢測目標物體的時候受到環境影響非常大,所以我今天向大家推薦一款新電賽神器-搭載K210芯片的MaixBit開發板,擁有1TOPs算力,可以運行神經網絡模型,價格親民,只要200塊就能買到,具體開發板參數介紹:勘智K210芯片介紹;
MaixBit開發板:
目前Sipeed官網有一個在線模型訓練平台,為購買K210產品的用戶提供一個在線模型訓練,支持目標檢測和目標分類兩種模型,本篇文章將手把手教大家如何使用在線雲平台訓練目標檢測模型(特別簡單),並將它導入到K210中運行!下面先講解一下關於目標檢測模型和目標分類模型的概念
- 目標分類: 識別圖像所屬的類別,例如
apple
或cup
,無返回坐標。如下圖,它是蘋果的概率是0.8
。
- 物體檢測:檢測物體在圖片中的位置,並輸出物體的坐標和物體的大小(即框定識別的物體)。如下圖所示,一個蘋果是蘋果的概率是
0.8
,當它被檢測到時會被框起來。
下面正式進入目標檢測模型訓練正文
二、開發准備(軟件+環境)
本章用到的資料已打包成文件夾上傳到CSDN:地址
- K210的Python開發平台MaixPy,開發方式與OpenMV基本差不多:下載地址,根據自己電腦選擇合適版本;
- MaixPy界面如下:(基本和OpenMV IDE一樣)
- Labelimg圖片標注軟件(軟件在我提供的壓縮包內),界面如下:(若打不開,將C盤\usr\用戶名下的labelImgSettings.pkl刪除重新打開)
- K210固件下載軟件,用於下載固件到K210(軟件在我提供的壓縮包內),界面如下:
- 串口調試軟件:ATK-XCOM串口調試工具(軟件在我提供的壓縮包內),界面如下
三、獲取訓練圖片
進行訓練首先需要的就是獲取目標圖片用於訓練,此處有兩種方法獲得圖片集,我都做一下介紹
3.1 手機獲取圖片
手機獲取圖片的方法主要有兩個:1.手機拍攝視頻提取圖片再轉化圖片大小,2.手機一張一張拍攝在轉化圖片大小(轉化圖片大小是把圖片大小轉化為224*224大小,因為k210官方推薦的訓練圖片大小就是這么大,如果使用的不是這個大小,后面會出現問題)
- 手機拍攝一段視頻,進入在線網頁轉換為圖片:網頁地址;
通過視頻獲取圖片數據集步驟:點開網頁-> 導入視頻-> 點擊開始后,選擇下載ZIP壓縮包
提取的所有圖片都包含在下載的壓縮包里面
- 手機拍攝大量圖片(這個方法比較累,一張一張拍攝在整合)
以上就是兩種獲取圖片的方法,在獲取了需要用於訓練的圖片素材后,他們的大小我們不能確定,需要通過imgtool軟件進行轉換,軟件在我提供的壓縮包內;把圖片轉換成224*224,具體步驟如下:
把所有圖片放在一個images文件夾下(名字要和我一樣)
打開Imgtool選擇存放圖片的文件夾,開始轉換
轉換后生成一個images_out文件夾,我們刪除原先文件夾,把images_out改名為images文件夾
到此通過手機獲取的圖片集就准備好了!
3.2 通過K210進行圖片拍取
上一步我們用手機獲取圖片集,但手機的效果並不是最佳,最佳的效果是使用K210直接進行圖片拍攝,獲取224*224格式的圖片,具體步驟如下:
首先確保K210自身固件為出廠固件,固件在我准備的文件夾內,如果不是可以刷一下固件,固件位置在下圖中我框選出來了,刷固件步驟可以提前參考下面刷機器碼步驟(如果是出廠固件無需再刷固件),同時需要一張格式化為FAT32的內存卡,用於存儲圖片
固件准備就緒后,打開maixpy IDE軟件,選擇拍照文件夾下的photo.py進行打開
打開后點擊做下架綠色圖標連接K210
連接后,點擊綠色播放按鈕,程序正常運行,圖片數據反饋回MaixPyIDE
我們對准我們需要的訓練的目標,按下MaixBit上的Boot按鍵,圖片就可以保存到內存卡里面,下圖為我采集的照片,照片已經為224*224大小,所以無需再進行轉換便得到圖片集
四、獲取訓練集
經過上一步,我們獲取了224*224大小的目標圖片集,這一步我們將使用標注軟件labelimg對獲取的訓練集進行標注,步驟如下:
桌面新建文件夾dataset,dataset下在建立一個usb文件夾,文件夾內建立兩個文件夾分別叫images和xml,以及一個labels.txt的文本文件(名字一定要對上)
將所有處理過的圖片放到images內(圖片不能為中文名字)
打開labelimg,選擇open dir打開圖片集目錄
點擊change save dir,選擇標注數據(.xml文件)輸出目錄
點擊view->auto save mode自動保存,方便我們標注
之后按下快捷鍵W進行圖片標注,框選出目標物體,然后標簽寫入usb
標注后按下快捷鍵D切換下一個,快捷鍵A切換上一個,重復以上步驟,一直到標注完成
標注完成后,我們在labels.txt內寫入所有的標簽(標注了幾種寫幾種,換行隔開),此處我只標注了usb一種,所以填一個usb;
標注完成之后,我們可以看到文件夾的內容框架如下:
之后我們將整個文件夾壓縮為ZIP格式文件,到這用於目標檢測模型的訓練集就做好了!
五、網絡平台訓練
在准備好訓練集后,我們下一步就是將模型上傳到Sipeed的模型平台進行訓練,具體步驟如下:
5.1 獲取機器碼
使用Sipeed的模型平台需要有k210的機器碼才能訓練,機器碼是每個k210獨有的一個標識碼,獲取過程如下
5.1.1 下載固件
打開kflash_gui,通過kflash下載bin文件到K210,bin文件在MaixBit文件夾下固件下面的key_gen.bin文件
5.1.2 串口讀取
固件下載完成之后,打開XCOM軟件,連接串口,設置波特率115200,按下開發板上的復位按鈕,串口會發送機器碼信息,如下圖
此處的機器碼就是當前機器的機器碼了,把它保存住,留着后面使用,注意一點此時的k210固件是刷機器碼的固件,我們需要刷回支持運行模型的固件,在固件文件夾內我准備了兩個固件,一個是出廠固件,一個是官方推薦的運行模型固件,具體對應如下表,我們刷入官方推薦的固件,為之后運行模型做准備!
文件名 | 說明 | 備注 |
---|---|---|
maixpy_vx.y.z_x_xxx*.bin |
默認版本的 MaixPy 固件,包含了大多數功能, 支持連接 MaixPy IDE , |
出廠默認固件版本 |
maixpy_vx.y.z_x_xxx*_minimum_with_ide_support.bin |
MaixPy 固件最小集合, 支持連接 MaixPy IDE , 不包含OpenMV 的相關算法和各種外設模塊 |
運行各種模型,建議使用這個 |
5.2 提交訓練集到模型平台
獲取了機器碼后,下一步我們進入到Sipeed的官網:Sipeed,進入到官網后注冊一個賬號(步驟略過),點擊官網的模型平台->選擇模型訓練,在下圖位置填入機器碼,並且選擇物體檢測;
然后點擊next,上傳模型壓縮包(ZIP格式),再點擊next一直到submit,提交后我們就可以在自己的主頁中看到模型正在排隊,等排到我們的時候就會開始訓練了,我的訓練集給了200張,訓練差不多要半個小時,下圖是訓練完成的界面
到此模型訓練就結束了
六、模型導入
6.1 壓縮包文件信息
模型訓練結束后下一步就是把模型導入到k210中運行,首先把我們訓練好的模型壓縮包下載下來,壓縮包內容如下:
其中startup.jpg是啟動界面圖片,無需關注,report是模型訓練的結果
兩個曲線的對應關系
Loss曲線趨勢 | 結果 |
---|---|
train loss 不斷下降,valid loss不斷下降 | 說明網絡仍在學習,還有優化空間 |
train loss 不斷下降,valid loss趨於不變 | 說明網絡過擬合(max pool或者正則化) |
train loss 趨於不變,valid loss不斷下降 | 說明數據集100%有問題,檢查數據集有沒有出錯 |
train loss 趨於不變,valid loss趨於不變 | 說明學習遇到瓶頸,需要減小學習率或批量數目;或者是數據集有問題(數據集標注錯誤數據比較多); |
train loss 不斷上升,valid loss不斷上升 | 說明網絡結構設計不當,訓練超參數設置不當,數據集經過清洗等問題; |
這里我的訓練集做的不是很好,因為攝像頭太模糊了,但也勉強可以使用
m.kmodel是模型數據,系統關鍵文件;
labels.txt是模型的標注信息;
boot.py是官方提供的調用模型的腳本,用於啟動模型
6.2 K210調用模型
知道壓縮包文件的作用后,我們開始通過k210調用模型,這里有兩種模型調用方式
1.從SD卡啟動模型
准備一個sd卡,把上面的文件全部拷貝進去,插入k210上電啟動,k210會從sd卡中的boot.py進行啟動,調用模型,開始檢測
2.從內部Flash啟動模型
若沒有SD卡,則可以將模型導入到內部Flash指定位置,然后通過修改Boot.py內讀取模型的位置,直接啟動,具體步驟如下
打開kflash,下載位置填入0x300000后下載
改變boot.py里面的代碼,注釋掉從SD卡啟動的代碼,取消從flash啟動代碼的注釋,然后通過MaixPy點擊運行,K210就可以檢測模型了
七、實驗現象
K210運行了模型之后,對准目標物到中心位置時檢測率很高,但因為我的數據集少的原因,在側面檢測的識別率不高,運行一段時間沒有誤檢測的情況,效果比我之前用Openmv好很多!!!