訂閱
糾錯(cuò)
加入自媒體

更加實(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é)果:

參考引用

image.png

希望你喜歡使用低通濾波器使姿勢(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ì)

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)