工程師親筆丨如何使用 CMSIS-NN 在 OpenMV 上部署 Caffe 模型?

2020-12-17 電子工程世界網

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 中。

相關焦點

  • 賈揚清撰文詳解Caffe2:從強大的新能力到入門上手教程
    它沿襲了大量的 Caffe 設計,可解決多年來在 Caffe 的使用和部署之中發現的瓶頸問題。最終,Caffe2 打開了算法實驗和新產品的大門。通過在內部用於各種深度學習和增強現實任務,Caffe2 已經在 Facebook 對於規模和性能的需求上得到了鍛造。同時,它為移動端應用提供了令人印象深刻的新功能,例如高級相機和即時通訊功能。
  • 深度學習這麼火,我也能自己訓練一個模型嗎?使用Caffe就可以
    git 命令從 GitHub 下載 Caffe 原始碼後:$ git clone ...caffe.git在編譯之前,需要配置 makefile,這個配置項可以直接在官方提供的模版基礎上修改:$ cp Makefile.config.example Makefile.config
  • 零門檻構建高精度AI模型及離線設備端部署實現
    傳統方案需要專業的數據標註團隊完成繁雜而龐大的數據標註工作,需要專業的工程師深入算法細節去選擇網絡和調參,在模型部署的階段,更是需要一個工程架構團隊把訓練好的模型部署在實際生產的各種環節和流程裡,極大的提高了高精度AI模型的定製與部署的難度。面對複雜的開發部署流程,百度EasyDL零門檻AI開發平臺應運而生,圍繞數據、模型訓練、模型部署提供了極致的零門檻構建高精度AI服務的一站式體驗。
  • F8 2017 | Facebook 開源全新深度學習框架 Caffe2,讓 AI 從雲端...
    Caffe2 相比 Caffe 更新了什麼Caffe2 官方博客表示:長期以來,提起 AI 模型的訓練和部署,人們通常都會聯想到大數據中心或超級計算機。之所以會出現這種現象,是因為小型計算設備在大規模圖像、視頻、文本和語音處理上具有明顯的短板,無論在速度還是可靠性上都遠遠不及大型數據中心。
  • 賈揚清回復:如何看待 Caffe2 代碼併入 PyTorch?
    這周輪子界最大的新聞是Caffe2併入Pytorch,兩個框架各取其長,祝福Facebook兩個團隊做出更好的框架,更近一步降低深度學習使用門檻。Caffe2 的 Github 頁面突然出現了一個「巨大的改動」:Caffe2 開原始碼正式併入 PyTorch,至此,Facebook 主力支持的兩大深度學習框架已合二為一。
  • EC2上的深度學習:CUDA 7/cuDNN/caffe/DIGITS實戰教程
    本教程將演示如何在一個g2.2xlarge EC2實例(運行64位的Ubuntu14.04)中設置CUDA7、cuDNN、caffe和DIGITS,以及如何快速上手DIGITS。為了說明DIGITS的應用,本教程使用一個當前的 Kaggle競賽項目作為案例進行演示, 是關於糖尿病視網膜病變檢測的,其狀態來自於螢光血管造影。
  • 如何用 Caffe 生成對抗樣本?這篇文章告訴你一個更高效的算法
    :如何通過優化求解輸入圖像》中我們曾提到對抗樣本的問題,本文作為其延續,將討論如何用Fast Gradient Sign方法在Caffe中生成對抗樣本。,在這個代碼中,我們執行的是生成一個對抗樣本降低當前模型預測類別的,其中每個像素在梯度方向上的前進幅度是1.0。
  • Facebook開源NLP建模框架PyText,從論文到產品部署只需數天
    PyText 降低了 Facebook 工程師在系統中部署實時高級 NLP 技術的難度,這些系統有數十億使用多種不同語言的用戶。PyText 以 Facebook 的其它 NLP 系統為基礎,並對其它系統進行補充。
  • 解析:深度學習框架Caffe源碼
    順便給個提示,儘量使用data_at(const vector& index)來查找數據。Reshape函數可以修改blob的存儲大小,count用來返回存儲數據的數量。BlobProto類負責了將Blob數據進行打包序列化到Caffe的模型中。
  • TensorFlow和Caffe、MXNet、Keras等其他深度學習框架的對比
    其核心代碼和 Caffe 一樣是用 C++編寫的,使用 C++簡化了線上部署的複雜度,並讓手機這種內存和CPU資源都緊張的設備可以運行複雜模型(Python 則會比較消耗資源,並且執行效率不高)。它可以同時運行多個大規模深度學習模型,支持模型生命周期管理、算法實驗,並可以高效地利用 GPU 資源,讓 TensorFlow 訓練好的模型更快捷方便地投入到實際生產環境」。除了 TensorFlow 以外的其他框架都缺少為生產環境部署的考慮,而 Google 作為廣泛在實際產品中應用深度學習的巨頭可能也意識到了這個機會,因此開發了這個部署服務的平臺。
  • Caffe2 代碼全部併入 PyTorch:深度學習框架格局劇震
    自 2017 年 1 月發布之後,由於調試、編譯等多方面的優勢,PyTorch 已經成為很多科研機構首選的深度學習框架;而 2017 年 4 月推出的 Caffe 2 則具有可在 iOS、Android 和樹莓派等多種設備上訓練和部署模型的優勢
  • 百度EasyDL直播課上線 「戰疫」第一課聚焦口罩佩戴標準識別模型
    同時,EasyDL口罩識別模型無接觸智能檢測的特點,也有效降低了近距離接觸帶來的風險,並大大提升排查效率。此外,由於EasyDL平臺可靈活支持雲服務API、私有化本地部署、設備端SDK部署等多種服務形式,EasyDL口罩識別模型也具備應用場景廣泛,適配性強、端雲部署便捷的特點。
  • 機器學習工程師與研究員之間的7個主要區別(包括薪水)
    3.交付物/最終產品ML工程師的可交付成果通常是帶有機器學習模型的工程解決方案,該模型能夠以自動化、高效或創造性的方式執行一組任務。 對於ML工程師而言,最終產品或可交付成果可以是一種軟體,其中的功能由機器學習方法提供支持。
  • 如何使NFV框架能夠滿足5G網絡部署的需求
    打開APP 如何使NFV框架能夠滿足5G網絡部署的需求 謝寶國 發表於 2019-12-29 09:59:24 Release3 (2017-2019):重點研究針對NFV投入運作時需要哪些增強特性,如何豐富NFV架構框架和功能特性。Release4 (2019-2021):重點研究NFV大規模商用部署需要哪些增強特性,如何使NFV架構框架和功能更滿足5G網絡部署及未來網絡虛擬化需求。
  • 你真的了解深度學習框架Caffe嗎?
    Caffe是由伯克利大學的賈楊清等人開發的一個開源的深度學習框架,採用高效的C++語言實現,並內置有Python和MATLAB接口,以供開發人員使用Python或MATLAB來開發和部署以深度學習為核心算法的應用。Caffe適用於網際網路級別的海量數據處理,包括語音,圖片,視頻等多媒體數據。
  • 大數據工程師需要具備哪些技能?未來的職業發展又如何?
    2、預測未來可能發生的事情   通過引入關鍵因素,大數據工程師可以預測未來的消費趨勢。在阿里媽媽的營銷平臺上,工程師正試圖通過引入氣象數據來幫助淘寶賣家做生意。「比如今年夏天不熱,很可能某些產品就沒有去年暢銷,除了空調、電扇,背心、遊泳衣等都可能會受其影響。
  • 3D 列印正在手術臺上進化,幾百美元就可製作出器官模型
    在軟體和列印方法上的改進,使得列印高精度顏色和紋理的複雜物體成為現實,我們可以構建更加精確和真實的器官模型,用於外科手術中。因此,澤恩召集了一個由臨床醫生、影像專家、工程師和軟體設計師組成的團隊,企圖用樹脂「列印」出一種針對特定病人的肝臟來指導手術過程。澤恩回憶說,第一個模型非常粗糙,就像一個玩培樂多彩泥的孩子隨手捏出來的那樣。它的大小不到活體肝臟的四分之三,並非完全透明,並且缺乏代表不同組織的顏色編碼。
  • 為什麼要做Caffe2?賈揚清親自給出答案
    在4月18日開幕的 F8 年度開發者大會上,Facebook 發布了一款全新的開源深度學習框架Caffe2。按照官網介紹,它最大的特點就是輕量、模塊化和擴展性,即一次編碼,到處運行(和 Java 的宣傳語類似)。
  • 杭州BIM工程師報名報名流程步驟
    杭州BIM工程師報名報名流程步驟   杭州BIM工程師報名報名流程步驟    將實際成本BIM模型通過網際網路集中在企業總部器。給施工項目部專業人員交底,培訓系統使用方法,項目部專業人員通過實際使用,驗證發能是否符合現場要求,能否解決項目中實際出現的問題。檢查,及時發現並優化後期可能遇到的管線結構間問題,減少人材機的浪費。但反過來講,它不是一個必要的東西,很多事情你有一個普通的能也都能解決,但是有智能你能做的事情更多。