如何將 MediaPipe 模型部署到嵌入式平臺(tái)邊緣
極速模型
在本項(xiàng)目中,我首先回顧了在部署 MediaPipe 模型時(shí)可能出現(xiàn)的挑戰(zhàn),特別是針對(duì)高通龍翼 QCS6490 芯片而言。
然后,我將逐一解決這些挑戰(zhàn),之后再將模型部署到 QAI Hub 工作平臺(tái)中。
最后,我將進(jìn)行分析以確定我們的加速目標(biāo)是否已經(jīng)達(dá)成。
高通人工智能工作臺(tái)
高通公司提供了一套在線工具,使用戶能夠?qū)⒛P筒渴鸬剿麄兊男酒O(shè)備上。
QAI 中心工作臺(tái)允許用戶自行導(dǎo)入模型(BYOM)和數(shù)據(jù)集(BYOD),以便對(duì)其進(jìn)行編譯、量化,并優(yōu)化以適配在高通設(shè)備上的部署。
量化步驟是可選的,具體取決于所針對(duì)的設(shè)備。
在該項(xiàng)目中,我們將專門針對(duì) QCS6490 設(shè)備的神經(jīng)處理單元進(jìn)行研究,因此將需要進(jìn)行量化處理。
QAI 中心工作臺(tái)支持以下模型格式作為輸入:
?PyTorch
?ONNX(開放神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)換格式)
其他框架則是通過(guò)轉(zhuǎn)換為 ONNX 格式來(lái)間接獲得支持的。在我們的案例中,我們將把 MediaPipe 模型從 TFLite 格式轉(zhuǎn)換為 ONNX 格式,使用 tf2onnx 工具。
此次部署包含以下任務(wù),這些任務(wù)在 QAI Hub 工作臺(tái)中被稱為“作業(yè)”:
?量化
?編譯
?驗(yàn)證;確認(rèn)
?簡(jiǎn)介
量化任務(wù)在內(nèi)部使用 AIMET 框架來(lái)對(duì)模型進(jìn)行量化處理。要完成這一量化操作,需要使用訓(xùn)練數(shù)據(jù)集的一部分。所需校準(zhǔn)數(shù)據(jù)的大小通常在數(shù)千個(gè)樣本的量級(jí)。
編譯任務(wù)可以針對(duì)多個(gè)運(yùn)行時(shí)目標(biāo)進(jìn)行部署:
?TFLite 運(yùn)行時(shí)(量子神經(jīng)網(wǎng)絡(luò)代理)
?ONNX 運(yùn)行時(shí)
?高通人工智能運(yùn)行時(shí)(QAIRT)
在這個(gè)項(xiàng)目中,我對(duì)使用 QNN 代理的 TFLite 運(yùn)行時(shí)與 QAIRT 進(jìn)行了對(duì)比研究并進(jìn)行了探索。
我的理解是,使用 ONNX 運(yùn)行時(shí)進(jìn)行部署僅在 Windows 系統(tǒng)上可行,而在嵌入式 Linux 系統(tǒng)上則無(wú)法實(shí)現(xiàn)。
“驗(yàn)證”和“配置”任務(wù)可用于在實(shí)際的目標(biāo)設(shè)備(在我們的案例中為 QCS6490)上對(duì)模型進(jìn)行推理和/或進(jìn)行性能分析。這些任務(wù)是在云端執(zhí)行的,并且是在實(shí)際設(shè)備上進(jìn)行的。我曾遇到過(guò)一些情況,這些任務(wù)因代理設(shè)備不可用而超時(shí)。
在這個(gè)項(xiàng)目中,我使用了 QAI Hub 工作臺(tái)的 2026.01.05.0 版本,其包含以下內(nèi)容:
?AI 資源中心工作臺(tái):aihub-2026.01.05.0
?QAIRT:2.40.0.251030114326_189385
高通公司的流程和相關(guān)文檔一直在不斷變化,每次改進(jìn)都會(huì)使用戶體驗(yàn)得到提升。
從 Vision AI-KIT 6490 上的 QIRP 1.6 版本圖像開始
該項(xiàng)目是在 Vision AI-KIT 6490 上進(jìn)行測(cè)試的,所使用的圖像為 QIRP 1.6 版本。如果您所使用的板子不同,或者使用的 QIRP 版本不同,那么其他部分中的說(shuō)明可能需要進(jìn)行修改。
請(qǐng)使用以下啟動(dòng)指南將 QIRP 1.6 鏡像程序化到 QCS6490 視覺人工智能套件中:
?Vision AI-KIT 6490 創(chuàng)業(yè)指南 v1.4
這將提供有關(guān)如何對(duì)最新版本的 QIRP 1.6 圖像進(jìn)行編程的說(shuō)明(文件名為 visionai_6490_qirp_1.6_v4.zip):
?visionai_6490_qirp_1.6_v4.zip
在使用 QIRP 1.6 鏡像啟動(dòng) Vision AI-KIT 6490 后,您可以使用出廠即用演示來(lái)進(jìn)行一次完整性檢查:
請(qǐng)注意底部的系統(tǒng)溫度圖和系統(tǒng)使用率圖。在我們的探索過(guò)程中,我們會(huì)利用這些數(shù)據(jù)。
在“視覺 AI-KIT 6490”上安裝 QAI Hub
首先,要確保在 Vision AI-KIT 6490 上所做的更改能夠持久生效:
QAI Hub 客戶端可以通過(guò) pip 進(jìn)行安裝。我們還將安裝對(duì) PyTorch 和 TFLite 的支持:
我嘗試安裝“qai-hub[onnx]”這個(gè)軟件包,但安裝過(guò)程失敗了。這似乎證實(shí)了我的看法,即使用 ONNX 運(yùn)行時(shí)進(jìn)行部署僅在 Windows 系統(tǒng)上可行,而在嵌入式 Linux 系統(tǒng)上則無(wú)法實(shí)現(xiàn)。
我們還可以安裝 QAI 中心模型庫(kù),具體操作如下:
然后按照以下命令輸入您的登錄信息一次:
作為一項(xiàng)驗(yàn)證手段,您可以列出 QAI 中心工作臺(tái)所支持的設(shè)備:
QAI 平臺(tái)上的 MediaPipe 模型
如果您已經(jīng)閱讀過(guò)高通公司的相關(guān)文檔,您就會(huì)發(fā)現(xiàn)他們已經(jīng)在其 QAI 平臺(tái)上部署了 MediaPipe 模型。
那么……我們?yōu)槭裁匆匦掳l(fā)明輪子呢?
這不僅是一個(gè)非常好的問(wèn)題,而且也是一個(gè)非常重要的需要強(qiáng)調(diào)的觀點(diǎn)。
首先,在我撰寫這篇文章之時(shí),以下這些 mediapipe 模型中僅有 1 個(gè)在高通 QCS6490 芯片上得到了支持:
?mediapipe_hand => 在 QCS6490 上不支持
?mediapipe_face => 在 QCS6490 上已支持
?mediapipe_pose => 在 QCS6490 上不支持
其次,高通公司選擇支持較舊版本的 mediapipe 模型(v0.07),而非最新的版本(v0.10)。
這一點(diǎn)非常重要,需要特別強(qiáng)調(diào)一下,因?yàn)樵?v0.7 版本之后,我們對(duì)手掌檢測(cè)和手部特征點(diǎn)模型進(jìn)行了重大更新,這些更新專門用于手勢(shì)和手語(yǔ)識(shí)別:
?SignAll SDK:使用 MediaPipe 構(gòu)建的手語(yǔ)交互界面現(xiàn)已面向開發(fā)者開放 - 谷歌開發(fā)者博客
事實(shí)上,高通公司選擇支持的是由開源社區(qū)將這些模型轉(zhuǎn)換為 PyTorch 版本后的版本:
?[維杜爾·薩蒂賈] 布萊茲帕爾姆:vidursatija/布萊茲帕爾姆
?[馬蒂?!せ衾章筣 布萊澤臉 - PyTorch : hollance/BlazeFace-PyTorch
?[扎克·穆雷茲] MediaPipePyTorch :zmurez/MediaPipePytorch
盡管 zmurez 沒(méi)有透露用于生成 PyTorch 版本模型的轉(zhuǎn)換腳本,但 vidrsatija 和 holland(zmurez 的研究工作基于他們的成果)確實(shí)以 Jupyter 筆記本的形式提供了這些轉(zhuǎn)換腳本。
不幸的是,這些轉(zhuǎn)換腳本/筆記本僅適用于 v0.7 版本,而不適用于后續(xù)版本(相信我,我試過(guò)了……).
當(dāng)我們?cè)?QCS6490 板上運(yùn)行支持的 mediapipe_face 模型時(shí),可以看到對(duì) zmurez/MediaPipePyTorch 倉(cāng)庫(kù)的引用:
選擇這個(gè)過(guò)時(shí)的模型對(duì)我來(lái)說(shuō)毫無(wú)意義,除了可能是在整合的時(shí)候,只有 PyTorch 被 Qualcomm AI 堆棧所支持之外?
當(dāng)我將這些模型部署到 AMD/Xilinx 的 Vitis-AI 平臺(tái)時(shí),我也遇到了同樣的情況。
不管原因如何,我認(rèn)為都有機(jī)會(huì)進(jìn)一步加強(qiáng)對(duì) MediaPipe 的支持。由于我們可以將 TFLite 模型轉(zhuǎn)換為 ONNX 格式,所以我為 QCS6490 上的 MediaPipe 模型提出了以下更新的流程:
在高通平臺(tái)上部署 MediaPipe 所面臨的挑戰(zhàn)
在第一部分中,我遇到的第一個(gè)難題是:在嵌入式平臺(tái)上運(yùn)行 MediaPipe 模型時(shí),其性能會(huì)明顯低于在現(xiàn)代計(jì)算機(jī)上的表現(xiàn)。這就是我試圖通過(guò) QAI Hub Workbench 來(lái)加速這些模型的原因。
第二個(gè)挑戰(zhàn)在于,谷歌并未提供用于訓(xùn)練 MediaPipe 模型的數(shù)據(jù)集。由于量化需要使用其中的一部分訓(xùn)練數(shù)據(jù),這就要求我們自己去收集這些數(shù)據(jù)。
為了應(yīng)對(duì)這些挑戰(zhàn),我們將克隆以下存儲(chǔ)庫(kù)(blaze_tutorial),該存儲(chǔ)庫(kù)將用于在 QAI Hub Workbench 中對(duì)云端的模型進(jìn)行量化、編譯和性能分析:
創(chuàng)建量化校準(zhǔn)數(shù)據(jù)集
正如“QAI Hub 工作臺(tái)概述”部分所描述的那樣,量化階段需要數(shù)百到數(shù)千個(gè)數(shù)據(jù)樣本,理想情況下應(yīng)是從訓(xùn)練數(shù)據(jù)中選取的一部分樣本。由于我們無(wú)法獲取訓(xùn)練數(shù)據(jù)集,所以我們需要自己生成這些數(shù)據(jù)。
我們可以使用修改后的 blaze_app_python.py 腳本生成校準(zhǔn)數(shù)據(jù)集,具體步驟如下:
對(duì)于每一張包含至少一只手的輸入圖像,我們想要生成:
?手掌檢測(cè)輸入圖像:經(jīng)過(guò)調(diào)整大小并填充至模型輸入尺寸的圖像
?手部特征點(diǎn)輸入圖像:每個(gè)手部的裁剪圖像,經(jīng)過(guò)調(diào)整大小處理以適應(yīng)模型的輸入尺寸。
輸入圖像的可能來(lái)源如下:
?Kaggle:存在眾多數(shù)據(jù)集,并且這些數(shù)據(jù)集可以被重復(fù)使用。
?Pixabay:包含多段有趣視頻,從中可以提取出圖片。
對(duì)于 Kaggle 這個(gè)案例,如果我們采用以下這樣一個(gè)現(xiàn)有的數(shù)據(jù)集:
?[Kaggle] 手勢(shì)數(shù)據(jù)集(由瑞蒂卡·吉里達(dá)爾創(chuàng)作)
我們可以對(duì) blaze_app_python 倉(cāng)庫(kù)中的 blaze_detect_live.py 腳本進(jìn)行修改,從而創(chuàng)建一個(gè)版本,該版本能夠掃描所有圖像,并生成一個(gè)特定于 NumPy 的二進(jìn)制格式文件(*.npy),其中包含我們?cè)诹炕襟E中所需的校準(zhǔn)數(shù)據(jù):
?blaze_app_python/calib_dataset_kaggle/gen_calib_hand_dataset.py
要運(yùn)行此腳本,請(qǐng)前往“blaze_app_python/calib_dataset_kaggle”目錄,將 Kaggle 數(shù)據(jù)集下載到該子目錄中,然后按照以下方式啟動(dòng)腳本:
這將為 0.10 版本的手掌檢測(cè)和手部特征點(diǎn)模型生成以下校準(zhǔn)數(shù)據(jù):
?calib_palm_detection_192_dataset.npy 文件:包含 1871 個(gè) 192x192 像素的 RGB 圖像樣本。
?calib_hand_landmark_224_dataset.npy 文件:包含 1880 個(gè) 224x224 像素的 RGB 圖像樣本。
最終我決定不使用這個(gè)數(shù)據(jù)集,但還是記錄下了整個(gè)過(guò)程以便日后參考,這個(gè)過(guò)程可以適用于任何其他 Kaggle 數(shù)據(jù)集。
再次說(shuō)明,我們可以對(duì) blaze_app_python 倉(cāng)庫(kù)中的 blaze_detect_live.py 腳本進(jìn)行修改,從而生成一個(gè)新的版本。該版本將對(duì)視頻進(jìn)行掃描,并生成一個(gè)包含量化步驟校準(zhǔn)數(shù)據(jù)的 NumPy 特定的二進(jìn)制格式文件(*.npy):
?blaze_app_python/calib_dataset_pixabay/gen_calib_hand_dataset.py
要運(yùn)行此腳本,請(qǐng)前往“blaze_app_python/calib_dataset_pixabay”目錄,將 Pixabay 視頻下載到“videos”子目錄中,然后按照以下方式啟動(dòng)腳本:
這將為 0.10 版本的手掌檢測(cè)和手部特征點(diǎn)模型生成以下校準(zhǔn)數(shù)據(jù):
?calib_palm_detection_192_dataset.npy 文件:包含 1577 個(gè) 192x192 像素的 RGB 圖像樣本。
calib_hand_landmark_224_dataset.npy 文件:包含 2595 個(gè) 224x224 像素的 RGB 圖像樣本。
您可以自由選擇上述所描述的任一數(shù)據(jù)源,或者使用您自己的數(shù)據(jù)源作為量化階段的數(shù)據(jù)。
我已經(jīng)將關(guān)于這個(gè)子主題(為各種版本的模型創(chuàng)建手部/面部/姿勢(shì)數(shù)據(jù)集)的探索成果存入了以下兩個(gè)檔案中:
?Kaggle:calib_dataset_kaggle.zip
?Pixabay:calib_dataset_pixabay.zip
為了此次探索,我準(zhǔn)備了校準(zhǔn)數(shù)據(jù)(來(lái)自 Pixabay),您可以按照以下方式下載并提取這些數(shù)據(jù):
模型轉(zhuǎn)換
使用 QAI Hub Workbench 進(jìn)行部署的第二步是下載 TFLite 模型,并使用 tf2onnx 工具將其轉(zhuǎn)換為 ONNX 格式:
?get_tflite_models.sh:從谷歌下載 TFLite 模型
?convert_models.sh:使用 tf2onnx 工具將模型轉(zhuǎn)換為 ONNX 格式
使用以下命令來(lái)下載并轉(zhuǎn)換 mediapipe 模型為 ONNX 格式:
模型部署
既然我們有了校準(zhǔn)數(shù)據(jù),并且我們的模型已轉(zhuǎn)換為 ONNX 格式,那么就可以使用 AI Hub 工作臺(tái)來(lái)執(zhí)行模型量化、性能分析和編譯操作了。
為此我準(zhǔn)備了一份腳本:
?qai_hub_workbench_flow.py
此腳本在被調(diào)用時(shí)會(huì)接受三個(gè)(3)參數(shù):
?名稱:型號(hào)名稱(例如:palm_detection_lite)
?模型:模型文件(例如:models/palm_detection_lite.onnx)
?說(shuō)明:輸入尺寸(例如:256)
“名稱參數(shù)”用于指明我們所部署的模型類型,例如對(duì)于手掌檢測(cè)器而言,可以是“palm_detection_lite”或“palm_detection_full”;而對(duì)于手部特征點(diǎn)模型,則可以是“hand_landmark_lite”或“hand_landmark_full”。而“分辨率”則表示模型的輸入尺寸。
這兩項(xiàng)參數(shù)將決定用于量化操作的校準(zhǔn)數(shù)據(jù)集是哪一個(gè)。例如:
?名稱:palm_detection_lite,大?。?92 => 文件名:calib_palm_detection_192_dataset.npy
?名稱=hand_landmark_lite,大小=224 => calib_hand_landmark_224_dataset.npy
該腳本將為以下目標(biāo)運(yùn)行環(huán)境生成輸出文件:
?TFLite(*.tflite)
?onnx(*.onnx.zip)
?qnn_dlc (*.dlc)
?qnn_context_binary (*.bin)
?預(yù)編譯的 QNN ONNX 文件(*.onnx.zip)
我將僅使用以下兩個(gè)目標(biāo)運(yùn)行時(shí)環(huán)境來(lái)進(jìn)行推理測(cè)試:
?TFLite (*.tflite) => 使用 TFLite(搭配 QNN 代理)
?qnn_context_binary (*.bin) => 使用 QAIRT
我已提供了另一份腳本,該腳本將調(diào)用 qai_hub_workbench_flow.py 腳本來(lái)對(duì)模型進(jìn)行量化、編譯和性能分析:
?deploy_models_qai_hub_workbench.sh
在執(zhí)行之前,您需要對(duì)以下列表進(jìn)行修改:
?模型列表:請(qǐng)指定您想要部署的模型(或多個(gè)模型)
以下是修改后的腳本版本,它將部署 0.10 版本的掌部檢測(cè)和手部特征點(diǎn)模型。
此腳本的執(zhí)行方式如下:
完成之后,以下編譯好的模型將位于當(dāng)前目錄中:
?palm_detection_full.tflite、palm_detection_full.bin……
?hand_landmarks_full.tflite、hand_landmarks_full.bin……
?palm_detection_lite.tflite、palm_detection_lite.bin……
?hand_landmarks_lite.tflite、hand_landmarks_lite.bin 等……
為了方便起見,我已將 QCS6490 的編譯模型存入以下檔案中:
?TFLite 模型(*.tflite):blaze_tflite_qnn_models_qcs6490.zip
?QAIRT 模型(*.bin):blaze_qairt_models_qcs6490.zip
在 QAI 資源中心工作臺(tái)中分析結(jié)果
在“職位”頁(yè)面中,如果我們點(diǎn)擊“個(gè)人資料”選項(xiàng)卡,就能看到針對(duì)每個(gè)模型的個(gè)人資料生成結(jié)果:
如果我們將運(yùn)行在 CPU 上的未量化 ONNX 模型與運(yùn)行在 NPU 上的量化模型進(jìn)行比較:
?“手掌檢測(cè)(基于 QAIRT 版本)”:66.4 毫秒 => 1.3 毫秒
?hand_landmarks_full(QAIRT 版本):47.4 毫秒 => 1 毫秒
如果我們將運(yùn)行在 CPU 上的未量化 ONNX 模型與運(yùn)行在 NPU 上的量化模型進(jìn)行比較:
?“palm_detection_lite(基于QAIRT的版本):54.7 毫秒 => 1.2 毫秒”
?hand_landmarks_lite(基于 QAIRT 的版本):29.9 毫秒 => 0.7 毫秒
這是顯著的加速(幅度在 30 倍到 60 倍之間)!
在量化模型的性能分析結(jié)果中存在一個(gè)異常情況:
?palm_detection_full(TFlite 版本):66.4 毫秒 => 31.0 毫秒
如果我們點(diǎn)擊該任務(wù)以了解其運(yùn)行情況,就會(huì)發(fā)現(xiàn)該模型在 NPU 上的加速程度并不完全,仍有 150 層運(yùn)算是在 CPU 上進(jìn)行的。
所有其他的工作都采用了干凈的 NPU 實(shí)現(xiàn)方式,包括 palm_detection_full 模型的 QAIRT 版本:
如果我們向下滾動(dòng)并選擇“運(yùn)行時(shí)層分析”部分,然后點(diǎn)擊“查看操作跟蹤”按鈕,就能獲得逐層的詳細(xì)分析報(bào)告:
如果我們查看每個(gè)模型的層數(shù)(中央處理器、神經(jīng)處理單元、圖形處理器等),則在性能測(cè)試報(bào)告中可得到以下所報(bào)告的層數(shù):
“ONNX 層”指的是我們作為 QAI Hub 工作臺(tái)輸入所使用的浮點(diǎn)型 ONNX 模型。
“TFLite 層”指的是經(jīng)過(guò)量化處理的模型,專為 TFLite 運(yùn)行時(shí)環(huán)境設(shè)計(jì)。
“QAIRT 層”對(duì)應(yīng)的是經(jīng)過(guò)量化處理的模型,其目標(biāo)是“qnn_compiled_binary”,并且可以與高通 AI 運(yùn)行時(shí)配合使用。
模型準(zhǔn)確率
如果我們查看模型的準(zhǔn)確率,那么在量化任務(wù)中我們得到的結(jié)果如下:
我們可以看到,模型的準(zhǔn)確度仍有待提高。這可能與校準(zhǔn)數(shù)據(jù)有關(guān),但我尚未進(jìn)一步進(jìn)行調(diào)查。
使用 0.07 版本的手掌檢測(cè)模型時(shí),能達(dá)到最佳的準(zhǔn)確度。
在“手部特征點(diǎn)模型”0.07 版本中,達(dá)到了最差的準(zhǔn)確度。這一點(diǎn)可以從 0.07 版本的流程中看出,即手部能夠被正確檢測(cè)出來(lái),但特征點(diǎn)的準(zhǔn)確性卻不高。
不幸的是,手部特征點(diǎn)模型 v0.10 版本的 PSNR 計(jì)算出現(xiàn)了錯(cuò)誤,所以我不清楚具體的指標(biāo)數(shù)值是什么,但它們看起來(lái)肯定是準(zhǔn)確的,所以我推測(cè)其數(shù)值肯定高于 30 分貝。
除了方向判斷有誤(總是錯(cuò)誤地報(bào)告為“左手”)之外。
模型執(zhí)行
為了支持 QCS6490 型號(hào),對(duì)“blaze_app_python”應(yīng)用程序進(jìn)行了以下增強(qiáng),添加了相應(yīng)的推理目標(biāo):
如圖所示,我已經(jīng)為原始的 TFLite 模型以及這些模型的 PyTorch 版本(v0.07)提供了支持。
我們也可以運(yùn)行未量化化的 ONNX 模型,但更重要的是,通過(guò)以下兩個(gè)運(yùn)行時(shí)目標(biāo)實(shí)現(xiàn)了在 NPU 上的執(zhí)行支持:
?TFLite(采用 QNN 代理)
?QAIRT
我針對(duì) TFLite(并使用了 QNN 代理)編寫的最終推理代碼,實(shí)際上采用了 EdgeAI Lite-RT(即谷歌最新版的 TFLite),該代碼可在“blaze_app_python”存儲(chǔ)庫(kù)中的“blaze_tflite_qnn”子目錄中找到:
?blaze_app_python/blaze_tflite_qnn/blazedetector.py
?blaze_app_python/blaze_tflite_qnn/blazelandmark.py
我們需要確保我們的電路板上具備所需的庫(kù)文件,而實(shí)際上它確實(shí)具備:
我為 QAIRT 編寫的最終推理代碼可以在“blaze_app_python”存儲(chǔ)庫(kù)中的“blaze_qairt”子目錄下找到:
?blaze_app_python/blaze_qairt/blazedetector.py
?blaze_app_python/blaze_qairt/blazelandmark.py
我們需要在我們的板子上安裝 QAIRT SDK,這可以通過(guò)以下步驟來(lái)完成。
首先,我們下載并安裝了 QAIRT SDK 的 2.40 版本:
然后,我們(可選地)會(huì)克隆、構(gòu)建并安裝 QAI 應(yīng)用程序構(gòu)建器:
在“視覺 AI-KIT 6490”設(shè)備上安裝 Python 應(yīng)用程序
首先,我們要確保我們的更改能夠持久生效:
該 Python 演示應(yīng)用程序需要一些特定的包,這些包可以通過(guò)以下方式安裝:
該 Python 應(yīng)用程序可通過(guò)以下 GitHub 倉(cāng)庫(kù)進(jìn)行訪問(wèn):
若要成功使用帶有原始 TFLite 模型的 Python 示例程序,需從谷歌網(wǎng)站下載這些模型:
若要成功使用與 QCS6490 型號(hào)配套的 Python 示例程序,需按照以下步驟進(jìn)行下載:
你們都準(zhǔn)備好了!
在 Vision AI-KIT 6490 上啟動(dòng) Python 應(yīng)用程序
正如我們?cè)诘?1 部分中所看到的,Python 應(yīng)用程序能夠啟動(dòng)多種雙推理流程的變體,這些變體可以通過(guò)以下參數(shù)進(jìn)行篩選:
——布萊茲:手部動(dòng)作 | 面部表情 | 姿態(tài)動(dòng)作
--目標(biāo):blaze_tflite | ... | blaze_tflite_qnn | blaze_qairt
--pipeline:管道的特定名稱(可通過(guò) --list 參數(shù)進(jìn)行查詢)
為了顯示所有支持的管道列表,請(qǐng)按照以下方式運(yùn)行 Python 腳本:
為了啟動(dòng)用于手部檢測(cè)和關(guān)鍵點(diǎn)識(shí)別的 v0.10 便攜版管道,以及帶有 QNN 代理的 TFLite 運(yùn)行時(shí),請(qǐng)按照以下方式使用 Python 腳本:
這將啟動(dòng)針對(duì) QCS6490 系統(tǒng)編譯的 0.10(精簡(jiǎn)版)版本的模型,如圖所示:
之前的視頻并未進(jìn)行加速處理。該視頻顯示,在未檢測(cè)到手部時(shí)(運(yùn)行一種模型:手掌檢測(cè)),幀率為約 30 幀每秒;在檢測(cè)到一只手時(shí)(運(yùn)行兩種模型:手掌檢測(cè)和手部特征點(diǎn)檢測(cè)),幀率為約 20 幀每秒;在檢測(cè)到兩只手時(shí)(運(yùn)行三種模型:手掌檢測(cè)和兩只手特征點(diǎn)檢測(cè)),幀率為約 15 幀每秒。
這比在 CPU 上運(yùn)行的原始 TFLite 模型要差一些,所以對(duì)于這種情況,我不得不考慮放棄使用 TFLite 并采用 QNN 代理的做法。
為了啟動(dòng)用于手部檢測(cè)和關(guān)鍵點(diǎn)識(shí)別的 v0.10 便攜版管道以及高通 AI 運(yùn)行時(shí),請(qǐng)按照以下方式使用 Python 腳本:
這將啟動(dòng)針對(duì) QCS6490 系統(tǒng)編譯的 0.10(精簡(jiǎn)版)版本的模型,如圖所示:
之前的視頻并未進(jìn)行加速處理。該視頻顯示,在未檢測(cè)到手部時(shí)(運(yùn)行一種模型:手掌檢測(cè)),幀率為 30 幀每秒;當(dāng)檢測(cè)到一只手時(shí)(運(yùn)行兩種模型:手掌檢測(cè)和手部特征點(diǎn)檢測(cè)),幀率為 30 幀每秒;當(dāng)檢測(cè)到兩只手時(shí)(運(yùn)行三種模型:手掌檢測(cè)和兩個(gè)手的特征點(diǎn)檢測(cè)),幀率為 30 幀每秒。
與使用 QNN 代理的 TFLite 運(yùn)行時(shí)相比,高通 AI 運(yùn)行時(shí)實(shí)現(xiàn)了顯著的加速!
為了了解使用 QAIRT 運(yùn)行的模型的實(shí)際表現(xiàn),我們需要暫時(shí)斷開 USB 攝像頭(該攝像頭決定了 30 幀每秒的幀率)。我們將在下一節(jié)中進(jìn)行此項(xiàng)操作。
在“視覺 AI-KIT 6490”平臺(tái)上對(duì)模型進(jìn)行基準(zhǔn)測(cè)試
為了獲得穩(wěn)定的輪廓結(jié)果,我們使用了一張測(cè)試圖片(包含雙手),該圖片可以從谷歌上下載,具體操作如下:
我們可以使用以下命令來(lái)直觀地比較原始的 TFLite 模型與 QAIRT 加速模型的性能分析結(jié)果:
以下圖表將會(huì)出現(xiàn):
您可能已經(jīng)注意到圖表中的柱狀圖存在一些抖動(dòng)現(xiàn)象,因此我們將把一系列數(shù)據(jù)保存到 CSV 文件中,然后對(duì)結(jié)果進(jìn)行平均處理,以便更清晰地了解其性能情況。
我沒(méi)有這種自動(dòng)化的流程,所以這是一個(gè)需要人工操作的流程,包括采集、處理和呈現(xiàn)等環(huán)節(jié)……
以下命令可用于使用 QCS6490 模型和測(cè)試圖像為 qairt_hand_v0_10_lite 流水線生成性能報(bào)告結(jié)果:
以下命令可用于使用 TFLite 模型及測(cè)試圖像為 tfl_hand_v0_10_lite 流水線生成性能報(bào)告結(jié)果:
對(duì)于 qairt_hand_v0_10_full 和 tfl_hand_v0_10_full 這兩個(gè)模型,也采用了同樣的操作。
所有.csv 文件中的數(shù)據(jù)均進(jìn)行了平均處理,然后使用 Excel 進(jìn)行了繪圖。
以下是使用 QAIRT 部署的模型的性能分析結(jié)果,與參考的 TFLite 模型進(jìn)行了對(duì)比:
同樣,需要指出的是,這些基準(zhǔn)測(cè)試是通過(guò)單線程的 Python 腳本完成的。如果采用多線程實(shí)現(xiàn)方式,還有進(jìn)一步加速的空間。在圖形運(yùn)行器等待從一個(gè)模型的子圖中獲取數(shù)據(jù)的同時(shí),可以同時(shí)啟動(dòng)另一個(gè)(或多個(gè)其他)模型……
此外,還有機(jī)會(huì)通過(guò)使用 C++ 代碼來(lái)加快整個(gè)開發(fā)流程的進(jìn)度……
已知問(wèn)題
盡管我已經(jīng)對(duì) palm_detection 和 hand_landmarks 這兩個(gè)模型的 v0.07 版本進(jìn)行了量化和部署,但 hand_landmarks 模型的準(zhǔn)確性已經(jīng)下降了,所以在您的應(yīng)用中請(qǐng)不要再使用這個(gè)模型。
對(duì)于 0.10 版本的手部特征點(diǎn)數(shù)據(jù),手的朝向似乎沒(méi)有得到正確處理。這些模型總是返回約 1.0 的數(shù)值,這對(duì)應(yīng)于“左手”。
本文編譯自hackster.io





