1)本文原作者:Alessandro Grande
2)中文版得到以下4位專家的幫助:William Gao,Gabriel Wang,Alex Shang,Lifeng Geng。
1、概覽
2、設置環境
3、定義模型
4、準備數據集
5、訓練模型
6、量化模型
7、將模型轉換為二進位格式
8、在 OpenMV 上部署模型
9、運行笑臉檢測
10、故障排除
本指南將逐步指導您在基於 Arm Cortex-M 的超低成本、低功耗處理器上部署 Caffe 模型。本指南中將使用由兩位 Arm 創新者 brahim Abdalkader 及 Kwabena W. Agyeman 開發的 OpenMV 開發板。
本指南將逐步指導您完成以下步驟:
1. 設置環境
2. 訓練神經網絡模型
定義模型。
準備數據集。
訓練 Caffe 中的模型。
註:本指南中的「訓練神經網絡模型」部分僅為確保步驟完整性,無需執行。
3. 在 Arm Cortex-M 上部署模型
量化模型。
將模型轉換為二進位格式。
在 OpenMV 上部署。
運行笑臉檢測。
完成本指南中的步驟後,您將能夠在 Arm Cortex-M7 處理器上部署具有笑臉識別功能的 Arm 神經網絡模型。
部署流程如下圖所示:
Linux 機器設置
按下文所述,安裝虛擬機來設置 Linux 環境。為確保完整性,我們將對設置環境所需的所有步驟進行說明。
使用虛擬機
註:推薦使用虛擬機進行安裝。使用 Linux 進行安裝耗時更長。
1. 安裝 Virtual Box。
2. 下載圖像。
3. 導入圖像。遵循此指南。
4. 登錄機器。
OpenMV 設置
在 VirtualBox 中,從終端啟動 OpenMV IDE:
./openmvide/bin/openmvide.sh &
註:若未預裝,請執行以下操作:
在Linux 虛擬機上安裝 OpenmMV IDE。
連接開發板:
1. 通過 USB 連接 OpenMV 和筆記本電腦。
2. 遵循USB VM 設置指南,在虛擬機上設置與 OpenMV 開發板的 USB 連接。
3. 如有必要,更新固件。
測試:
1. 單擊 IDE 左下方的連接圖標或按 CTRL+E。
2. 選擇 IDE 左下方的播放圖標或按 CTRL+R,啟動程序。
3. 程序應該正常運行並在右上方顯示圖像,而沒有任何錯誤。
設置到此完成,下一步是在 Arm Cortex-M7 OpenMV 開發板上部署選定的模型。
註:本部分中,您無需進行任何操作。此部分僅為確保步驟完整性。
圖像分類的實現方式多種多樣,但人工智慧領域的最新研究表明,一種稱為卷積神經網絡 (CNN) 的神經網絡特別擅長圖像分類。
為實現笑臉識別功能,我們將使用 OpenMV 定義的笑臉模型。如下圖所示,該網絡為三層卷積神經網絡:
該網絡由以下幾層組成:
Convolution layer - 負責從圖像中提取特徵。
Dropout layer - 負責通過在訓練階段忽略隨機節點來避免過擬合。
Rectified Linear Unit (ReLU) - 負責在模型中引入非線性的激活函數。如果收到任何負輸入,該函數將返回 0,但是收到任何正值 x 時,它將返回該值。
Pooling layer - 負責逐步縮小模型的空間大小,減少網絡中的參數數量和計算量,因而也控制過擬合。
Inner product (Inp) 或 fully connected layer。
我們使用的笑臉數據集可在 GitHub 上找到。
我們將使用以下位置的數據集:
repos/SMILEsmileD/SMILEs/
查看這兩個集合中的圖像數量:
ls repos/SMILEsmileD/SMILEs/negatives/negatives7/.-1 | wc –l
ls repos/SMILEsmileD/SMILEs/positives/positives7/.-1 | wc –l
該數據集由約 3000 張正樣本圖片和約 9000 張負樣本圖片組成。為了避免產生偏差模型,我們希望使用相同數量的正樣本和負樣本。
為此,我們可以對正圖像使用增加腳本來增大數據集。使用該腳本會將正示例的數量增加到原來的 3 倍:
創建文件夾(若尚不存在):
mkdir repos/SMILEsmileD/SMILEs/positives/positives_aug/
增大數據集:
python2 repos/openmv/tools/augment_images.py --input repos/SMILEsmileD/SMILEs/positives/positives7/
--output repos/SMILEsmileD/SMILEs/positives/positives_aug/ --count 3
註:由於時間限制,本指南不涉及神經網絡的訓練。此處材料僅為確保步驟完整性。
目前已支持將 Caffe 模型轉換為 CMSIS-NN 函數。未來還將支持其他框架(TensorFlow、PyTorch 等)。
經過訓練的模型也需要轉換為lmdb 資料庫。轉換後的文件應該能在以下位置找到:
repos/openmv/ml/cmsisnn/models/smile/smile_database/
模型訓練完成後,我們需要將其減少到合適的大小。為此,我們使用 Arm 的量化腳本將 Caffe 模型權重和激活從 32 位浮點格式轉換為 8 位定點格式。這樣不僅可以減少網絡大小,還可以避免浮點計算。
該 NN 量化器腳本的工作方式為,測試網絡並找出動態定點表示的最佳格式。該腳本的輸出為序列化 Python (.pkl) 文件,其中包括網絡的模型、量化的權重和激活以及每一層的量化格式。運行以下命令便會生成量化模型:
python2 repos/ML-examples/cmsisnn-cifar10/nn_quantizer.py --model
repos/openmv/ml/cmsisnn/models/smile/smile_train_test.prototxt --weights
repos/openmv/ml/cmsisnn/models/smile/smile_iter_*.caffemodel –save
repos/openmv/ml/cmsisnn/models/smile/smile.pk1
最後一步是使用 OpenMV NN 轉換器腳本將模型轉換為二進位格式,可由 OpenMV Cam 運行。該轉換器腳本會輸出每個層類型的代碼,後跟該層的維度和權重(如有)。
在 OpenMV Cam 上,固件讀取該二進位文件,並使用鍊表數據結構在內存中構建網絡。
運行以下命令便會生成二進位模型:
python2 repos/openmv/ml/cmsisnn/nn_convert.py –model
repos/openmv/ml/cmsisnn/models/smile/smile.pk1 --mean
/home/embedded/repos/openmv/ml/cmsisnn/models/smile/smile_database/mean.binaryproto --output
repos/openmv/ml/cmsisnn/models/smile/smile.network
將 smile.network 直接下載到 OpenMV 開發板上的 Arm Cortex-M7 中。此步驟需要使用 USB 連接。
此步驟中將使用 CMSIS-NN,它是一系列高效神經網絡內核的開源集合,其開發目的是最大程度地提升神經網絡的性能,減少神經網絡在 Arm Cortex-M處理器內核上的內存佔用。藉助基於 CMSIS-NN 內核的神經網絡推理方案,運行時/吞吐量可提升 4.6 倍,能效可提升 4.9 倍。
在 OpenMV IDE 的笑臉檢測 Python 示例中運行以下程序。
Select Files -> Examples -> 25-Machine-Learning -> nn_haar_smile_detection.py
該程序會將問題拆分成兩個不同階段,從而實現笑臉識別:
1. 使用 Haar Cascade 分類器識別圖像中的人臉。
2. 識別該人臉是否在笑。
3. 在右上方的圖像上顯示黃色笑臉或哭臉。
可選任務:修改 Python 示例
1. 調整用於限定笑臉檢測範圍的矩形大小。
2. 當檢測到笑臉時,添加終端輸出。
可選:最終可部署模型
註:如果之前的步驟均成功執行,則不需要執行此步驟。
最終的預訓練和預轉換模型可在 GitHub 上找到。
如果出現以下錯誤:
No OpenMV Cams found(未找到 OpenMV Cams)
這表示 OpenMV 未與電腦連接或未被作業系統識別:
1. 確認 OpenMV 開發板已通過 USB 與電腦連接。
2. 如果是在 Linux 上運行,請遵循 USB VM 設置指南。
No module named caffe(caffe 模塊不存在)
ImportError: No module named caffe
輸入以下命令,檢查該模塊是否已正確添加到模塊查找路徑:
python >>> import sys >>> sys.path ['', '/home/embedded/caffe/python', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib- old', '/usr/lib/python2.7/lib-dynload','/home/embedded/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
如果沒有 /home/embedded/caffe/python
>>> exit() export PYTHONPATH=~/caffe/python
Check failed: mdb_status == 0 (2 vs. 0) No such file or directory(檢查失敗:mdb_status == 0 (2 vs. 0) 沒有此文件或目錄)
Check failed: mdb_status == 0 (2 vs. 0) No such file or directory
打開以下文件:
repos/openmv/ml/cmsisnn/models/smile/smile_train_test.prototxt
並確認 mean_file 和 source 指向以下位置的文件:
repos/openmv/ml/cmsisnn/models/smile/smile_database/
OSError: Could not find the file(作業系統錯誤:無法找到該文件)
確保將該文件上傳至 OpenMV 開發板上的 Arm Cortex-M7 中。