Single-Stage-Multi-person-Pose-Machines icon indicating copy to clipboard operation
Single-Stage-Multi-person-Pose-Machines copied to clipboard

关于Z值和keypoints map中亮点所在位置的两个问题

Open xskxushaokai opened this issue 4 years ago • 56 comments

感谢实现! 基于你的代码移植了pytorch版本,过程中发现两个问题。

  1. 论文中Z值取了输出map的长宽均方根,为了对回归值做归一化,你的实现中Z值取了1,有可能导致回归不好学吧,不知道你的模型表现如何?

  2. 按照我对paper的理解,每个joint map 上亮点应该放在每个人的center点位置处,你的实现里把子joint map上的亮点放在了父joint点的位置处,不确定这样会不会影响模型效果,特别是多人场景目标离得很近或重叠的时候。

xskxushaokai avatar Nov 26 '19 04:11 xskxushaokai

  1. 我试过取平方根做归一化, 但loss计算的时候发现特别特别小, 我就直接取1了, 效果还行, 不过你可以尝试下使用论文的方法来做
  2. 我不是很明白你的意思, 论文是通过父jioint的偏移值来学习子joint的位置, 是个回归操作, 并不是类似之前的直接对每一个关键点学习一个heatmap

xskxushaokai [email protected] 于2019年11月26日周二 下午12:16写道:

感谢实现! 基于你的代码移植了pytorch版本,过程中发现两个问题。

论文中Z值取了输出map的长宽均方根,为了对回归值做归一化,你的实现中Z值取了1,有可能导致回归不好学吧,不知道你的模型表现如何? 2.

按照我对paper的理解,每个joint map 上亮点应该放在每个人的center点位置处,你的实现里把子joint map上的亮点放在了父joint点的位置处,不确定这样会不会影响模型效果,特别是多人场景目标离得很近或重叠的时候。

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/murdockhou/Single-Stage-Multi-person-Pose-Machines/issues/5?email_source=notifications&email_token=AEMCC7IXO2SZZH2QXT4AXWDQVSPIPA5CNFSM4JRSGA2KYY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4H375GFQ, or unsubscribe https://github.com/notifications/unsubscribe-auth/AEMCC7J7TMIZYBRGATEWBETQVSPIPANCNFSM4JRSGA2A .

murdockhou avatar Nov 27 '19 01:11 murdockhou

关于第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上是不相同的。 这两种不同的预测方式是否会影响模型效果我不确定……

xskxushaokai avatar Nov 27 '19 02:11 xskxushaokai

@xskxushaokai 我认为你的意思是全部关节点都从中心点回归;

不过论文提到由于长距离偏移比较难度可能较大,因此,作者将SPR扩展到了分层表示,子节点由父节点负责回归,也就是这里说的“父jioint的偏移值来学习子joint的位置”;

事实上objects as points 采用的应该是你所说的全部关节从中心点回归的策略,但是这篇文章作者也使用了原始的热图来提的关键点位置作为最终的结果,应该是也说明了长距离偏移不容易学习。

ManiaaJia avatar Nov 27 '19 07:11 ManiaaJia

@ManiaaJia 我的意思回归的值是子节点相对于父节点的值,回归的位置都在中心点处,你可以再仔细推敲一下我上面的例子,跟你的理解是一致的。@murdockhou 的代码跟我说的意思是不同的

@xskxushaokai 我认为你的意思是全部关节点都从中心点回归;

不过论文提到由于长距离偏移比较难度可能较大,因此,作者将SPR扩展到了分层表示,子节点由父节点负责回归,也就是这里说的“父jioint的偏移值来学习子joint的位置”;

事实上objects as points 采用的应该是你所说的全部关节从中心点回归的策略,但是这篇文章作者也使用了原始的热图来提的关键点位置作为最终的结果,应该是也说明了长距离偏移不容易学习。

xskxushaokai avatar Nov 27 '19 07:11 xskxushaokai

@xskxushaokai 子节点回归的位置确实都是在父节点的地方, 因为本来就是按照父节点的位置找一个offset求得子节点位置, 这样才能判断哪些点是组成同一个人的关节点.

我还是不是很理解你说的是什么意思, 你认为是只从一个center point回归出所有的关节点效果会不好吗?

murdockhou avatar Nov 27 '19 07:11 murdockhou

@murdockhou 我跟你的意思唯一不同的一点就是子节点回归的位置,我的理解是即使是分层的SPR,子节点回归的位置也是再center点处,只是回归的值对于原始SPR变成了相对父节点的偏移。这样我在预测的时候只要一次性把所有feature map上center点位置的值取出来,依次累加便得到了所有关节点的值,而你的方式需要先得到父节点的坐标,再去子节点的map上拿该坐标处的值。也就是你的方法取值的位置是根据父节点位置不断变化的,我的方法取值的位置始终固定在center点处。 我认为固定位置有几个好处:1.网络在回归最后一层feature maps的时候,热图的分布是统一的,只去回归偏移量即可;2.后处理优化空间大。 当然第1点好处不是绝对的,如果你网络能力足够,同样能够把热图的分布也学进去。

xskxushaokai avatar Nov 27 '19 08:11 xskxushaokai

我也理解错了你的意思...不过你说的也很有道理,所说的两点好处应该是存在的;

但是我认为这样的偏移可能在另一种角度来看是比较难学的:我觉得在父节点放置子节点偏移响应的好处主要是在空间上编码了相对易学的躯干信息(事实上我觉得PAF有效的来源也就是编码了躯干信息)供网络学习,但是强制的将这样的响应搬到人体的中心位置可能会失去这样的“连续性”;

当然只是另一种角度的猜想,总之还是实验看看吧 (PS:受益很多,谢谢两位大佬)

ManiaaJia avatar Nov 27 '19 14:11 ManiaaJia

@xskxushaokai ,个人觉得,文章里面的意思是从center point里面回归所有的值,只不过所有的值,是指的相对于上一个层级的偏置。这样更合理一点,更好回归一点。

zhly0 avatar Nov 28 '19 01:11 zhly0

@ManiaaJia 确实,有一定的道理,还需要实验验证

xskxushaokai avatar Nov 28 '19 01:11 xskxushaokai

@zhly0 你跟我的理解应该是相同的,不过这样是否更好回归还不确定,需要实验验证

xskxushaokai avatar Nov 28 '19 01:11 xskxushaokai

@xskxushaokai sorry, 我理解了你的意思, 假如有个路径, 是从center point -> neck -> head, 我的做法是先找到center point, 然后根据上面的偏移去找neck点, 找到neck点的位置, 在heatmap上找到neck点位置对应的偏移找head点. 你的意思是center point直接回归出2个点的偏移, 一个是neck, 另外一个是相对于neck点偏移的head, 但都是在center point位置处, 不知道这样说对不对?

我也无法确定哪种理解是正确的, 等作者开源吧

murdockhou avatar Nov 28 '19 02:11 murdockhou

@murdockhou 是的

xskxushaokai avatar Nov 28 '19 02:11 xskxushaokai

@murdockhou @ManiaaJia @xskxushaokai 不知道几位有没有验证过center点的想法? 1,目前将HRnet替换为其他网络后,很多手部的节点识别不好,不知道有没有更好的提升精度办法,试过用了整个目标作为mask和节点label区域作为mask,区别不明显,只是featuremap上更干净些; 2,另外我试过将Z归一化,效果和不归一化差异不大;

uestcjackey avatar Dec 14 '19 03:12 uestcjackey

@xskxushaokai @uestcjackey @ManiaaJia @zhly0 刚才又看了下论文以及之前和作者的讨论, 作者关于center点的offset处理确实是采用了 @xskxushaokai 说的方法, 这是作者回复我的:

关于hierarchical SPR,我们只预测了root joint的heatmap。对于其他joints,我们会预测某一个joint相对于其parent joint的offset,并将此offset按顺序排列起来。做inference的时候,我们会先取出root joint的位置,然后依次按顺序去累加每个joint相对于其parent joint的offset,以得到每个joint的位置。具体可以参考文章中Eqn. (6), (7) and (8).

按照这段话的意思应该就是只预测出一个root 点, 然后直接在root点上回归出N个joint的offset, 只不过这个offset是hierarchical的, 而不是像Objects As Points中那样, 直接回归N个joint相对于center点的offset的, 我会在代码中进行更改并测试训练结果.

murdockhou avatar Dec 29 '19 02:12 murdockhou

@xskxushaokai 你的pytorch版本 spm训练的如何? 我按照之前改的label生成方式去训练, 发现第一级的回归值特别大, 例如 center point -> right shoulder这个offset特别大, 但right shoulder->right elbow是正确的. 我训练了5个epoch, 模型能够学习出来第二级到第三级, 第三级到第四级的offset, 但从center point到其它位置的offset没有办法很好的学习出来.

murdockhou avatar Jan 17 '20 02:01 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,瓶颈似乎是不同大小的目标训练的效果有差异,小目标学的较差。

xskxushaokai avatar Jan 19 '20 06:01 xskxushaokai

@xskxushaokai 方便共享下你的pytorch代码吗?

murdockhou avatar Feb 05 '20 02:02 murdockhou

@xskxushaokai 作者说训练了100个epoch,测试用了6个带flip的尺度(所以单张图片一共要前传12次),这样的话单尺度精度在40左右是可能的,但是前传时间是58ms,这有点奇怪吧,应该是单张前传58ms(符合HourGlass的网络规模),12次前传的话可能要12x58=686ms,实际上PAF单尺度的我复现的精度的mAP也只有40+,多尺度+flip才有60+的mAP。

kohillyang avatar Feb 13 '20 09:02 kohillyang

原论文中有这样的话: 捕获 这里说前传是多尺度的,多尺度下不太可能速度还能到58ms,

参考文献3就是PAF,但是就我对PAF所知,PAF里没有类似对其做refinement的步骤,所以不知道这个refinement是干啥的。

kohillyang avatar Feb 13 '20 09:02 kohillyang

@murdockhou 请问一下有没有考虑过将SPM和CenterNet融合呢,在CenterNet code的基础上添加SPM呢

Dantju avatar Feb 27 '20 05:02 Dantju

@murdockhou 另外我看code是用AI challenger数据集来训练 ,目前下载不到这个数据集,能否分享这个数据集呢,或者能分享一下在COCO数据集上训练的code吗

Dantju avatar Feb 27 '20 07:02 Dantju

@murdockhou 请问一下有没有考虑过将SPM和CenterNet融合呢,在CenterNet code的基础上添加SPM呢 你好,个人认为SPM只是在CenterNet的基础上增加了一个Hierarchical SPR表示, CenterNet在姿态估计上的输出也比SPM具有更好地有效性及可解释性,个人觉得SPM这篇文章大概率很多算法实现的东西没有写。Hierarchical SPR这种表示方式,对于现实复杂数据基本很不友好,所以直接放弃了这东西

nickshawn avatar Mar 02 '20 09:03 nickshawn

@Dantju SPM和centernet其实没有融合的必要,二者都是对关键点表述的两种不同的方式,没有必要强行融合. AI数据集放在了公司服务器上,上传很慢,你可以修改源码去训练COCO数据集,主要是在label的生成那里,并不是特别麻烦

murdockhou avatar Mar 03 '20 00:03 murdockhou

@murdockhou 你好,可以分享下新的coco_keypoint_train.jasn或者转换code吗

Dantju avatar Mar 03 '20 08:03 Dantju

@Dantju 没有做过这个工作,你可以修改源码适应COCO的label

murdockhou avatar Mar 04 '20 01:03 murdockhou

我看最新的code里面读入的是12个点的coco_keypoint.json,请问一下你的code有在coco上测试吗,目前的效果能达到多少,跟paper中的结果相比呢

Dantju avatar Mar 04 '20 01:03 Dantju

@murdockhou 请问对coco_keypoint_train.json有做什么操作,目前我将coco的keypoint改为12个点,其他没有改动,在跑code的时候遇到错误,想知道是否还有哪里没有改动

Dantju avatar Mar 04 '20 08:03 Dantju

change_coco_17kps_12kps.zip @Dantju 参考下这个文件里的转换代码和转换后的json文件

murdockhou avatar Mar 05 '20 01:03 murdockhou

@murdockhou ,我用custom_train.py和keras_train.py都会报错,用main.py可以跑,只不过这个是单GPU,看起来训练很慢,大概要训练多长时间呢

Dantju avatar Mar 05 '20 06:03 Dantju

@xskxushaokai 方便共享下你的pytorch代码吗

Dantju avatar Mar 05 '20 08:03 Dantju