摘要:本案例使用Windows版本的ModelBox SDK進行二次開發,主要是針對姿态比對案例開發實踐。
本文分享自華為雲社群《姿态比對:抖抖手動動腳勤做深呼吸》,作者:吳小魚。
在之前釋出的AI說ModelBox推理真的高效嗎一文中,我們使用雙階段單人人體關鍵點檢測作為案例對比測試了ModelBox的性能。作為一個性能測試案例我們隻是簡單的将檢測到的關鍵點畫在原圖上,并未進行進一步的應用開發。昨晚做夢,夢到關鍵點檢測案例哭訴大材小用為何對它棄之不理明明廣闊天地大有可為,愧疚之下連夜寫了這篇動手動腳的案例 ,最終效果如下:
畫面左上角随機繪制一個标準姿勢,同時檢測使用者的姿态與标準姿勢進行相似性比對,得分繪制在畫面中央。如果得分超過門檻值,則視為姿态一緻,将更新下一個标準姿勢。
本案例使用Windows版本的ModelBox SDK進行二次開發。如果對此還不熟悉,請先閱讀ModelBox端雲協同AI開發套件(Windows)開發環境篇,如果對ModelBox AI應用開發感興趣,歡迎參加我們的ModelBox實戰營。
工程目錄
本案例是在single_human_pose應用基礎上修改而來,案例所需資源(代碼、模型、測試資料等)均可從obs桶下載下傳。工程目錄與原始版本基本一緻,下面列出其中不一樣的地方:
single_human_pose
├─data
│ └─norm_kpts.npy // 标準姿态關鍵點
├─etc
│ └─flowunit // 功能單元目錄
│ ├─draw_pose // 關鍵點繪制功能單元
│ ├─draw_pose.py // 關鍵點繪制功能單元入口檔案
│ ├─draw_pose.toml // 關鍵點繪制功能單元配置檔案
│ ├─draw_utils.py // 關鍵點比對算法
│ └─smooth.py // 平滑算法,使關鍵點更穩定
│ ├─... // 其他功能單元
├─graph
│ └─single_human_pose.toml // 預設技能流程圖,使用攝像頭運作
├─...
└─build_project.sh
主要的不同點有兩處:
1.我們希望姿态與标準姿态比對得分超過門檻值後持續展示幾幀比對結果,使結果更可感,這就需要draw_pose單元是有序的,是以我們在關鍵點繪制功能單元配置檔案draw_pose.toml中将單元類型改為流單元:
# Flowunit Type
stream = true # Whether the flowunit is a stream flowunit
同時要在draw_pose.py中補充流單元需實作的接口data_pre、data_post:
def data_pre(self, data_context):
# Before streaming data starts
return modelbox.Status()
def data_post(self, data_context):
# After streaming data ends
return modelbox.Status()
2.draw_utils.py中新增關鍵點比對算法,主要思路是将檢測到的關鍵點對檢測框進行歸一化處理後與标準關鍵點計算oks:
def compute_kpts_oks(self, dt_kpts, area=1):
g = np.array(self.target_kpt)
xg = g[:, 0]
yg = g[:, 1]
d = np.array(dt_kpts)
xd = d[:, 0]
yd = d[:, 1]
vd = d[:, 2]
dx = xd - xg
dy = yd - yg
e = (dx ** 2 + dy ** 2) / self.variances / (area + np.spacing(1)) / 2
e = e[vd > self.kpts_thre]
return np.sum(np.exp(-e)) / e.shape[0] if e.shape[0] else 0.0
為防止某些低置信度關鍵點漂移影響相似性計算,我們隻取置信度大于kpts_thre的關鍵點計算得分。
此外,一時手癢替換了人形檢測模型,檢測的前後處理以及技能流程圖稍有改變;如果使用原本的檢測模型隻修改上述部分也可以正常運作。由于本項目随機選擇标準姿勢,是以隻提供了使用攝像頭運作的技能流程圖。
運作項目
打開工程目錄下bin/mock_task.toml檔案,設定其中的任務輸入和任務輸出配置為如下内容:
[input]
type = "url"
url = "0"
# 任務輸出,目前僅支援"webhook", 和本地輸出"local"(輸出到螢幕,url="0", 輸出到rtsp,填寫rtsp位址)
# (local 還可以輸出到本地檔案,這個時候注意,檔案可以是相對路徑,是相對這個mock_task.toml檔案本身)
[output]
type = "local"
url = "0:Pose"
即使用編号為0的攝像頭(預設為PC自帶的攝像頭),輸出畫面顯示到名為Pose的本地螢幕視窗中。
執行bin/main.bat 運作應用,就可以開始伸展胳膊腿兒了:
另外,巨佬飛戈在single_human_pose應用基礎上開發了體感小遊戲,有興趣的朋友可以玩一下。
可以看到,在基礎案例上進行簡單的二次開發即可得到一個可玩應用,期待大家腦洞大開讓基礎案例們都可以一展抱負
11月3号晚19點,将進行AI養豬 實時看護豬的健康直播,華為雲AI發燒友線上帶你學習ModelBox架構,快速AI應用,實作AI監測豬的健康狀态。
參與直播互動,有機會赢取華為自拍杆、雷柏機械鍵盤、ModelArts書籍等多重好禮,還等什麼,馬上報名吧!
報名連結:http://su.modelarts.club/5a7o