學(xué)習(xí)關(guān)于 2D 和 3D 姿勢估計的知識
介紹
讓我們了解一下如何將姿勢估計用于 Snapchat 濾鏡。你有沒有想過 Snapchat 的濾鏡為什么這么吸引人?Snapchat 上的濾鏡種類繁多,從有趣的到化妝的濾鏡。這更像是滑動濾鏡并選擇一個你感興趣的濾鏡來拍照。
閱讀本文并不需要任何有關(guān)姿勢估計的基礎(chǔ)知識。本文從頭到尾總結(jié)了有關(guān)姿態(tài)估計的所有關(guān)鍵點和重要主題。文章的開頭包括什么是姿態(tài)估計以及為什么我們必須了解姿態(tài)估計。本文從頭部、手部、人體、2D、3D 以及更多姿勢估計中描述了多種姿勢估計。之后,我們將使用各種公共數(shù)據(jù)集,用于使用流行算法進行姿勢估計。
閱讀本文后,你將獲得所有與 2D 姿態(tài)估計和 3D 姿態(tài)估計相關(guān)的信息,以及一個使用 OpenPose 算法進行 2D 人體姿態(tài)估計的迷你項目。
什么是姿勢估計?
姿勢估計是一種在圖像或視頻中檢測對象或人的位置和軌跡的計算機視覺技術(shù)。該過程通過查看給定對象或人的姿勢方向組合來執(zhí)行。根據(jù)點的方向,我們可以比較一個人或一個對象的各種時刻和姿勢,并得出一些見解。
姿態(tài)估計主要是通過識別對象/人的關(guān)鍵點,甚至通過識別位置來完成的。
對于對象:關(guān)鍵點將是對象的角或邊緣。 對于圖像:包含人類的圖像,關(guān)鍵點可以是肘部、手腕、手指、膝蓋等。
計算機視覺中最令人興奮的研究領(lǐng)域之一是各種類型的姿態(tài)估計。使用姿勢估計技術(shù)有很多好處。

姿態(tài)估計的應(yīng)用
如今,在市場上,有大量使用計算機視覺技術(shù)的應(yīng)用程序。特別是由于有效的跟蹤系統(tǒng)和姿態(tài)估計的測量。讓我們通過示例來看看姿勢估計的一些應(yīng)用。
1) 增強現(xiàn)實元宇宙
元宇宙突破科技界,吸引了從年輕人到老年人的普遍關(guān)注。元宇宙將 3D 元素固定在現(xiàn)實世界中的對象/人上,使它們看起來非常真實,為人們創(chuàng)造了一個進入另一個宇宙的環(huán)境,并有助于體驗奇妙的事物。適用于元宇宙解決方案的應(yīng)用程序是姿勢估計、眼動追蹤、語音和面部追蹤。
姿態(tài)估計的有用用例之一是在美國陸軍中使用,它們可以區(qū)分敵軍和友軍。
2) 醫(yī)療保健和健身行業(yè)
新冠時代,健身行業(yè)高速發(fā)展,有無數(shù)消費者加入了瘋狂的健身行列。健身應(yīng)用的快速增長提供了高效的健康監(jiān)測圖表和健身計劃。
此外,一些應(yīng)用程序在錯誤檢測和向消費者反饋方面提供了令人驚訝的結(jié)果。這些應(yīng)用程序利用計算機視覺中的姿勢估計技術(shù)來最大程度地減少鍛煉時受傷的可能性。
3) 機器人
姿勢估計被集成到機器人技術(shù)中。它被應(yīng)用于機器人的訓(xùn)練中,他們學(xué)習(xí)人的動作。
為什么我們使用姿勢估計?
人的檢測在檢測部分中起著主要作用。隨著機器學(xué)習(xí)(ML)算法的最新發(fā)展,姿勢檢測和姿勢跟蹤很容易使用。
在對象檢測等傳統(tǒng)方法中,我們只能被感知為一個方形邊界框。隨著姿勢檢測和姿勢跟蹤的進步,機器可以輕松學(xué)習(xí)人體語言。在姿態(tài)估計的幫助下,我們可以在粒度級別跟蹤對象。這些強大的技術(shù)為在現(xiàn)實世界中應(yīng)用開辟了廣泛的可能性。
為了跟蹤人類的運動和活動,姿勢估計具有多個應(yīng)用范圍,例如增強現(xiàn)實、醫(yī)療保健部門和機器人技術(shù)。例如,人體姿態(tài)估計可以以多種方式使用,例如通過結(jié)合人體姿態(tài)估計和距離投影啟發(fā)式方法來保持銀行隊列中的社交距離。它將幫助人們保持銀行中的衛(wèi)生規(guī)則和規(guī)定,也有助于在人滿為患的地方保持物理距離。
另一個可以使用姿勢跟蹤和姿勢估計的例子是在自動駕駛汽車中。當(dāng)車輛無法理解行人行為時,大多數(shù)事故都是由自動駕駛汽車引起的。在姿態(tài)估計的幫助下,模型將得到更好的訓(xùn)練。
多人姿態(tài)估計方法
用于姿態(tài)估計的兩種常用方法:
1)自上而下的方法:
首先,我們將檢測人并在每個人周圍制作邊界框。然后我們將估計身體的部位。之后,我們可以將每個關(guān)節(jié)分類為正確的人。這種方法被稱為自上而下的方法。
2) 自下而上的方法:
首先,我們將檢測圖像中的所有部分,然后關(guān)聯(lián)/分組屬于不同人的部分。這種方法被稱為自下而上的方法。
在一般情況下,自上而下的方法比自下而上的方法消耗更多的時間。
姿勢估計模型
近年來,隨著深度學(xué)習(xí)解決方案的快速發(fā)展,它在姿勢估計等多項任務(wù)(包括圖像分割和對象檢測)中的表現(xiàn)優(yōu)于一些計算機視覺方法。
存在幾種用于姿勢估計的模型。模型選擇取決于問題的要求。在選擇模型時,我們還需要考慮無數(shù)因素,可以是運行時間、模型的大小等等。
在這里,我將列出互聯(lián)網(wǎng)上最流行的姿勢估計庫。我們可以根據(jù)我們的用例輕松自定義它們。
OpenPose High-Resolution Net (HRNet) Blaze pose Regional Multi-Person Pose Estimation (AlphaPose) Deep Pose PoseNet Dense pose Deep cut
1) OpenPose
OpenPose 被稱為基于開源視頻的人體姿態(tài)估計。OpenpPose 架構(gòu)在預(yù)測多人姿態(tài)估計方面很受歡迎。令人驚奇的事情之一是 Openpose 是其開源的實時多人檢測架構(gòu)。它使用自下而上的方法進行多人人體姿態(tài)估計。
OpenPose 在單張圖像的總共 135 個關(guān)鍵點中估計身體、腳、手和面部關(guān)鍵點的姿勢時具有很高的準(zhǔn)確性。OpenPose 的主要優(yōu)點是 API 可以讓用戶控制選擇圖像源并提供多個選項。我們還可以從攝像頭、網(wǎng)絡(luò)攝像頭和嵌入式系統(tǒng)(CCTV 攝像頭和系統(tǒng))中選擇圖像。
OpenPose 的優(yōu)點之一是它的精度高,不會影響執(zhí)行性能。它在速度和準(zhǔn)確性之間具有輕微的平衡(即 R-CNN 運行得更快)
OpenPose 論文:https://cmu-perceptual-computing-lab.github.io/openpose/web/html/doc/index.html
OpenPose 文檔 :https://www.arxiv-vanity.com/papers/1611.08050/)
代碼的 Github 鏈接:https://github.com/CMU-Perceptual-Computing-Lab/openpose

2) High-Resolution Net (HRNet)
HRNet 被稱為高分辨率網(wǎng)絡(luò)。對于人體姿態(tài)估計,我們使用 HRNet 神經(jīng)網(wǎng)絡(luò)。HRNet 是人體姿態(tài)估計領(lǐng)域最先進的算法。HRNet 在電視體育運動中的人體姿勢檢測中得到了廣泛應(yīng)用。
HRNet 使用卷積神經(jīng)網(wǎng)絡(luò) (CNN),它類似于神經(jīng)網(wǎng)絡(luò),但主要區(qū)別在于模型的架構(gòu)。普通神經(jīng)網(wǎng)絡(luò)不能很好地使用圖像數(shù)據(jù)集進行擴展,而卷積神經(jīng)網(wǎng)絡(luò)提供了很好的輸出。
即使是普通的神經(jīng)網(wǎng)絡(luò)工作也非常緩慢,因為所有隱藏層都相互連接,這導(dǎo)致模型運行速度變慢。例如,如果我們的圖像大小為 32 *32* 3,那么我們將有 3072 個權(quán)重,這太大了。在輸入這些數(shù)據(jù)時,它會減慢神經(jīng)網(wǎng)絡(luò)的速度。
HRNet 論文:https://jingdongwang2017.github.io/Projects/HRNet/PoseEstimation.html
代碼的 Github 鏈接:https://github.com/leoxiaobin/deep-high-resolution-net.pytorch
3) Blaze pose
BlazePose 是一種機器學(xué)習(xí) (ML) 模型,可與 ailia SDK 一起使用。BlazePose 由 Google 開發(fā),最多可計算 33 個骨架關(guān)鍵點,主要用于健身應(yīng)用。BlazePose 根據(jù)下面的圖表排序約定將 33 個關(guān)鍵點作為模型的輸出。這使我們能夠僅從與面部和手部模型一致的姿勢預(yù)測中確定身體語義。我們可以通過 ailia SDK(https://ailia.jp/en/) 輕松地使用 BlazePose 模型,創(chuàng)建 AI 應(yīng)用程序。
Blaze Pose 論文:https://cmu-perceptual-computing-lab.github.io/openpose/web/html/doc/index.html
此處找到文檔 :https://www.arxiv-vanity.com/papers/1611.08050/
用于檢查代碼的 Github 鏈接:https://github.com/CMU-Perceptual-Computing-Lab/openpose
要了解有關(guān) BlazePose 的更多信息,請關(guān)注此博客:https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html

4)Regional Multi-Person Pose Estimation (AlphaPose)
AlphaPose 是一個實時多人人體姿態(tài)估計系統(tǒng)。一種流行的自頂向下方法,使用 AplhaPose 數(shù)據(jù)集進行人體姿態(tài)估計。當(dāng)有不準(zhǔn)確的人體邊界框時,Aplhapose 就會出現(xiàn),并且非常準(zhǔn)確。
我們可以在 AplhaPose 的幫助下從圖像或視頻或圖像列表中檢測單個人或多個人。它是被稱為 PoseFlow 的姿勢跟蹤器,它也是開源的。AlphaPose 是在 PoseTrack Challenge 數(shù)據(jù)集上同時滿足 60+ mAP (66.5 mAP) 和 50+ MOTA (58.3 MOTA) 的跟蹤器。

姿勢估計的分類
通常,姿態(tài)估計分為兩組:
單姿勢估計:從圖像或視頻中檢測單個對象或人 多姿勢估計:從圖像或視頻中檢測多個對象或人
姿態(tài)估計有多種類型
人體姿態(tài)估計 剛性姿態(tài)估計 2D 姿態(tài)估計 3D 姿態(tài)估計 頭部姿勢估計 手部姿勢估計
1) 人體姿態(tài)估計
處理人體圖像或視頻時的關(guān)鍵點估計,其中關(guān)鍵點可以是肘部、手指、膝蓋等。這稱為人體姿勢估計。
2)剛性姿勢估計
不屬于柔性對象類別的對象是剛性對象。例如,無論磚塊的方向如何,磚塊的邊緣總是處于相同的距離,因此預(yù)測這些對象的位置被稱為剛性姿勢估計。
3) 2D 姿態(tài)估計
它根據(jù)像素級別從圖像中預(yù)測關(guān)鍵點估計。在 2D 估計中,我們簡單地估計與輸入數(shù)據(jù)相關(guān)的 2D 空間中位置的關(guān)鍵點。關(guān)鍵點的位置用 X 和 Y 表示。
4) 3D 姿態(tài)估計
它預(yù)測所有對象/人的三維空間排列作為其最終輸出。首先,通過附加的 z 軸將對象從 2D 圖像轉(zhuǎn)換為 3D 圖像以預(yù)測輸出。

5)頭部姿勢估計
尋找一個人的頭部姿勢的位置正在成為計算機視覺中的一個流行用例。頭部姿勢估計的最佳應(yīng)用之一是 Snapchat,我們在臉上使用各種濾鏡讓我們看起來很有趣。此外,我們在 Instagram 濾鏡和 Snapchat 中使用頭部姿勢估計,我們還可以在自動駕駛汽車中使用它來跟蹤駕駛員在駕駛時的活動。
頭部姿勢估計有多種應(yīng)用,例如在 3D 游戲中建模注意力和執(zhí)行面部對齊。為了在 3D 姿勢中進行頭部姿勢估計,我們需要借助深度學(xué)習(xí)模型從 2D 圖像姿勢中找到面部關(guān)鍵點。
閱讀有關(guān)頭部姿勢估計的信息:https://medium.com/towards-data-science/head-pose-estimation-with-hopenet-5e62ace254d5

6) 手部姿勢估計
手部姿勢估計旨在從圖像中預(yù)測手部關(guān)節(jié)的位置,并且由于 VR/AR/MR 技術(shù)的出現(xiàn)而變得流行。在手部姿態(tài)估計中,關(guān)鍵點是手部關(guān)節(jié)的位置。手總共有21個關(guān)鍵點,其中包括手腕,5個手指用于關(guān)鍵點的位置。

人體姿態(tài)估計數(shù)據(jù)集
各種數(shù)據(jù)集可用于人體圖像和視頻的姿態(tài)估計。在這里,我列出了一些數(shù)據(jù)集供你制作模型和探索。我將根據(jù)圖像和視頻的類別來解釋數(shù)據(jù)集包含的內(nèi)容。此外,將提供有關(guān)數(shù)據(jù)集及其性能的一些基本信息。
MPII COCO HumanEva Human3.6M SURREAL – Synthetic hUmans foR REAL tasks
1)MPII
MPII 人體姿勢數(shù)據(jù)集包含大量人體姿勢的數(shù)據(jù),其中包括大約 25K 圖像,其中 包含超過 40K 個帶有注釋的身體關(guān)節(jié)的人。MPII 人體姿態(tài)數(shù)據(jù)集是用于評估關(guān)節(jié)式人體姿態(tài)估計的最先進的基準(zhǔn)。
2014 年第一個發(fā)起 2D 姿勢估計挑戰(zhàn)的數(shù)據(jù)集是 MPII 人體姿勢,它也是第一個包含如此多樣化姿勢的數(shù)據(jù)集。這些數(shù)據(jù)包含從 Youtube 視頻中收集的人類活動圖像??偣灿?410 個人類活動圖像,上面有活動標(biāo)簽。每個圖像都是從 YouTube 視頻中提取的,并提供了前后未注釋的幀。此外,對于測試集,我們獲得了更豐富的注釋,包括身體部位遮擋、 3D 軀干和頭部方向。
你可以在此處找到 MPII 人體姿勢數(shù)據(jù)集:http://human-pose.mpi-inf.mpg.de/

2) COCO
COCO 是一個用于對象檢測、分割和字幕數(shù)據(jù)的大規(guī)模數(shù)據(jù)集,也是一個從 Flickr 收集的圖像的多人 2D 姿態(tài)估計數(shù)據(jù)集。COCO 數(shù)據(jù)集有 80 個對象類別和 91 個東西類別。
迄今為止最大的 2D 姿態(tài)估計數(shù)據(jù)集之一是 COCO,它正在考慮測試 2D 姿態(tài)估計算法的基準(zhǔn)。
COCO 數(shù)據(jù)集:https://cocodataset.org/#home

3) HumanEva
HumanEva 數(shù)據(jù)集由人類 3D 姿勢估計的視頻序列組成,這些視頻序列是使用不同的攝像機(例如多個 RGB 和灰度攝像機)記錄的。HumanEva 是第一個相當(dāng)大的 3D 姿勢估計數(shù)據(jù)集。
HumanEva-I 數(shù)據(jù)集包含 7 個視頻序列,分別是:4 個灰度和 3 個顏色。令人驚奇的是,它們與從動作捕捉系統(tǒng)獲得的 3D 身體姿勢同步。HumanEva 數(shù)據(jù)庫包含 4 名受試者執(zhí)行 6 種常見動作(例如步行、慢跑、手勢等)。向參與者提供計算 2D 和 3D 姿勢誤差的誤差度量。數(shù)據(jù)集包含訓(xùn)練、驗證和測試集。
HumanEva 數(shù)據(jù)集:http://humaneva.is.tue.mpg.de/
4) SURREAL
SURREAL 這個名字來源于Synthetic hUmans for RREAL tasks。SURREAL 包含 2D/3D 姿勢估計數(shù)據(jù)中的單人虛擬視頻動畫。它是使用實驗室記錄的動作捕捉數(shù)據(jù)創(chuàng)建的。第一個為 RGB 視頻輸入生成深度、身體部位、光流、2D/3D 姿勢、表面法線地面實況的大型人物數(shù)據(jù)集。
該數(shù)據(jù)集包含600 萬幀合成人。這些圖像是人物在形狀、紋理、視點和姿勢的巨大變化下的照片般逼真的渲染。為確保真實感,合成體是使用 SMPL 模型創(chuàng)建的,其參數(shù)通過 MoSh 方法擬合給定原始 3D MoCap 標(biāo)記數(shù)據(jù)。
SMPL模型:http://smpl.is.tue.mpg.de/
MoSh方法:https://ps.is.tuebingen.mpg.de/research_projects/mosh

3d 人體姿態(tài)估計 SURREAL 數(shù)據(jù)集:https://www.di.ens.fr/willow/research/surreal/data/
機器學(xué)習(xí)中的人體姿勢估計代碼
讓我們開始人體姿勢估計的實現(xiàn)
第一步是創(chuàng)建一個用于存儲項目的新文件夾。最好做一個虛擬環(huán)境,然后加載 OpenPose 算法,而不是下載到你的正常環(huán)境中。
為姿勢估計創(chuàng)建 Anaconda 環(huán)境。在 ' myenv ' 中為環(huán)境輸入任何名稱。
conda create --name myenv
現(xiàn)在讓我們在這個環(huán)境中工作,我們將為其激活環(huán)境
conda activate myenv
安裝最新版本的python
conda create -n myenv python=3.9
人體姿態(tài)估計的代碼受到 OpenPose 算法的 OpenCV 示例的啟發(fā)。
現(xiàn)在我們將編寫人體姿態(tài)估計的代碼。我們從此鏈接(https://github.com/quanhua92/human-pose-estimation-opencv)下載 zip 文件。

首先,我們導(dǎo)入所有庫。
import cv2 as cv
import matplotlib.pyplot as plt
現(xiàn)在,我們將加載權(quán)重。權(quán)重存儲在graph_opt.pb文件中,并將權(quán)重存儲到net變量中。
net = cv.dnn.readNetFromTensorflow(r"graph_opt.pb")
初始化圖像的高度、寬度和閾值。
inWidth = 368
inHeight = 368
thr = 0.2
我們將使用 18 點模型進行人體姿態(tài)估計。該模型在 COCO 數(shù)據(jù)集上進行訓(xùn)練,其中關(guān)鍵點的編號以以下格式完成。
BODY_PARTS = { "Nose": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,
"LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,
"RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "REye": 14,
"LEye": 15, "REar": 16, "LEar": 17, "Background": 18 }
定義用于創(chuàng)建連接所有關(guān)鍵點的肢體的姿勢對。
POSE_PAIRS = [ ["Neck", "RShoulder"], ["Neck", "LShoulder"], ["RShoulder", "RElbow"],
["RElbow", "RWrist"], ["LShoulder", "LElbow"], ["LElbow", "LWrist"],
["Neck", "RHip"], ["RHip", "RKnee"], ["RKnee", "RAnkle"], ["Neck", "LHip"],
["LHip", "LKnee"], ["LKnee", "LAnkle"], ["Neck", "Nose"], ["Nose", "REye"],
["REye", "REar"], ["Nose", "LEye"], ["LEye", "LEar"] ]
讓我們看看原圖是什么樣子的。
img = plt.imread("image.jpg")
plt.imshow(img)

為了為每個關(guān)鍵點生成置信度圖,我們將在原始輸入圖像上調(diào)用 forward 函數(shù)。
net.setInput(cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight), (127.5, 127.5, 127.5), swapRB=True, crop=False))
這是完成人體姿態(tài)估計預(yù)測的主要代碼。
def pose_estimation(frame):
frameWidth = frame.shape[1]
frameHeight = frame.shape[0]
net.setInput(cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight), (127.5, 127.5, 127.5), swapRB=True, crop=False))
out = net.forward()
out = out[:, :19, :, :]
assert(len(BODY_PARTS) == out.shape[1])
points = []
for i in range(len(BODY_PARTS)):
# Slice heatmap of corresponging body's part.
heatMap = out[0, i, :, :]
_, conf, _, point = cv.minMaxLoc(heatMap)
x = (frameWidth * point[0]) / out.shape[3]
y = (frameHeight * point[1]) / out.shape[2]
# Add a point if it's confidence is higher than threshold.
# combining all the key points.
points.append((int(x), int(y)) if conf > thr else None)
for pair in POSE_PAIRS:
partFrom = pair[0]
partTo = pair[1]
assert(partFrom in BODY_PARTS)
assert(partTo in BODY_PARTS)
idFrom = BODY_PARTS[partFrom]
idTo = BODY_PARTS[partTo]
if points[idFrom] and points[idTo]:
cv.line(frame, points[idFrom], points[idTo], (0, 255, 0), 3)
cv.ellipse(frame, points[idFrom], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
cv.ellipse(frame, points[idTo], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
t, _ = net.getPerfProfile()
freq = cv.getTickFrequency() / 1000
cv.putText(frame, '%.2fms' % (t / freq), (10, 20), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))
return frame
調(diào)用 main 函數(shù)在原始未編輯圖像上生成關(guān)鍵點。
estimated_image = pose_estimation(img)
讓我們看看圖片看起來如何
plt.imshow(img)

如果我們想在關(guān)鍵點上看到 RGB 格式的圖像。
plt.imshow(cv.cvtColor(estimated_image, cv.COLOR_BGR2RGB))

結(jié)論
通過本文,我們了解了姿勢估計的概念,為什么對姿態(tài)估計的需求猛增?姿態(tài)估計的應(yīng)用是什么?我們已經(jīng)使用姿勢估計的地方等內(nèi)容。
我們將看到有多少種姿態(tài)估計,例如人體姿態(tài)估計、剛性姿態(tài)估計、2D 姿態(tài)估計、3D 姿態(tài)估計、頭部姿態(tài)估計、手姿態(tài)估計,我們?nèi)绾卧谑褂眠@些類型的姿態(tài)估計的同時使用一些用于 2D 和 3D 姿態(tài)估計的流行算法。
最后,我們了解了如何使用 Openpose 估計對人體全身圖像進行姿態(tài)估計。
