二維已經(jīng) OUT 了?3DPose 實(shí)現三維人體姿態(tài)識別真香 | 代碼干貨
引言
人體姿態(tài)估計是計算機視覺(jué)領(lǐng)域很多研究工作的基礎,也是研究的熱點(diǎn)問(wèn)題,在行為識別、人機交互、姿態(tài)跟蹤等領(lǐng)域有著(zhù)廣泛的應用前景。
按照人體姿態(tài)維度的差異,可以將人體姿態(tài)估計任務(wù)分為二維人體姿態(tài)估計和三維人體姿態(tài)估計。2D人體姿態(tài)估計的目標是定位并識別出人體關(guān)鍵點(diǎn),將這些關(guān)鍵點(diǎn)按照關(guān)節順序相連形成在圖像二維平面的投影,從而得到人體骨架。3D人體姿態(tài)估計的主要任務(wù)是預測出人體關(guān)節點(diǎn)的三維坐標位置和角度等信息。
在實(shí)際應用中,由于3D姿態(tài)估計在2D姿態(tài)估計的基礎上加入了深度信息,其對于人體姿態(tài)的表述比2D更為精準,因此其應用范圍和研究?jì)r(jià)值都要高于2D人體姿態(tài)估計,但是3D姿態(tài)估計的難度也更高,存在著(zhù)遮擋,單視角2D到3D的映射中固有的深度模糊性、不適定性,缺少大型的室外數據集等挑戰。
本項目通過(guò)使用3DPose模型實(shí)現對人體的三維實(shí)時(shí)姿態(tài)識別。其最終實(shí)現的效果如下圖可見(jiàn):
1、基本介紹
在深度學(xué)習方法得到廣泛應用之前,3D人體姿態(tài)標注數據集和具有高運算能力的GPU還沒(méi)有普及,研究人員主要通過(guò)一些應用在傳統計算機視覺(jué)或機器學(xué)習領(lǐng)域的方法來(lái)進(jìn)行3D人體姿態(tài)的估計。傳統三維人體姿態(tài)估計和基于深度學(xué)習的姿態(tài)估計之間最明顯的特征在于是否使用了多層神經(jīng)網(wǎng)絡(luò )的學(xué)習方法,因為建模方式不同,在估計精確性、計算復雜度等方面也有著(zhù)較大的差別。其中建模是三維人體姿態(tài)估計一個(gè)很重要的方面,目的是表示從輸入數據中提取的關(guān)鍵點(diǎn)和特征。在解決實(shí)際問(wèn)題時(shí)由于實(shí)驗個(gè)體所處環(huán)境的復雜性,很大程度上增加了模型的建立難度,因此選取適當且有效的圖像特征來(lái)簡(jiǎn)化模型建立過(guò)程十分重要。
1.1 環(huán)境要求:
本次環(huán)境使用的是python3.6.5+windows平臺。
主要用的庫有:ONNX Runtime庫、opencv-python模塊、Numpy模塊。
ONNX Runtime庫
ONNX Runtime庫是一個(gè)用于ONNX(Open Neural Network Exchange)模型推理的引擎。微軟聯(lián)合Facebook等在2017年搞了個(gè)深度學(xué)習以及機器學(xué)習模型的格式標準--ONNX,順路提供了一個(gè)專(zhuān)門(mén)用于ONNX模型推理的引擎。
opencv-python模塊
opencv-python是一個(gè)Python綁定庫,旨在解決計算機視覺(jué)問(wèn)題。其使用Numpy,這是一個(gè)高度優(yōu)化的數據庫操作庫,具有MATLAB風(fēng)格的語(yǔ)法。所有Opencv數組結構都轉換為Numpy數組。這也使得與使用Numpy的其他庫(如Scipy和Matplotlib)集成更容易。
Numpy模塊
Numpy是應用Python進(jìn)行科學(xué)計算時(shí)的基礎模塊。它是一個(gè)提供多維數組對象的Python庫,除此之外,還包含了多種衍生的對象(比如掩碼式數組(masked arrays)或矩陣)以及一系列的為快速計算數組而生的例程,包括數學(xué)運算,邏輯運算,形狀操作,排序,選擇,I/O,離散傅里葉變換,基本線(xiàn)性代數,基本統計運算,隨機模擬等。
1.2 方法總結:
傳統方法很多是采用基于人體模型的方法來(lái)描述和推斷人體姿態(tài),通過(guò)算法提取圖像姿態(tài)特征,因此對特征表示和關(guān)鍵點(diǎn)的空間位置關(guān)系這兩個(gè)維度有比較高的要求,除去邊界、顏色這類(lèi)低層次特征,典型的有尺度不變特征變換、梯度直方圖等表達能力更強、可有效壓縮特征空間維度的高層次特征,它們雖然在時(shí)間效率方面具有優(yōu)勢,但依然存在著(zhù)較大的不足。
而深度學(xué)習模型操作過(guò)程相對簡(jiǎn)單且對特征的表示能力強大,對輸入信息自動(dòng)進(jìn)行特征提取而無(wú)需人為手動(dòng)提取特征。
基于深度學(xué)習的人體姿態(tài)估計可以通過(guò)建立網(wǎng)絡(luò )模型在圖像數據上進(jìn)行訓練和學(xué)習,直接得到最有效的表征方法,其核心是深度神經(jīng)網(wǎng)絡(luò ),主要是利用卷積神經(jīng)網(wǎng)絡(luò )從圖像中提取出比人工特征語(yǔ)義信息更豐富、準確性更高和更具魯棒性的卷積特征,并且網(wǎng)絡(luò )模型的表達能力會(huì )因網(wǎng)絡(luò )堆疊數量的增加而呈指數增長(cháng),因此相較于傳統方法可以進(jìn)一步提升復雜環(huán)境下的人體姿態(tài)的精度和魯棒性。深度學(xué)習在人體姿態(tài)估計任務(wù)中的應用已經(jīng)取得了顯著(zhù)的進(jìn)展,然而像遮擋、訓練數據不足和深度模糊等挑戰仍然是難以克服的。
2.三維人體可視化
傳統方法與深度學(xué)習方法
其中3DPose算法提供的模型架構如下圖可見(jiàn):
2.1 圖片預處理:
其中圖片處理代碼如下,分別為讀取圖片,顯示圖片,BGR轉RGB以及尺寸變換等:
img=cv2.imread("1.jpg") cv2.imshow("test", img) cv2.waitKey(1) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (448, 448)) img = img.astype(np.float32) / 255.0 img = img.transpose(2, 1, 0) img = img[np.newaxis, ...]
2.2 模型訓練:
首先通過(guò)使用onnxruntime,
然后讀取Resnet34_inputs_448x448_20200609.0nnx模型文件,實(shí)時(shí)需要識別的圖片數據,獲取每一張圖片的offset圖和heatmap圖。通過(guò)找到第j個(gè)關(guān)節的28個(gè)特征圖,并找到最大值的索引來(lái)獲取個(gè)點(diǎn)坐標。并把坐標按照一定比例縮放。使得圖像變形較為符合人體規律。
for j in range(0, 24): # 找到第j個(gè)關(guān)節的28個(gè)特征圖,并找到最大值的索引 joint_heat = heatMap3D[j * 28:(j + 1) * 28, ...] if np.max(joint_heat)>0.1: print(np.max(joint_heat)) [x, y, z] = np.where(joint_heat == np.max(joint_heat)) x = int(x[-1]) y = int(y[-1]) z = int(z[-1]) # 通過(guò)heatmap的索引找到對應的offset圖,并計算3D坐標的xyz值 pos_x = offset3D[j * 28 + x, y, z] + x pos_y = offset3D[24 * 28 + j * 28 + x, y, z] + y pos_z = offset3D[24 * 28 * 2 + j * 28 + x, y, z] + z kps[j, 0] = pos_x kps[j, 1] = pos_y kps[j, 2] = pos_z else: try: kps[j, 0] = kps[j-1, 0] kps[j, 0] = kps[j-1, 0] kps[j, 2] = kps[j-1, 2] except: pass parent = np.array([15, 1, 2, 3, 3, 15, 6, 7, 8, 8, 12, 15, 14, 15, 24, 24, 16, 17, 18, 24, 20, 21, 22, 0]) - 1; for i in range(len(kps)): if (parent[i] != -1): ax.plot3D(kps[[i, parent[i]], 0], -kps[[i, parent[i]], 1], -kps[[i, parent[i]], 2], 'gray')
完整代碼:
鏈接:https://pan.baidu.com/s/1pb0uG9Uy36sOBuWNTsZUpA
提取碼:0ahr
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。