[多图/秒懂]白话OpenPose,最受欢迎的姿态估计网络
前言:
最近在開發(fā)運動計數(shù)APP,需要用到姿態(tài)估計相關的算法。于是對這一領域的算法進行了總結(jié)。如下圖所示為姿態(tài)估計的一些經(jīng)典論文。這其中OpenPose的影響力可以說是非常大的了,由于其開源做的好,論文,代碼,教程,文檔,模型都非常豐富,因此有很多項目都是基于OpenPose的。并且其bottom-up的核心算法PAF也非常值得學習。本期就對OpenPose進行一個詳細的講解,力爭用最白話的語言把內(nèi)容核心算法講透徹。
網(wǎng)絡結(jié)構(gòu)
?如下圖所示為OpenPose的網(wǎng)絡結(jié)構(gòu):
首先由主干網(wǎng)絡VGG19提取圖片的特征,然后進入到stage模塊,stage是一些串行的模塊,每個模塊的結(jié)構(gòu)和功能都是一樣的。分成兩個branch,一個branch生成pcm,一個branch生成paf。并且每個stage的pcm和paf都會進行l(wèi)oss求解。最后總的loss是所有l(wèi)oss的和。?這里考慮一下為什么需要多個stage呢?理論上第一個stage已經(jīng)可以輸出完整的信息了,為什么還需要后面重復的stages呢。這是因為關鍵點之間有相互的語義信息,例如在stage1中,可能只檢測出了眼睛,但是沒有檢測出鼻子,在stage2中,由于輸入中帶有satge1的輸出,那么stage2就更有更可能根據(jù)眼睛再推測出鼻子的位置,因此后面的stage可以利用前面stage提取的信息,進一步優(yōu)化檢測結(jié)果,對于一些比較難檢測的關鍵點很有作用。更直白一點的解釋就是所有關鍵點的檢測難易程度是不一樣的,有一些眼睛,鼻子等視覺特征非常明顯,而有一些關鍵點可能會隨著衣著,遮擋,首飾等有非常大的變化,因此前面的stage檢測一些簡單的關鍵點,后面的stage再根據(jù)前面檢測出的關鍵點檢測更復雜一些的關鍵點,這是一個漸進優(yōu)化的過程。
白話PCM
PCM其實就是關鍵點的熱力圖。Part?confidence map。用來表征關鍵點的位置。假設需要輸出18個人體關鍵點信息,那么PCM會輸出19個通道,最后一個通道作為背景。理論上不輸出背景也沒有什么關系,但是輸出背景有兩個好處,一是增加了一個監(jiān)督信息,有利于網(wǎng)絡的學習,二是背景輸出繼續(xù)作為下一個stage的輸入,有利于下一個stage獲得更好的語義信息。下圖是輸入一張圖片,輸出19個PCM的示意圖。
雖然說一個關鍵點對應的是一個pcm中的一個像素,但是一般不這么做,一般會用高斯核來創(chuàng)建PCM的GroundTruth。如果沒有高斯核,那么gt附件的點被強制當做負樣本來學習,但是實際上該點對應的感受域(黃色虛線框)其實與gt點對應的感受域(紅色虛線框)非常接近,導致神經(jīng)網(wǎng)絡很迷惑,這到底是有還是沒有關鍵點?甚至有的時候由于標注存在誤差,可能標注的gt點反而沒有旁邊的負樣本點準確,那么神經(jīng)網(wǎng)絡就更迷惑了,學個XX啊。一會跟我說圓的是蘋果,一會有跟我說圓的是梨,讓我怎么個學呢?因此用高斯核的PCM ground truth能夠非常好的緩解這個問題。因為標簽點附件的點已經(jīng)不是簡單的當做負樣本,還是根據(jù)高斯分布同樣作為正樣本,只是置信度稍低一點,這更符合邏輯。
?
白話PAF
PCM是大部分的關鍵點檢測網(wǎng)絡里面都會用到的技術(shù),相信很多朋友都已經(jīng)有所了解,而PAF則是openpose的核心,是openpse區(qū)別于其他關鍵點檢測框架的最大特性。中文可以翻譯為關鍵點的親和力場,用來描述不同關鍵點之間的親和力。屬于同一個人的不同關節(jié),親和力大,不同人之間的關節(jié),親和力小。由于openpose是一個bottom-up的姿態(tài)估計網(wǎng)絡,也就是先不管關節(jié)是誰的,先一股腦的檢測出來,然后接下來再確定哪些關節(jié)的親和力大,那么把它們劃分為同一個人。如下圖所示,由于圖片中有兩個人的實例,檢測出了兩個左眼與兩個左耳,那么如何進行配對呢?此時就是PAF的作用了,PAF會描述任意兩個關節(jié)之間的親和力(例如檢測出2個左眼與2個左耳,那么每個左眼都能得到和所有左耳的親和力,也就是一共有4個親和力),如下圖所示,顏色越黃,表示兩個關鍵點之間的親和力越強,左耳的1點與左眼的1點親和力明顯大于左眼1與左耳2,因此將左眼1與左耳1進行配對。同樣的左耳2與左眼2的親和力更大,因此將左耳2與左眼2進行配對。
以上是關于PAF作用的描述,那么究竟PAF是如何實現(xiàn)的呢?實際上并不復雜。為了描述方便(接地氣),我這里不使用論文中的描述符號和公式,用最直白,接地氣的大白話來描述。openpose首先把各個關節(jié)進行了人為的配對,如下圖所示,一共19對。可以理解成19根骨骼,每一根骨骼連接了兩個關節(jié)。一個PAF熱圖對應一根骨骼。剛開始的時候我怎么也不明白,18個關節(jié)直接怎么會連出19根骨骼,最后把所有骨骼畫出來才明白。原來有的關節(jié)可以在多跟骨骼上面,而且openpose增加了耳朵和肩膀之間的虛擬骨骼。如下圖紅色連接所表示的虛擬骨骼,所以一共是19根骨骼,也就是19個PAF場。由于PAF是用向量來表示的,因此PAF的輸出通道是19*2=38,因為一個向量需要由x和y兩個標量表示,因此PAF輸出通道是19的2倍。
PAF具體是怎么表達的呢?來看一根左胯到左膝蓋的連接骨骼對應的PAF場,首先我們知道骨骼在真實世界中是有長度和寬度的。長度就是骨骼兩端的兩個關節(jié)之間的距離,那么骨骼的寬度呢?可以通過超參來設置,例如假設該骨骼的寬度為α,那么我們可以定義在骨骼內(nèi)的點親和力向量不為0,在骨骼外面的點的親和力向量為0.
如上圖所示,紅色的點在骨骼內(nèi),所以在PAF場中就是非零向量,綠色的點在骨骼外面,所以在PAF場中用0向量表示。那么有意義的紅色點的向量是多少呢?openpose使用了從一個關節(jié)指向另一個關節(jié)的單位向量來表示,即圖中黃色向量的單位長度向量來表示。因此最終的PAF場如下圖所示(藍色部分為0向量區(qū)域):
如果某一個像素點在多個骨骼內(nèi)部,那么該像素點的PAF向量取所有向量的均值向量。
?
親和力的快速計算
雖然有了PAF場,那么如何計算兩個關鍵點之間的親和力呢?理論是需要該骨骼內(nèi)的所有向量的積分。但是這樣計算量代價太大了,實際上可以通過均勻采樣的方式。例如將兩個關節(jié)之間均勻的分為5段,然后采集4個點的paf向量作為最終的親和力表示,因為所有骨骼都采樣相同的做法,隨意最后的親和力相對大小還是得到保證的。如下圖所示,這樣的話,計算量可以降低很多。
?
關鍵點配對
說實話,剛開始我覺得有了PCM和PAF,那么進行配對應該不是問題,例如通過PCM得到3個左耳,3個左眼,再根據(jù)他們之間的PAF親和力,把親和力最大的配對就行了。例如下圖這樣的:
但實際上,PAF學的沒有這么智能,有的時候很多親和力是比較接近的,根本無法根據(jù)最大值來簡單的配置。例如左耳點1可能與左眼1的親和力最大,但是左眼1卻與左耳2的親和力最大。這樣的話簡單的最大值配對就會出現(xiàn)一些問題。
實際上這是圖論里面的二分圖查找組大匹配問題。因此直接使用匈牙利算法進行最大值匹配即可。關于匈牙利算法,其實也不難理解,網(wǎng)上有很多講的很好的教程,有興趣的朋友可以?查閱相關資料。
@end(有共同技術(shù)愛好的朋友可以加我微信,共同學習,共同進步: 15158106211)
總結(jié)
以上是生活随笔為你收集整理的[多图/秒懂]白话OpenPose,最受欢迎的姿态估计网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 已连续 6 年,三星 Galaxy S2
- 下一篇: [开源]基于姿态估计的运动计数APP开发