<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 智能計(jì)算 > 設(shè)計(jì)應(yīng)用 > 基于機(jī)器學(xué)習(xí)的高效嵌入式計(jì)算機(jī)視覺

          基于機(jī)器學(xué)習(xí)的高效嵌入式計(jì)算機(jī)視覺

          作者: 時(shí)間:2024-09-04 來(lái)源:Arm 收藏

          作者: 物聯(lián)網(wǎng)事業(yè)部主任軟件工程師兼技術(shù)推廣工程師

          本文引用地址:http://www.ex-cimer.com/article/202409/462644.htm

          Sandeep Mistry

          TinyML 是 (ML) 的一個(gè)分支,專注于將 ML 模型部署到低功耗、資源受限的物聯(lián)網(wǎng) (IoT) 設(shè)備上。在物聯(lián)網(wǎng)設(shè)備上部署 ML 模型有諸多好處,包括減少延遲和保護(hù)隱私性,因?yàn)樗袛?shù)據(jù)都是在端側(cè)處理。TinyML 在 2019 年引起了人們的關(guān)注,當(dāng)時(shí),Google 的 TensorFlow 團(tuán)隊(duì)發(fā)布了適用于微控制器的 TensorFlow Lite (TFLM) 庫(kù) [1] 。

          最初的用例和 TFLM 示例側(cè)重于在基于 Cortex-M4 [2] 的開發(fā)板(例如 Arduino Nano 33 BLE Sense [3] 和 SparkFun Edge [4] )上運(yùn)行量化的 8 位關(guān)鍵詞檢測(cè) [5] 和人員檢測(cè) [6] 模型。這些示例利用 Cortex-M4 CPU 的 SMLAD [7] 指令對(duì)模型所需的乘加 (MAC) 運(yùn)算執(zhí)行端側(cè) ML 推理。

          上表總結(jié)了 Arduino Nano 33 BLE Sense 上兩種模型的 MAC 數(shù)量、RAM 和閃存要求以及推理延遲。

          配備 Ethos-U55 NPU 的現(xiàn)代微控制器能夠運(yùn)行最初為移動(dòng)端應(yīng)用開發(fā)的復(fù)雜模型。Ethos-U55 NPU 支持 44 個(gè) TensorFlow Lite 算子 [8] 的位精確輸出,并且可配置為每個(gè)周期執(zhí)行 32、64、128 或 256 次 MAC 運(yùn)算。本文將通過在配備 Ethos-U55 NPU 的現(xiàn)代微控制器上運(yùn)行兩個(gè) TinyML 應(yīng)用來(lái)展示 NPU 的性能優(yōu)勢(shì)。我們將分別在采用和不采用 Ethos-U55 NPU 的微控制器上運(yùn)行應(yīng)用中所使用的 ML 模型,以此對(duì)推理延遲進(jìn)行基準(zhǔn)測(cè)試。

          現(xiàn)代物聯(lián)網(wǎng)開發(fā)板


          TinyML 應(yīng)用被部署到 Seeed Studio 的 Grove Vision AI Module V2 [9] 開發(fā)板上,該開發(fā)板基于 Himax WiseEye2 HX6538 微控制器并集成了 16 MB 的外部閃存。Himax WiseEye2 HX6538 [10] 微控制器搭載了 Cortex-M55 CPU 和 Ethos-U55 NPU,運(yùn)行頻率均為 400 MHz,且?guī)в?512 KB 緊耦合存儲(chǔ)器 (TCM) 和 2 MB SRAM。

          圖:Seeed Studio Grove Vision AI Module V2 開發(fā)板

          該開發(fā)板上有一個(gè) 15 引腳相機(jī)串行接口 (CSI),連接至 Himax WiseEye2 HX6538 MCU,可與基于 OmniVision OV5647 的相機(jī)模塊一起使用。開發(fā)板上運(yùn)行的應(yīng)用可以從相機(jī)模塊 [11] 實(shí)時(shí)采集分辨率為 160x120、320x240 或 640x480 像素的 RGB 圖像。

          將 2.8 寸的 TFT 彩色液晶屏和 3.7 伏的鋰聚合物 (LiPo) 電池連接到開發(fā)板上,便能打造出一款便攜式的電池供電設(shè)備。

          TinyML 應(yīng)用


          部署到開發(fā)板上的兩個(gè)基于的應(yīng)用將會(huì)持續(xù):

          從相機(jī)模塊采集圖像。

          完成使用 ML 模型時(shí)所需的預(yù)處理和后處理并執(zhí)行 ML 推理。

          在開發(fā)板所連接的 TFT 屏幕上顯示所采集的圖像和 ML 推理結(jié)果。

          第一個(gè)應(yīng)用將使用兩個(gè) ML 模型來(lái)檢測(cè)臉上的關(guān)鍵特征點(diǎn),第二個(gè)應(yīng)用則使用 ML 模型來(lái)檢測(cè)人體姿態(tài)中的關(guān)鍵特征點(diǎn)。

          這兩個(gè)應(yīng)用都將用到 TFLM 庫(kù)和 Ethos-U 自定義算子 [12] ,以便將 ML 運(yùn)算卸載到 NPU 中。應(yīng)用中所用的量化 8 位 TensorFlow Lite 模型必須使用 Arm 的 vela [13] 編譯器進(jìn)行編譯。vela 編譯器將 NPU 支持的運(yùn)算轉(zhuǎn)換為 Ethos-U 自定義算子,使其可分派到 NPU 進(jìn)行高效執(zhí)行。任何不受 NPU 支持的運(yùn)算都將保持原樣并退回到 CPU 上運(yùn)行。

          左為 8 位量化 TensorFlow Lite 模型圖,右為經(jīng) vela 編譯的 8 位量化 TensorFlow Lite 模型圖 (點(diǎn)擊圖片,查看全圖)

          在上例中,除了 pad 運(yùn)算之外的所有 TensorFlow 算子都被 vela 編譯器轉(zhuǎn)換為在 Ethos-U55 NPU 上運(yùn)行的 Ethos-U 自定義算子。未轉(zhuǎn)換的 pad 算子將回調(diào)到 CPU 上運(yùn)行。

          Face Mesh 應(yīng)用


          該應(yīng)用從相機(jī)模塊采集 320x240 圖像,然后估算人臉上的 468 個(gè)關(guān)鍵特征點(diǎn)。對(duì)于那些需要識(shí)別熟悉面孔、監(jiān)測(cè)注意力、識(shí)別情緒或執(zhí)行醫(yī)療診斷的用例來(lái)說,該應(yīng)用可以用作特征提取層。其采用了兩個(gè) ML 模型,首先是使用 Google MediaPipe BlazeFace(短程)模型 [14] 來(lái)識(shí)別圖像中面部的位置。檢測(cè)到人臉后,繼而使用 Google MediaPipe Face Mesh 模型 [15] 來(lái)識(shí)別圖像中最大的那個(gè)人臉的 468 個(gè)關(guān)鍵特征點(diǎn)。

          MediaPipe BlazeFace(短程)模型


          MediaPipe BlazeFace(短程)模型需要將一張 RGB 128x128 圖像作為輸入,且每次推理要執(zhí)行 3,100 萬(wàn)次 MAC 運(yùn)算。利用 Katsuya Hyodo 的 PINTO_model_zoo GitHub 資源庫(kù) [16] ,可得到 TensorFlow Lite 格式的 BlazeFace(短程)模型的 8 位量化版本。

          上表總結(jié)了對(duì) RAM 和閃存的要求,并將單獨(dú)使用 Cortex-M55 CPU 與同時(shí)使用 Cortex-M55 CPU 和 Ethos-U55 NPU 所對(duì)應(yīng)的推理延遲進(jìn)行了比較,結(jié)果顯示 Ethos-U55 NPU 將推理速度提高了 109 倍!

          MediaPipe Face Mesh 模型


          MediaPipe Face Mesh 模型需要將一張 RGB 192x192 的臉部裁剪圖像(填充率為 25%)作為輸入,且每次推理要執(zhí)行 3,680 萬(wàn)次 MAC 運(yùn)算。從 GitHub [17] 下載該模型的 16 位浮點(diǎn)版本,并使用 tflite2tensorflow [18] 工具將其轉(zhuǎn)換為 8 位量化模型。

          上表總結(jié)了對(duì) RAM 和閃存的要求,并將單獨(dú)使用 Cortex-M55 CPU 與同時(shí)使用 Cortex-M55 CPU 和 Ethos-U55 NPU 所對(duì)應(yīng)的推理延遲進(jìn)行了比較,結(jié)果顯示 Ethos-U55 NPU 將推理速度提高了 103 倍。

          Ethos-U55 的優(yōu)勢(shì)


          將 ML 計(jì)算卸載到 Ethos-U55,可使該應(yīng)用每秒執(zhí)行 10 次以上的推理。如果將其部署到 Cortex-M55 CPU,在臉部可見的情況下,該應(yīng)用只能每八秒執(zhí)行一次推理。

          姿態(tài)估計(jì)應(yīng)用


          該應(yīng)用從相機(jī)模塊采集 320x240 圖像,然后為圖像中檢測(cè)到的每個(gè)人估計(jì)人體姿態(tài)的 17 個(gè)關(guān)鍵特征點(diǎn)。該應(yīng)用可以用作那些需要檢測(cè)跌倒或運(yùn)動(dòng)的應(yīng)用的特征提取層,或作為人機(jī)界面的輸入。

          該模型使用 Ultralytic YOLOv8 GitHub 資源庫(kù)的 DeGirum 分支 [19] ,通過一張 256x256 的 RGB 圖像輸入,導(dǎo)出為一個(gè) 8 位量化 TensorFlow Lite 模型。對(duì) DeGirum 進(jìn)行修改可以讓導(dǎo)出的模型更好地針對(duì)微控制器進(jìn)行優(yōu)化,這是通過刪除轉(zhuǎn)置運(yùn)算并分離模型的七個(gè)輸出來(lái)實(shí)現(xiàn)的,旨在提高量化的準(zhǔn)確性。該模型每次推理需要進(jìn)行 7.28 億次 MAC 運(yùn)算。

          上表總結(jié)了對(duì) RAM 和閃存的要求,并將單獨(dú)使用 Cortex-M55 CPU 與同時(shí)使用 Cortex-M55 CPU 和 Ethos-U55 NPU 所對(duì)應(yīng)的推理延遲進(jìn)行了比較,結(jié)果顯示 Ethos-U55 NPU 將推理速度提高了 611 倍!將 ML 計(jì)算卸載到 Ethos-U55,可使該應(yīng)用每秒執(zhí)行 10 次以上的推理。如果將其部署到 Cortex-M55 CPU,該應(yīng)用只能每 62 秒執(zhí)行一次推理。推理延遲的縮短使得應(yīng)用能夠更快地對(duì)人們的動(dòng)作做出反應(yīng)。

          結(jié)論


          本文演示了為移動(dòng)端應(yīng)用開發(fā)的 ML 模型,它們每次推理需要進(jìn)行千萬(wàn)到數(shù)億次 MAC 運(yùn)算,可部署到配備 Ethos-U55 NPU 的現(xiàn)代微控制器上。與 TFLM 庫(kù)中所含的示例應(yīng)用相比,這些 ML 模型對(duì) MAC 運(yùn)算、RAM 和閃存的要求更高。使用 NPU 可以讓應(yīng)用在一秒內(nèi)執(zhí)行多次推理,而如果沒有 NPU,則每隔幾秒或一分鐘內(nèi)只能執(zhí)行一次推理。因此,使用 NPU 對(duì)于應(yīng)用來(lái)說非常有利,使其能夠運(yùn)行一個(gè)或多個(gè)相比初始 tinyML 應(yīng)用中所使用的模型更為復(fù)雜的 ML 模型,而且能夠?qū)χ車h(huán)境做出更快的反應(yīng)。

          本文展示的應(yīng)用離不開 Himax 團(tuán)隊(duì)的辛勤付出,他們將 Face Mesh 和 Yolov8n-pose 模型移植到了 Himax WiseEye2 HX6539 微控制器上。正是他們的項(xiàng)目成果,啟發(fā)了我去開發(fā)一臺(tái)帶有 TFT 顯示屏和可充電電池的緊湊型便攜式電池供電設(shè)備。


          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();