论文阅读笔记: 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, 不能同时进行人脸姿态估计和手势检测, 因为显存大小不够. 该网络效果非常好, 可以检测正面人体, 侧面人体, 背面人体.

猜你喜欢

转载自blog.csdn.net/u010579901/article/details/79606271