a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

博客專欄

EEPW首頁 > 博客 > 二維已經 OUT 了?3DPose 實現三維人體姿態識別真香 | 代碼干貨

二維已經 OUT 了?3DPose 實現三維人體姿態識別真香 | 代碼干貨

發布人:AI科技大本營 時間:2021-07-16 來源:工程師 發布文章

引言

人體姿態估計是計算機視覺領域很多研究工作的基礎,也是研究的熱點問題,在行為識別、人機交互、姿態跟蹤等領域有著廣泛的應用前景。

按照人體姿態維度的差異,可以將人體姿態估計任務分為二維人體姿態估計和三維人體姿態估計。2D人體姿態估計的目標是定位并識別出人體關鍵點,將這些關鍵點按照關節順序相連形成在圖像二維平面的投影,從而得到人體骨架。3D人體姿態估計的主要任務是預測出人體關節點的三維坐標位置和角度等信息。

在實際應用中,由于3D姿態估計在2D姿態估計的基礎上加入了深度信息,其對于人體姿態的表述比2D更為精準,因此其應用范圍和研究價值都要高于2D人體姿態估計,但是3D姿態估計的難度也更高,存在著遮擋,單視角2D到3D的映射中固有的深度模糊性、不適定性,缺少大型的室外數據集等挑戰。

本項目通過使用3DPose模型實現對人體的三維實時姿態識別。其最終實現的效果如下圖可見:

1.jpg

1、基本介紹

在深度學習方法得到廣泛應用之前,3D人體姿態標注數據集和具有高運算能力的GPU還沒有普及,研究人員主要通過一些應用在傳統計算機視覺或機器學習領域的方法來進行3D人體姿態的估計。傳統三維人體姿態估計和基于深度學習的姿態估計之間最明顯的特征在于是否使用了多層神經網絡的學習方法,因為建模方式不同,在估計精確性、計算復雜度等方面也有著較大的差別。其中建模是三維人體姿態估計一個很重要的方面,目的是表示從輸入數據中提取的關鍵點和特征。在解決實際問題時由于實驗個體所處環境的復雜性,很大程度上增加了模型的建立難度,因此選取適當且有效的圖像特征來簡化模型建立過程十分重要。

1.1 環境要求:

本次環境使用的是python3.6.5+windows平臺。

主要用的庫有:ONNX Runtime庫、opencv-python模塊、Numpy模塊。

ONNX Runtime庫

ONNX Runtime庫是一個用于ONNX(Open Neural Network Exchange)模型推理的引擎。微軟聯合Facebook等在2017年搞了個深度學習以及機器學習模型的格式標準--ONNX,順路提供了一個專門用于ONNX模型推理的引擎。

opencv-python模塊

opencv-python是一個Python綁定庫,旨在解決計算機視覺問題。其使用Numpy,這是一個高度優化的數據庫操作庫,具有MATLAB風格的語法。所有Opencv數組結構都轉換為Numpy數組。這也使得與使用Numpy的其他庫(如Scipy和Matplotlib)集成更容易。

Numpy模塊

Numpy是應用Python進行科學計算時的基礎模塊。它是一個提供多維數組對象的Python庫,除此之外,還包含了多種衍生的對象(比如掩碼式數組(masked arrays)或矩陣)以及一系列的為快速計算數組而生的例程,包括數學運算,邏輯運算,形狀操作,排序,選擇,I/O,離散傅里葉變換,基本線性代數,基本統計運算,隨機模擬等。

1.2 方法總結:

傳統方法很多是采用基于人體模型的方法來描述和推斷人體姿態,通過算法提取圖像姿態特征,因此對特征表示和關鍵點的空間位置關系這兩個維度有比較高的要求,除去邊界、顏色這類低層次特征,典型的有尺度不變特征變換、梯度直方圖等表達能力更強、可有效壓縮特征空間維度的高層次特征,它們雖然在時間效率方面具有優勢,但依然存在著較大的不足。

而深度學習模型操作過程相對簡單且對特征的表示能力強大,對輸入信息自動進行特征提取而無需人為手動提取特征。

基于深度學習的人體姿態估計可以通過建立網絡模型在圖像數據上進行訓練和學習,直接得到最有效的表征方法,其核心是深度神經網絡,主要是利用卷積神經網絡從圖像中提取出比人工特征語義信息更豐富、準確性更高和更具魯棒性的卷積特征,并且網絡模型的表達能力會因網絡堆疊數量的增加而呈指數增長,因此相較于傳統方法可以進一步提升復雜環境下的人體姿態的精度和魯棒性。深度學習在人體姿態估計任務中的應用已經取得了顯著的進展,然而像遮擋、訓練數據不足和深度模糊等挑戰仍然是難以克服的。

2.三維人體可視化

傳統方法與深度學習方法

2.png

其中3DPose算法提供的模型架構如下圖可見:

3.png

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 模型訓練:

首先通過使用onnxruntime,

然后讀取Resnet34_inputs_448x448_20200609.0nnx模型文件,實時需要識別的圖片數據,獲取每一張圖片的offset圖和heatmap圖。通過找到第j個關節的28個特征圖,并找到最大值的索引來獲取個點坐標。并把坐標按照一定比例縮放。使得圖像變形較為符合人體規律。

for j in range(0, 24):
    # 找到第j個關節的28個特征圖,并找到最大值的索引
    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])
        # 通過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

*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



關鍵詞: 機械學習

技術專區

關閉