計算機視覺的一大研究熱點是人體姿態估計,還有很多問題急需解決,比如遮擋,交互等等。在最近的CVPR2020里邊也有很多這方面的工作。本文站長主要是想談談基于深度學習的實時多人姿態估計。
人體姿態估計要干嘛?
? ? 關于人類活動規律的研究,必定是計算機視覺領域首要關注的內容。其中,人體姿態估計便是計算機視覺領域現有的熱點問題,其主要任務是讓機器自動地檢測場景中的人“在哪里”和理解人在“干什么”。
? ? 隨著信息化時代的迅速發展,人類每時每刻都在通過多種多樣的手段和途徑獲得海量的可視化圖像數據,這使得基于自然場景圖像的人姿態估計研究在現實生活中擁有很多潛在的應用價值。圖1展示了自然場景圖像中人體姿態估計的研究應用。
Fig.1: 自然場景圖像人體姿態估計的研究應用
? ?在信息化的時代,視頻監控正在銀行、超市以及公安機關等關乎人民財產、人身安全的重要場所發揮著舉足輕重的角色。面對海量的視頻圖像序列,為了及時地制止現場事故的進一步發生,工作人員必須長時間且精神高度集中地觀察視頻監控畫面并對異常事件作出處理。
? ? 除了工作人員很難長時間地保持高度警惕外,長期投入大量的人力來監測小概率發生的事件也不是單位機構提倡的做法。因此,實現視頻監控的智能化成為一種互聯網時代的必然趨勢。但是,實現智能視頻監控的前提條件是讓機器自動地識別視頻圖像序列中的人體姿態,從而進一步分析視頻圖像中人類的行為活動。
這就涉及到了我們下面所要說的人體行為分析了。
人體行為分析又為那般?
? ?人體行為分析理解成為了近幾年研究的熱點之一。在人體行為分析理解的發展過程中,研究人員攻克了很多技術上的難關,并形成了一些經典算法,但仍有很多尚未解決的問題。從研究的發展趨勢來看,人體行為分析的研究正由采用單一特征、單一傳感器向采用多特征、多傳感器的方向發展。而人體姿態估計作為人體行為識別的一個重要特征,是進行人體行為分析的基礎,是人體行為分析領域備受關注的研究方向之一。
Fig.2: 人體行為分析的實際應用情形
? ? 人體姿態估計是指從圖像中檢測人體各部分的位置并計算其方向和尺度信息。人體行為分析是基于多幀圖像的前后關系進行分析理解,而人體姿態識別是針對單幀靜態圖像進行處理。正確識別出多幀連續的靜態圖像的姿態信息,為實現正確的行為分析理解提供了可能。因此,人體姿態估計的準確性與實時性直接影響人體行為分析的準確性和實時性,確保實時準確的姿態識別是進行下一步行為分析的基礎。
? ? ? 現在,我們的人體姿態估計課題的發展已越來越貼近實際,例如在步態分析、人機交互以及視頻監控等領域,人體姿態估計均具有廣泛的應用前景。所以呢,研究人體姿態估計還是蠻有意思的,好玩 !
當前姿態估計算法有哪些?
目前主流的人體姿態估計算法可以劃分為傳統方法和基于深度學習的方法。
基于傳統方法的人體姿態估計
? ? ? 傳統方法一般是基于圖結構和形變部件模型,設計2D人體部件檢測器,使用圖模型建立各部件的連通性,并結合人體運動學的相關約束不斷優化圖結構模型來估計人體姿態。
其缺點是什么?
-
First,傳統方法雖然擁有較高的時間效率,但是由于其提取的特征主要是人工設定的HOG和SHIFT特征,無法充分利用圖像信息,導致算法受制于圖像中的不同外觀、視角、遮擋和固有的幾何模糊性。同時,由于部件模型的結構單一,當人體姿態變化較大時,部件模型不能精確地刻畫和表達這種形變,同一數據存在多個可行的解,即姿態估計的結果不唯一,導致傳統方法適用范圍受到很大限制。
-
Second,另一方面,傳統方法很多是基于深度圖等數字圖像提取姿態特征的算法,但是由于采集深度圖像需要使用專業的采集設備,成本較高,所以很難適用于所有的應用場景,而且采集過程需要同步多個視角的深度攝像頭以減小遮擋問題帶來的影響,導致人體姿態數據的獲取過程復雜困難。因此這種傳統的基于手工提取特征,并利用部件模型建立特征之間聯系的方法大多數是昂貴和低效的。
基于深度學習的人體姿態估計算法
? ? ?隨著大數據時代的到來,深度學習在計算機視覺領域得到了成功的應用。因此,考慮如何將深度學習用于解決人體姿態估計問題,是人體姿態估計領域的學者們繼圖結構模型后所要探索的另一個重點。早期利用深度學習估計人體姿態的方法,都是通過深度學習網絡直接回歸出輸入圖像中關節點的坐標。
Fig.3: DeepPose
? ? 基于深度學習的人體姿態估計方法主要是利用卷積神經網絡(CNN)從圖像中提取人體姿態特征,相比于傳統方法人工設計特征,CNN 不僅可以得到語義信息更為豐富的特征,而且能夠獲得不同感受野下多尺度多類型的人體關節點特征向量和每個特征的全部上下文(contextual),擺脫對部件模型結構設計的依賴,然后對這些特征向量進行坐標回歸以反映當前姿態,從而將姿態信息應用于具體實際之中。
其好處是什么?
-
First,相較之下日常生活中的單目攝像頭更為常見,雖然其采集的彩色圖像容易受到光照等環境因素的影響,但是可以利用神經網絡提取出比人工特征更為準確和魯棒的卷積特征,以預測更為復雜的姿態,所以基于深度學習的人體姿態估計方法得到了深入的研究。
-
Second,不同于傳統方法顯式地設計特征提取器和局部探測器,進行深度學習時構建CNN比較容易實現,同時可以設計處理序列問題的CNN模型,例如循環神經網絡RNN,通過分析連續多幀圖像獲得人體姿態的變化規律,進而為人體姿態中各個關節點之間建立更為準確的拓撲結構。
? ? OK,in summary,人體姿態估計算法其實主要可分為基于傳統方法的人體姿態估計和基于深度學習的人體姿態估計計算法兩大類,而基于傳統方法的人體姿態估計一般通過待處理圖像到,部位或關節定位的非線性映射來實現。不論是具有理論優勢的匹配模型,還是使得人體姿態估計準確性有所提升的深度學習網絡,都正促使著人體姿態估計領域快速地發展。
? ?但是,如何在表征人體復雜結構的理論數學模型和提升估計結果的精度上同時取得突破,是人體姿態估計領域一直以來探索的終極目標。因此,人體姿態估計領域在未來的工作中具有較大的研究發展空間。
Fig.4: 2D估計
多人姿態估計
? ? 本文站長主要是想談談基于深度學習的實時多人姿態估計。主要是拜讀了文獻7,所以本文站長想談談自己通過很多文獻的全面閱讀后,自己的一些想法和理解,有理解不到位的地方請大家斧正,謝謝。
? ? ? 目前多人姿態估計主要有兩種思路,一種是基于自頂向下的算法,另一種是基于自底向上的算法。
Fig.5: 實時多人估計
自頂向下
? ? ?自頂向下的算法先從圖像中檢測出所有人,隨后利用單人姿態估計的方法對所有人進行姿態估計。自頂向下算法的缺點是算法運行效率隨著人數增加而降低,且部分被遮擋的人無法被檢測,精度不高。
自底向上
? ? ? ?自底向上的算法,先檢測出所有人的骨點,再將骨點進行連接形成圖,最后通過圖優化的方法剔除錯誤的連接,實現多人姿態估計。自底向上算法的優點是運行時間不隨人數增加而線性增加,更有利于實時多人姿態估計。
站? ? ?長這次采用的多人姿態估計方法是基于自底向上的方法,是一種六階段雙分支的深度神經網絡結構,可同時獲得骨點位置以及骨點之間的連接置信度,有效稀疏骨點連接圖,提高算法運行效率。對于骨點連接置信度,有骨點之間的親和區域方法,通過在親和區域上的線性積分計算骨點連接置信度。
網絡結構
? ? 對于一張輸入圖像,深度神經網絡同時預測出每個骨點的熱力圖S=(S1,S2,…,SJ)和骨點之間的親和區域L=(L1,L2,…,LC) 。熱力圖的峰值為骨點的位置,骨點相互連接構成二分圖,親和區域對圖的連接進行稀疏,最后對二分圖進行最優化實現多人姿態估計。
網絡結構深度解讀
? ? ? ?如圖6所示,整體網絡架構為六階段雙分支,上分支負責預測骨點位置,下分支負責預測骨點之間的親和區域。前一階段的預測結果融合原有圖像特征并作為下一階段的輸入,經過多階段的操作以提高骨點預測精度。
Fig.6: 網絡結構
? ? ? ?圖像特征采用VGG-19模型進行提取,并用符號F表示圖像特征。在第一階段,網絡以F作為輸入,輸出關節點的熱力圖S1 = ρ1 (F) 和骨點之間的親和區域L1 = φ1(F),其中 ρ1 和 φ1 為網絡的映射函數,其本質是一系列的卷積操作。
-
在第一階段,對于輸入特征采用3×3大小的卷積核連續進行三次卷積,之后用1×1 大小的卷積核連續進行三次卷積。
-
之后的階段將前一階段的預測結果和原圖像特征F進行融合,作為當前階段的輸入,經過卷積操作分別預測出關節點熱力圖和關節點的親緣關系程度(站長自己的理解haha,簡單點就是兩個關節點的朋友關系的親密程度唄):
?
其中ρt 和φt 分別表示現階段t 的卷積操作,先用大小為7×7的卷積核連續進行五次卷積操作,之后用大小為1×1的卷積核連續兩次卷積操作,最終輸出本階段的關節點熱力圖和關節點親和區域。
損失函數
由于關節點熱力圖和關節點的親緣關系程度本質有所不同,因此在訓練的時候需要分別對關節點位置和親和區域進行監督,損失函數均采用L2損失。為了避免梯度消失現象發生,在每個階段的輸出都添加損失函數,起到中繼監督作用。
另外在樣本標注的時候,會存在行人漏標等情況對損失函數造成影響,因此需要對損失函數在各個位置進行掩膜操作。于是,對于關節點位置和親和區域的損失函數形式如下:
其中S*j和L*c分別為關節點位置和親和區域的實際測量值,W為掩膜函數,有標注的位置為1,沒標注的位置為0,W(p)=0表示在位置p處沒有標注。
Finally,整個網絡的最終損失為每個階段兩個損失之和的累加:
?
站長關于兩個概念的深層剖析
前面站長談到了關節點熱力圖和關節點親和區域(這個名稱是曹大佬自己說的haha),可能有些站友對這2個概念可能云里霧里,下面站長就根據自己的理解好好的盤他一般。
關節點熱力圖
? ? ? 關節點熱力圖是衡量關節點在圖像某位置出現的置信度,由一系列二維的點組成,每個點表示骨點出現在該位置的置信度,骨點最終位置定義為置信度最高的位置。對于圖像中只有一個人的情況,則某一類型可見的關節點在熱力圖中只有一個峰值。對于多人情況,某一類型可見的骨點存在多個峰值,表示不同人的同一個類型骨點。
Fig.7: 關節點熱力圖(引自文獻7)
強調!Attention!
這里站長還是要強調下多人情況下的熱力圖和單人是有很大區別的。
-
與CPM不同,CPM網絡只是針對單個人的Pose,所以它的網絡輸出的P張置信度圖中(假如一個人總共有P個關節點),每一張置信度上只有一個熱點,這個熱點只是一個人的一個關節點,比如右手腕關節這個關節點。
-
但如果圖片上有多個人,它的第一行網絡輸出的P張置信度圖中(假如單個人總共有P個關節點),每一張置信度上就有多個熱點了,比如右手腕關節,假設有K個人,則要有K個右手腕關節點,所以此時這張置信度上就要有K個熱點了。
為了更清楚地解釋這件事,站長畫了下圖以形象化得輔助大家理解(畫得太丑了orz大家別見怪haha,道理理解清楚就行了)
Fig.8: 站長丑畫haha
In other way,我們在對樣本進行標注時,只需確定骨點的位置,則該骨點真值熱力圖為在該點處放置一個固定方差的高斯核,用高斯函數確定各個位置的置信度。對于第k個人的第j個骨點,以xj,k表示骨點的實際位置,則該骨點周圍的像素點的置信值為:
其中標準差σ控制了置信值的分布范圍。對于一張存在多人的圖像,每個人特定骨點的實際熱力圖為取得高斯核范圍內的最大值:
?Fig.9: Max操作(引自文獻7)
注意:P是個二維的坐標點(x,y),表示圖片中的每一個點。
關節點親和區域
這個概念其實可以簡單點理解就是兩個關節點的朋友關系的親密程度。
如圖10所示,骨點親和區域由一系列單位向量組成,每一段肢體對應一個親和區域,位于肢體上的像素點都由一個單位向量進行表示,包含了位置和方向信息,所有在肢體上的單位向量構成親和區域。
Fig.10: 關節點親和區域
二分圖優化(重點來了)
? ? ?這是這個網絡實現關節點檢測的關鍵所在了,上面經過網絡推理,得到骨點熱力圖以及骨點之間的親和區域,對熱力圖采取非極大值抑制得到一系列候選骨點。由于多人或者錯誤檢測,對于每一類型的骨點會存在多個候選骨點。這些候選骨點之間的連接構成二分圖,每兩個骨點之間的連接置信度通過線積分計算得到。為二分圖找到最優的稀疏性是NP-Hard 問題。
優化該二分圖即在所有邊中選擇一組邊使得最終二分圖的總權重最大,所以目標函數可寫為:
約束條件:
-
其中Ec為二分圖優化之后肢體c的權重,我們要取其中總權重之和最大的;
-
Zc為所有骨點連接集合Z的子集;
-
約束條件表示一段肢體最多只存在一條連接邊。
Fig.11: 算法效果
問題分解與簡化
為擴展到多人所有骨點的最優化問題,即定義Z為K 維匹配問題,這是一個NP-hard問題,為了提高最優化效率,如圖所示,本文采用兩種方法降低二分圖優化算法的復雜度。
-
首先,如圖所示,剔除跨骨點之間的連接構成稀疏二分圖,代替全連接二分圖;
-
然后根據肢體將稀疏后的二分圖拆解得到圖所示的多個簡化二分圖。
? Fig.12: 多人姿態估計求解(引自文獻7)
因此,整體優化問題轉化為對各個簡化后的二分圖進行最優化。而最優化的目標函數為所有簡化二分圖的權重之和達到最大:
優化之后將各個簡化二分圖中共同的骨點進行整合得到最終多人人體姿態估計。這樣做的優點是將NP-hard問題轉化為多個較容易求解的二分圖最優化,可以有效逼近全局最優解,同時降低算法復雜度,提高算法的運行效率,達到實時多人姿態估計的目的。
站長的筆記整理
我對這個算法的整體思路做了個筆記,字太丑了orz,大家別見怪haha,道理講明白理解清楚就行了。
Fig.13: 站長的算法筆記(求各位大佬斧正)
站長的實驗結果和分析
實驗所使用的顯卡為NVIDIA TITAN XP,CPU為Intel i7-6900K。圖像大小為1920× 1080,通過下采樣方法額外獲得1280 × 720 和720 × 480 兩個低分辨率的視頻。
首先分析運行效率與人數的關系,在相同視頻流和相同分辨情況下,計算自頂向下與自底向上運行時間與人數關系,計算結果如圖14所示。由圖可知,自頂向下隨著人數的增加耗時幾乎呈線性增加,而自底向上的運行耗時幾乎不隨人數增加而遞增。卷積神經網絡預測關節點的耗時也幾乎不隨人數增加而增加。因此我所使用的自底向上算法的運行效率不受行人數量的影響,對人數不確定的情況依然可以實時進行多人姿態估計。
Fig.14: 實驗的運行耗時
最后,對三種分辨率視頻采用兩種不同方法進行耗時分析,結果如表所示,隨著分辨率的降低,處理速度越來越快。若對視頻所有幀都進行關節點檢測,在最高分辨率情況下每秒可處理23幀,人眼感覺不到卡頓,基本達到實時。如果采用間隔檢測結合跟蹤,幀率可提高十幾幀,完全達到實時要求。
站長測試(使用自己亂糟糟的圖片才有說服力哈)
以下是我采用深度學習算法(Openpose)最終的實驗結果(效果果然杠杠的):
Fig.15: 一次旅游haha
總體而言,效果還算很nice的,關節點都檢測出來了,Great!(羞澀的我)
能閱讀到這里,說明你也是個踏踏實實的做研究的人了。此時,我們娛樂時間到了,讓我們來段測試視頻放松放松下哈:
總結
六階段雙分支網絡結構在關節點預測精度上略高于現有傳統的的人體姿態估計算法。本次站長采用的算法利用自底向上的思想,首先預測出所有骨點位置,并將骨點連接形成圖結構,通過圖優化實現多人體姿態估計。算法運行效率方面,由于網絡同時預測出關節點位置和關節點之間的空間關系,為多人姿態估計算法提供更加稀疏的二分圖,降低二分圖優化復雜度而達到了實時的效果。
巨人的肩膀
[1]?Qian C, Sun X, Wei Y, et al. Realtime and robust hand trackingfrom depth[C]//Proceedings of the IEEE conference on computer vision and patternrecognition. 2014: 1106-1113.
[2]?Joseph? Tan? D,?Cashman? T,? Taylor?J,? et? al.?Fits? like? a?glove:? Rapid? and?reliable? hand shape? personalization[A].? IEEE?Conference? on? Computer?Vision? and? Pattern Recognition[C], 2016: 5610-5619.
[3]?Tang D, Jin Chang H, Tejani A, et al. Latent regression forest:Structured estimation of 3d articulated hand posture[A]. IEEE conference oncomputer vision and pattern recognition[A], 2014: 3786-3793.?
[4]?Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification withdeep convolutional neural networks[A]. Advances in neural informationprocessing systems[C], 2012: 1097-1105.
[5]?Zhou E, Cao Z, Yin Q. Naive-Deep Face Recognition: Touching theLimit of LFW Benchmark or Not?[J]. Computer Science, 2015.
[6]???Sharp? T,? Keskin?C,? Robertson? D,?et? al.? Accurate,?robust,? and? flexible?real-time? hand tracking[A].? Proceedings?of? the ?33rd?Annual? ACM? Conference on Human? Factors?in Computing Systems. ACM[C], 2015: 3633-3642.
[7] Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields.2017
[8]?Oberweger? M? ,?Wohlhart? P? ,?Lepetit? V? .?Hands? Deep? in?Deep? Learning? for?Hand? Pose Estimation[J]. ComputerScience, 2015.