xskxushaokai
xskxushaokai
关于第2点,按照我的理解举个例子吧: 构造groundtruth label的时候(假设先抛开高斯平滑来说), 将FM做为网络最后一层feature maps label,则FM[0]为center点map,假设途中有两个人,则在FM[0]上有两个亮点——其坐标分别为(x0,y0),(x1,y1);FM[1]为第一个关节点的x方向上的偏移map,则在FM[1]上坐标为(x0,y0),(x1,y1)处也会出现两个两个亮点,取值分别为bias0_0, bias0_1 (关节点1相对于center点的偏移);FM[3]为第二个关节点的x方向上的偏移map,则在在FM[3]上坐标同样为(x0,y0),(x1,y1)处也会出现两个两个亮点,取值分别为bias1_0, bias1_1 (关节点2相对于关节点1的偏移);以此类推所有的关节点map。 (x0,y0),(x1,y1)....... 这些赋值的点的坐标在每个关节点map上都是相同的的即center点坐标;你的代码里这些点取了父节点的坐标,因此在每个关节点map上是不相同的。 这两种不同的预测方式是否会影响模型效果我不确定……
@ManiaaJia 我的意思回归的值是子节点相对于父节点的值,回归的位置都在中心点处,你可以再仔细推敲一下我上面的例子,跟你的理解是一致的。@murdockhou 的代码跟我说的意思是不同的 > @xskxushaokai 我认为你的意思是全部关节点都从中心点回归; > > 不过论文提到由于长距离偏移比较难度可能较大,因此,作者将SPR扩展到了分层表示,子节点由父节点负责回归,也就是这里说的“父jioint的偏移值来学习子joint的位置”; > > 事实上objects as points 采用的应该是你所说的全部关节从中心点回归的策略,但是这篇文章作者也使用了原始的热图来提的关键点位置作为最终的结果,应该是也说明了长距离偏移不容易学习。
@murdockhou 我跟你的意思唯一不同的一点就是子节点回归的位置,我的理解是即使是分层的SPR,子节点回归的位置也是再center点处,只是回归的值对于原始SPR变成了相对父节点的偏移。这样我在预测的时候只要一次性把所有feature map上center点位置的值取出来,依次累加便得到了所有关节点的值,而你的方式需要先得到父节点的坐标,再去子节点的map上拿该坐标处的值。也就是你的方法取值的位置是根据父节点位置不断变化的,我的方法取值的位置始终固定在center点处。 我认为固定位置有几个好处:1.网络在回归最后一层feature maps的时候,热图的分布是统一的,只去回归偏移量即可;2.后处理优化空间大。 当然第1点好处不是绝对的,如果你网络能力足够,同样能够把热图的分布也学进去。
@ManiaaJia 确实,有一定的道理,还需要实验验证
@zhly0 你跟我的理解应该是相同的,不过这样是否更好回归还不确定,需要实验验证
@murdockhou 是的
> @xskxushaokai 你的pytorch版本 spm训练的如何? 我按照之前改的label生成方式去训练, 发现第一级的回归值特别大, 例如 center point -> right shoulder这个offset特别大, 但right shoulder->right elbow是正确的. 我训练了5个epoch, 模型能够学习出来第二级到第三级, 第三级到第四级的offset, 但从center point到其它位置的offset没有办法很好的学习出来. 我目前在pytorch下能够正常训练,但在COCO上训练的AP难以突破0.4,瓶颈似乎是不同大小的目标训练的效果有差异,小目标学的较差。
label格式转换可使用https://github.com/GengDavid/pytorch-cpn/blob/master/label_transform.py 我用的label格式与cpn单人姿态估计的label格式相同。