精华内容
下载资源
问答
  • 人体姿态估计简介及应用

    千次阅读 2020-09-15 23:02:33
    人体姿态估计简介 人体姿态估计根据估计的关节坐标维度分为2D姿态估计和3D姿态...人体姿态估计应用 动作识别 追踪一段时间内一个人姿态的变化也可以应用在动作、手势和步态识别上。在这方面有好几个应用场景,包括:

    人体姿态估计简介

    人体姿态估计根据估计的关节坐标维度分为2D姿态估计和3D姿态估计。

    • 2D人体姿态估计的目标是定位并识别出人体的关键点,这些关键点按照关节顺序相连,就可以得到人体的骨架,人体2D骨架表现形式如下所示:
      2D骨架
    • 3D姿态估计的目标是从图像或视频中估计人体基于某点的人体三维关节坐标(x, y, z),一般以人体的臀部(Hip)关节为基点,本质上是一个回归问题。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ciBH8sUW-1600181087642)(/home/fa/Documents/ACCV/GAST-Net/image/Baseball.gif)]

    人体姿态估计应用

    • 动作识别

    追踪一段时间内一个人姿态的变化也可以应用在动作、手势和步态识别上。在这方面有好几个应用场景,包括:

    用于检测一个人是否摔倒或疾病
    用于健身、体育和舞蹈等的自动教学
    用于理解全身的肢体语言(如机场跑道信号、交警信号等)
    用于增强安保和监控
    在这里插入图片描述

    • Animation、运动捕捉和增强现实

    人体姿态估计的一个有趣应用是 CGI(computer graphic image,一种电影制造技术)应用。如果可以检测出人体姿态,那么图形、风格、特效增强、设备和艺术造型等就可以被加载在人体上。通过追踪人体姿态的变化,渲染的图形可以在人动的时候“自然”地与人“融合”。姿态估计的一个有趣应用是在交互游戏中追踪人体对象的运动。比较流行的 Kinect 使用 3D 姿态估计(采用 IR 传感器数据)来追踪人类玩家的运动,从而利用它来渲染虚拟人物的动作。

    在这里插入图片描述

    • demonstration 模仿学习,训练机器人

    除了手动为机器人编程、让它们跟随特定的路径,我们也可以让机器人跟随一个做特定动作的人体骨架。人类教练可以仅通过演示特定的动作,来教机器人学习这一动作。接着,机器人就可以计算如何移动自己的活动关节,来进行相同的动作。

    参考:

    https://medium.com/beyondminds/an-overview-of-human-pose-estimation-with-deep-learning-d49eb656739b
    https://www.cnblogs.com/davidwang456/articles/10898205.html
    https://github.com/Vegetebird/3D-Human-Pose-Estimation-Notes
    https://github.com/fabro66/GAST-Net-3DPoseEstimation

    展开全文
  • 1、人体姿态估计简介 2、人体姿态估计数据集 3、OpenPose库 4、实现原理 5、实现神经网络 6、实现代码 1、人体姿态估计简介 人体姿态估计(Human Posture Estimation),是通过将图片中已检测到的人体关键点...

    目录

    1、人体姿态估计简介

    2、人体姿态估计数据集

    3、OpenPose库

    4、实现原理

    5、实现神经网络

    6、实现代码


    1、人体姿态估计简介

    人体姿态估计(Human Posture Estimation),是通过将图片中已检测到的人体关键点正确的联系起来,从而估计人体姿态。

    人体关键点通常对应人体上有一定自由度的关节,比如颈、肩、肘、腕、腰、膝、踝等,如下图。

     

    通过对人体关键点在三维空间相对位置的计算,来估计人体当前的姿态。

    进一步,增加时间序列,看一段时间范围内人体关键点的位置变化,可以更加准确的检测姿态,估计目标未来时刻姿态,以及做更抽象的人体行为分析,例如判断一个人是否在打电话等。

    人体姿态检测的挑战:

    1. 每张图片中包含的人的数量是未知的。
    2. 人与人之间的相互作用是非常复杂的,比如接触、遮挡等,这使得联合各个肢体,即确定一个人有哪些部分变得困难。
    3. 图像中人越多,计算复杂度越大(计算量与人的数量正相关),这使得实时检测变得困难。

    2、人体姿态估计数据集

    由于缺乏高质量的数据集,在人体姿势估计方面进展缓慢。在近几年中,一些具有挑战性的数据集已经发布,这使得研究人员进行研发工作。人体姿态估计常用数据集:

    3、OpenPose库

     OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人,具有极好的鲁棒性。是世界上首个基于深度学习的实时多人二维姿态估计应用,基于它的实例如雨后春笋般涌现。

    其理论基础来自Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ,是CVPR 2017的一篇论文,作者是来自CMU感知计算实验室的曹哲(http://people.eecs.berkeley.edu/~zhecao/#top),Tomas Simon,Shih-En Wei,Yaser Sheikh 。

    人体姿态估计技术在体育健身、动作采集、3D试衣、舆情监测等领域具有广阔的应用前景,人们更加熟悉的应用就是抖音尬舞机。

    OpenPose项目Github链接:https://github.com/CMU-Perceptual-Computing-Lab/openpose

    4、实现原理

    1. 输入一幅图像,经过卷积网络提取特征,得到一组特征图,然后分成两个岔路,分别使用 CNN网络提取Part Confidence Maps 和 Part Affinity Fields;
    2. 得到这两个信息后,我们使用图论中的 Bipartite Matching(偶匹配) 求出Part Association,将同一个人的关节点连接起来,由于PAF自身的矢量性,使得生成的偶匹配很正确,最终合并为一个人的整体骨架;
    3. 最后基于PAFs求Multi-Person Parsing—>把Multi-person parsing问题转换成graphs问题—>Hungarian Algorithm(匈牙利算法)

    (匈牙利算法是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。)

    5、实现神经网络

    阶段一:VGGNet的前10层用于为输入图像创建特征映射。

    阶段二:使用2分支多阶段CNN,其中第一分支预测身体部位位置(例如肘部,膝部等)的一组2D置信度图(S)。 如下图所示,给出关键点的置信度图和亲和力图 - 左肩。

    第二分支预测一组部分亲和度的2D矢量场(L),其编码部分之间的关联度。 如下图所示,显示颈部和左肩之间的部分亲和力。

    阶段三: 通过贪心推理解析置信度和亲和力图,对图像中的所有人生成2D关键点。

    6、实现代码

    import cv2 as cv
    import numpy as np
    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--input', help='Path to image or video. Skip to capture frames from camera')
    parser.add_argument('--thr', default=0.2, type=float, help='Threshold value for pose parts heat map')
    parser.add_argument('--width', default=368, type=int, help='Resize input to specific width.')
    parser.add_argument('--height', default=368, type=int, help='Resize input to specific height.')
    
    args = parser.parse_args()
    
    BODY_PARTS = { "Nose": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,
                   "LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,
                   "RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "REye": 14,
                   "LEye": 15, "REar": 16, "LEar": 17, "Background": 18 }
    
    POSE_PAIRS = [ ["Neck", "RShoulder"], ["Neck", "LShoulder"], ["RShoulder", "RElbow"],
                   ["RElbow", "RWrist"], ["LShoulder", "LElbow"], ["LElbow", "LWrist"],
                   ["Neck", "RHip"], ["RHip", "RKnee"], ["RKnee", "RAnkle"], ["Neck", "LHip"],
                   ["LHip", "LKnee"], ["LKnee", "LAnkle"], ["Neck", "Nose"], ["Nose", "REye"],
                   ["REye", "REar"], ["Nose", "LEye"], ["LEye", "LEar"] ]
    
    inWidth = args.width
    inHeight = args.height
    
    net = cv.dnn.readNetFromTensorflow("graph_opt.pb")
    
    cap = cv.VideoCapture(args.input if args.input else 0)
    
    while cv.waitKey(1) < 0:
        hasFrame, frame = cap.read()
        if not hasFrame:
            cv.waitKey()
            break
    
        frameWidth = frame.shape[1]
        frameHeight = frame.shape[0]
        
        net.setInput(cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight), (127.5, 127.5, 127.5), swapRB=True, crop=False))
        out = net.forward()
        out = out[:, :19, :, :]  # MobileNet output [1, 57, -1, -1], we only need the first 19 elements
    
        assert(len(BODY_PARTS) == out.shape[1])
    
        points = []
        for i in range(len(BODY_PARTS)):
            # Slice heatmap of corresponging body's part.
            heatMap = out[0, i, :, :]
    
            # Originally, we try to find all the local maximums. To simplify a sample
            # we just find a global one. However only a single pose at the same time
            # could be detected this way.
            _, conf, _, point = cv.minMaxLoc(heatMap)
            x = (frameWidth * point[0]) / out.shape[3]
            y = (frameHeight * point[1]) / out.shape[2]
            # Add a point if it's confidence is higher than threshold.
            points.append((int(x), int(y)) if conf > args.thr else None)
    
        for pair in POSE_PAIRS:
            partFrom = pair[0]
            partTo = pair[1]
            assert(partFrom in BODY_PARTS)
            assert(partTo in BODY_PARTS)
    
            idFrom = BODY_PARTS[partFrom]
            idTo = BODY_PARTS[partTo]
    
            if points[idFrom] and points[idTo]:
                cv.line(frame, points[idFrom], points[idTo], (0, 255, 0), 3)
                cv.ellipse(frame, points[idFrom], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
                cv.ellipse(frame, points[idTo], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
    
        t, _ = net.getPerfProfile()
        freq = cv.getTickFrequency() / 1000
        cv.putText(frame, '%.2fms' % (t / freq), (10, 20), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))
    
        cv.imshow('OpenPose using OpenCV', frame)

    本项目实现代码及模型参见网址:https://download.csdn.net/download/m0_38106923/11265524

     关注公众号,发送关键字:关键点检测,获取资源。

    展开全文
  • OpenCV实现人体姿态估计(人体关键点检测)OpenPose

    万次阅读 多人点赞 2019-08-04 11:53:03
    OpenCV实现人体姿态估计(人体关键点检测)OpenPose OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态...

    OpenCV实现人体姿态估计(人体关键点检测)OpenPose


    OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人,具有极好的鲁棒性。是世界上首个基于深度学习的实时多人二维姿态估计应用,基于它的实例如雨后春笋般涌现。

    其理论基础来自Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ,是CVPR 2017的一篇论文,作者是来自CMU感知计算实验室的曹哲(http://people.eecs.berkeley.edu/~zhecao/#top),Tomas Simon,Shih-En Wei,Yaser Sheikh 。

    人体姿态估计技术在体育健身、动作采集、3D试衣、舆情监测等领域具有广阔的应用前景,人们更加熟悉的应用就是抖音尬舞机。

    OpenPose的效果并不怎么好,强烈推荐《2D Pose人体关键点检测(Python/Android /C++ Demo)https://panjinquan.blog.csdn.net/article/details/115765863 ,提供了C++推理代码和Android Demo

    OpenPose项目Github链接:https://github.com/CMU-Perceptual-Computing-Lab/openpose

    OpenCV实现的Demo链接:https://github.com/PanJinquan/opencv-learning-tutorials/blob/master/opencv_dnn_pro/openpose-opencv/openpose_for_image_test.py


    1、实现原理

    输入一幅图像,经过卷积网络提取特征,得到一组特征图,然后分成两个岔路,分别使用 CNN网络提取Part Confidence Maps 和 Part Affinity Fields;


    得到这两个信息后,我们使用图论中的 Bipartite Matching(偶匹配) 求出Part Association,将同一个人的关节点连接起来,由于PAF自身的矢量性,使得生成的偶匹配很正确,最终合并为一个人的整体骨架;
    最后基于PAFs求Multi-Person Parsing—>把Multi-person parsing问题转换成graphs问题—>Hungarian Algorithm(匈牙利算法)
    (匈牙利算法是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。)


    2、实现神经网络

    阶段一:VGGNet的前10层用于为输入图像创建特征映射。

    阶段二:使用2分支多阶段CNN,其中第一分支预测身体部位位置(例如肘部,膝部等)的一组2D置信度图(S)。 如下图所示,给出关键点的置信度图和亲和力图 - 左肩。

    第二分支预测一组部分亲和度的2D矢量场(L),其编码部分之间的关联度。 如下图所示,显示颈部和左肩之间的部分亲和力。

    阶段三: 通过贪心推理解析置信度和亲和力图,对图像中的所有人生成2D关键点。


    3.OpenCV-OpenPose实现推理代码

    # -*-coding: utf-8 -*-
    """
        @Project: python-learning-notes
        @File   : openpose_for_image_test.py
        @Author : panjq
        @E-mail : pan_jinquan@163.com
        @Date   : 2019-07-29 21:50:17
    """
    
    import cv2 as cv
    import os
    import glob
    
    BODY_PARTS = {"Nose": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,
                  "LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,
                  "RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "REye": 14,
                  "LEye": 15, "REar": 16, "LEar": 17, "Background": 18}
    
    POSE_PAIRS = [["Neck", "RShoulder"], ["Neck", "LShoulder"], ["RShoulder", "RElbow"],
                  ["RElbow", "RWrist"], ["LShoulder", "LElbow"], ["LElbow", "LWrist"],
                  ["Neck", "RHip"], ["RHip", "RKnee"], ["RKnee", "RAnkle"], ["Neck", "LHip"],
                  ["LHip", "LKnee"], ["LKnee", "LAnkle"], ["Neck", "Nose"], ["Nose", "REye"],
                  ["REye", "REar"], ["Nose", "LEye"], ["LEye", "LEar"]]
    
    
    def detect_key_point(model_path, image_path, out_dir, inWidth=368, inHeight=368, threshhold=0.2):
        net = cv.dnn.readNetFromTensorflow(model_path)
        frame = cv.imread(image_path)
        frameWidth = frame.shape[1]
        frameHeight = frame.shape[0]
        scalefactor = 2.0
        net.setInput(
            cv.dnn.blobFromImage(frame, scalefactor, (inWidth, inHeight), (127.5, 127.5, 127.5), swapRB=True, crop=False))
        out = net.forward()
        out = out[:, :19, :, :]  # MobileNet output [1, 57, -1, -1], we only need the first 19 elements
        assert (len(BODY_PARTS) == out.shape[1])
        points = []
        for i in range(len(BODY_PARTS)):
            # Slice heatmap of corresponging body's part.
            heatMap = out[0, i, :, :]
            # Originally, we try to find all the local maximums. To simplify a sample
            # we just find a global one. However only a single pose at the same time
            # could be detected this way.
            _, conf, _, point = cv.minMaxLoc(heatMap)
            x = (frameWidth * point[0]) / out.shape[3]
            y = (frameHeight * point[1]) / out.shape[2]
            # Add a point if it's confidence is higher than threshold.
            points.append((int(x), int(y)) if conf > threshhold else None)
        for pair in POSE_PAIRS:
            partFrom = pair[0]
            partTo = pair[1]
            assert (partFrom in BODY_PARTS)
            assert (partTo in BODY_PARTS)
    
            idFrom = BODY_PARTS[partFrom]
            idTo = BODY_PARTS[partTo]
    
            if points[idFrom] and points[idTo]:
                cv.line(frame, points[idFrom], points[idTo], (0, 255, 0), 3)
                cv.ellipse(frame, points[idFrom], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
                cv.ellipse(frame, points[idTo], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
    
        t, _ = net.getPerfProfile()
        freq = cv.getTickFrequency() / 1000
        cv.putText(frame, '%.2fms' % (t / freq), (10, 20), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))
    
        cv.imwrite(os.path.join(out_dir, os.path.basename(image_path)), frame)
        cv.imshow('OpenPose using OpenCV', frame)
        cv.waitKey(0)
    
    
    def detect_image_list_key_point(image_dir, out_dir, inWidth=480, inHeight=480, threshhold=0.3):
        image_list = glob.glob(image_dir)
        for image_path in image_list:
            detect_key_point(image_path, out_dir, inWidth, inHeight, threshhold)
    
    
    if __name__ == "__main__":
        model_path = "pb/graph_opt.pb"
        # image_path = "body/*.jpg"
        out_dir = "result"
        # detect_image_list_key_point(image_path,out_dir)
        image_path = "./test.jpg"
        detect_key_point(model_path, image_path, out_dir, inWidth=368, inHeight=368, threshhold=0.05)

    参考资料:

    [1].https://blog.csdn.net/m0_38106923/article/details/89416514

    展开全文
  • 人体姿态估计综述

    千次阅读 多人点赞 2020-10-14 19:18:11
    一、人体姿态估计常用数据集 二、人体姿态估计常用评估指标 三、人体姿态估计论文 3.1 DeepPose: Human Pose Estimation via Deep Neural Networks(2014) 3.2 Convolutional Pose Machines(2016) 3.3Stacked ...

    【编者的话】本文是综合各家关于人体姿态估计的介绍,后面补充移动端的性能对比、PoseNet、BlazePose

    还有MediaPipe的应用

     

    人体姿态估计是给定一幅图像或者一段视频,从中去恢复人体关节点的过程。利用深度学习进行姿态估计的方法大致分为两种:自上而下的方法和自下而上的方法。自上而下(top-down),即先检测出来人体,再对单个人进行姿态估计;而自下而上(down-top),则是先检测出人体关节点,再根据检测出来的关节点连成人体骨架。下面,将对近几年的人体姿态估计的论文进行一下汇总。

    各模型在不同机器上耗时

     

    模型服务器CPU服务器GPU设备CPU设备GPU设备*PUOPPO CPUOPPO GPU 
    PoseEstimation-TFLite(CPU)/MACE(GPU)  278ms(9652)  78ms10ms 
    pytorch mobilenetv2  100ms(811)     
    openpose  1.7s  400ms  
    PoseNet 

     

    150 ms

    posenet: Scaling to [-1,1] took 10.58 ms

    200ms

    更慢需要看下

     50ms  

    BlazePose

    BlazeFace

    BlazePalm

      

    200ms一个打印

    上半身

         
    yolov4    

    700ms

    需要看下

       

    人体姿态估计常用数据集

    LSP

    样本数:2K,关节点个数:14,全身,单人,体育

    FLIC

    样本数:20K,关节点个数:9,半身,单人,影视 

    MPII

    2014年引入

    样本数:25K,关节点个数:16,全身,单人/多人,日常

    单人姿态估计中最常用的benchmark, 使用的是PCKh的指标(可以认为预测的关键点与GT标注的关键点经过head size normalize后的距离)

    整体结果目前已经非常高(最高的有93.9%)

    MicroSoft COCO

    2016年的下半年

    多人姿态估计的标注

    样本数:>=30W,关节点个数:18,全身,多人,10W个人体姿态标签

    CrowdPose

    拥挤人群的数据集

    PoseTrack

    用于人体姿态跟踪的任务,来源于MPII的数据集,标注风格也很相近

    • > 1356 video sequences
    • > 46K annotated video frames
    • > 276K body pose annotations
    • Two challenges: "Multi-Person Pose Estimation" and "Multi-Person Pose Tracking"

    AIChallenger

    Human3.6M

    3D的人体数据集

    Diversity and Size

    • 3.6 million 3D human poses and corresponding images

    • 11 professional actors (6 male, 5 female)

    • 17 scenarios (discussion, smoking, taking photo, talking on the phone...)

    Accurate Capture and Synchronization

    • High-resolution 50Hz video from 4 calibrated cameras

    • Accurate 3D joint positions and joint angles from high-speed motion capture system

    • Pixel-level 24 body part labels for each configuration

    • Time-of-flight range data

    • 3D laser scans of the actors

    • Accurate background subtraction, person bounding boxes

    Support for Development

    • Precomputed image descriptors

    • Software for visualization and discriminative human pose prediction

    • Performance evaluation on withheld test set

    DensePose-COCO

    Facebook,100人也很轻松

    把2D图像,转换成3D人体模型

    覆盖浑身上下超过5000个节点,比十几个关节要细致得多。

    DensePose每秒处理多帧画面,而且,就算视频里同时出现100个人

     

    人体姿态估计常用评估指标

    Percentage of Correct Parts (PCP)

    检测到正确部位的比例。在PCP中认为一个骨骼(limb)被检测到的标准是,骨骼的两个关节点的位置与真实关节点的位置的距离小于骨骼的长度的一半。

    Percent of Detected Joints (PDJ)

    检测到的关节点的比例。在PDJ中认为一个关节被检测到的标准是,关节的位置与真实位置的距离小于躯干对角点的长度(left shoulderright hip的距离)的一个比例值。

    Percentage of Correct Keypoints (PCK)

    关键点被准确检测的比例。计算检测的关键点与其对应的groundtruth间的归一化距离小于设定阈值的比例。FLIC 中是以躯干直径作为归一化参考。MPII 中是以头部长度作为归一化参考,即 PCKh

    Average Precision (AP)

    平均精确度。类似目标检测,将在真实目标和预测值目标之间的匹配程度的阈值度量由目标检测中的每个目标检测框的交并比(IOU)改为每个目标的关键点相似度(object keypoint similarity, OKS)

     

    人体姿态估计的过去,现在,未来

    俞刚Be myself / skicyyu.org

    前言

    因为在ICIP2019上面和两位老师搞了一个关于人体姿态估计以及动作行为的tutorial,所以最近整理了蛮多人体姿态估计方面的文章。所以做了一个总结和梳理,希望能抛砖引玉。

    问题

    人体姿态估计是计算机视觉中一个很基础的问题。从名字的角度来看,可以理解为对“人体”的姿态(关键点,比如头,左手,右脚等)的位置估计。一般我们可以这个问题再具体细分成4个任务:

    • 单人姿态估计 (Single-Person Skeleton Estimation)
    • 多人姿态估计 (Multi-person Pose Estimation)
    • 人体姿态跟踪 (Video Pose Tracking)
    • 3D人体姿态估计 (3D Skeleton Estimation)

    具体讲一下每个任务的基础。首先是 单人姿态估计, 输入是一个crop出来的行人,然后在行人区域位置内找出需要的关键点,比如头部,左手,右膝等。常见的数据集有MPII, LSP, FLIC, LIP。其中MPII是2014年引进的,目前可以认为是单人姿态估计中最常用的benchmark, 使用的是PCKh的指标(可以认为预测的关键点与GT标注的关键点经过head size normalize后的距离)。但是经过这几年的算法提升,整体结果目前已经非常高了(最高的已经有93.9%了)。下面是单人姿态估计的结果图(图片来源于CPM的paper):

    单人姿态估计算法往往会被用来做多人姿态估计。多人姿态估计的输入是一张整图,可能包含多个行人,目的是需要把图片中所有行人的关键点都能正确的做出估计。针对这个问题,一般有两种做法,分别是top-down以及bottom-up的方法。对于top-down的方法,往往先找到图片中所有行人,然后对每个行人做姿态估计,寻找每个人的关键点。单人姿态估计往往可以被直接用于这个场景。对于bottom-up,思路正好相反,先是找图片中所有parts (关键点),比如所有头部,左手,膝盖等。然后把这些parts(关键点)组装成一个个行人。

    对于测试集来讲,主要有COCO, 最近有新出一个数据集CrowdPose。下面是CPN算法在COCO上面的结果:

    如果把姿态估计往视频中扩展的话,就有了人体姿态跟踪的任务。主要是针对视频场景中的每一个行人,进行人体以及每个关键点的跟踪。这个问题本身其实难度是很大的。相比行人跟踪来讲,人体关键点在视频中的temporal motion可能比较大,比如一个行走的行人,手跟脚会不停的摆动,所以跟踪难度会比跟踪人体框大。目前主要有的数据集是PoseTrack

    同时,如果把人体姿态往3D方面进行扩展,输入RGB图像,输出3D的人体关键点的话,就是3D 人体姿态估计。这个有一个经典的数据集Human3.6M。最近,除了输出3D的关键点外,有一些工作开始研究3D的shape,比如数据集DensePose。长线来讲,这个是非常有价值的研究方向。3D人体姿态估计的结果图(来自算法a simple baseline)如下:

    Densepose算法的结果输出:

    过去--传统方法提取feature representation以及关键点的空间位置关系

    这部分主要用于描述在深度学习之前,我们是如何处理人体姿态估计这个问题。从算法角度来讲,这部分的工作主要是希望解决单人的人体姿态估计问题,也有部分工作已经开始尝试做3D的人体姿态估计。可以粗略的方法分成两类。

    第一类是直接通过一个全局feature,把姿态估计问题当成分类或者回归问题直接求解 [1][2]。但是这类方法的问题在于精度一般,并且可能比较适用于背景干净的场景。第二类是基于一个graphical model,比如常用图结构模型(pictorial structure model)。一般包含unary term,是指对单个part进行feature的representation,单个part的位置往往可以使用DPM (Deformable Part-based model)来获得。 同时需要考虑pair-wise关系来优化关键点之间的关联。基于Pictorial Structure,后续有非常多的改进,要么在于如何提取更好的feature representation [3][4], 要么在于建模更好的空间位置关系[5][6]。

    总结一下,在传统方法里面,需要关注的两个维度是: feature representation以及关键点的空间位置关系。特征维度来讲,传统方法一般使用的HOG, Shape Context, SIFT等shallow feature。 空间位置关系的表示也有很多形式,上面的Pictorial structure model可能只是一种。

    备注
    对应OpenPose,feature representation是heatmap,关键点的空间位置关系是paf

    这两个维度在深度学习时代也是非常至关重要的,只是深度学习往往会把特征提取,分类,以及空间位置的建模都在一个网络中直接建模,所以不需要独立的进行拆解,这样更方便设计和优化。

    现在--深度学习提取feature representation以及关键点的空间位置关系

    从2012年AlexNet开始,深度学习开始快速发展,从最早的图片分类问题,到后来的检测,分割问题。在2014年,[7]第一次成功引入了CNN来解决单人姿态估计的问题。因为当时的时代背景,整体网络结构比较简单,同时也沿用了传统骨架的思路。首先是通过slide-window的方式,来对每个patch进行分类,找到相应的人体关键点。因为直接sliding-window少了很多context信息,所以会有很多FP的出现。所以在pipeline上面加上了一个post-processing的步骤,主要是希望能抑制部分FP,具体实现方式是类似一个空间位置的模型。所以从这个工作来看,有一定的传统姿态估计方法的惯性,改进的地方是把原来的传统的feature representation改成了深度学习的网络,同时把空间位置关系当成是后处理来做处理。总体性能在当时已经差不多跑过了传统的姿态估计方法。

    2014年的另外一个重要的进展是引入了MPII的数据集。此前的大部分paper都是基于FLIC以及LSP来做评估的,但是在深度学习时代,数据量还是相对偏少(K级别)。MPII把数据量级提升到W级别,同时因为数据是互联网采集,同时是针对activity来做筛选的,所以无论从难度还是多样性角度来讲,都比原来的数据集有比较好的提升。

    一直到2016年,随着深度学习的爆发,单人姿态估计的问题也引来了黄金时间。这里需要重点讲一下两个工作,一个工作是Convolutional Pose Machine (CPM)[8],另外一个是Hourglass [9]。

    • CPM

    CPM是CMU Yaser Sheikh组的工作,后续非常有名的openpose也是他们的工作。从CPM开始,神经网络已经可以e2e的把feature representation以及关键点的空间位置关系建模进去(隐式的建模),输入一个图片的patch, 输出带spatial信息的tensor,channel的个数一般就是人体关键点的个数(或者是关键点个数加1)。空间大小往往是原图的等比例缩放图。通过在输出的heatmap上面按channel找最大的响应位置(x,y坐标),就可以找到相应关键点的位置。

    这种heatmap的方式被广泛使用在人体骨架的问题里面。这个跟人脸landmark有明显的差异,一般人脸landmark会直接使用回归(fully connected layer for regression)出landmark的坐标位置。这边我做一些解释。首先人脸landmark的问题往往相对比较简单,对速度很敏感,所以直接回归相比heatmap来讲速度会更快,另外直接回归往往可以得到sub-pixel的精度,但是heatmap的坐标进度取决于在spatial图片上面的argmax操作,所以精度往往是pixel级别(同时会受下采样的影响)。 但是heatmap的好处在于空间位置信息的保存,这个非常重要。一方面,这个可以保留multi-modal的信息,比如没有很好的context信息的情况下,是很难区分左右手的,所以图片中左右手同时都可能有比较好的响应,这种heatmap的形式便于后续的cascade的进行refinement优化。另外一个方面,人体姿态估计这个问题本身的自由度很大,直接regression的方式对自由度小的问题比如人脸landmark是比较适合的,但是对于自由度大的姿态估计问题整体的建模能力会比较弱。相反,heatmap是比较中间状态的表示,所以信息的保存会更丰富

    备注:

    回归(fully connected layer for regression)在Alexnet的思路

    后续2D的人体姿态估计方法几乎都是围绕heatmap这种形式来做的(3D姿态估计将会是另外一条路),通过使用神经网络来获得更好的feature representation,同时把关键点的空间位置关系隐式的encode在heatmap中,进行学习。大部分的方法区别在于网络设计的细节。先从CPM开始说起。

    整个网络会有多个stage,每个stage设计一个小型网络,用于提取feature,然后在每个stage结束的时候,加上一个监督信号。中间层的信息可以给后续层提供context,后续stage可以认为是基于前面的stage做refinement。这个工作在MPII上面的结果可以达到88.5,在当时是非常好的结果。

    备注:是否跟SSD的思路类似?SSD使用6个不同特征图检测不同尺度的目标。低层预测小目标,高层预测大目标。这6个检测层都是卷积层,对应了上文中的6个DeepID2层,每个DeepID2层对应了不同大小的滑动窗口(低层滑动窗口较小,高层滑动窗口较大),这样就可以检测到不同尺度的目标了

    • Hourglass

    在2016年的7月份,Princeton的Deng Jia组放出了另外一个非常棒的人体姿态估计工作,Hourglass。后续Deng Jia那边基于Hourglass的想法做了Associate Embedding,以及后续的CornerNet都是非常好的工作。

    Hourglass相比CPM的最大改进是网络结构更简单,更优美。

     

    从上图可以看出,网络是重复的堆叠一个u-shape的structure.

     

    pipeline上面跟CPM很类似。只是结构做了修改。从MPII上的结果来看,也有明显的提升,可以达到90.9的PCKh。

    这种u-shape的结构其实被广泛应用于现代化的物体检测,分割等算法中,同时结果上面来讲也是有非常好的提升的。另外,Hourglass这种堆多个module的结构,后续也有一些工作follow用在其他任务上面。

    采用的是Resnet的思路?

    但是Hourglass也是存在一些问题的,具体可以看后续讲解的MSPN网络。

    在CPM以及Hourglass之后,也有很多不错的工作持续在优化单人姿态估计算法,比如[10][11]。

    2016年的下半年还出现了一个非常重要的数据集: COCO。这个时间点也是非常好的时间点。一方面,MPII已经出现两年,同时有很多非常好的工作,比如CPM, Hourglass已经把结果推到90+,数据集已经开始呈现出一定的饱和状态。另外一方面,物体检测/行人检测方面,算法提升也特别明显,有了很多很好的工作出现,比如Faster R-CNN和SSD。所以COCO的团队在COCO的数据集上面引入了多人姿态估计的标注,并且加入到了2016年COCO比赛中,当成是一个track。从此,多人姿态估计成为学术界比较active的研究topic。正如前面我在“问题”的部分描述的,多人姿态估计会分成top-down以及bottom-up两种模式。我们这边会先以bottom-up方法开始描述。

    • OpenPose

    在2016年COCO比赛中,当时的第一名就是OpenPose [12]。 CMU团队基于CPM为组件,先找到图片中的每个joint的位置,然后提出Part Affinity Field (PAF)来做人体的组装。

    PAF的基本原理是在两个相邻关键点之间,建立一个有向场,比如左手腕,左手肘。我们把CPM找到的所有的左手腕以及左手肘拿出来建立一个二分图,边权就是基于PAF的场来计算的。然后进行匹配,匹配成功就认为是同一个人的关节。依次类别,对所有相邻点做此匹配操作,最后就得到每个人的所有关键点

    备注:

    向量叉积

    在当时来讲,这个工作效果是非常惊艳的,特别是视频的结果图,具体可以参考Openpose的Github官网。在COCO的benchmark test-dev上面的AP结果大概是61.8。

    • Hourglass + Associative Embedding

    在2016年比赛的榜单上面,还有另外一个很重要的工作就是Deng Jia组的Associative Embedding[13]。文章类似Openpose思路,使用bottom-up的方法,寻找part使用了Hourglass的方式来做。关键在于行人的组装上面,提出了Associative Embedding的想法。大概想法是希望对每个关键点输出一个embedding,使得同一个人的embedding尽可能相近,不同人的embedding尽可能不一样。

    在COCO2016比赛后,这个工作持续的在提升,文章发表的时候,COCO test-dev上面的结果在65.5。

    除了Openpose以及Associative Embedding之外,bottom-up还有一个工作非常不错,DeepCut[14]以及DeeperCut[15],他们使用优化问题来直接优化求解人的组合关系

    • CPN

    后面一部分章节我会重点围绕COCO数据集,特别是COCO每年的比赛来描述多人姿态估计的进展。虽然2016年bottom-up是一个丰富时间点,但是从2017年开始,越来的工作开始围绕top-down展开,一个直接的原因是top-down的效果往往更有潜力。top-down相比bottom-up效果好的原因可以认为有两点。首先是人的recall往往更好。因为top-down是先做人体检测,人体往往会比part更大,所以从检测角度来讲会更简单,相应找到的recall也会更高。其次是关键点的定位精度会更准,这部分原因是基于crop的框,对空间信息有一定的align,同时因为在做single person estimation的时候,可以获得一些中间层的context信息,对于点的定位是很有帮助的。当然,top-down往往会被认为速度比bottom-up会更慢,所以在很多要求实时速度,特别是手机端上的很多算法都是基于openpose来做修改的。不过这个也要例外,我们自己也有做手机端上的多人姿态估计,但是我们是基于top-down来做的,主要原因是我们的人体检测器可以做的非常快。

    说完了背景后,在COCO2017年的比赛中,我们的CPN[16]一开始就决定围绕top-down的算法进行尝试。我们当时的想法是一个coarse-to-fine的逻辑,先用一个网络出一个coarse的结果(GlobalNet),然后再coarse的结果上面做refinement (RefineNet)。具体结果如下:

    为了处理处理难的样本,我们在loss上面做了一定的处理,最后的L2 loss我们希望针对难的关键点进行监督,而不是针对所有关键点uniform的进行监督,所以我们提出了一个Hard keypoint mining的loss。这个工作最后在COCO test-dev达到了72.1的结果 (不使用额外数据以及ensemble),获得了2017年的COCO骨架比赛的第一名。

    损失函数:L1 loss, L2 loss, smooth L1 loss

    对于大多数CNN网络,我们一般是使用L2-loss而不是L1-loss,因为L2-loss的收敛速度要比L1-loss要快得多。

    对于边框预测回归问题,通常也可以选择平方损失函数(L2损失),但L2范数的缺点是当存在离群点(outliers)的时候,这些点会占loss的主要组成部分。比如说真实值为1,预测10次,有一次预测值为1000,其余次的预测值为1左右,显然loss值主要由1000主宰。所以FastRCNN采用稍微缓和一点绝对损失函数(smooth L1损失),它是随着误差线性增长,而不是平方增长。

    注意:smooth L1和L1-loss函数的区别在于,L1-loss在0点处导数不唯一,可能影响收敛。smooth L1的解决办法是在0点附近使用平方函数使得它更加平滑。

    公式比较

     

    Smooth L1 vs L2


    根据fast rcnn的说法,"...... L1 loss that is less sensitive to outliers than the L2 loss used in R-CNN and SPPnet." 也就是smooth L1 loss让loss对于离群点更加鲁棒,即:相比于L2损失函数,其对离群点、异常值(outlier)不敏感,梯度变化相对更小,训练时不容易跑飞。

    另外,这个工作的另外一个贡献是比较完备的ablation。我们给出了很多因素的影响。比如top-down的第一步是检测,我们分析了检测性能对最后结果的影响。物体检测结果从30+提升到40+(mmAP)的时候,人体姿态估计能有一定的涨点(1个点左右),但是从40+提升到50+左右,涨点就非常微弱了(0.1-0.2)。另外,我们对data augmentation,网络的具体结构设计都给出了比较完整的实验结果。另外,我们开始引入了传统的ImageNet basemodel (ResNet50)做了backbone,而不是像Openpose或者Hourglass这种非主流的模型设计结构,所以效果上面也有很好的提升。

    • MSPN

    2018年的COCO比赛中,我们继续沿用top-down的思路。当时我们基于CPN做了一些修改,比如把backbone不停的扩大,发现效果提升很不明显。我们做了一些猜测,原来CPN的两个stage可能并没有把context信息利用好,单个stage的模型能力可能已经比较饱和了,增加更多stage来做refinement可能是一个解决当前问题,提升人体姿态估计算法uppper-bound的途径。所以我们在CPN的globalNet基础上面,做了多个stage的堆叠,类似于Hourglass的结构。

    相比Hourglass结构,我们提出的MSPN[17]做了如下三个方面的改进。首先是Hourglass的每个stage的网络,使用固定的256 channel,即使中间有下采样,这种结构对信息的提取并不是很有益。所以我们使用了类似ResNet-50这种标准的ImageNet backbone做为每个stage的网络。另外,在两个相邻stage上面,我们也加入了一个连接用于更好的信息传递。最后,我们对于每个stage的中间层监督信号做了不同的处理,前面层的监督信号更侧重分类,找到coarse的位置,后面更侧重精确的定位。从最后效果上面来看,我们在COCO test-dev上面一举跑到了76.1 (单模型不加额外数据)。

    • HRNet

    之前我们讲的很多人体姿态估计方面的工作,都在围绕context来做工作,如何更好的encode和使用这些context是大家工作的重点。到了2019年, MSRA wang jingdong组出了一个很好的工作,提出了spatial resolution的重要性。在这篇工作之前,我们往往会暴力的放大图片来保留更多信息,同时给出更精准的关键点定位,比如从256x192拉大到384x288。这样对效果提升还是很明显的,但是对于计算量的增加也是非常大的。 HRNet从另外一个角度,抛出了一个新的可能性:

    相比传统的下采样的网络结构,这里提出了一种新的结构。分成多个层级,但是始终保留着最精细的spaital那一层的信息,通过fuse下采样然后做上采样的层,来获得更多的context以及语义层面的信息(比如更大的感受野)。从结果上面来看,在COCO test-dev上面单模型可以达到75.5。

    到此为止,我们重点讲述了几个多人姿态估计的算法,当然中间穿插了不少我们自己的私货。在多人姿态估计领域还有很多其他很好的工作,因为篇幅问题,这里我们就略过了。

    回到2017年,MPI提出了一个新的数据集, PoseTrack,主要是希望能帮忙解决视频中的人体姿态估计的问题,并且在每年的ICCV或者ECCV上面做challenge比赛。 PoseTrack的数据集主要还是来源于MPII的数据集,标注风格也很相近。围绕PoseTrack这个任务,我们重点讲一个工作, Simple Baselines。

    • Simple Baselines

    Simple Baselines [19]是xiao bin在MSRA的工作。提出了一种非常简洁的结构可以用于多人姿态估计以及人体姿态估计的跟踪问题。这里重点讲一下对于PoseTrack的处理方法:

    这里有两个细节,首先是会利用上一帧的检测结果,merge到新的一帧,避免检测miss的问题。另外,在两帧间,会使用OKS based相似度来做人体的关联,而不是只是简单的使用框的overlap,这样可以更好的利用每个关键点的temporal smooth的性质。从结果上面来看,这个方法也获得了PoseTrack2018比赛的第一名。

    到目前位置,我们描述了单人的姿态估计,多人的姿态估计,以及简单讲了一下视频中的人体姿态跟踪的问题。最后,我们讲一下3D人体姿态估计的问题,这个我觉得这个是目前非常active的研究方向,也是未来的重要的方向。

    • 3D Skeleton

    3D人体姿态估计目前我们先限制在RGB输入数据的情况下,不考虑输入数据本身是RGBD的情况。我们大概可以把这个问题分成两个子问题:第一个是出人体的3D关键点。相比之前的2D关键点,这里需要给出每个点的3D位置。 另外一种是3D shape,可以给出人体的3D surface,可以认为是更dense的skeleton信息(比如Densepose, SMPL模型)。

    先从3D关键点说起。主要的方法可以分成两类,第一类是割裂的考虑。把3D skeleton问题拆解成2D人体姿态估计,以及从2D关键点预测3D关键点两个步骤。 另外一类是joint的2D以及3D的姿态估计。

    大部分的基于深度学习的3D人体骨架工作是从2017年开始的,主要的上下文是因为2D人体姿态估计中CPM以及Hourglass给出了很好的效果,使得3D Skeleton成为可能。

    我们先从3D跟2D skeleton割裂的算法开始说起。首先从2017年deva Ramanan组的一个非常有意思的工作【20】开始说起,3D Human Pose Estimation = 2D Pose Estimation + Matching。从名字可以看出,大致的做法。首先是做2D的人体姿态估计,然后基于Nearest neighbor最近邻的match来从training data中找最像的姿态。2D的姿态估计算法是基于CPM来做的。3D的match方法是先把training data中的人体3d骨架投射到2D空间,然后把test sample的2d骨架跟这些training data进行对比,最后使用最相近的2d骨架对应的3D骨架当成最后test sample点3D骨架。当training数据量非常多的时候,这种方法可能可以保证比较好的精度,但是在大部分时候,这种匹配方法的精度较粗,而且误差很大。

    随后,也在17年,另外一个非常有意思的工作【21】发表在ICCV2017。同样,从这个工作的名字可以看出,这个工作提出了一个比较simple的baseline,但是效果还是非常明显。方法上面来讲,就是先做一个2d skeleton的姿态估计,方法是基于Hourglass的,文章中的解释是较好的效果以及不错的速度。 基于获得的2d骨架位置,后续接入两个fully connected的操作,直接回归3D坐标点。这个做法非常粗暴直接,但是效果还是非常明显的。在回归之前,需要对坐标系统做一些操作。

    同样,从2017年的ICCV开始,已经有工作【22】开始把2D以及3d skeleton的估计问题joint一起来做优化。这样的好处其实是非常明显的。因为很多2d数据对于3d来讲是有帮助的,同时3D姿态对于2d位置点估计也能提供额外的信息辅助。2D的MPII, COCO数据可以让算法获得比较强的前背景点分割能力,然后3D的姿态估计数据集只需要关注前景的3D骨架估计。这也是目前学术界数据集的现状。从实际效果上面来讲,joint training的方法效果确实也比割裂的train 2d以及3d skeleton效果要好。

    从2018年开始,3D skeleton开始往3d shape发展。原先只需要知道joint点的3D坐标位置,但是很多应用,比如人体交互,美体,可能需要更dense的人体姿态估计。这时候就有了一个比较有意思的工作densePose 【23】。这个工作既提出来一个新的问题,也包含新的benchmark以及baseline。相比传统的SMPL模型,这个工作提出了使用UV map来做估计(同时间也有denseBody类似的工作),可以获得非常dense的3d姿态位置,等价于生成了3d shape。当然,从3d shape的角度来讲,有很多非常不错的工作,这里就不做重点展开。

    最后讲一下3d人体姿态估计目前存在的问题。我个人认为主要是benchmark。目前最常使用的human 3.6M实际上很容易被overfit,因为subjects数量太小(实际训练样本只有5-6人,depend on具体的测试方法,测试样本更少)。同时,是在受限的实验室场景录制,跟真实场景差异太大,背景很干净,同时前景的动作pose也比较固定。当然,3d skeleton的数据集的难度非常大,特别是需要采集unconstrained条件下面的数据。目前也有一些工作在尝试用生成的数据来提升结果。

    • 应用

    最后,讲了这么多的人体姿态估计,我们最后说一下人体姿态估计有什么用,这里的人体姿态估计是一个广义的人体姿态估计,包含2D/3D等。

    首先的一个应用是人体的动作行为估计,要理解行人,人体的姿态估计其实是一个非常重要的中间层信息。目前有蛮多基于人体姿态估计直接做action recogntion的工作,比如把关键点当成graph的节点,然后是使用graph convolution network来整合各种信息做动作分类。我博士的研究课题是action recognition,我读完四年博士的一个总结是action这个问题,如果需要真正做到落地,人体姿态估计算法是必不可少的组成部分。

    第二类应用是偏娱乐类的,比如人体交互,美体等。比如可以通过3d姿态估计来虚拟出一个动画人物来做交互,使用真实人体来控制虚拟人物。另外比如前一段时间比较火热的瘦腰,美腿等操作背后都可能依赖于人体姿态估计算法。

    第三类应用是可以做为其他算法的辅助环节,比如Person ReID可以基于人体姿态估计来做alignment,姿态估计可以用来辅助行人检测,杀掉检测的FP之类的。

    未来

    深度学习带来了学术界以及工业界的飞速发展,极大的提升了目前算法的结果,也使得我们开始关注并尝试解决一些更有挑战性的问题。

    下面的几点我是侧重于把人体姿态估计真正落地到产品中而展开的。当然也可以换个维度考虑更长线的研究发展,这个可能希望以后有机会再一起讨论。

    • Data Generation

    我觉得这个是一个非常重要的研究方向,不管是对2d还是3d。以2d为例,虽然目前数据量已经非常的大,比如COCO数据,大概有6w+的图片数据。但是大部分pose都是正常pose,比如站立,走路等。对于一些特殊pose,比如摔倒,翻越等并没有多少数据。或者可以这么理解,这些数据的收集成本很高。如果我们可以通过生成数据的方法来无限制的生成出各种各样的数据的话,这个对于算法的提升是非常的关键。虽然目前GAN之类的数据生成质量并不高,但是对于人体姿态估计这个问题来讲其实已经够了,因为我们不需要清晰真实的细节,更多的是需要多样性的前景(不同着装的人)和pose。但是数据生成的方式对于人体姿态估计本身也有一个非常大的挑战,这个可以留做作业,感兴趣的同学可以在留言区回复。

    • Crowd的问题

    这个问题其实是行人检测的问题。目前市面上没有能针对拥挤场景很work的行人检测算法。这个问题的主要瓶颈在于行人检测的一个后处理步骤:NMS (Non-maximum suppression)。这个其实是从传统物体检测方法时代就有的问题。因为目前大部分算法不能区分一个行人的两个框还是两个不同行人的两个框,所以使用NMS来基于IOU用高分框抑制低分框。这个问题在传统的DPM以及ACF时代问题并不突出,因为当时算法精度远没有达到需要考虑NMS的问题。但是随着技术的进步,目前NMS已经是一个越来越明显的瓶颈,或者说也是行人检测真正落地的一个很重要的障碍。最近我们提出了一个新的数据集CrowdHuman,希望引起大家对于遮挡拥挤问题的关注。从算法上面来讲,最近也陆续开始由蛮多不错的工作在往这个方向努力,但是离解决问题还是有一定的距离。回到人体姿态估计这个问题,目前top-down方法依赖于检测,所以这个问题避免不了。 bottom-up可能可以绕开,但是从assemble行人的角度,拥挤场景这个问题也非常有挑战。

    • Multi-task Learning

    刚刚我们讲到,2D以及3D人体姿态估计可以联合training,从而提升整体结果。同样,其实可以把人体姿态估计跟人体相关的其他任务一起联合做数据的标注以及训练。这里可以考虑的包括人体分割(human segmentation),人体部位的parse (human parse)等。可以这么理解,human seg本身的标注可以认为是多边形的标注,我们可以在多边形轮廓上面进行采点,这几个任务可以很自然的联合起来。人体多任务的联合训练我觉得对于充分理解行人是非常有意义的,同时也可以提升各个任务本身的精度。当然潜在的问题是数据标注的成本会增加。另外可以考虑的是跨数据集的联合training,比如某个数据集只有skeleton标注,有个数据集只有seg标注等,这个问题其实也是工业界中很常见的一个问题。

    • Speed

    速度永远是产品落地中需要重点考虑的问题。目前大部分学术paper可能都是在GPU做到差不多实时的水平,但是很多应用场景需要在端上,比如手机的ARM上面进行实时高效的处理。我们之前有尝试过使用我们自己的ThunderNet [24]做人体检测,然后拼上一个简化版的CPN来做人体姿态估计,可以做到端上近似实时的速度,但是效果跟GPU上面还是有一定差距。所以速度的优化是非常有价值的。

    • UnConstrained 3D skeleton Benchmark

    这个我上面也有提到,3D人体姿态估计急需一个更大更有挑战的benchmark来持续推动这个领域的进步。随着很多3d sensor的普及,我理解我们不一定需要依赖传统的多摄像头的setting来做采集,这个使得我们能获得更真实,更wild的数据。

    后记

    这里只是从我个人的角度列了一些人体姿态估计的重要工作,当然其中可能miss了很多细节,很多重要的文献,但是我希望这个是一个引子,吸引更多的同学来一起投入这个方向,一起来推动这个领域的落地。因为我时刻相信人体姿态估计的进步,将会是我们真正从视觉角度理解行人的非常关键的一步。

    最后,希望借此也感谢一下我们R4D中做人体姿态估计的同学,感谢志成,逸伦,文博,斌一,琦翔,禹明,天孜,瑞豪,正雄等等,虽然可能有些同学已经奔赴各地,但是非常感谢各位的付出也怀念和大家一起战斗的时光 。

    Reference

    [1] Randomized Trees for Human Pose Detection, Rogez etc, CVPR 2018

    [2] Local probabilistic regression for activity-independent human pose inference, Urtasun etc, ICCV 2009

    [3] Strong Appearance and Expressive Spatial Models for Human Pose Estimation, Pishchulin etc, ICCV 2013

    [4] Pictorial Structures Revisited: People Detection and Articulated Pose Estimation, Andriluka etc, CVPR 2009

    [5] Latent Structured Models for Human Pose Estimation, Ionescu etc, ICCV 2011

    [6] Poselet Conditioned Pictorial Structures, Pishchulin etc, CVPR 2013

    [7] Learning Human Pose Estimation Features with Convolutional Networks, Jain etc, ICLR 2014

    [8] Convolutional Pose Machines, Wei etc, CVPR 2016

    [9] Stacked Hourglass Networks for Human Pose Estimation, Newell etc, ECCV 2016

    [10] Multi-Context Attention for Human Pose Estimation, Chu etc, CVPR 2017

    [11] Deeply Learned Compositional Models for Human Pose Estimation, ECCV 2018

    [12] Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields, Cao etc, CVPR 2017

    [13] Associative Embedding: End-to-End Learning for Joint Detection and Grouping, Newell etc, NIPS 2017

    [14] DeepCut: Joint Subset Partition and Labeling for Multi Person Pose Estimation, Pishchulin etc, CVPR 2016

    [15] DeeperCut: A Deeper, Stronger, and Faster Multi-Person Pose Estimation Model, Insafutdinov, ECCV 2016

    [16] Cascaded Pyramid Network for Multi-Person Pose Estimation, Chen etc, CVPR 2017

    [17] Rethinking on Multi-Stage Networks for Human Pose Estimation, Li etc, Arxiv 2018

    [18] Deep High-Resolution Representation Learning for Human Pose Estimation, Sun etc, CVPR 2019

    [19] Simple Baselines for Human Pose Estimation and Tracking, Xiao etc, ECCV 2018

    [20] 3D Human Pose Estimation = 2D Pose Estimation + Matching, Chen etc, CVPR 2017

    [21] A simple yet effective baseline for 3d human pose estimation, Martinez, ICCV 2017

    [22] Compositional Human Pose Regression, Sun etc, ICCV 2017

    [23] Densepose: Dense Human Pose Estimation in the Wild, Guler etc, CVPR 2018

    [24] ThunderNet: Toward Real-time Generic Object Detection, Qin etc, ICCV 2019

     

     

    人体姿态估计论文

    DeepPose: Human Pose Estimation via Deep Neural Networks(2014)

    DeepPose     2014     Google     自上而下

    paper link:https://arxiv.org/pdf/1312.4659.pdf

    github:https://github.com/mitmul/deeppose

    这是第一个将深度学习应用到人体姿态估计的方法。这篇文章使用深度神经网络构建了一个级联的回归网络来实现人体姿态估计。文章将人体姿态估计看作是一个人体关节的回归问题,文章认为这样做有两个好处:(1)深度神经网络有着捕获全局上下文信息的能力,每一个关节的回归器都用到整张图片的信息;(2)是这种表示方相对于图模型的方法要更简单,不需要设计人体部分(part)的特征表示或者检测器,也不需要设计人体关节之间的拓扑模型和交互。

    步骤:

    1.首先把整个图像作为输入,使用卷积神经网络来进行全局的特征提取,初步获得人体关节点的粗略估计

    2.将图像中所有的人体关节点坐标标准化,利用深度神经网络对关节点坐标进行回归。

    3.设计了级联姿态回归器,分阶段优化。利用前一阶段预测结果截取候选框(在获得初步的节点坐标之后,再在原始图片中根据该坐标选择一定的局部区域),扩充数据,增加细节,从而提高精度。

    解决的问题:

    1.如何使用全局观点获得关节点的坐标的问题,对于每一个关节点,都把整个图像作为输入,同时,使用卷积神经网络来作为全局的特征提取;

    2.对于节点的坐标在不同的图像中处理绝对坐标的问题,作者采用在每一个环节中,通过中点,长和宽选择一个bound box,然后计算节点在bound box中的坐标,从而将绝对坐标转换为统一的坐标;

    3.如何实现更高精度的坐标计算问题,作者提出的级联的卷积神经网络,在最初输入时,将图片设定为固定大小,通过缩放的方式将图片缩放到这个大小,在获得初步的节点坐标之后,再在原始图片中根据该坐标选择一定的局部区域,从而实现更高准确度的计算节点的坐标。

    数据集:FLICLSP

    性能指标(PCP)

    LSP0.56(大臂)0.38(小臂)0.78(大腿)0.71(小腿)

    FLIC0.8(大臂)0.75(小臂)0.71(大腿)0.5(小腿)

    Convolutional Pose Machines(2016)

    CPM     2016     Carnegie Mellon University     自下而上

    paper linkhttps://arxiv.org/pdf/1602.00134.pdf

    githubhttps://github.com/shihenw/convolutional-pose-machines-release

    https://github.com/CMU-Perceptual-Computing-Lab/convolutional-pose-machines-release

    算法的流程:

    1.在每个尺度下,计算各个部件的相应图

    2.对于每个关节点,累加所有尺度的响应图,得到总响应图

    3.每个关节点的总响应图上,找出相应最大的点,为该关节点的位置

                              

    第一阶段是一个基本的卷积网络,从彩色图像直接预测每个部件的响应。半身模型有9个部件,加上一个背景响应,共10层响应图。

    第二阶段在卷积层中段多了一个串联层(红色concat,把以下三个数据合一:阶段性的卷积结果46*46*32(纹理特征)、46*46*10前一阶段各部件响应(空间特征)、中心约束46*46*1(空间约束:是一个提前生成的高斯函数模板,用来吧相应归拢到图像中心。)

    第三阶段及后续阶段不再使用原始图像为输入,而是从前一阶段的中途取出一个深度为128的特征图作为输入。同样使用串联层综合三种因素:纹理特征+空间特征+中心约束。

    主要特点

    1.用各部件响应图来表达各部件之间的空间约束。响应图和特征图一起作为数据在网络中传递。

    2.网络分为多个阶段(stage)。各个阶段都有监督训练,避免过深网络产生的梯度消失、难以优化的问题。

    3.使用同一个网络,同时在多个尺度处理输入的特征和响应。既能确保精度,又考虑了各个部件之间的远距离关系。

    数据集MPIIFLICLSP

    性能指标PCK):

    MPII0.8795     LSP0.8432     FLIC0.9759(手肘)0.9503(手腕)

    Stacked Hourglass Networks for Human Pose Estimation(2016)

    Stacked Hourglass Networks     2016     University of Michigan      自上而下

    paper link:https://arxiv.org/abs/1603.06937

    githubhttps://github.com/princeton-vl/pose-hg-train

    2016年提出来的堆叠沙漏模型也取得了很高的精确度。网络总体思路是受ResNet的思路影响,希望综合考虑各尺度下不同的feature来让网络学习姿态。

    沙漏结构(单个沙漏)

    沙漏结构设计:可捕捉不同尺度下图片所包含的信息

    残差模块:提取较高层次的特征,同时保留原有层次的信息

    一阶沙漏:

                                  

    四阶沙漏:

    以上为单个沙漏模型。其实单个hourglass network 其实已经可以用来训练姿态估计了,关节点之间是可以互相参考预测的,所以将第一个沙漏网络给出的热力图作为下一个沙漏网络的输入,就意味着第二个沙漏网络可以使用关节点件的相互关系,从而提升了关节点的预测精度。因此要将单个沙漏级联。

             

    中间监督:下图的蓝色部分是输出的heat map。堆叠沙漏网络的每一个子沙漏网络都会有heat map作为预测,所以将每个沙漏输出的heat map参与到loss中,实验证实,预测精确度要远远好于只考虑最后一个沙漏预测的loss,这种考虑网络中间部分的监督训练方式,就叫做中间监督。

              

    数据集:FLICMPII

    性能指标 (PCK)FLIC手肘 0.99 (PCK@0.2)FLIC手腕 0.97                    MPII 0.909 (PCKh@0.5)

    Associative Embedding: End-to-End Learning for Joint Detection and Grouping(2017)  

    Associative Embedding     2017     University of Michigan,清华大学     自下而上

    paper linkhttps://arxiv.org/pdf/1611.05424.pdf

    github:https://github.com/princeton-vl/pose-ae-train

    模型结构:

    思想:

    该网络在堆叠沙漏基础上同时生成每个关节点的检测热图和联合嵌入的预测标签,每个关节点的热图都有对应的标签热图。因此,如果有m个身体关节需要预测,那么网络将输出总共2m个通道,m用于检测,m用于分组。为检测到个人,该网络使用非极大值抑制得到各关节的峰值检测并在同一像素位置检索相应的标记。然后通过比较检测的标签值,匹配那些足够接近的标签值,对身体各个部位的检测进行分组。一组检测形成一个人的姿态估计。

    为了训练网络,对输出热图施加检测损失和分组损失。

                          

    性能指标(AP)

    MPII 0.775MS-COCO test-std 0.663MS-COCO test-dev 0.655.

    Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields(2017) 

    OpenPose     2017     Carnegie Mellon University     自下而上

    paper linkhttps://arxiv.org/abs/1611.08050

    gitHubhttps://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation

    a)该方法以整个图像为输入(b/c)用一个双分支CNN来联合预测身体部位(b)关节点检测的置信度图(c)部位组织的亲和域(d)解析步骤执行一组双边匹配,以关联身体部位的候选。(e)最后将图中所有人组装成完整的身体姿态。

    网络结构:

                     

    步骤:

    1,使用置信图进行关节检测

    先使用 VGG19 的前十个层获得图片的特征,再将其输入后面的模块进行优化。一个阶段 中包含两个分支,一个分支用于回归关节点,另一个则回归关节点之间的链接。第一个阶段 的输入数据为 VGG 前十层得到的特征,而随后阶段的输入数据为前一个阶段的输出和特征。

    2,使用PAF进行身体部分组合

    对于多个人的问题,使用PAFPart Affinity Fields,部位亲和域)的方法将每个人的身体分别组合在一起。这个方法包含了位置和方向信息。每一种肢体在关联的两个部位之间都有一个亲和区域,其中的每一个像素都有一个2D 向量的描述方向。

    3,自底向上

    使用匈牙利算法(Hungarian algorithm)找到两两关节点最优化的连接方式。

                                       

    匈牙利算法

    本文讲述的是匈牙利算法,即图论中寻找最大匹配的算法,暂不考虑加权的最大匹配(用KM算法实现),文章整体结构如下:

    1. 基础概念介绍
    2. 算法的实现

    好的,开始!

    一. 部分基础概念的介绍

    我会严格介绍其定义,并同时用自己的大白话来重述。

    概念点1. 图G的一个匹配是由一组没有公共端点的不是圈的边构成的集合。

    这里,我们用一个图来表示下匹配的概念:

    如图所示,其中的三条边即该图的一个匹配;所以,匹配的两个重点:1. 匹配是边的集合;2. 在该集合中,任意两条边不能有共同的顶点。

    那么,我们自然而然就会有一个想法,一个图会有多少匹配?有没有最大的匹配(即边最多的匹配呢)?

    我们顺着这个思路,继续往下走。

    概念点2. 完美匹配:考虑部集为X={x1 ,x2, ...}和Y={y1, y2, ...}的二部图,一个完美匹配就是定义从X-Y的一个双射,依次为x1, x2, ... xn找到配对的顶点,最后能够得到 n!个完美匹配。

    这里有一个概念,有点陌生,即什么是二部图,这个其实很好理解,给定两组顶点,但是组内的任意两个顶点间没有边相连,只有两个集合之间存在边,即组1内的点可以和组2内的点相连,这样构建出来的图就叫做二部图(更好理解就是n个男人,n个女人,在不考虑同性恋的情况下,组成配偶)。这样是不是简单多了?

    既然说到了双双组成配偶,那我们干的就是月老做的活了,古话说得好,宁拆一座庙,不毁一桩婚,如果真的给出n个帅气的男孩,n个漂亮的女孩,他们之间互相有好感,但一个男孩可以对多个女孩有感觉,一个女孩也可能觉得多个男孩看起来都不错,在这种情况下,我们怎么让他们都能成双成对呢?

    将这个问题抽象出来,互有好感就是一条条无向边(单相思我们先不考虑),而男孩和女孩就是一个个节点,我们构建出这么一个图,而完美匹配就是让所有看对眼的男孩和女孩都能够在一起。

    完美匹配是最好的情况,也是我们想要的情况。

    当然,有些情况下我们做不到完美匹配,只能尽可能实现最多的配对,这个就叫做最大匹配。

    可以看出来,完美匹配一定是最大匹配,而最大匹配不一定是完美匹配。

    那么,作为月老的我们,核心目标就是找到最大匹配了。

    在我们思考如何完成这个艰巨的任务之前,我们引入几个可能不太好理解的概念。

    3.交错路径:给定图G的一个匹配M,如果一条路径的边交替出现在M中和不出现在M中,我们称之为一条M-交错路径

    而如果一条M-交错路径,它的两个端点都不与M中的边关联,我们称这条路径叫做M-增广路径

    举个例子:

    在上图中,有五条边,按照匹配的概念,2, 4两条加粗的边是一个匹配,目光锐利的你或许同时发现了,1, 3, 5是不是也是一个匹配呢?

    毫无疑问,是的。

    套用我们说的M-交错路径的概念,如果我们从2, 4 所构成的匹配M出发,会发现 1, 2, 3, 4, 5 这条路径是M的一条交错路径,同时它还满足两个端点都不与M中的边所关联。

    是不是发现个奇怪的地方呢?我们完全可以从1, 2, 3, 4, 5 这条路径中找到一个更大的匹配,而这个匹配比原先的匹配M多一条边,是一个比原先M更大的匹配!

    所以,我们寻找最大匹配的任务就相当于我们不断地在已经确定的匹配下,不断找到新的增广路径,因为出现一条增广路径,就意味着目前的匹配中增加一条边嘛!

    看起来复杂的问题,变成了寻找增广路径这么个解决问题的想法了。

    当图中再没有增广路径了,就意味着我们找到了该图的最大匹配了。

    说明下:我们这里所讨论的匹配,是图论中的任务分配问题,通常是针对于二部图发起的,想想也是,匹配不就是配对么,自然是两两成对了。

    好,基础概念介绍完了,我们接下来给个例子,探讨我们的匈牙利算法,它就是通过不断寻找增广路径的办法,打开了通向最大匹配的道路。

    二. 匈牙利算法

    下面我们讨论下匈牙利算法的内容:

    1. 给定一个图:

    前面已经说了,我们讨论的基础是二部图,而上图就是一个二部图,我们从上图的左边开始讨论,我们的目标是尽可能给x中最多的点找到配对。

    注意,最大匹配是互相的,如果我们给X找到了最多的Y中的对应点,同样,Y中也不可能有更多的点得到匹配了。

    刚开始,一个匹配都没有,我们随意选取一条边,(x1, y1)这条边,构建最初的匹配出来,结果如下,已经配对的边用粗线标出:

    2. 我们给x2添加一个匹配,如下图的(x2, y2)边。

    目前来看,一切都很顺利,到这里,我们形成了匹配M,其有(x1,  y1), (x2,  y2 ) 两条边。

    3. 我们现在想给x3匹配一条边,发现它的另一端y1已经被x1占用了,那x3就不高兴了,它就去找y1游说,让y1离开x1。

    即将被迫分手的x1很委屈,好在它还有其他的选择,于是 x1 妥协了,准备去找自己看中的y2

    但很快,x1发现 y2 被x2 看中了,它就想啊,y1 抛弃了我,那我就让 y2 主动离开 x2 (很明显,这是个递归的过程)

    x2 该怎么办呢?好在天无绝人之路,它去找了y5

    谢天谢地,y5 还没有名花有主,终于皆大欢喜。

    匹配如下:

    上面这个争论与妥协的过程中,我们把牵涉到的节点都拿出来:(x3, y1, x1, y2, x2, y5),很明显,这是一条路径P。

    而在第二步中,我们已经形成了匹配M,而P呢?还记得增广路径么,我们发现,P原来是M的一条增广路径!

    上文已经说过,发现一条增广路径,就意味着一个更大匹配的出现,于是,我们将M中的配对点拆分开,重新组合,得到了一个更大匹配,M1, 其拥有(x3,  y1),(x1,  y2),  (x2,  y5)三条边。

    而这,就是匈牙利算法的精髓。

    同样,x4 , x5 按顺序加入进来,最终会得到本图的最大匹配。

    得到这个结果后,我们发现,其实也可以把y4 让给 x6 , 这样x5 就会空置,但并不影响最大匹配的大小。

    总结:

    1. 匈牙利算法寻找最大匹配,就是通过不断寻找原有匹配M的增广路径,因为找到一条M匹配的增广路径,就意味着一个更大的匹配M' , 其恰好比M 多一条边。

    2. 对于图来说,最大匹配不是唯一的,但是最大匹配的大小是唯一的。

    数据集:MPIICOCO2016

    性能指标(mAP)0.797(MPII测试子集)   0.756(MPII完整测试集)   0.791(MPII验证集最佳结构)   0.653(COCO)

    RMPE: Regional Multi-Person Pose Estimation2017

    AlphaPose     2017     上海交通大学     自上而下

    paper link:https://arxiv.org/abs/1612.00137v3

    github:https://github.com/MVIG-SJTU/AlphaPose

    目标:在第一步中检测到的是不精准的区域框的情况下,仍能检测出正确的人体姿态

    大体流程:训练阶段,拿到图片用现有的单人检测,检测human proposal作为输入,分支SPPE的误差反向传播,使得STN调整bbox,得到更准确的bbox,再通过SPPE做姿态检索,将得到的所有pose proposalNMS,除去冗余pose,得到最终结果。

    对称空间变换网络和并行单人姿态估计(Symmetric STN and Parallel SPPE

                       

    步骤

    1、用SSD检测图中人物,获得人物候选框。

    2、将候选框输入到两个并行的分支里面,上面的分支是STN+SPPE+SDTN的结构,即空间变换网络(Spatial Transformer Networks + 单人姿态估计(Single Person Pose Estimation + 空间反变换网络(Spatial de-Transformer Networks)。不准确的检测框经过STN+SPPE+SDTNSTN对人体区域框中的姿态进行形态调整,输入SPPE做姿态估计后得到姿态线(人体骨骼框架),再用SDTN把姿态线映射到原始的人体区域框中,以此来调整原本的框,使框变成精准的。下面并行的分支充当额外的正则化矫正器。

    3、对候选姿态做parametric pose NMS(参数化姿态非极大值抑制)来消除冗余。

    性能指标(AP):MPII 0.723

    Cascaded Pyramid Network for Multi-Person Pose Estimation(2018)

    CPN     2018     清华大学     自上而下

    paper link:https://arxiv.org/abs/1711.07319

    github:https://github.com/chenyilun95/tf-cpn

    大致流程:

    文章核心提出一种使用自上而下的多人关键点估计方法。先检测人体,之后利用GlobalNet + RefineNet结构对单人目标回归人体关键点。一些比较容易识别出来的人体关键点,直接利用一个CNN模型就可以回归得到;而对于一些遮挡比较严重的关节点,则需要增大局部区域感受野以及结合上下文信息才能够进一步refine得到。

    首先对于可以看见的“easy”关键点直接预测得到,对于不可见的关键点,使用增大感受野来获得关键点位置,对于还未检测出的点,使用上下文(context)进行预测。

    GlobalNet的作用就是简单的前向CNN组成的回归模型,目的是回归得到一些易于识别的人体关键点位置,这里作者使用ResNet的网络架构回归heatmapRefineNet的目的则是利用GlobalNet产生的金字塔模型的特征图,融合多个感受野信息,最后concatenate所有的同一尺寸特征图进一步回归一些有歧义的关键点位置。

       

    1GlobalNet  

    A采用ResNet的不同Stage的最后一个残差块输出(C2C3C4C5)作为组合为特征金字塔;拿ResNet50来说,当输入大小为1×3×256×192时:  C2 = res2c1×256×64×48  C3 = res3d1×512×32×24  C4 = res4f1×1024×16×12  C5 = res5c1×2048×8×6  这样就构成特征金字塔。C2,C3具有较高的空间分辨率和较低语义信息,而C4,C5具有较低空间分辨率和更丰富的语义信息;将他们结合在一起,则即可利用C2,C3空间分辨率优势定位关键点,也可利用C4,C5丰富语义信息识别关键点

    B然后各层进行1×1卷积将通道都变为256  

    C将分辨率小的层上采样一次,在对应神经元相加,输出P2P3P4P5

    D输出:对每层,即P2P3P4P5都进行3×3卷积,再生成heatmaps

    2RefineNet  

    AGlobalNet4层输出P2P3P4P5分别接上不同个数的Bottleneck模块  

    B将这4路输出,上采样到同一分辨率,这里以P2路(64×48)为基础,P3路放大2倍,P4路放  4倍,P4路放大8  

    C4路按通道Concat一起,再接bottleneck,最后接输出层

    性能指标(AP):COCO 0.721

    Deep High-Resolution Representation Learning for Human Pose Estimation2019

    HRNet      2019     中国科学技术大学 ,微软亚洲研究院

    paper link:https://arxiv.org/pdf/1902.09212.pdf

    github:https://github.com/leoxiaobin/deep-high-resolution-net.pytorch

    特点:网络能在整个过程中都保持高分辨率的表示。

    该架构从作为第一阶段的高分辨率子网开始,逐步逐个添加高到低分辨率的子网,以形成更多的阶段并连接并行的多分辨率子网。通过在整个过程中反复进行跨越多分辨率并行子网络的信息交换来实现多尺度融合。

    使用重复的多尺度融合,利用相同深度和相似级别的低分辨率表示来提高高分辨率表示,反之亦然,从而使得高分辨率表示对于姿态的估计也很充分。因此,该网络预测的热图可能更准确。

     

                                       

     

    数据集:COCOMPII

    性能指标(AP):HRNet-W48COCO:关键点检测0.763、姿态估计0.770、多人姿态估计0.770

    https://www.jianshu.com/p/98c11545d4fb

    OpenPose算法解析

     

    1、人体姿态简介

      人体姿态估计是计算机视觉中一个很基础的问题。从名字的角度来看,可以理解为对“人体”的姿态(关键点,比如头,左手,右脚等)的位置估计。
      人体姿态估计可以分为两种思路,
    (1)“top-down”,它指先检测人体区域,再检测区域内的人体关键点。

    (2)“bottom-up”,它指先检测图片中所有的人体关键点,然后将这些关键点对应到不同的人物个体。这里需要提及一下,第一种方案因为需要对检测出的每个人体区域,分别做前向关键点检测,所以速度较慢,而OpenPose采用的则为第二种方案。

    2、OpenPose论文方案解读

    2.1 文章亮点

      已有"bottom-up"方法缺点:(1)未利用全局上下文先验信息,也即图片中其他人的身体关键点信息;(2)将关键点对应到不同的人物个体,算法复杂度太高。
      文章改进点:提出“Part Affinity Fields (PAFs)”,每个像素是2D的向量,用于表征位置和方向信息。基于检测出的关节点和关节联通区域,使用greedy inference算法,可以将这些关节点快速对应到不同人物个体。

    2.2 网络结构


      整个的技术方案为“two-branch multi-stage CNN”,如图,其中一个分支用于预测打分图confidence maps(S),另外一个分支用于预测Par Affinity Fields(L),也对应着heatmap与vectormap。
    其中
    ,表示heatmap,j表示要检测的关节数(可能加上background);
    ,表示vectormap,C表示要检测的关节对数。
      从图中还可以看出,网络的接收的输入是特征,然后经过和网络的处理后分别得到和。从开始,阶段网络的输入包括三部分: 。每个阶段网络的输入为:
    下图展示了CNN的两个分支计算的结果:

    上图(b)中表示检测到的关节点,一个部位对应了一张feature map,请注意图中高亮像素;
    上图(c)中表示检测到的一段躯干,同样的一个躯干对应一个feature map。

    2.3 Loss function

      损失函数是保证网络能收敛的最重要的关键点,因此作者对两分支的损失函数均采用L2 loss。训练时,每个阶段都会产生loss,避免梯度消失;预测时只使用最后一层的输出。公式表示如下:

    其中, 表示branch1 的label图,也称为heatmap; 是branch2 的label图,也称为vectormap。另外,考虑到有些训练数据集只标注了图片中部分人物的关节点,因此对损失函数采用了空域加权操作,W表示二值化mask矩阵,当位置p的标签缺失时其值为0,否则值为1。显然,对于未被标记的人物关节点  ,而被标记的人物关节点和非关节点 ,所以未被标记的人物关节点不会影响模型的学习过程,整个CNN网络架构的优化目标函数如下,

    2.4 计算heatmap( )与vectormap( )

       实际上就是使用2D高斯分布建模,求出一张图像上身体j部位的heatmap,记第k个人的第j个关节的heatmap为 , 表示位置信息,则有:

       表示了使用part affinity fields(PAF)建模骨骼区域,对于骨骼区域内的每一个像素,使用2D向量同时表征位置和方向信息,这里的方向指代当前骨骼对应的关节点对的连接方向,对应vectormap。以下图的骨骼区域为例

    其中,和分别表示关节与的位置坐标。分别表示人物索引与关节对索引,则有:
    其中,,表示位置指向位置的单位向量。
    图中绿色虚线框内的区域以点集表示,数学公式如下:
    其中,表示骨骼长度,表示骨骼的粗细,更多详细的信息可在后文中3.1中得到。

    2.5 关节拼接与多人检测(Multi-Person Parsing using PAFs)

      经过上述过程,我们已经得到各个关节点的坐标图--heatmap,与关节对连接的vectormap,现在的问题就是如何合理地在推理阶段将各个关节连接成一段骨骼,并将它们组装成一个人?
      关节拼接:对于任意两个关节点位置 和 ,通过计算PAFs的线性积分来表征骨骼点对的相关性,也即表征了骨骼点对的置信度,公式表示如下, 为了快速计算积分,一般采用均匀采样的方式近似这两个关节点间的相似度,    多人检测:由于图片中人数不确定,同时伴随遮挡、变形等问题,因此只使用上述计算关节对相似度,只能保证局部最优,因此作者利用greedy relaxation的思想生成全局较优的搭配。具体操作如下:
    (1)已知不同关节点的heatmap,也就是不同人的某个关节点的点集;
    (2)现在要将不同的点集进行唯一匹配,如:一群表示手肘的点集和手腕的点集,两点集中的点必须存在唯一匹配;
    (3)关节点之间的相关性PAF已知,将关键点作为图的顶点,将关键点之间的相关性PAF看为图的边权,则将多人检测问题转化为二分图匹配问题,并用匈牙利算法求得相连关键点最优匹配。

    二分匹配:二分图上进行匹配,一个点群中的点只与另一个点群中的点进行唯一匹配,即任意两条边没有公共顶点

    3、细节梳理

    3.1 COCO人体姿态数据集的格式

    3.2 为什么heatmap的channels是19,vectormap的channels是38?

      由上图可知,COCO数据集总共有18个关键点,17个肢体骨架,但heatmap多了一个背景图,vectormap多了耳朵和肩膀的肢体,为什末要虚构这麽一个肢体呢,因为有时候人体是背对相机的,眼睛这个关键点是不可见的,为了更好的预测耳朵,引入这两个个肢体(也就是关节对:2-16和5-17)。所以总共有19个肢体,应为vectormap为矢量,预测时分为x,y两个分量,所以有19*2=38

    3.3 tf-openpose人体姿态估计标签生成--heatmap--vectormap

      完全参考https://blog.csdn.net/m0_37477175/article/details/81236115,结合2.4节中vectormap( )的计算公式与绿色虚线框内的区域以点集数学公式理解。
      关键是叉乘的几何意义是两个向量所组成的平行四边形的面积,所以 就表示与向量 平行距离为 的区域,也就是骨骼宽度。

    3.4 改进

    后来论文作者对网络结构进行了改进,使得效果更好,速度更快,参考文献【11】。

     

    4、参考资料

    【1】Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
    【2】人体姿态估计的过去、现在和未来
    【3】论文解读-Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
    【4】Realtime Multi-Person 2D Pose Estimation Using Part Affinity Fields【菜鸟读者】
    【5】知乎:openpose笔记
    【6】openpose论文总结:Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
    【7】详细介绍匈牙利算法步骤
    【8】Github 项目 - OpenPose 关键点输出格式
    【9】openpose的细节处理
    【10】tf-openpose人体姿态估计标签生成--heatmap--vectormap
    【11】OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

     

    BlazePose

    PoseNet

    MediaPipe

    PoseEstimation-TFlite

     

    展开全文
  • 人体姿态估计

    2020-05-31 06:47:45
    人体姿态估计 人体姿态估计(Human Pose Detection)是计算机视觉中的一个重要分支,应用范围宽广,比如在自动驾驶行业进行街景中行人的姿态检测、动作预测;在安防领域的行人再识别问题,特殊场景的特定动作监控;...
  • 2D人体姿态估计综述

    千次阅读 2018-11-19 21:03:12
    本文主要介绍2D人体姿态估计的基本概念和相关算法,其中算法部分着重介绍基于深度学习的人体姿态估计算法的两个方向,即自上而下(Top-Down)的检测方法和自下而上(Bottom-Up)的检测方法。 前言:人体骨骼关键点...
  • 人体姿态估计总述

    2020-03-01 14:35:54
    人体姿态估计简述 一、总述 人体姿态估计分为单人姿态估计和多人姿态估计,其中单人姿态估计的识别率达到了90%加,已经没有很大提升空间,近些年来比较热门的是在coco数据集上做多人姿态估计识别率的提升。 多人姿态...
  • 3D人体姿态估计笔记

    千次阅读 2020-04-27 16:52:24
    人体姿态估计:估计人的关节点坐标(回归问题) RGB or RGBD 图像 or 视频 单目 or 多视角 单人 or 多人 2D or 3D 3D姿态 or 3D形态 2D姿态估计 任务 单人姿态估计 Benchmark: MPII (2014) 代表作: ...
  • 因为在ICIP2019上面和两位老师搞了一个关于人体姿态估计以及动作行为的tutorial,所以最近整理了蛮多人体姿态估计方面的文章,做了一个总结和梳理,希望能抛砖引玉。 问题 人体姿态估计是计算机视觉中一个很基础...
  • 点击我爱计算机视觉标星,更快获取CVML新技术概述这是一个移动设备上的摄像头应用,使用姿势预测模型通过摄像头实时检测人体的关键点。人体的关键点是指构建人体骨架所需的点,例如肩膀,肘部,膝...
  • 3D人体姿态估计总结

    千次阅读 2020-09-20 10:42:24
    3D人体姿态估计 姿态估计 人体姿态估计:估计人的关节点坐标(回归问题) RGB or RGBD 图像 or 视频 单目 or 多视角 单人 or 多人 2D or 3D 3D姿态 or 3D形态 2D姿态估计 任务 单人姿态估计 Benchmark: MPII (2014...
  • openpose人体姿态估计

    千次阅读 2020-03-23 19:12:29
    参考博客:Openpose驾驶员危险驾驶检测(抽烟打电话) 人体姿态识别模型—openpose OpenPose人体姿态识别项目是美国...是世界上首个基于深度学习的实时多人二维姿态估计应用。 参考:Github开源人体姿态识别项目Ope...
  • 人体姿态估计的目的是通过图像、视频等输入数据定位人体部位,构建人体表征(如人体骨架)。在过去的十年中,它受到了越来越多的关注,并被广泛应用于人机交互、运动分析、增强现实和虚拟现实等领域。
  • 支持向量数据描述(SVDD)算法是解决单类分类问题的最好方法之一,在人体姿态估计问题中获得了成功的应用,在建立部位外观模型方面取得了良好的效果,但现有利用SVDD算法建立的部位外观模型将所有训练样本和样本不同...
  • 那么系统如何发现这种行为,其中就需要人体姿态估计。 相对于传统方法,只识别人体来数人数有一个问题,就是如果乘客之间发生遮挡,或者后排乘客没有露出面部,就会找不到乘客。 使用人体姿态估计的方法就可以在上述...
  • 人体姿态估计概述

    千次阅读 2020-02-22 11:47:18
    一,人体关键点检测,也称为人体姿态检测。 人体骨架是以图形形式对一个人的方位所进行的描述。本质上,骨架是一组坐标点,可以连接起来以描述该人的位姿。...二,人体姿态估计总的来说有两种方式:...
  • 本文设计了一套手机使用状态监控系统, 先采用YOLOv3检测图像中的人体, 然后通过OpenPose姿态估计算法获得人体关节点, 再通过YOLOv3判断手部区域是否有手机, 最后通过神经网络分类器识别当前的手机使用状态....
  • 一种用于人体姿态估计的强大算法,可以检测并且定位人体的四肢及躯干和头部的位置,用于更高层次的分析。 (Pose estimation) 文件列表: parse_matlab parse_matlab\parseHorse.m parse_matlab\condenseLRResp.m ...
  • 2020CVPR人体姿态估计论文盘点

    千次阅读 2020-06-26 22:41:10
    Hey,今天总结盘点一下2020CVPR论文中涉及到人体姿态估计的论文。人体姿态估计分为2D(6篇)和3D(11篇)两大类。 2D 人体姿态估计 [1].UniPose: Unified Human Pose Estimation in Single Images and Videos ...
  • 重新思考人体姿态估计–2D人体姿态估计基本任务的研究问题、意义和应用 1.基本定义:从单张RGB图像中,精确地识别出多个人体的以及其骨架的的稀疏的关键点位置。 2.基本任务:定位图像中人体的关键点位置,并确定...
  • 人体姿态估计-DeepPose

    千次阅读 2019-04-26 13:30:36
    基于深度神经网络的人体姿态估计算法——DeepPose 文章目录基于深度神经网络的人体姿态估计算法——DeepPose参考简介关键点坐标的表示方式网络结构Initial StageCascade实现总结 参考 DeepPose: Human Pose ...
  • 因为在ICIP2019上面和两位老师搞了一个关于人体姿态估计以及动作行为的tutorial,所以最近整理了蛮多人体姿态估计方面的文章。所以做了一个总结和梳理,希望能抛砖引玉。 问题 人体姿态估计是计算机视觉中一个很...
  • 3D 人体姿态估计简述

    2021-08-27 13:30:12
    0 前言3D Human Pose Estimation(以下简称 3D HPE )的目标是在三维空间中估计人体关键点的位置。3D HPE 的应用非常广泛,包括人机交互、运动分析、康复训练...
  • Human Pose Estimation人体姿态估计综述调研

    万次阅读 多人点赞 2018-08-23 11:44:05
    给定一幅图像或一段视频,人体姿态估计就是去恢复其中人体关节点位置的过程。 数据集 LSP 地址:http://sam.johnson.io/research/lsp.htm 样本数:2K 关节点个数:14 全身,单人 FLIC 地址:...
  • 人体姿态估计调研

    2021-06-23 19:00:07
    点击上方“计算机视觉工坊”,选择“星标”干货第一时间送达基于视觉的单目人体姿势估计是计算机视觉中最基本和最具挑战性的问题之一,旨在从输入图像或视频序列中获取人体姿势。本文调查2014年以来...
  • 26页2D/3D人体姿态估计综述,共计297篇参考文献!本文对基于深度学习的2D和3D人体姿态估计解决方案进行全面回顾,并介绍了相关数据集和评估指标,最后还对各种技术进行了性能比较。 注:文末附**【人体姿态估计】**...
  • 人体姿态估计(Human Pose Estimation)文献综述

    万次阅读 多人点赞 2018-07-13 20:12:57
    维基百科对人体姿态估计的定义如下: Articulated body pose estimation in computer vision is the study of algorithms and systems that recover the pose of an articulated body, which consists of joints ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,515
精华内容 1,406
关键字:

人体姿态估计应用