zoukankan      html  css  js  c++  java
  • (^_^)Pose Estimation:SamplePose

    人体姿态估计和评价指标

    人体姿态估计可以细分成四个任务:

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

    单人姿态估计: 输入是切割出来的单个行人,然后再找出行人的关键点,使用的方法也就是自顶向下(Topdown),先检测人的bounding box,再用one-stage的方法检测每个人的骨骼关键点(landmark),常使用的benchmark数据集MPII,使用的是PCKh的指标(可以认为预测的关键点与GT标注的关键点经过head size normalize后的距离)。但是经过这几年的算法提升,整体结果目前已经非常高了(最高的已经有93.9%了)。

     多人姿态估计: 输入是一张整图,可能包含多个行人,目的是需要把图片中所有行人的关键点都能正确的做出估计,同样有两种方法:自顶向下(top-down)、自底向上(bottom-up)。对于top-down的方法,往往先找到图片中所有行人,然后对每个行人做姿态估计,寻找每个人的关键点。单人姿态估计往往可以被直接用于这个场景。对于bottom-up,思路正好相反,先是找图片中所有parts (关键点),比如所有头部,左手,膝盖等。然后把这些parts(关键点)组装成一个个行人。使用的是OKS(object keypoint similarity指标。

    $OKS_{p}=frac{sum_{i}exp {-d_{pi}^{2}/2S_{p}^{2} sigma_{i}^{2}} delta(upsilon_{pi}>0)}{sum_{i}delta(upsilon_{pi}>0)}$

     参数详细解释,其中:

    $p$ 表示当前图片所有groundtruth行人中id为$p$的人,$pin(0,M)$,$M$表示当前图中共有行人的数量
    $i$ 表示id为$i$的keypoint
    $d_{pi}$ 表示当前检测的一组关键点中id为i ii的关键点与groundtruth行人中id为$p$的人的关键点中id为$i$的关键点的欧式距离,$d_{pi}=(x_{i}'-x_{pi})(y_{i}'-y_{pi})$,$(x_{i}', y_{i}')$为当前的关键点检测结果,$(x_{pi}, y_{pi})$为groundtruth
    $S_{p}$表示groundtruth行人中id为$p$的人的尺度因子,其值为行人检测框面积的平方根:$S_{p}=sqrt{wh}$,$w$ 、 $h$为检测框的宽和高
    $sigma_{i}$ 表示id为$i$类型的关键点归一化因子,这个因子是通过对所有的样本集中的groundtruth关键点由人工标注与真实值存在的标准差,$sigma$越大表示此类型的关键点越难标注。根据[1]中所述,对coco数据集中的5000个样本统计出17类关键点的归一化因子,$sigma$的取值可以为:{鼻子:0.026,眼睛:0.025,耳朵:0.035,肩膀:0.079,手肘:0.072,手腕:0.062,臀部:0.107,膝盖:0.087,脚踝:0.089},因此此值可以当作常数看待,但是使用的类型仅限这个里面。如果使用的关键点类型不在此当中,可以使用另外一种统计方法计算此值,详细见下文
    $v_{pi}$​ 表示groundtruth中id为$p$的行人第$i$个关键点的可见性,其中$v_{pi}=0$表示关键点未标记,可能的原因是图片中不存在,或者不确定在哪,$v_{pi}=1$表示关键点无遮挡并且已经标注,$v_{pi}=2$表示关键点有遮挡但已标注。同样,预测的关键点有两个属性:$v_{pi}^{prime}=0$表示未预测出,$v_{pi}^{prime}=1$表示预测出
    $ delta(*)$表示如果条件$*$成立,那么$delta(*)=1$,否则$delta(*)=0$,在此处的含义是:仅计算groundtruth中已标注的关键点$OKS$

     人体姿态跟踪: 输入的是视频,对视频中的每一个行人进行人体以及每个关键点跟踪,相比行人跟踪来讲,人体关键点在视频中的temporal motion可能比较大,比如一个行走的行人,手跟脚会不停的摆动,所以跟踪难度会比跟踪人体框大。目前主要有的数据集是PoseTrack。

    3D人体姿态估计: 输入的是RGB图像,输出3D的人体关键点的话,就是3D 人体姿态估计。这个有一个经典的数据集Human3.6M。
    目前主要的难点: 图像的复杂性-遮挡(不可见)、拥挤,算法的复杂度。

    SimplePoseNet

    论文:https://arxiv.org/pdf/1804.06208.pdf

    pytorch实现:https://github.com/Microsoft/human-pose-estimation.pytorch

    tensorflow实现:https://github.com/mks0601/TF-SimpleHumanPose

    这篇文章开发的单人姿态估计模型SimplePoseNet简单高效,是2018年COCO人体关键点挑战赛的亚军,使用top-down策略,在COCO测试集上取得mAP=73.7。

    模型结构

    模型结构非常简单:

    网络特点

    1. 网络直接在基础网络后面接反卷积作为上采样,没有构建金字塔特征结构
    2. 使用反卷积作为上采样,添加可训练参数,增加网络的非线性,使得网络能够更好的表达特征。在上采样upsampling目前主要存在三种常用方式:
    双线性插值(bilinear)---在语义分割中用的比较多的一种方式,例如FCN和一些带金字塔结构的网络,在不增加网络复杂性的情况下,实现特征的扩张,近似还原高层特征,既含有位置信息又有语义信息,具体实现源码不记录。
    反池化(unpooling)---原理:记录下max-pooling在对应kernel中的坐标,在反池化过程中,将一个元素根据kernel进行放大,根据之前的坐标将元素填写进去,其他位置补0. 感觉没啥用,在segNet中有源码。
    反卷积(deconvolution)---反卷积的具体实现源码,不做讨论,但是要会用。记录下卷积以及反卷积的输出out与输入in在caffe和tensorflow中的不同关系:

    卷积:
    caffe:caffe架构中conv和pooling层输出尺寸的计算方法

    tensorflow:

    valid(不进行补0)

     $out=floor((in-k)/s)+1$

     same(进行补0)

     $out=ceil(in/s)$

     反卷积:

    caffe:

    $out=(in-1)*s+k-2*p$

     tensorflow:

    valid(不进行补0)

    $out=in*s+max(k-s, 0)$

    same(进行补0)

    $out=in*s$

     3. 具体结构:

    第一部分:基础特征提取器---Resnet(进行5次下采样)
    第二部分: 连续3个反卷积,每个反卷积参数设置相同
    第三部分: 1个1*1卷积层,使得输出热图个数为关键点个数
    4. 损失函数:
    MSE均方误差-L2loss

    算法效果

    在coco数据集上关键点检测取得了不错的效果:

    1. 参数设置实验:

    2. Hourglass、CPN、SimplePoseNet 对比

    3. 多种方法综合对比

    视频轨迹追踪

    文中还介绍了使用SimplePoseNet进行轨迹跟踪的一套流程。流程中主要的方法依赖于ICCV 17PoseTrack Challenge 提出的算法,首先使用MaskRcnn来进行多行人检测,在视频第一帧中每个检测到的人给一个id,然后之后的每一帧检测到的人都和上一帧检测到的人通过某种度量方式(文中提到的是计算检测框的IOU)计算一个相似度,将相似度大的作为同一个id,没有匹配到的分配一个新的id。
    创新的改进点:
    1. 使用光流法对检测框进行补充,目的避免有些行人没有被检测到,文中给出例子,如下图c
    2. 使用OKS代替代替检测框的IOU来计算相似度,具体是使用光流法计算某一帧的关键点会出现在的另外一帧的位置,然后用这个计算出来的位置和这一帧检测出来的关键点之间计算OKS,以此作为两帧之间的不同人的相似度值。
    跟踪示意图:

    Reference

    [1] https://blog.csdn.net/ZXF_1991/article/details/104609002

    [2] https://github.com/mks0601/TF-SimpleHumanPose

    [3] https://zhuanlan.zhihu.com/p/109118177

    [4] https://blog.csdn.net/ZXF_1991/article/details/104279387

    [5] https://blog.csdn.net/ZXF_1991

  • 相关阅读:
    svn:ignore 设置忽略文件
    Css让文字自适应Table宽度[转]
    自学python笔记
    java代码中添加log4j日志
    maven多模块项目搭建
    js || 与&&
    java内存溢出和tomcat内存配置
    xsl:for-each中引用循环外全局变量
    quartz启动两次(tomcat)
    pymysql简单封装
  • 原文地址:https://www.cnblogs.com/nanmi/p/13669393.html
Copyright © 2011-2022 走看看