檢索實(shí)戰(zhàn)指南:用 Pose-Search 三步從海量圖片中找出指定動(dòng)作)
人體姿勢(shì)檢索實(shí)戰(zhàn)指南用 Pose-Search 三步從海量圖片中找出指定動(dòng)作【免費(fèi)下載鏈接】pose-searchx6ud.github.io/pose-search項(xiàng)目地址: https://gitcode.com/gh_mirrors/po/pose-search本次文章采用動(dòng)手實(shí)戰(zhàn)式結(jié)構(gòu)以一次真實(shí)的找動(dòng)作圖片經(jīng)歷開(kāi)場(chǎng)引出項(xiàng)目隨后依次講解姿勢(shì)識(shí)別原理、環(huán)境搭建、完整檢索體驗(yàn)、匹配機(jī)制拆解和擴(kuò)展方向章節(jié)順序與原文完全不同敘述視角改為第一人稱體驗(yàn)視角。先說(shuō)一個(gè)讓人抓狂的場(chǎng)景做運(yùn)動(dòng)類內(nèi)容的朋友大概都有過(guò)這種經(jīng)歷素材庫(kù)里有幾千張圖片想找一張左腿抬起、右臂向后擺的照片卻只能一張張翻。翻到最后眼睛都快花了還得不到滿意的結(jié)果。想用文字搜右腿彎曲45度、身體前傾30度這種描述搜索引擎根本聽(tīng)不懂。這就是 Pose-Search 想解決的問(wèn)題——它是一款基于骨骼關(guān)鍵點(diǎn)的人體姿勢(shì)檢索引擎讓你像拖拽一個(gè)3D小人擺動(dòng)作那樣定義目標(biāo)姿勢(shì)然后從圖片庫(kù)里自動(dòng)篩出最接近的照片。這套人體姿勢(shì)檢索方案把只能靠肉眼和關(guān)鍵詞的活兒變成了一個(gè)可計(jì)算的數(shù)學(xué)問(wèn)題。別被計(jì)算機(jī)視覺(jué)嚇到原理其實(shí)很直白你可能會(huì)問(wèn)圖片又不是文字機(jī)器怎么知道我擺的是什么動(dòng)作答案藏在每個(gè)畫(huà)面里的骨架上。Pose-Search 借助 Google 的 MediaPipe Pose 模型對(duì)每張圖片做一次透視把人體的肩、肘、腕、髖、膝、踝等關(guān)節(jié)位置統(tǒng)統(tǒng)定位出來(lái)一共提取33 個(gè)骨骼關(guān)鍵點(diǎn)。每個(gè)關(guān)鍵點(diǎn)不僅有平面坐標(biāo)還帶著深度信息和可見(jiàn)度評(píng)分相當(dāng)于給每個(gè)人體建了一張三維數(shù)字名片。這一步對(duì)應(yīng)源碼里的src/utils/detect-pose.ts。它把檢測(cè)結(jié)果分成兩套數(shù)據(jù)一套是歸一化后的畫(huà)面坐標(biāo)對(duì)應(yīng)你在圖上看到的紅點(diǎn)標(biāo)注另一套是真實(shí)空間中的世界坐標(biāo)對(duì)應(yīng)三維信息。兩套數(shù)據(jù)都被存進(jìn)landmarks.dat配合photos.json里的圖片元數(shù)據(jù)就構(gòu)成了一個(gè)骨骼點(diǎn)圖片的檢索數(shù)據(jù)庫(kù)。說(shuō)白了檢索的本質(zhì)不再是看圖而是比骨架。動(dòng)作像不像取決于兩組骨骼點(diǎn)之間的幾何關(guān)系接近不接近。三步完成環(huán)境搭建跟著做就能跑起來(lái)別急部署這套姿勢(shì)檢索工具比你想象的簡(jiǎn)單不需要懂模型訓(xùn)練只需要 Node.js 環(huán)境。第一步拉取倉(cāng)庫(kù)并安裝依賴git clone https://gitcode.com/gh_mirrors/po/pose-search cd pose-search npm install第二步啟動(dòng)開(kāi)發(fā)服務(wù)npm run dev瀏覽器打開(kāi)本地地址就能進(jìn)入界面。如果想打包成生產(chǎn)版本執(zhí)行npm run build即可構(gòu)建過(guò)程會(huì)自動(dòng)做類型檢查并壓縮資源。第三步導(dǎo)入你的圖片數(shù)據(jù)系統(tǒng)默認(rèn)圖片來(lái)自 Unsplash。你只需到 Unsplash 開(kāi)放平臺(tái)申請(qǐng)一個(gè)應(yīng)用密鑰App Key然后訪問(wèn)/#/editor編輯器頁(yè)面把密鑰粘貼到彈出的輸入框里系統(tǒng)就會(huì)自動(dòng)拉取圖片并完成骨骼關(guān)鍵點(diǎn)標(biāo)注。整個(gè)標(biāo)注過(guò)程由 MediaPipe 在瀏覽器本地完成所有檢測(cè)結(jié)果會(huì)寫(xiě)回landmarks.dat和photos.json下次啟動(dòng)直接讀取不需要重復(fù)計(jì)算。效果最直觀的姿勢(shì)檢索方式拖拽3D小人環(huán)境跑起來(lái)之后就到了最有意思的環(huán)節(jié)。編輯器界面里會(huì)有一個(gè)可拖拽的 3D 人體模型——這就是你的姿勢(shì)模板。你可以用鼠標(biāo)轉(zhuǎn)動(dòng)視角、扳動(dòng)各個(gè)關(guān)節(jié)把它擺成你想要的姿勢(shì)比如讓滑板運(yùn)動(dòng)員做一個(gè)騰空抓板動(dòng)作。擺好姿勢(shì)后從下拉框里選擇要匹配的身體部位比如Left Elbow或Right Knee再點(diǎn)一下搜索按鈕系統(tǒng)就會(huì)遍歷整個(gè)圖片庫(kù)按相似度從高到低返回前 100 個(gè)結(jié)果這個(gè)數(shù)量上限可以在配置里改。點(diǎn)擊任意一張縮略圖還能放大查看原圖驗(yàn)證匹配效果。這里有個(gè)很貼心的細(xì)節(jié)搜索結(jié)果左上角會(huì)帶翻轉(zhuǎn)標(biāo)記。因?yàn)槿梭w動(dòng)作天然有左右對(duì)稱性系統(tǒng)遇到左手動(dòng)作但圖片里是右手完成的情況會(huì)通過(guò)水平翻轉(zhuǎn)來(lái)處理保證左叉腰也能匹配到右叉腰的照片。憑什么匹配得準(zhǔn)拆開(kāi)匹配器給你看搜索準(zhǔn)不準(zhǔn)全靠src/Search/impl/目錄下那一排專用匹配器。每個(gè)匹配器都實(shí)現(xiàn)同一個(gè)PoseMatcher接口只有兩個(gè)核心方法prepare()負(fù)責(zé)讀取你擺好的 3D 模板姿勢(shì)算出它的角度特征match()負(fù)責(zé)拿這些特征去和圖片庫(kù)里的每張照片逐一比對(duì)算出相似度分?jǐn)?shù)分?jǐn)?shù)越高越靠前。為什么拆成這么多個(gè)文件因?yàn)榫植科ヅ浔日w匹配聰明得多。全身一起比頭發(fā)、衣服、背景都會(huì)干擾判斷而單獨(dú)比較肘部彎曲角度、肩部旋轉(zhuǎn)方向、膝蓋的夾角每個(gè)部位都能用最合適的幾何算法誤差自然更小。比如MatchElbow會(huì)同時(shí)比較上臂和前臂的朝向角、肘部彎折角、以及手臂相對(duì)軀干的方位多個(gè)角度誤差相乘得到總分——只要某一項(xiàng)差太多總分就會(huì)迅速拉低保證不濫竽充數(shù)。更妙的是相機(jī)無(wú)關(guān)匹配器MatchShoulderCameraUnrelated這類文件。普通的 2D 角度會(huì)受拍攝角度影響同一個(gè)動(dòng)作從正面拍和從側(cè)面拍畫(huà)面里的夾角完全不同。這類匹配器只用世界坐標(biāo)計(jì)算關(guān)節(jié)相對(duì)軀干的方向把拍攝視角的影響抹掉這就是系統(tǒng)宣傳的視角無(wú)關(guān)能力。另外每個(gè)匹配器都很自覺(jué)如果某張照片里目標(biāo)部位的可見(jiàn)度太低低于配置里的LANDMARK_VISIBILITY_ACCEPTABLE_THRESHOLD默認(rèn) 0.4它直接返回空結(jié)果寧可不出現(xiàn)在列表里也不拿噪音數(shù)據(jù)湊數(shù)。除了搜圖它還能用在哪兒把檢索能力搭好之后應(yīng)用場(chǎng)景其實(shí)比想象中寬體育訓(xùn)練分析教練把標(biāo)準(zhǔn)技術(shù)動(dòng)作存進(jìn)庫(kù)里運(yùn)動(dòng)員想練手臂完全伸展、身體成直線的空中姿態(tài)直接拖 3D 模型搜出參考圖??祻?fù)動(dòng)作核對(duì)治療師可以檢索膝關(guān)節(jié)彎曲 90~120 度的示范圖讓患者照著標(biāo)準(zhǔn)執(zhí)行方便又直觀。動(dòng)畫(huà)制作找參考動(dòng)畫(huà)師需要奔跑中左腿前擺、右腿后蹬的中間幀過(guò)去翻素材庫(kù)半小時(shí)現(xiàn)在幾秒鐘出結(jié)果。行為異常監(jiān)測(cè)建立一個(gè)正常姿態(tài)基準(zhǔn)庫(kù)凡是偏離基準(zhǔn)太多的姿勢(shì)都會(huì)被標(biāo)記出來(lái)可用于特定場(chǎng)景的安防輔助。如果以后想接入自己的圖片數(shù)據(jù)源也留好了口子PhotoDataset負(fù)責(zé)數(shù)據(jù)讀寫(xiě)圖片庫(kù)里每一張圖的元數(shù)據(jù)和骨骼點(diǎn)都能通過(guò)它增刪改查替換數(shù)據(jù)源不需要?jiǎng)悠ヅ溥壿?。給想動(dòng)代碼的人留的幾條路這套項(xiàng)目最大的優(yōu)點(diǎn)就是模塊化想改哪里都很清楚新增一個(gè)身體部位的匹配器在src/Search/impl/下新建類實(shí)現(xiàn)PoseMatcher接口再在Search.ts的匹配器注冊(cè)表里登記一下界面上立刻多一個(gè)可選項(xiàng)。自定義3D可視化src/components/SkeletonModelCanvas/里加載了頭部、軀干、四肢等一組 OBJ 模型文件可以替換成你自己的骨骼模型。調(diào)整檢索體驗(yàn)src/config.ts里MAX_NUM_OF_SEARCH_RESULTS控制返回?cái)?shù)量LANDMARK_VISIBILITY_ACCEPTABLE_THRESHOLD控制關(guān)鍵點(diǎn)可信度門(mén)檻改這兩個(gè)數(shù)就能在召回更多和結(jié)果更準(zhǔn)之間找平衡?,F(xiàn)在該輪到你動(dòng)手了回顧一下Pose-Search 用 33 個(gè)骨骼關(guān)鍵點(diǎn)把姿勢(shì)變成可計(jì)算的數(shù)據(jù)用分部位匹配器和視角無(wú)關(guān)算法保證精度再用 3D 模型拖拽提供最直觀的姿勢(shì)定義方式——整套流程環(huán)環(huán)相扣卻只靠瀏覽器就能跑起來(lái)。與其對(duì)著這篇文章想象不如現(xiàn)在就git clone下來(lái)npm install之后去編輯器里拖兩下 3D 小人搜一把自己最想要的那個(gè)動(dòng)作。你會(huì)發(fā)現(xiàn)找一張姿勢(shì)對(duì)的圖從來(lái)沒(méi)這么痛快過(guò)。【免費(fèi)下載鏈接】pose-searchx6ud.github.io/pose-search項(xiàng)目地址: https://gitcode.com/gh_mirrors/po/pose-search創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考