論文閱讀筆記: 2017 cvpr Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

論文閱讀筆記: 2017 cvpr Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

  博客
  論文地址

  本博客主要學習介紹2017 cvpr的一篇文章,這篇文章用於多人的姿態估計,來自卡內基梅隆大學感知計算實驗室Carnegie Mellon University。


主要思想


  論文的基本思想來源於 CMU 的上一篇CVPR 文章 Convolutional Pose Machines, 這篇論文實現了單人的姿態檢測, 論文對這篇文章進行改進, 實現了基於多人的 2D 姿態檢測, 在保證精度的同時, 具有實時的性能.
  論文提出了 Part Affinity Fields, 即 PAFs 網絡結構, 結合 CPM 網絡, 可以有效估計不同人的不同關節點之間的聯繫, 從而有效保證姿態檢測的精度.
  提出自底向上的方法預測各個 part 的位置檢測和關聯表示. 達到近乎實時的效果.


算法流程


  這裏講解一下整個算法的流程。
  
  首先,網絡輸入圖像特徵, 第一個網絡分支迴歸各個人的關節的點, 得到各個部件的 confidence map 置信度譜, 第二個網絡迴歸各個人關節之間的聯繫, 得到各個部件之間的關係矢量譜 Part Affinity Fields.
  接下來,融合上一階段生成的 confidence map 置信度譜和關係譜 Part Affinity Fields 以及輸入圖像的圖像特徵, 繼續迴歸各個人的關節點和關節點之間的聯繫,這裏就相當於融合了關節點的空間信息,從而輸出新的 confidence map 置信度譜。同樣的, 輸出新的關係譜 Part Affinity Fields.
  最後,在最後一個階段stage得到各個部件 的confidence map 置信度譜和各個部件之間的關係譜 Part Affinity Fields. 對 confidence map 置信度譜, 通過 non-maximum suppression 非最大抑制的方法定位候選部件, 對關係譜 Part Affinity Fields, 首先通過積分的方式(簡單的線性積分, 因爲PAFs是一個矢量譜), 獲得各個相鄰部件之間的連接權重值, 然後應用條件約束的匹配算法, 即根據沒有兩個邊共享節點的條件通過最大權重匹配獲得最終的部件關係. 最後獲得多人姿態輸出.


網絡結構



  Stage 1 input是原始圖像特徵。其中,該原始圖像特徵是運用 VGG-19 的前10層網絡然後 finetuned 得到的。Output是對應的 PCM 譜和 PAFs 譜.
  Stage 2 input是 Stage1 的 Output 響應譜,並且加上原始圖像的特徵譜 feature map。Output是對應的 PCM 譜和 PAFs 譜.
  Stage 3 及其後面各個階段的網絡結構和 Stage 2 相似.
  爲了防止訓練時出現梯度消失的問題:論文采用了中層監督(加入中層loss),加強反向傳播.

  其中, 模型的損失函數是普通的 L2 範數, 描述了預測結果和 groundtruth 之間的距離:
  
  上圖中的兩個 groundtruth, 一個是 groundtruth part confidence map 部件置信度譜和 groundtruth part affinity vector filed 部件的關係譜 PAFs. W(p) 是爲了避免由於數據集缺少註釋時, 由於懲罰了積極預測鎖產生的影響.


圖像標籤:ground true


  論文是這樣生成 ground true 的:首先對於 confidence map 置信度譜, 先在每個人的每個關節點的位置放置一個高斯響應,然後對所有人的所有關節的高斯相應求最大來構造響應圖的真值。這樣做的可以有效反應兩個關節點重合的影響.
  
  其次, 對於關係譜 Part Affinity Fields, 論文構造了 2D 矢量場, 首先在每個人在肢體區域中編碼了從一個部件 part 到另一個部件 part 的方向, 並用單位矢量表示. 同樣的, 考慮不同人關節點重合的影響, 全局的肢體區域編碼是通過單人肢體區域編碼取平均得到的.


相關實驗


  論文進行了相應的實驗,通過實驗證明, 提出的網絡結構具有最先進的結果. 下圖是在 MPII 數據庫上的測試結果和 COCO 2016 關鍵點挑戰的測試結果.
  

  
  同時,隨着stage的增長,根據論 文Convolutional Pose Machines 的結論, 網絡會學習到parts之間的空間幾何約束關係來糾正容易出錯的情況.


代碼實現


  這個工作來自2017年的CVPR,Realtime Multi-Person 2D Pose Estimation using Part Affinity Field,用於多人的姿態估計,來自卡內基梅隆大學感知計算實驗室Carnegie Mellon University。
  配置安裝教程, 可以參考官方參考安裝教程和本博客進行安裝和配置.
  首先, 需要從git上面下載代碼, 這裏不在贅述. 接下來, 配置環境, 我們這裏使用Installation - Script Compilation安裝.

    bash ./ubuntu/install_caffe_and_openpose_if_cuda8.sh

  通過論文相關介紹, 我們瞭解到, 代碼可以實時檢測圖像的人體、手部和麪部關鍵點, 共130個特徵點。15或18個人體關鍵點估計,2*21個手部關鍵點估計,70個臉部關鍵點估計。

  並且代碼運用Caffe和OpenCV,可以在Ubuntu、Windows、Nvidia TX2上運行。可以運用於多輸入和多輸出,對應輸入—-圖像,視頻,攝像頭和IP攝像頭,和對應輸出—-基本圖像+關鍵點顯示/保存(PNG,JPG,AVI,…),保存關鍵點(JSON,XML,YML,…)


Demo


  在搭載好環境之後, 我們運行相關 Demo 看看效果: 該 Demo 可以分別對圖像\視頻\攝像頭進行測試,並顯示和保存結果

# Ubuntu
./build/examples/openpose/openpose.bin                              # 直接跑攝像頭
./build/examples/openpose/openpose.bin --face --body_disable        # 進行人臉關鍵點檢測
./build/examples/openpose/openpose.bin --hand                       # 加上手勢關鍵點檢測 
./build/examples/openpose/openpose.bin --video examples/media/video.avi
./build/examples/openpose/openpose.bin --image_dir ./examples/media/image/ --write_images ./examples/media/image/image_res/                        # 直接跑圖片

Demo - Output


  接下來, 我們看看該 Demo 的輸出可以做哪些事情.
  Demo --write_keypoint_json, 代碼通過自定義JSON寫入器保存人物姿態數據. JSON文件每一object代表一個people, 其中每一個Object都有一個數組pose_keypoints, 記錄 body part locations 和檢測置信度.

  其中, 在文件 /src/openpose/pose/poseParameters.cpp 中描述了COCO的18個身體關鍵點部位分佈順序和MPI的15個身體關鍵點部位分佈順序.

    {
        "version":1.0,
        "people":[
            {
                "pose_keypoints":[ ],
                "face_keypoints":[ ],
                "hand_left_keypoints":[ ],
                "hand_right_keypoints":[ ]
            },
    }

    POSE_COCO_BODY_PARTS {
            {0,  "Nose"},       鼻子
            {1,  "Neck"},       脖子
            {2,  "RShoulder"},  右肩
            {3,  "RElbow"},     右肘
            {4,  "RWrist"},     右手腕
            {5,  "LShoulder"},  左肩
            {6,  "LElbow"},     左肘
            {7,  "LWrist"},     左手腕
            {8,  "RHip"},       右髖
            {9,  "RKnee"},      右膝
            {10, "RAnkle"},     右踝
            {11, "LHip"},       左髖
            {12, "LKnee"},      左膝
            {13, "LAnkle"},     左踝
            {14, "REye"},       右眼
            {15, "LEye"},       左眼
            {16, "REar"},       右耳
            {17, "LEar"},       左耳
            {18, "Background"}, 
        }

  如果你想將 OpenPose 應用於 Python 上, 你可以參考博客 PyOpenPose


測量結果


  我們配置電腦的顯卡爲GTX750 Ti , 2G顯存. 姿態檢測速度爲2.8fps, 消耗顯存1119MiB, 不能同時進行人臉姿態估計和手勢檢測, 因爲顯存大小不夠. 該網絡效果非常好, 可以檢測正面人體, 側面人體, 背面人體.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章