溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

發(fā)布時(shí)間:2021-12-23 15:24:22 來(lái)源:億速云 閱讀:138 作者:柒染 欄目:大數(shù)據(jù)

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

介紹

正如Zhe Cao在其2017年的論文中所述,實(shí)時(shí)多人二維姿勢(shì)估計(jì)對(duì)于機(jī)器理解圖像和視頻中的人至關(guān)重要。

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

然而,什么是姿勢(shì)估計(jì)

顧名思義,它是一種用來(lái)估計(jì)一個(gè)人身體位置的技術(shù),比如站著、坐著或躺下。獲得這一估計(jì)值的一種方法是找到18個(gè)“身體關(guān)節(jié)”或人工智能領(lǐng)域中命名的“關(guān)鍵點(diǎn)(Key Points)”。下面的圖像顯示了我們的目標(biāo),即在圖像中找到這些點(diǎn):

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

關(guān)鍵點(diǎn)從0點(diǎn)(上頸部)向下延伸到身體關(guān)節(jié),然后回到頭部,最后是第17點(diǎn)(右耳)。

使用人工智能方法出現(xiàn)的第一個(gè)有意義的工作是DeepPose,2014年由谷歌的Toshev和Zegedy撰寫的論文。提出了一種基于深度神經(jīng)網(wǎng)絡(luò)(DNNs)的人體姿勢(shì)估計(jì)方法,該方法將人體姿勢(shì)估計(jì)歸結(jié)為一個(gè)基于DNN的人體關(guān)節(jié)回歸問(wèn)題。

該模型由一個(gè)AlexNet后端(7層)和一個(gè)額外的目標(biāo)層,輸出2k個(gè)關(guān)節(jié)坐標(biāo)。這種方法的一個(gè)重要問(wèn)題是,首先,模型應(yīng)用程序必須檢測(cè)到一個(gè)人(經(jīng)典的對(duì)象檢測(cè))。因此,在圖像上發(fā)現(xiàn)的每個(gè)人體必須分開處理,這大大增加了處理圖像的時(shí)間。

這種方法被稱為“自上而下”,因?yàn)槭紫纫业缴眢w,然后從中找到與其相關(guān)聯(lián)的關(guān)節(jié)。

姿勢(shì)估計(jì)的挑戰(zhàn)

姿勢(shì)估計(jì)有幾個(gè)問(wèn)題,如:

  1. 每個(gè)圖像可能包含未知數(shù)量的人,這些人可以出現(xiàn)在任何位置或比例。

  2. 人與人之間的相互作用會(huì)導(dǎo)致復(fù)雜的空間干擾,這是由于接觸或肢體關(guān)節(jié)連接,使得關(guān)節(jié)的關(guān)聯(lián)變得困難。

  3. 運(yùn)行時(shí)的復(fù)雜性往往隨著圖像中的人數(shù)而增加,這使得實(shí)時(shí)性能成為一個(gè)挑戰(zhàn)。

為了解決這些問(wèn)題,一種更令人興奮的方法是OpenPose,這是2016年由卡內(nèi)基梅隆大學(xué)機(jī)器人研究所的ZheCao和他的同事們引入的。

OpenPose

OpenPose提出的方法使用一個(gè)非參數(shù)表示,稱為部分親和力場(chǎng)(PAFs)來(lái)“連接”圖像上的每個(gè)身體關(guān)節(jié),將它們與個(gè)人聯(lián)系起來(lái)。

換句話說(shuō),OpenPose與DeepPose相反,首先在圖像上找到所有關(guān)節(jié),然后“向上”搜索最有可能包含該關(guān)節(jié)的身體,而不使用檢測(cè)人的檢測(cè)器(“自下而上”方法)。OpenPose可以找到圖像上的關(guān)鍵點(diǎn),而不管圖像上有多少人。下面的圖片是從ILSVRC和COCO研討會(huì)2016上的OpenPose演示中檢索到的,它讓我們了解了這個(gè)過(guò)程。

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

下圖顯示了用于訓(xùn)練的兩個(gè)多階段CNN模型的結(jié)構(gòu)。首先,前饋網(wǎng)絡(luò)同時(shí)預(yù)測(cè)一組人體部位位置的二維置信度映射(關(guān)鍵點(diǎn)標(biāo)注來(lái)自(dataset/COCO/annotations/)和一組二維的部分親和力場(chǎng)(L)。

在每一個(gè)階段之后,兩個(gè)分支的預(yù)測(cè)以及圖像特征被連接到下一個(gè)階段。最后,利用貪婪的推理對(duì)置信圖和相似域進(jìn)行解析,輸出圖像中所有人的二維關(guān)鍵點(diǎn)。

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

在項(xiàng)目執(zhí)行過(guò)程中,我們將回到其中一些概念進(jìn)行澄清。但是,強(qiáng)烈建議你遵循2016年的OpenPose ILSVRC和COCO研討會(huì)演示(http://image-net.org/challenges/talks/2016/Multi-person%20pose%20estimation-CMU.pdf)和CVPR 2017的視頻錄制(https://www.youtube.com/watch?v=OgQLDEAjAZ8&list=PLvsYSxrlO0Cl4J_fgMhj2ElVmGR5UWKpB),以便更好地理解。

TensorFlow 2 OpenPose (tf-pose-estimation)

最初的OpenPose是使用基于模型的VGG預(yù)訓(xùn)練網(wǎng)絡(luò)和Caffe框架開發(fā)的。但是,我們將遵循Ildoo Kim 的TensorFlow實(shí)現(xiàn),詳細(xì)介紹了他的tf-pose-estimation。

Github鏈接:https://github.com/ildoonet/tf-pose-estimation

什么是tf-pose-estimation?

tf-pose-estimation是一種“Openpose”算法,它是利用Tensorflow實(shí)現(xiàn)的。它還提供了幾個(gè)變體,這些變體對(duì)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行了一些更改,以便在CPU或低功耗嵌入式設(shè)備上進(jìn)行實(shí)時(shí)處理。

tf-pose-estimation的GitHub頁(yè)面展示了幾種不同模型的實(shí)驗(yàn),如:

  • cmu:原論文中描述的基于模型的VGG預(yù)訓(xùn)練網(wǎng)絡(luò)的權(quán)值是Caffe格式,將其轉(zhuǎn)換并用于TensorFlow。

  • dsconv:除了mobilenet的深度可分離卷積之外,與cmu版本的架構(gòu)相同。

  • mobilenet:基于mobilenet V1論文,使用12個(gè)卷積層作為特征提取層。

  • mobilenet v2:與mobilenet相似,但使用了它的改進(jìn)版本。

本文的研究是在mobilenet V1(“mobilenet_thin”)上進(jìn)行的,它在計(jì)算預(yù)算和延遲方面具有中等性能:

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

第1部分-安裝 tf-pose-estimation

我們參考了Gunjan Seth的文章Pose Estimation with TensorFlow 2.0(https://medium.com/@gsethi2409/pose-estimation-with-tensorflow-2-0-a51162c095ba)。

  • 轉(zhuǎn)到終端并創(chuàng)建一個(gè)工作目錄(例如,“Pose_Estimation”),并移動(dòng)到那里:

mkdir Pose_Estimation
cd Pose_Estimation
  • 創(chuàng)建虛擬環(huán)境(例如,Tf2_Py37)

conda create --name Tf2_Py37 python=3.7.6 -y 
conda activate Tf2_Py37
  • 安裝TF2

pip install --upgrade pip
pip install tensorflow
  • 安裝開發(fā)期間要使用的基本軟件包:

conda install -c anaconda numpy
conda install -c conda-forge matplotlib
conda install -c conda-forge opencv
  • 下載tf-pose-estimation:

git clone https://github.com/gsethi2409/tf-pose-estimation.git
  • 轉(zhuǎn)到tf-pose-estimation文件夾并安裝requirements

cd tf-pose-estimation/
pip install -r requirements.txt

在下一步,安裝SWIG,一個(gè)接口編譯器,用C語(yǔ)言和C++編寫的程序連接到Python等腳本語(yǔ)言。它通過(guò)在C/C++頭文件中找到的聲明來(lái)工作,并使用它們生成腳本語(yǔ)言需要訪問(wèn)底層C/C++代碼的包裝代碼。

conda install swig
  • 使用SWIG,構(gòu)建C++庫(kù)進(jìn)行后處理。

cd tf_pose/pafprocess
swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace
  • 現(xiàn)在,安裝tf-slim庫(kù),一個(gè)用于定義、訓(xùn)練和評(píng)估TensorFlow中復(fù)雜模型的輕量級(jí)庫(kù)。

pip install git+https://github.com/adrianc-a/tf-slim.git@remove_contrib

就這樣!現(xiàn)在,有必要進(jìn)行一次快速測(cè)試。返回tf-pose-estimation主目錄。

如果你按照順序,你必須在 tf_pose/pafprocess內(nèi)。否則,請(qǐng)使用適當(dāng)?shù)拿罡哪夸洝?/p>

cd ../..

在tf-pose-estimation目錄中有一個(gè)python腳本 run.py,讓我們運(yùn)行它,參數(shù)如下:

  • model=mobilenet_thin

  • resize=432x368(預(yù)處理時(shí)圖像的大?。?/p>

  • image=./images/ski.jpg(圖像目錄內(nèi)的示例圖像)

python run.py --model=mobilenet_thin --resize=432x368 --image=./images/ski.jpg

請(qǐng)注意,在幾秒鐘內(nèi),不會(huì)發(fā)生任何事情,但大約一分鐘后,終端應(yīng)顯示與下圖類似的內(nèi)容:

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

但是,更重要的是,圖像將出現(xiàn)在獨(dú)立的OpenCV窗口上:

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

太好了!這些圖片證明了一切都是正確安裝和運(yùn)作良好的!我們將在下一節(jié)中詳細(xì)介紹。

然而,為了快速解釋這四幅圖像的含義,左上角(“Result”)是繪制有原始圖像的姿勢(shì)檢測(cè)骨架(在本例中,ski.jpg)作為背景。右上角的圖像是一個(gè)“熱圖”,其中顯示了“檢測(cè)到的組件”(S),兩個(gè)底部圖像都顯示了組件的關(guān)聯(lián)(L)。“Result”是把S和L連接起來(lái)。

下一個(gè)測(cè)試是現(xiàn)場(chǎng)視頻:

如果計(jì)算機(jī)只安裝了一個(gè)攝像頭,請(qǐng)使用:camera=0

python run_webcam.py --model=mobilenet_thin --resize=432x368 --camera=1

如果一切順利,就會(huì)出現(xiàn)一個(gè)窗口,里面有一段真實(shí)的視頻,就像下面的截圖:

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

第2部分-深入研究圖像中的姿勢(shì)估計(jì)

在本節(jié)中,我們將更深入地介紹我們的TensorFlow姿勢(shì)估計(jì)實(shí)現(xiàn)。建議你按照這篇文章,試著復(fù)制Jupyter Notebook:10_Pose_Estimation_Images,可以從GitHub項(xiàng)目下載:https://github.com/Mjrovai/TF2_Pose_Estimation/blob/master/10_Pose_Estimation_Images.ipynb

作為參考,這個(gè)項(xiàng)目是在MacPro(2.9Hhz Quad-Core i7 16GB 2133Mhz RAM)上開發(fā)的。

導(dǎo)入庫(kù)
import sys
import time
import logging
import numpy as np
import matplotlib.pyplot as plt
import cv2

from tf_pose import common
from tf_pose.estimator import TfPoseEstimator
from tf_pose.networks import get_graph_path, model_wh
模型定義和TfPose Estimator創(chuàng)建

可以使用位于model/graph子目錄中的模型,如mobilenet_v2_large或cmu(VGG pretrained model)。

對(duì)于cmu,*.pb文件在安裝期間沒(méi)有下載,因?yàn)樗鼈兒艽蟆R褂盟?,?qǐng)運(yùn)行位于/cmu子目錄中的bash腳本download.sh。

這個(gè)項(xiàng)目使用mobilenet_thin(MobilenetV1),考慮到所有使用的圖像都應(yīng)該被調(diào)整為432x368。

參數(shù):

model='mobilenet_thin'
resize='432x368'
w, h = model_wh(resize)

創(chuàng)建估計(jì)器:

e = TfPoseEstimator(get_graph_path(model), target_size=(w, h))

為了便于分析,讓我們加載一個(gè)簡(jiǎn)單的人體圖像。OpenCV用于讀取圖像。圖像存儲(chǔ)為RGB,但在內(nèi)部,OpenCV與BGR一起工作。使用OpenCV顯示圖像沒(méi)有問(wèn)題,因?yàn)樵谔囟ù翱谏巷@示圖像之前,它將從BGR轉(zhuǎn)換為RGB(如所示ski.jpg上一節(jié))。

一旦圖像被打印到Jupyter單元上,Matplotlib將被用來(lái)代替OpenCV。因此,在顯示之前,需要對(duì)圖像進(jìn)行轉(zhuǎn)換,如下所示:

image_path = ‘./images/human.png’
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.grid();

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

請(qǐng)注意,此圖像的形狀為567x567。OpenCV讀取圖像時(shí),自動(dòng)將其轉(zhuǎn)換為數(shù)組,其中每個(gè)值從0到255,其中0表示“白色”,255表示“黑色”。

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

一旦圖像是一個(gè)數(shù)組,就很容易使用shape驗(yàn)證其大?。?/p>

image.shape

結(jié)果將是(567567,3),其中形狀是(寬度、高度、顏色通道)。

盡管可以使用OpenCV讀取圖像,但我們將使用tf_pose.common庫(kù)中的函數(shù)read_imgfile(image_path) 以防止顏色通道出現(xiàn)任何問(wèn)題。

image = common.read_imgfile(image_path, None, None)

一旦我們將圖像作為一個(gè)數(shù)組,我們就可以將方法推理應(yīng)用到估計(jì)器(estimator, e)中,將圖像數(shù)組作為輸入

humans = e.inference(image, resize_to_default=(w > 0 and h > 0), upsample_size=4.0)

運(yùn)行上述命令后,讓我們檢查數(shù)組e.heatmap。該陣列的形狀為(184,216,19),其中184為h/2,216為w/2,19與特定像素屬于18個(gè)關(guān)節(jié)(0到17)+1(18:none)中的一個(gè)的概率有關(guān)。例如,檢查左上角像素時(shí),應(yīng)出現(xiàn)“none”:

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

可以驗(yàn)證此數(shù)組的最后一個(gè)值

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

這是最大的值;可以理解的是,在99.6%的概率下,這個(gè)像素不屬于18個(gè)關(guān)節(jié)中的任何一個(gè)。

讓我們?cè)囍页鲱i部的底部(肩膀之間的中點(diǎn))。它位于原始圖片的中間寬度(0.5*w=108)和高度的20%左右,從上/下(0.2*h=37)開始。所以,讓我們檢查一下這個(gè)特定的像素:

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

很容易意識(shí)到位置1的最大值為0.7059…(或通過(guò)計(jì)算e.heatMat[37][108].max()),這意味著特定像素有70%的概率成為“頸部”。下圖顯示了所有18個(gè)COCO關(guān)鍵點(diǎn)(或“身體關(guān)節(jié)”),顯示“1”對(duì)應(yīng)于“頸部底部”。

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

可以為每個(gè)像素繪制,一種代表其最大值的顏色。這樣一來(lái),一張顯示關(guān)鍵點(diǎn)的熱圖就會(huì)神奇地出現(xiàn):

max_prob = np.amax(e.heatMat[:, :, :-1], axis=2)
plt.imshow(max_prob)
plt.grid();

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

我們現(xiàn)在在調(diào)整后的原始圖像上繪制關(guān)鍵點(diǎn):

plt.figure(figsize=(15,8))
bgimg = cv2.cvtColor(image.astype(np.uint8), cv2.COLOR_BGR2RGB)
bgimg = cv2.resize(bgimg, (e.heatMat.shape[1], e.heatMat.shape[0]), interpolation=cv2.INTER_AREA)
plt.imshow(bgimg, alpha=0.5)
plt.imshow(max_prob, alpha=0.5)
plt.colorbar()
plt.grid();

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

因此,可以在圖像上看到關(guān)鍵點(diǎn),因?yàn)閏olor bar上顯示的值意味著:如果黃色更深就有更高的概率。

為了得到L,即關(guān)鍵點(diǎn)(或“關(guān)節(jié)”)之間最可能的連接(或“骨骼”),我們可以使用e.pafMat的結(jié)果數(shù)組。其形狀為(184,216,38),其中38(2x19)與該像素與18個(gè)特定關(guān)節(jié)+none中的一個(gè)作為水平(x)或垂直(y)連接的一部分的概率有關(guān)。

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

繪制上述圖表的函數(shù)在Notebook中。

使用draw_human方法繪制骨骼

使用e.inference()方法的結(jié)果傳遞給列表human,可以使用draw_human方法繪制骨架:

image = TfPoseEstimator.draw_humans(image, humans, imgcopy=False)

結(jié)果如下圖:

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

如果需要的話,可以只繪制骨架,如下所示(讓我們重新運(yùn)行所有代碼進(jìn)行回顧):

image = common.read_imgfile(image_path, None, None)
humans = e.inference(image, resize_to_default=(w > 0 and h > 0), upsample_size=4.0)
black_background = np.zeros(image.shape)
skeleton = TfPoseEstimator.draw_humans(black_background, humans, imgcopy=False)
plt.figure(figsize=(15,8))
plt.imshow(skeleton);
plt.grid(); 
plt.axis(‘off’);

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

獲取關(guān)鍵點(diǎn)(關(guān)節(jié))坐標(biāo)

姿勢(shì)估計(jì)可用于機(jī)器人、游戲或醫(yī)學(xué)等一系列應(yīng)用。為此,從圖像中獲取物理關(guān)鍵點(diǎn)坐標(biāo)以供其他應(yīng)用程序使用可能很有趣。

查看e.inference()生成的human列表,可以驗(yàn)證它是一個(gè)包含單個(gè)元素、字符串的列表。在這個(gè)字符串中,每個(gè)關(guān)鍵點(diǎn)都以其相對(duì)坐標(biāo)和相關(guān)概率出現(xiàn)。例如,對(duì)于目前使用的人像,我們有:

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

例如:

BodyPart:0-(0.49, 0.09) score=0.79
BodyPart:1-(0.49, 0.20) score=0.75
...
BodyPart:17-(0.53, 0.09) score=0.73

我們可以從該列表中提取一個(gè)數(shù)組(大小為18),其中包含與原始圖像形狀相關(guān)的實(shí)際坐標(biāo):

keypoints = str(str(str(humans[0]).split('BodyPart:')[1:]).split('-')).split(' score=')
keypts_array = np.array(keypoints_list)
keypts_array = keypts_array*(image.shape[1],image.shape[0])
keypts_array = keypts_array.astype(int)

讓我們?cè)谠紙D像上繪制這個(gè)數(shù)組(數(shù)組的索引是 key point)。結(jié)果如下:

plt.figure(figsize=(10,10))
plt.axis([0, image.shape[1], 0, image.shape[0]])  
plt.scatter(*zip(*keypts_array), s=200, color='orange', alpha=0.6)
img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(img)
ax=plt.gca() 
ax.set_ylim(ax.get_ylim()[::-1]) 
ax.xaxis.tick_top() 
plt.grid();

for i, txt in enumerate(keypts_array):
    ax.annotate(i, (keypts_array[i][0]-5, keypts_array[i][1]+5)

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

創(chuàng)建函數(shù)以快速?gòu)?fù)制對(duì)通用圖像的研究:

Notebook顯示了迄今為止開發(fā)的所有代碼,“encapsulated”為函數(shù)。例如,讓我們看看另一幅圖像:

image_path = '../images/einstein_oxford.jpg'
img, hum = get_human_pose(image_path)
keypoints = show_keypoints(img, hum, color='orange')

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

img, hum = get_human_pose(image_path, showBG=False)
keypoints = show_keypoints(img, hum, color='white', showBG=False)

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

多人圖像

到目前為止,只研究了包含一個(gè)人的圖像。一旦開發(fā)出從圖像中同時(shí)捕捉所有關(guān)節(jié)(S)和PAF(L)的算法,為了簡(jiǎn)單起見我們找到最可能的連接。因此,獲取結(jié)果的代碼是相同的;例如,只有當(dāng)我們得到結(jié)果(“human”)時(shí),列表的大小將與圖像中的人數(shù)相匹配。

例如,讓我們使用一個(gè)有五個(gè)人的圖像:

image_path = './images/ski.jpg'
img, hum = get_human_pose(image_path)
plot_img(img, axis=False)

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

算法發(fā)現(xiàn)所有的S和L都與這5個(gè)人聯(lián)系在一起。結(jié)果很好!

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

從讀取圖像路徑到繪制結(jié)果,所有過(guò)程都不到0.5秒,與圖像中發(fā)現(xiàn)的人數(shù)無(wú)關(guān)。

讓我們把它復(fù)雜化,讓我們看到一個(gè)畫面,人們更“混合”地在一起跳舞:

image_path = '../images/figure-836178_1920.jpg
img, hum = get_human_pose(image_path)
plot_img(img, axis=False)

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

結(jié)果似乎也很好。我們只繪制關(guān)鍵點(diǎn),每個(gè)人都有不同的顏色:

plt.figure(figsize=(10,10))
plt.axis([0, img.shape[1], 0, img.shape[0]])  
plt.scatter(*zip(*keypoints_1), s=200, color='green', alpha=0.6)
plt.scatter(*zip(*keypoints_2), s=200, color='yellow', alpha=0.6)
ax=plt.gca() 
ax.set_ylim(ax.get_ylim()[::-1]) 
ax.xaxis.tick_top() 
plt.title('Keypoints of all humans detected\n')
plt.grid();

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

第三部分:視頻和實(shí)時(shí)攝像機(jī)中的姿勢(shì)估計(jì)

在視頻中獲取姿勢(shì)估計(jì)的過(guò)程與我們對(duì)圖像的處理相同,因?yàn)橐曨l可以被視為一系列圖像(幀)。建議你按照本節(jié)內(nèi)容,嘗試復(fù)制Jupyter Notebook:20_Pose_Estimation_Video:https://github.com/Mjrovai/TF2_Pose_Estimation/blob/master/20_Pose_Estimation_Video.ipynb。

OpenCV在處理視頻方面做得非常出色。

因此,讓我們獲取一個(gè).mp4視頻,并使用OpenCV捕獲其幀:

video_path = '../videos/dance.mp4
cap = cv2.VideoCapture(video_path)

現(xiàn)在讓我們創(chuàng)建一個(gè)循環(huán)來(lái)捕獲每一幀。有了這個(gè)框架,我們將應(yīng)用e.inference(),然后根據(jù)結(jié)果繪制骨架,就像我們對(duì)圖像所做的那樣。最后還包括了一個(gè)代碼,當(dāng)按下一個(gè)鍵(例如“q”)時(shí)停止視頻播放。

以下是必要的代碼:

fps_time = 0

while True:
    ret_val, image = cap.read()
    
    humans = e.inference(image,
                         resize_to_default=(w > 0 and h > 0),
                         upsample_size=4.0)
    if not showBG:
        image = np.zeros(image.shape)
        image = TfPoseEstimator.draw_humans(image, humans, imgcopy=False)
        
    cv2.putText(image, "FPS: %f" % (1.0 / (time.time() - fps_time)), (10, 10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    cv2.imshow('tf-pose-estimation result', image)
    fps_time = time.time()
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

結(jié)果很好,但是有點(diǎn)慢。這部電影最初的幀數(shù)為每秒30幀,將在“慢攝影機(jī)”中運(yùn)行,大約每秒3幀。

使用實(shí)時(shí)攝像機(jī)進(jìn)行測(cè)試

建議你按照本節(jié)內(nèi)容,嘗試復(fù)制Jupyter Notebook:30_Pose_Estimation_Camera(https://github.com/Mjrovai/TF2_Pose_Estimation/blob/master/30_Pose_Estimation_Camera.ipynb)。

運(yùn)行實(shí)時(shí)攝像機(jī)所需的代碼與視頻所用的代碼幾乎相同,只是OpenCV videoCapture()方法將接收一個(gè)整數(shù)作為輸入?yún)?shù),該整數(shù)表示實(shí)際使用的攝像機(jī)。例如,內(nèi)部攝影機(jī)使用“0”和外部攝影機(jī)“1”。此外,相機(jī)也應(yīng)設(shè)置為捕捉模型使用的“432x368”幀。

參數(shù)初始化:

camera = 1
resize = '432x368'     # 處理圖像之前調(diào)整圖像大小
resize_out_ratio = 4.0 # 在熱圖進(jìn)行后期處理之前調(diào)整其大小
model = 'mobilenet_thin'
show_process = False
tensorrt = False       # for tensorrt process
cam = cv2.VideoCapture(camera)
cam.set(3, w)
cam.set(4, h)

代碼的循環(huán)部分應(yīng)與視頻中使用的非常相似:

while True:
    ret_val, image = cam.read()
    
    humans = e.inference(image,
                         resize_to_default=(w > 0 and h > 0),
                         upsample_size=resize_out_ratio)
    image = TfPoseEstimator.draw_humans(image, humans, imgcopy=False)
    cv2.putText(image, "FPS: %f" % (1.0 / (time.time() - fps_time)), (10, 10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    cv2.imshow('tf-pose-estimation result', image)
    fps_time = time.time()
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cam.release()
cv2.destroyAllWindows()

基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的

同樣,當(dāng)使用該算法時(shí),30 FPS的標(biāo)準(zhǔn)視頻捕獲降低約到10%。

看完上述內(nèi)容,你們掌握基于TensorFlow2.x的實(shí)時(shí)多人二維姿勢(shì)估計(jì)是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI