xggIoU / centernet_tensorflow_wilderface_voc

This is the unofficial implementation of the "CenterNet:Objects as Points".Just a simple try with self-modified shufflenetv2 and yolov3.If you want better results, you need more experiments.
MIT License
111 stars 25 forks source link

关于loss #10

Open murdockhou opened 5 years ago

murdockhou commented 5 years ago

你好, 感谢你的实现,有些细节处想和你请教下:

官方版本的label是只把center这一个点当作true, 剩下的都是负样本来计算focal_loss, focal_loss里面会找哪些位置的点的值是1, 但由于是在center附近打的一个高斯核, center处并不一定能保证是1? 或者说由于打得是个高斯核, center处有可能无限趋近于1但不是1, 在focal_loss里会去寻找哪些位置是1, 如果没有的话, 不就是整张图都是负样本吗? 还是说有哪些地方确实可以让focal_loss去找到这个1的值的位置? 我在官方的源码里没有看大明白, 但个人猜测是根据生成的center_mask来确保哪些点是1然后再送进去focal_loss? 但我没有在你的实现里找到相应的操作, 不知能否解释下? 万分感谢 ~

xggIoU commented 5 years ago

label是以center point 打高斯核,有目标就一定有个1。create_label.py 中draw_msra_gaussian函数就是在中心点出搞个高斯核

murdockhou commented 5 years ago

是这个样子, 我想差了. 不过我测试了下你的draw_msra_gaussian代码, 我传入 b = draw_msra_gaussian(a, (4,5), 2.5), 其中a是 10x11全零的矩阵, 然后我运行 np.where(b==1), 得到的坐标值是(6,5)并不是(5,4), 传入的center值是(3,4)时候, np.where(b==1)得到的值是(5,4), 代码是否哪里有些问题?

murdockhou commented 5 years ago

还有个问题, 就是网络输出的center和reg是经过sigmoid, 而size则是经过relu的, 好像官方源码里没有这么写?

xggIoU commented 5 years ago

draw_msra_gaussian是从官方源码搞过来的,没有测试过,不过这点差距应该不影响。最后的预测head激活是我自己加的。官方貌似是3X3conv+relu+1x1conv

xggIoU commented 5 years ago

我在尝试多目标检测的时候发现很难收敛,即使收敛了也要训练很久很久,检测效果也差,如果你有什么能解决这个问题的方法,请告诉我。

murdockhou commented 5 years ago

有一个想法是不使用focal_loss做点的分类, 而是使用l2_loss计算. 因为这个centernet预测中心点的方式和人体姿态估计领域里, 预测多个关节点的目的是一样的, 而目前大部分的姿态估计都是使用l2 loss作为loss计算, label和pred都是centernet这种打的高斯核生成的center_map.

另外你在训练的时候有没有遇到过计算的focal_loss值是inf的情况? 我这边尝试了下, 经常会出现focal_loss = inf 的情况

xggIoU commented 5 years ago

要不你尝试下l2 loss。我正在尝试用其他的方式训练看能否解决多目标不收敛的情况,没有多余的卡去尝试l2损失。至于loss inf没出现过,是不是你sigmoid后没有clip。

murdockhou commented 5 years ago

有clip, 就是用的你的focal loss计算的, 我把clip里面的1e-10 改为1e-4就不会出现inf了, 但很奇怪的是训练没几步focal loss的值会固定变成某个值, 我检查了下发现就是pos_loss那里会一直变成个固定值,neg_loss基本为0, pos_num = 1, 很奇怪, 搞不懂为什么.

我一直都觉得这种给目标点打高斯核但又使用focal loss这种二分类的做法去找center 点明显不合理, 要么打的label就是1或0, 这样用二分类可以去做, 也说得通, 打个高斯核再去用二分类, 而且区别的还是高斯核的中心处和其余的所有点, 而不是高斯核里面的点和高斯核外面的点, 我觉得问题很大. 要么作者的意思就是把高斯核里面的所有位置都当作true, 但按文章的说法又明显不是这个意思, 所以很奇怪.

xggIoU commented 5 years ago

看来不是我一个人感觉奇怪了,我总感觉这种方式并不是很好,从实际训练就能体会到。但是人家官方就能训练出效果,难道炼丹功力差距这么大。。。

murdockhou commented 5 years ago

我准备用下l2训练下, l2应该没问题, 之前训练人体姿态的时候就可以. 但我的focal_loss问题仍然没有解决~~ 你有没有什么好的想法~~

xggIoU commented 5 years ago

focal loss 出现问题这个我也没什么想法,毕竟我没遇到。人体关键点和人脸关键点都是来自同一个目标物体,所以有效果,而这里目标检测point是来自不同的目标,我觉得可能还是有难度,行不行实验后才知道,如果l2有效果请通知我一下,感谢。

murdockhou commented 5 years ago

我又看了下官方提供的源码, 计算center hm loss的时候会对网络的输出在计算loss的时候先进行sigmoid计算, 然后执行focal loss. 总共的loss就是1个focal loss + 2个reg loss. 但想不明白为啥网络可以收敛, 我自己的focal loss尝试了很多次, 都是每次输出固定在某个值, 查看了下输出, 没几步就是全0的输出了, 真奇怪~~

我用l2也是只做单目标的检测, 多目标的目前还没这个需求, 先看看能不能搞定吧~

xggIoU commented 5 years ago

肯定要sigmoid后计算损失呀,我还以为你是激活后还是出现那问题呢...单目标的我用人脸检测已经证实了能收敛的,另外CSP算法也能证明这种方式能收敛,主要是多目标的检测目前就官方的结果能证明收敛,而实际在我的实验中不收敛。

murdockhou commented 5 years ago

我是激活后还出现那个问题.........难道我打的label不对? 不过不就是个高斯核, 也没其它东西了啊, 崩溃...

murdockhou commented 5 years ago

你好, 我想问下你在训练的时候有在tensorboard上查看网络预测出的center_map吗? 我的一片黑, 感觉网络根本学习不到东西

xggIoU commented 5 years ago

单目标是ok的

murdockhou commented 5 years ago

发现需要给网络一些时间去学, 今早发现网络预测的center_map确实有学习到中心点, 多给网络点耐心....

xggIoU commented 5 years ago

目前主要是多目标训练不出来

dl8207531 commented 5 years ago

@xggIoU 你的多目标 voc能收敛吗? 看你项目主页里能收敛 我的不能收敛 cls loss一直3-4左右

dl8207531 commented 5 years ago

我看你的pic10 shufflenetv2_centernet_voc_total_loss 图中能收敛到零点几 是用的l2 loss还是focal loss?

xggIoU commented 5 years ago

能收敛,用的focal_loss。这个算法,拟合能力ok,泛化能力不太行。

dl8207531 commented 5 years ago

又试了下确实能收敛。收敛曲线和你图上一致 voc只有一万七千多张图平均每类只有八百多张图,同时又没有做数据增强和权重正则,所以过拟合和泛化不好是一定的,这个应该不是centernet泛化能力问题。 能不能私信个联系方式私下交流下?

xggIoU commented 5 years ago

@dl8207531 数据增强是个原因。另一方面知乎上有人也反映了这个拟合能力与泛化能力问题,由于没有去尝试数据增强后的效果,所以初步结论是这样,具体有待验证。qq:1079903174 wx:18200587519 备注下您这个ID就好。