更加實(shí)用的姿態(tài)估計(jì)
本文?將通過強(qiáng)調(diào)推理過程中的一個關(guān)鍵問題來討論如何使姿勢估計(jì)算法更有效,并討論如何緩解這個問題。?還介紹了一個示例,使得姿勢估計(jì)變得更加實(shí)用。
關(guān)鍵詞:human pose-estimation, jitter, low-pass filter, signal.
人體姿勢估計(jì)是計(jì)算機(jī)視覺中非常具有挑戰(zhàn)性的問題之一,其目標(biāo)是定位人體關(guān)鍵點(diǎn)(如臀部、肩部、手腕等)。
它有無數(shù)的應(yīng)用程序,包括AR、基于VR的游戲(如Microsoft Kinect)、交互式健身、治療、運(yùn)動捕捉等。結(jié)果的逐幀平滑對于這些應(yīng)用程序的任何用途都至關(guān)重要。
抖動問題
幾乎每種姿態(tài)估計(jì)算法在推理過程中都存在抖動問題。點(diǎn)周圍關(guān)鍵點(diǎn)的高頻振蕩是噪聲信號的特征,稱為抖動。
抖動原因可歸因于我們在整個視頻輸入的幀級別上執(zhí)行這些推斷。這些連續(xù)的幀具有不同的遮擋(以及一系列復(fù)雜的姿勢)。另一個原因可能是訓(xùn)練數(shù)據(jù)中注釋的不一致性導(dǎo)致姿勢估計(jì)的不確定性。抖動會帶來以下問題:
1. 故障數(shù)據(jù)和噪聲數(shù)據(jù)會導(dǎo)致算法性能下降。
2. 關(guān)鍵點(diǎn)太過嘈雜,無法在生產(chǎn)環(huán)境中構(gòu)建任何有用的功能和應(yīng)用程序。
3. 獲得假陽性數(shù)據(jù)點(diǎn)的概率很高。
4. 例如:假設(shè)你想使用姿勢估計(jì)建立一個靜止記分器(對于做冥想的人來說),這些抖動會顯著影響分?jǐn)?shù),導(dǎo)致結(jié)果不準(zhǔn)確。
抖動問題的解決方案
信號處理提供了兩種主要的方法來衰減信號中的噪聲。低通濾波器:將信號中的所有頻率衰減到指定閾值頻率以下,并使其余信號保持不變的濾波器。
高通濾波器:一種濾波器,將信號中的所有頻率衰減到指定閾值頻率以上,并使其余信號保持不變。
我們的自然運(yùn)動是低頻信號,而抖動是高頻信號。因此,為了解決抖動問題,我們可以使用低通濾波器來過濾所有更高頻率的信號。
解決抖動問題的其他方法包括使用神經(jīng)網(wǎng)絡(luò)進(jìn)行姿勢優(yōu)化。其中一個例子是SmoothNet。然而,LPF更容易實(shí)現(xiàn)和使用。LPF的另一個變體是One Euro濾波器,它在實(shí)時過濾噪聲信號方面也非常強(qiáng)大。
Movenet姿態(tài)估計(jì)
讓我們從一些代碼開始,讓LPF在python中工作。為了在本博客中進(jìn)行說明,我使用了Tensorflow的Movenet姿勢估計(jì)模型。這個模型非?焖俸蜏(zhǔn)確。
現(xiàn)在,讓我們考慮一些將用于推理的簡單函數(shù)。
tf.lite中提供了用于在tflite上運(yùn)行推理的Python API。(參考:使用tflite在python中加載并運(yùn)行模型)。
# Initialize the TFLite interpreter
input_size = 256
interpreter = tf.lite.Interpreter(model_path="model.tflite")
interpreter.a(chǎn)llocate_tensors()
# Movenet model: Runs detection on an input image
def movenet(input_image):
# TF Lite format expects tensor type of uint8.
input_image = tf.cast(input_image, dtype=tf.uint8)
# Get input and output tensors.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
interpreter.set_tensor(input_details[0]['index'], input_image.numpy())
interpreter.invoke() # Invoke inference.
# Get the model prediction.
kps = interpreter.get_tensor(output_details[0]['index'])
return kps
# Obtain inference from the Movenet model
def get_inference(image):
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Padding and Resizing the input image.
image = pad(image, input_size, input_size)
image = cv2.resize(image, (input_size, input_size))
input_image = image
# Movenet expects a [1, height, width, 3] tensor input
input_image = np.expand_dims(input_image, axis=0)
# Run model inference.
kps = movenet(input_image)[0]
return kps[0], image
使用以下命令在本地運(yùn)行推理(首先,在克隆后執(zhí)行“cd motion-detection”):
python -m inference.movenet_infer — path file.mp4 — lpf n
讓我們看看使用Movenet模型的示例推斷結(jié)果:
顯然,推斷看起來相當(dāng)準(zhǔn)確,延遲也很小。
現(xiàn)在,讓我們回到一開始看到的抖動示例,看看如何解決抖動問題。為了便于演示,我們使用了低通濾波器。我們還可以使用Python-Scipy中流行的信號處理庫,該庫支持不同類型的低通濾波器(例如signal.lfilter模塊)。
1? LPF的使用情況如下所示:
while True:
old_curr_kp, image = get_inference(frame2)
curr_kp = [x[:] for x in old_curr_kp] # deepcopy
if j == 0:
x_track = [OneEuroFilter(j, curr_kp[k][0], 0.6, 0.015) for k in range(num_kps)] # track for all keypoints
y_track = [OneEuroFilter(j, curr_kp[k][1], 0.6, 0.015) for k in range(num_kps)]
if lpf and j > 1:
for i in range(num_kps):
## x coordinate
curr_kp[i][0] = x_track[i](j, curr_kp[i][0])
## y coordinate
curr_kp[i][1] = y_track[i](j, curr_kp[i][1])
output = draw_pose(image, curr_kp)
output = cv2.cvtColor(output, cv2.COLOR_BGR2RGB)
outimage = np.a(chǎn)sarray(output, dtype=np.uint8)
outimage = cv2.resize(outimage, size)
prev_kp = curr_kp
ret, frame2 = cap.read()
cframe = cap.get(cv2.CAP_PROP_POS_FRAMES)
j += 1
if not ret:
break
k = cv2.waitKey(1)
if k == ord('q') or k == 27:
break
cap.release()
cv2.destroyAllWindows()
使用以下命令在本地運(yùn)行推理(使用LPF):(首先,克隆后執(zhí)行“cd motion-detection”)
python -m inference.stillness_scorer — path file.mp4 — lpf y
應(yīng)用程序示例
現(xiàn)在,讓我們看一個非常簡單的例子,在這個例子中,使用上述概念,姿勢估計(jì)可以變得更加實(shí)用。
考慮下面的問題陳述:“只根據(jù)身體靜止來給一個人冥想打分!
除了姿勢估計(jì)之外,你能想出一些其他技術(shù)來解決這個問題嗎?
圖像處理
也許我們可以使用簡單的圖像處理方法來解決這個問題。我們可以從兩個連續(xù)幀開始,然后我們可以應(yīng)用二進(jìn)制閾值來獲得減去的掩碼;這里,白色像素的數(shù)量將指示靜止。
這種方法很好,但當(dāng)有一個風(fēng)扇或一只貓?jiān)诤笈_移動時,問題就會出現(xiàn);在這種可能的情況下,這種方法將不會有效。因?yàn)橐苿拥呢垥蔀檠诖a的一部分。目標(biāo)是想出一種專門針對人類的方法。
圖像(人體)分割
使用一些分割技術(shù)怎么樣?我們可以使用分割專門分割出一個人,然后取兩個連續(xù)分割幀的差值,檢查白色像素的數(shù)量。局限性:當(dāng)分割區(qū)域內(nèi)有運(yùn)動時,此方法不起作用。
姿態(tài)估計(jì)
這里,我們計(jì)算連續(xù)幀中特定身體部位關(guān)鍵點(diǎn)的歐氏距離。我們的最終分?jǐn)?shù)是所有這些歐幾里德距離的加權(quán)和。顯然,如果一個人做了一些運(yùn)動,關(guān)鍵點(diǎn)的歐幾里德距離會更高,反之亦然。
得分:如果沒有明顯的移動,得分應(yīng)該低。分?jǐn)?shù)越低意味著冥想越好(基于身體靜止,實(shí)際上有很多因素有助于良好的冥想,而不僅僅是靜止)。
請注意,如果我們沒有提前平滑姿勢關(guān)鍵點(diǎn),抖動將導(dǎo)致得分變高,從而導(dǎo)致糟糕和不準(zhǔn)確的結(jié)果。下圖顯示了y軸上的運(yùn)動分?jǐn)?shù)與x軸上的時間。
首先,讓我們看看分?jǐn)?shù)在沒有平滑的情況下是如何表現(xiàn)的。
很明顯,由于抖動,圖形看起來很嘈雜。
讓我們看看使用LPF的情況。
在這里,這次的圖表看起來很平滑和干凈。我們可以推斷,任何運(yùn)動都會影響曲線下的面積。因此,平滑關(guān)鍵點(diǎn)在此類應(yīng)用中變得非常關(guān)鍵。
最終結(jié)果
還在android中集成了一個低通濾波器,并在自定義姿勢估計(jì)模型上運(yùn)行它。我們得到以下結(jié)果:
參考引用
希望你喜歡使用低通濾波器使姿勢估計(jì)更加實(shí)用。希望這個例子足夠合理,可以暗示在姿態(tài)估計(jì)的基礎(chǔ)上構(gòu)建應(yīng)用程序時,消除抖動是最關(guān)鍵的優(yōu)化之一。
原文標(biāo)題 : 更加實(shí)用的姿態(tài)估計(jì)

發(fā)表評論
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
7月8日立即報(bào)名>> 【在線會議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動力電池技術(shù)應(yīng)用大會
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會2025(第六屆)機(jī)器人及智能工廠展
-
免費(fèi)參會立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會工業(yè)芯片與傳感儀表展
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 AI 眼鏡讓百萬 APP「集體失業(yè)」?
- 2 豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
- 3 一文看懂視覺語言動作模型(VLA)及其應(yīng)用
- 4 “支付+”時代,支付即生態(tài) | 2025中國跨境支付十大趨勢
- 5 中國最具實(shí)力AI公司TOP10
- 6 特斯拉Robotaxi上路,馬斯克端上畫了十年的餅
- 7 國家數(shù)據(jù)局局長劉烈宏調(diào)研格創(chuàng)東智
- 8 AI的夏天:第四范式VS云從科技VS地平線機(jī)器人
- 9 張勇等人退出阿里合伙人
- 10 深圳跑出40億超級隱形冠軍:賣機(jī)器人年入6.1億,港股上市