更加實(shí)用的姿態(tài)估計(jì)
本文?將通過強(qiáng)調(diào)推理過程中的一個(gè)關(guān)鍵問題來討論如何使姿勢(shì)估計(jì)算法更有效,并討論如何緩解這個(gè)問題。?還介紹了一個(gè)示例,使得姿勢(shì)估計(jì)變得更加實(shí)用。
關(guān)鍵詞:human pose-estimation, jitter, low-pass filter, signal.
人體姿勢(shì)估計(jì)是計(jì)算機(jī)視覺中非常具有挑戰(zhàn)性的問題之一,其目標(biāo)是定位人體關(guān)鍵點(diǎn)(如臀部、肩部、手腕等)。
它有無數(shù)的應(yīng)用程序,包括AR、基于VR的游戲(如Microsoft Kinect)、交互式健身、治療、運(yùn)動(dòng)捕捉等。結(jié)果的逐幀平滑對(duì)于這些應(yīng)用程序的任何用途都至關(guān)重要。
抖動(dòng)問題
幾乎每種姿態(tài)估計(jì)算法在推理過程中都存在抖動(dòng)問題。點(diǎn)周圍關(guān)鍵點(diǎn)的高頻振蕩是噪聲信號(hào)的特征,稱為抖動(dòng)。
抖動(dòng)原因可歸因于我們?cè)谡麄(gè)視頻輸入的幀級(jí)別上執(zhí)行這些推斷。這些連續(xù)的幀具有不同的遮擋(以及一系列復(fù)雜的姿勢(shì))。另一個(gè)原因可能是訓(xùn)練數(shù)據(jù)中注釋的不一致性導(dǎo)致姿勢(shì)估計(jì)的不確定性。抖動(dòng)會(huì)帶來以下問題:
1. 故障數(shù)據(jù)和噪聲數(shù)據(jù)會(huì)導(dǎo)致算法性能下降。
2. 關(guān)鍵點(diǎn)太過嘈雜,無法在生產(chǎn)環(huán)境中構(gòu)建任何有用的功能和應(yīng)用程序。
3. 獲得假陽(yáng)性數(shù)據(jù)點(diǎn)的概率很高。
4. 例如:假設(shè)你想使用姿勢(shì)估計(jì)建立一個(gè)靜止記分器(對(duì)于做冥想的人來說),這些抖動(dòng)會(huì)顯著影響分?jǐn)?shù),導(dǎo)致結(jié)果不準(zhǔn)確。
抖動(dòng)問題的解決方案
信號(hào)處理提供了兩種主要的方法來衰減信號(hào)中的噪聲。低通濾波器:將信號(hào)中的所有頻率衰減到指定閾值頻率以下,并使其余信號(hào)保持不變的濾波器。
高通濾波器:一種濾波器,將信號(hào)中的所有頻率衰減到指定閾值頻率以上,并使其余信號(hào)保持不變。
我們的自然運(yùn)動(dòng)是低頻信號(hào),而抖動(dòng)是高頻信號(hào)。因此,為了解決抖動(dòng)問題,我們可以使用低通濾波器來過濾所有更高頻率的信號(hào)。
解決抖動(dòng)問題的其他方法包括使用神經(jīng)網(wǎng)絡(luò)進(jìn)行姿勢(shì)優(yōu)化。其中一個(gè)例子是SmoothNet。然而,LPF更容易實(shí)現(xiàn)和使用。LPF的另一個(gè)變體是One Euro濾波器,它在實(shí)時(shí)過濾噪聲信號(hào)方面也非常強(qiáng)大。
Movenet姿態(tài)估計(jì)
讓我們從一些代碼開始,讓LPF在python中工作。為了在本博客中進(jìn)行說明,我使用了Tensorflow的Movenet姿勢(shì)估計(jì)模型。這個(gè)模型非?焖俸蜏(zhǔn)確。
現(xiàn)在,讓我們考慮一些將用于推理的簡(jiǎ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)在,讓我們回到一開始看到的抖動(dòng)示例,看看如何解決抖動(dòng)問題。為了便于演示,我們使用了低通濾波器。我們還可以使用Python-Scipy中流行的信號(hào)處理庫(kù),該庫(kù)支持不同類型的低通濾波器(例如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)在,讓我們看一個(gè)非常簡(jiǎn)單的例子,在這個(gè)例子中,使用上述概念,姿勢(shì)估計(jì)可以變得更加實(shí)用。
考慮下面的問題陳述:“只根據(jù)身體靜止來給一個(gè)人冥想打分!
除了姿勢(shì)估計(jì)之外,你能想出一些其他技術(shù)來解決這個(gè)問題嗎?
圖像處理
也許我們可以使用簡(jiǎn)單的圖像處理方法來解決這個(gè)問題。我們可以從兩個(gè)連續(xù)幀開始,然后我們可以應(yīng)用二進(jìn)制閾值來獲得減去的掩碼;這里,白色像素的數(shù)量將指示靜止。
這種方法很好,但當(dāng)有一個(gè)風(fēng)扇或一只貓?jiān)诤笈_(tái)移動(dòng)時(shí),問題就會(huì)出現(xiàn);在這種可能的情況下,這種方法將不會(huì)有效。因?yàn)橐苿?dòng)的貓會(huì)成為掩碼的一部分。目標(biāo)是想出一種專門針對(duì)人類的方法。
圖像(人體)分割
使用一些分割技術(shù)怎么樣?我們可以使用分割專門分割出一個(gè)人,然后取兩個(gè)連續(xù)分割幀的差值,檢查白色像素的數(shù)量。局限性:當(dāng)分割區(qū)域內(nèi)有運(yùn)動(dòng)時(shí),此方法不起作用。
姿態(tài)估計(jì)
這里,我們計(jì)算連續(xù)幀中特定身體部位關(guān)鍵點(diǎn)的歐氏距離。我們的最終分?jǐn)?shù)是所有這些歐幾里德距離的加權(quán)和。顯然,如果一個(gè)人做了一些運(yùn)動(dòng),關(guān)鍵點(diǎn)的歐幾里德距離會(huì)更高,反之亦然。
得分:如果沒有明顯的移動(dòng),得分應(yīng)該低。分?jǐn)?shù)越低意味著冥想越好(基于身體靜止,實(shí)際上有很多因素有助于良好的冥想,而不僅僅是靜止)。
請(qǐng)注意,如果我們沒有提前平滑姿勢(shì)關(guān)鍵點(diǎn),抖動(dòng)將導(dǎo)致得分變高,從而導(dǎo)致糟糕和不準(zhǔn)確的結(jié)果。下圖顯示了y軸上的運(yùn)動(dòng)分?jǐn)?shù)與x軸上的時(shí)間。
首先,讓我們看看分?jǐn)?shù)在沒有平滑的情況下是如何表現(xiàn)的。
很明顯,由于抖動(dòng),圖形看起來很嘈雜。
讓我們看看使用LPF的情況。
在這里,這次的圖表看起來很平滑和干凈。我們可以推斷,任何運(yùn)動(dòng)都會(huì)影響曲線下的面積。因此,平滑關(guān)鍵點(diǎn)在此類應(yīng)用中變得非常關(guān)鍵。
最終結(jié)果
還在android中集成了一個(gè)低通濾波器,并在自定義姿勢(shì)估計(jì)模型上運(yùn)行它。我們得到以下結(jié)果:
參考引用
希望你喜歡使用低通濾波器使姿勢(shì)估計(jì)更加實(shí)用。希望這個(gè)例子足夠合理,可以暗示在姿態(tài)估計(jì)的基礎(chǔ)上構(gòu)建應(yīng)用程序時(shí),消除抖動(dòng)是最關(guān)鍵的優(yōu)化之一。
原文標(biāo)題 : 更加實(shí)用的姿態(tài)估計(jì)
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-10.29立即報(bào)名>> 2024德州儀器嵌入式技術(shù)創(chuàng)新發(fā)展研討會(huì)
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月14日立即報(bào)名>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
推薦專題
- 1 Intel宣布40年來最重大轉(zhuǎn)型:年底前裁員15000人、拋掉2/3房產(chǎn)
- 2 因美封殺TikTok,字節(jié)股價(jià)骨折!估值僅Meta1/5
- 3 宏山激光重磅發(fā)布行業(yè)解決方案,助力智能制造產(chǎn)業(yè)新飛躍
- 4 國(guó)產(chǎn)AI芯片公司破產(chǎn)!白菜價(jià)拍賣
- 5 具身智能火了,但規(guī)模落地還需時(shí)間
- 6 國(guó)產(chǎn)英偉達(dá)們,抓緊沖刺A股
- 7 三次錯(cuò)失風(fēng)口!OpenAI前員工殺回AI編程賽道,老東家捧金相助
- 8 英特爾賦能智慧醫(yī)療,共創(chuàng)數(shù)字化未來
- 9 英偉達(dá)的麻煩在后頭?
- 10 將“網(wǎng)紅”變成“商品”,AI“爆改”實(shí)力拉滿
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市