1. 程式人生 > >論文學習筆記:曹哲 實時多人人體姿態識別 CVPR2017

論文學習筆記:曹哲 實時多人人體姿態識別 CVPR2017

    最近學習了曹哲的這篇Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields,認真讀了,也看了曹哲直播的視訊,雖然程式還是看不懂,但也算是學到東西了,寫個筆記記錄一下,其實大部分也就是直接把論文翻譯過來,裡面出現的PPT截圖也是我之前自己做的,但是不小心存成相容模式之後文字變成圖片了o(╥﹏╥)o,所以就直接截了圖,還是希望能和大家多多交流,更好地學習理解這篇論文。

    本文的研究目標為給定一張RGB影象,得到所有人體關鍵點的位置資訊,同時知道每一個關鍵點是屬於圖片中具體哪個人的,即得到關鍵點之間的連線資訊。具體的效果展示即實時的在視訊上對每一幀影象進行檢測的結果,並沒有做任何的目標追蹤,或其他利用時間上的連續性加速這個結果。 


一、與傳統多人人體姿態估計方法的對比

    論文首先介紹了該方法與傳統多人人體姿態估計方法的對比,大多數方法都是採用一種自上而下的方式(Top-down Approach:Person Detection + Pose Estimation),就是給定一張圖片,先做人體的檢測,在每個人的位置上都得到一個邊緣方框資訊,在每個方框上,做單人的人體姿態估計,重複這個步驟,直到得到最終的結果。


這種方法存在兩個主要的缺陷:

1)十分依賴人體姿態檢測的結果(假如說有兩個人靠的很近,有的時候會只得到一個方框資訊,它的最終結果也會少一個人)

2)演算法速度與圖片上人的數目成正比,假如說一張圖有30個人,它要重複30次單人的人體估計,這樣使得這個方法在複雜場景下變得十分緩慢

為改進上述缺陷,該論文采用了一種自下而上的方法(Down-topApproach:PartsDetection + Parts Association),首先檢測人關鍵點的位置,比如圖片上人體右肩膀的位置,得到檢測結果是通過預測人體關鍵點的熱點圖,可以看到在每個人體關鍵點上都有一個高斯的峰值,代表神經網路相信這裡有一個人體的關鍵點。同樣的我們對其他人體關鍵點比如說右手肘作同樣的處理,得到這個檢測結果。在得到檢測結果之後,對關鍵點檢測結果進行連線,換句話說,就是想知道每個關鍵點具體是屬於圖片中哪個人。

    對於這個步驟,他們的方法是通過一個新的特徵進行推測,這個特徵是一個向量場,叫作人體關鍵點親和場(PAFs),在後面會具體介紹這個特徵的表示,這裡先整體介紹方法的結構。然後重複這個步驟,對另外關鍵點之間(另外人體的軀幹)的連線進行推測,同樣是通過人體關鍵點親和場來進行推測,重複這個步驟,直到得到人體的全部骨架資訊。


二、Jointly Learning Parts Detection and Parts Association

   同時對人體關鍵點檢測和關鍵部位連線進行學習。這個方法主要包括兩個部分,第一個部分右側的分支,人體關鍵點的檢測。第二個部分就是人體關鍵點的連線。他們的創新點就是設計了一個設計了一個深度學習網路結構,同時學習人體關鍵點的檢測和人體關鍵點的連線。並且,同時學習會使得他們互相幫助,得到更好的結果。


    下面是同時學習的一些具體內容。這是兩分支多階段的結構圖,每個分支都是一個迭代的預測架構,具體內容是在CPM論文中提出的,後面會給大家簡單介紹一下。對於最終的結果每個分支各輸出一個集合。檢測部分(上面的分支)輸出身體各部分位置資訊的二維置信圖集S,有J個置信圖,每類關鍵點對應一個。連線部分(下面的分支)輸出身體各部分親和力向量場L,有C個向量場,每類肢體對應一個。


    影象首先被一個卷積神經網路處理後生成特徵圖集F(通過VGG-19的前10層進行初始化並微調),這裡簡單介紹一下VGG19,VGG是由Visual Geometry Group實驗室提出的,論文原標題《VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION》,VGG16和VGG19是這篇文章提出的兩個非常好的DCNN(Deep Convolutional Neural Network )。VGG網路非常深,通常有1619層,卷積核大小為3 x 31619層的區別主要在於後面三個卷積部分卷積層的數量。可以看到VGG的前幾層為卷積和maxpool的交替,後面緊跟三個全連線層,啟用函式採用Relu,訓練採用了dropout。這裡就不貼圖了,大家感興趣的可以自己去搜一下這個結構,讀一下相關論文。

    處理後生成的特徵圖集F作為輸入送到第一階段,可以看到第一個階段的輸入只與F有關,對有t階段的輸入則與三個變數有關。


    這個損失函式的公式也比較好理解,S分支t階段的損失函式,對每一類關鍵點的每一個位置p處的權重乘以預測值減標註的真實值的平方(即距離)累加求和。後面的式子同理,只不過是針對每一類肢體而言,求解人體關鍵點親和場的損失函式。

這裡想說一個這個W(p),為什麼要加這個權重呢?

    在論文中也介紹了,這裡用我的理解我的語言說一下,因為在標註真實值的過程中,人為標註可能不會標出圖片中所有人的所有關鍵點,有的部位被遮擋了那麼人為可能不會標註這個點,但是訓練之後的系統可能會根據其他點的位置和連線資訊預測出這個點,那麼當影象中的p處沒有標註而系統又預測出這裡有關鍵點存在時,這時損失函式中的預測值減標註的真實值的平方(即距離)就會變的非常大。最終訓練出的結果可能就偏差比較嚴重,可以說是非常機智了。

三、Confidence Maps for Part Detection


    人體關鍵點檢測。使用深度學習神經網路,對單張彩圖進行卷積操作,大部分方法是輸出熱點圖譜,對人體每個關鍵點都輸出一張熱點圖譜,用峰值來代表關鍵點的位置。這一部分是在CPM的基礎上,大家可以去看這篇論文,不過我看了還是不太懂,大部分都是文字性的敘述,深度學習這邊剛開始學習,基礎渣的不行。

    採用多個階段進行人體姿態的學習,在第一階段得到不同關鍵點的熱點圖譜預測,比如說這個例子,顯示的是人右手腕關鍵點預測的熱點圖譜,可以看到是預測錯誤的,它在左手腕位置給了一個更高的峰值,但是我們把所有熱點圖譜的預測值放進下一個階段,用一個類似的神經網路進行卷積操作,它會優化上一階段的結果。主要是第二階段有了上一個階段的預測結果,同時有了上一個階段對各個人體關鍵點的資訊,推測關鍵點之間的連線資訊,進而用新的學習人體結構之間的關係,進而優化這個結果。可以看到第二個階段的預測結果已經有了很大的提高,它很確定右手腕的位置。反覆這個過程,直到最終結果,最終結果已經很接近目標值。

    接下來在論文中,介紹了標註的真實值的處理方法,利用高斯函式:


  可以看出,關鍵點標註的真實值x即為曲線的對稱軸,那對於每一個x都存在這樣一條曲線,生成眾多曲線之後該作什麼處理呢?最後取所有曲線的最大值構成最終的S*。那這裡為什麼取最大值不取平均值呢?

    應該也是非常好理解,每一條曲線的峰值都表示這個位置存在關鍵點的可能性最高,如上圖所示,可能有兩個關鍵點距離比較近,這兩條高斯曲線如果取平均值的話,很明顯就從兩個峰值變成一個峰值了,那最後預測出的結果可能就只有一個關鍵點了。所以這裡取的是最大值。

四、Part Affinity Field for PartAssociation

    關鍵點預測出來了,那麼如何把檢測出的身體關鍵點組合成未知數目人的整體動作呢?

    起初,他們想到的方法是取中點連線法,即預測每個關鍵點之間的中點的熱點圖譜,假設有這個預測結果和兩個關鍵點的位置,連線的中點在熱點圖譜對應的畫素點的響應值作為這個連線的確信值。那麼這個點是兩個關鍵點之間的中點的可能性越高,這個連線是正確的可靠性就越高。這個方法也存在一定的侷限性,看一下最右邊這張圖。中間的綠點在三條曲線上是中點的概率都很高,那麼就可能出現誤判。


    所以這種方法的兩個侷限性總結為:只考慮了每個肢體的位置資訊,而沒有肢體的旋轉資訊(方向資訊);將肢體的支撐範圍縮小到了一個點上(聽上去比較奇怪,其實意思就是你這麼大個胳膊,這麼大個身子,取中點的話就只用了一個點來表示整個軀幹,難免出點問題對不對)。


    在訓練時,人體關鍵部分親和場不是手工標註的,是預測出關鍵點之後,利用兩點生成一個橢圓(自己調節引數),使這個橢圓能大致把整個軀幹包在裡面(如上圖紫圈)。在這個紫圈內(在肢體上)的每一個畫素點上,都設定一個單位向量v,如果畫素點在圈外(不在肢體上),則此處的L*就是0。兩個不等式就是為了保證點p在肢體上。v和p-x1的點乘,即x1p線段向v方向上的投影,即p點要在x1x2線段內。第二個不等式就是寬度上要在範圍內。


    對於這個取平均,其實不難看出,當沒有肢體重疊的情況出現時,此處的L*c就等於L*c,k。那當有肢體重疊的情況呢,如上圖左下那張,假設紫色橢圓是另一個肢體,此時p同時位於兩個肢體上,在p處就有兩個不同方向的單位向量,對他們求和,得到的就是黃色的向量,之後除以n(p),即p處非零向量的個數這裡舉例即為2,得到的就是一個比單位向量小的方向如圖的向量了。

  只得到每個p處的向量是不能評估這個連線是否可靠的,這是就採用積分的方法,E在最後進行連線的時候就起到了一個權重的作用。這個積分也比較好理解,兩個可能的關鍵點位置大家可以在上圖中看到,我這裡用d1和d2簡單代替一下,p(u)即是在d1和d2連線線上取值,從d1到d2這條線上進行積分。預測出此處的向量L(p)與d1d2的單位向量點乘,即往d1d2方向上投影的長度,那麼預測出的單位向量如果和d1d2同方向的話,這個值就會比較大,值越大這個連線的可靠性越高。所以這裡積分E可以作為權重,在後面評估連線的好壞(實際計算是用對u等間隔取樣求和來逼近結果的)。

五、Multi-Person Parsing using PAFs

現在預測出了關鍵點的位置,也得到了PAFs的預測資訊,但是得到的預測點有很多很多很多可能的連線,現在就是在一個K維匹配問題中找到最優解(NP-Hard)。什麼是NP-Hard問題吶?這裡也給大家貼一下,省了百度了。

    NP是指非確定性多項式(non-deterministicpolynomial,縮寫NP)。所謂的非確定性是指,可用一定數量的多項式運算去解決的問題。

    例如,著名的推銷員旅行問題(TravelSalemanProblem or TSP):假設一個推銷員需要從香港出發,經過廣州,北京,上海,…,等 n 個城市,最後返回香港。 任意兩個城市之間都有飛機直達,但票價不等。假設公司只給報銷 C 元錢,問是否存在一個行程安排,使得他能遍歷所有城市,而且總的路費小於C?     推銷員旅行問題顯然是NP的。因為如果你任意給出一個行程安排,可以很容易算出旅行總開銷。但是,要想知道一條總路費小於C的行程是否存在,在最壞情況下,必須檢查所有可能的旅行安排!這將是個天文數字。     在接下來要介紹這個問題之前呢,還要了解一下二分圖和匈牙利演算法,其實理論特別好理解哈!但是太長了,我也偷懶不貼了,百度個連線放在這裡好了~大家自己去看看,挺有意思的。http://www.renfei.org/blog/bipartite-matching.html

    針對這個問題,加入兩個放鬆條件簡化問題:

    ①選擇最小數量的邊來獲得人體姿態的生成樹骨架,而不是使用完整的圖形(Fig.6c(只考慮相鄰關鍵點的連線)     ②匹配問題分解為一組二分圖匹配的子問題,並獨立確定相鄰樹節點的匹配(Fig.6d(每次只考慮一個肢體的連線)

  具體的執行: 從一個樹的節點出發,連線另外一個節點,重複這個過程,直到把人體所有的樹狀結構裡的連線都走一遍。

    注意到這個變數Z是個非0即1的集合。即系統預測為連線則為1,未連線則為0,應該就是根據那個匈牙利演算法來的。


    都比較好理解了哈,計算這個可能性最大的匹配結果,E和z的乘積,E是這個連線通過向量積分得到的,z是系統給出了一種連線方式,認為連線此處為1,不連線此處為0。下面這兩個約束條件呢,就保證了兩邊不共用同一個頂點。因為z非0即1呀,z小於等於1的話,就是一個點要麼不連,要麼只能連一個點。     恩!終於可算是打完了!大概就是這樣了,後面論文給出了一些結果,還有一些比較什麼的,感興趣就自己看看吧,前面理論部分差不多就是這些了!終於寫完這個筆記了!耶!




相關推薦

論文學習筆記 實時人體姿態識別 CVPR2017

    最近學習了曹哲的這篇Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields,認真讀了,也看了曹哲直播的視訊,雖然程式還是看不懂,但也算是學到東西了,寫個筆記記錄一下,其實大部分也就是直接

Python機器學習筆記利用Keras進行類分類

名稱 encoder 創建 numeric 種類 deep ast 4.0 允許   Keras是一個用於深度學習的Python庫,它包含高效的數值庫Theano和TensorFlow。   本文的目的是學習如何從csv中加載數據並使其可供Keras使用,如何用神經網絡建立

Paperreading 之二  人體姿態估計COCO2017冠軍—CPN

前言 人體姿態估計是MSCOCO資料集(http://cocodataset.org/)上面的一項比賽,人體關鍵點檢測,目前主流的做法都是深度學習來做。可以分為兩個大的方向: (1)top-down方向:自頂向下的方法,目前的主流,像cpn,hourglass,cpm,

Python學習筆記threading.Condition執行緒排程

#!/usr/bin/python #coding:utf-8 #引入執行緒和時間模組 import threading,time   #引入執行緒條件變數 cond = threading.Condition() def run():    

Python學習筆記程序

multiprocessing  --程序庫 Linux上可以用fwork,但是windowns不支援fwork,所以才需要用 multiprocessing垮平臺來使用多程序 父程序:當前執行的程序叫父程序 子程序:當前執行的程序中建立的程序叫子程序 引入程序模組 for

Struts2學習筆記DMI,個配置檔案,預設Action,字尾

動態方法呼叫有三種方法: 1.同一Action多次對映,每個action標籤的method對應要呼叫的方法。 當要呼叫的方法多了就會增加struts.xml檔案的複雜性。 2.struts.DynamicMethodInvocation=true (struts.properties檔案) 或<

Spark學習筆記基於Socket的實時計算WordCount

基於Socket的實時計算WordCount Socket簡述 Socket(套接字),用來描述IP地址和埠,是通訊鏈的控制代碼,應用程式可以通過Socket向網路傳送請求或者應答網路請求。Socket是支援TCP/IP協議的網路通訊的基本操作單元,是對網路通訊過程中端點

Spark學習筆記基於HDFS的實時計算WordCount

基於HDFS的實時計算WordCount 基於HDFS檔案的實時計算,其實就是監控一個HDFS目錄,只要有新檔案出現就實時處理 StreamingContext.fileStream(dataDirectory)方法可以從多種檔案系統的檔案中讀取資料,然後建立一個DStre

核程式設計》學習筆記氣泡排序的並行實現

我們都知道氣泡排序的序列演算法的實現,非常簡單,兩個for迴圈即可實現,那麼並行演算法又如何實現呢? 先介紹一下演算法思想。 (1)序列演算法思想:從左至右依次比較相鄰的兩個資料,如果左邊的數比右邊的數大,則交換,這樣經過一輪變換後,最大的資料就會移到最右邊;然後第二輪只需

Tensorflow學習筆記變數作用域、模型的載入與儲存、執行緒與佇列實現執行緒讀取樣本

# tensorflow變數作用域     用上下文語句規定作用域     with tf.variable_scope("作用域_name")         ......

Tensorflow學習筆記輸入線性迴歸神經網路

def myregression(): """ 實現多維輸入的線性迴歸神經網路 假設輸入為x = [a,b,c,d,e,f,g],正確答案為:y_true 則y_true = x1 * a + x2 * b + x3 * c + x4 * d + x5 * e + x6 * f + x7

uCOS-II學習筆記實時作業系統(一)

1.前後臺系統:前後臺系統的架構用一句話來形容的話,就是一個大的迴圈,加上中斷,就形成了一個整的體系。 假設來了中斷需要處理模組3,如果模組3的處理是最緊迫的,但是當前cpu 只執行到模組1, 這樣的話,必須還要承受模組2的執行時間延遲,才能輪到模組3的處理,當模組越多的

Java學習筆記線程

ide 實例 and @override 正式 future 基礎 [] bsp Java中線程的五種狀態: 新建狀態(New) 就緒狀態(Runnable) 運行狀態(Running) 阻塞狀態(Blocked) 死亡狀態(Dead) 其中阻塞狀態(Blocked)又

Java學習筆記執行緒

Java中執行緒的五種狀態: 新建狀態(New) 就緒狀態(Runnable) 執行狀態(Running) 阻塞狀態(Blocked) 死亡狀態(Dead) 其中阻塞狀態(Blocked)又分為三種: 等待阻塞:執行狀態中的執行緒執行wait( )方法,使本執行緒進入到等

學習筆記Qt與Matlab混合程式設計及遇到的諸問題(附DEMO)

工具:MATLAB R2014b,Qt 5.6.1, 目標:通過MATLAB寫一個簡單的函式,生成動態連結庫DLL,再在Qt上呼叫 1.在MATLAB主頁新建一個函式 記住函式的名字和儲存的函式檔案的名字要相同,比如我寫了一個函式f,儲存時檔名需要是f.m 2.生

學習筆記個靜態庫連線成一個動態庫例子

目標: 將多個靜態庫連結為一個動態庫,提供統一的介面給外部使用。 看一下例子的目錄檔案: 編譯後將生成 libAdd.a libMutiply.a , 然後將這兩個.a靜態庫和apl_myApi.o 連結成為一個動態庫 libMyApi.so。提供這個動態庫給app.cp

python3學習筆記程序分散式小例子

最近一直跟著廖大在學Python,關於分散式程序的小例子挺有趣的,這裡做個記錄。 分散式程序 Python的multiprocessing模組不但支援多程序,其中managers子模組還支援把多程序分佈到多臺機器上。一個服務程序可以作為排程者,將任務分佈

Linux學習筆記存儲管理

linux 磁盤管理 Linux系統中所有的硬件設備都是通過文件的方式來表現和使用的,我們將這些文件稱為設備文件,在Linux下的/dev目錄中有大量的設備文件,根據設備文件的不同,又分為字符設備文件和塊設備文件。字符設備文件的存取是以字符流的方式來進行的,一次傳送一個字符。常見的有打印

學習筆記javascript內置對象數組對象

b- sort splice 刪除 分隔 href 結果 join() strong 1.數組對象的創建 1.設置一個長度為0的數組 var myarr=new array(); 2.設置一個長度為n的數組 var myarr=new arr(n); 3.聲明一個

學習筆記javascript內置對象日期對象

etsec sel mil cond ava com 描述 學習筆記 asp 2.日期對象的常用函數 2.日期對象的常用函數 Date 對象方法 方法描述 Date() 返回當日的日期和時間。 getDate() 從 Date 對象返回一個月