色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > 二維已經(jīng) OUT 了?3DPose 實現(xiàn)三維人體姿態(tài)識別真香 | 代碼干貨

          二維已經(jīng) OUT 了?3DPose 實現(xiàn)三維人體姿態(tài)識別真香 | 代碼干貨

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

          引言

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

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

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

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

          1.jpg

          1、基本介紹

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

          1.1 環(huán)境要求:

          本次環(huán)境使用的是python3.6.5+windows平臺。

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

          ONNX Runtime庫

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

          opencv-python模塊

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

          Numpy模塊

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

          1.2 方法總結(jié):

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

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

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

          2.三維人體可視化

          傳統(tǒng)方法與深度學習方法

          2.png

          其中3DPose算法提供的模型架構(gòu)如下圖可見:

          3.png

          2.1 圖片預處理:

          其中圖片處理代碼如下,分別為讀取圖片,顯示圖片,BGR轉(zhuǎn)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模型文件,實時需要識別的圖片數(shù)據(jù),獲取每一張圖片的offset圖和heatmap圖。通過找到第j個關(guān)節(jié)的28個特征圖,并找到最大值的索引來獲取個點坐標。并把坐標按照一定比例縮放。使得圖像變形較為符合人體規(guī)律。

          for j in range(0, 24):
              # 找到第j個關(guān)節(jié)的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

          *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



          關(guān)鍵詞: 機械學習

          技術(shù)專區(qū)

          關(guān)閉