LiWentomng/OrientedRepPoints

About “Sample Selection for Point Set Representation” and “The differentiability of convex IoU”

Closed this issue · 3 comments

请问作者有相关博客仔细介绍一下这一部分吗?我有点没搞懂具体流程,大致流程论文里讲的比较清楚:
point assigner先分配初始正样本点 -> 先进行一次梯度不更新的前向传播计算这些正样本的分类loss + 定位loss + 方向loss -> 再根据这些loss值从小到大排序取topk,其余的质量太低重新标为负样本 -> 重采样后的正样本点正常进行训练
但是配置文件中point assigner每个gt分配一个初始正样本点,后续的topk再怎么取也是1吧,岂不是重采样没有作用?
然后我debug的时候,训练初期gt可能为10,num_total_pos_init可能为9(这个我明白,物体挨得比较紧的话,后面的gt会把前面的gt匹配到的正样本覆盖掉),重采样后的num_pos可能为9.
训练后期,gt可能为10,num_total_pos_init为9,num_pos可能为50,这个重采样后的正样本数量是怎么升上去的?
希望作者能帮忙解惑

你好!
对于此部分的理解上,你可能存在一些偏差。
首先该模型是一个cascaded模型,分为两个initial 和 refine阶段,initial阶段进行初步旋转框(点集)的回归,第二阶段在第一阶段的(点集位置)的基础上是进一步的refine,同样这两个阶段都需要进行正负样本分配,从而分别进行loss的计算。对于initial阶段的正负样本分配,采用的方法和原始的reppoints是一致的,也就是config文件中的point assigner(具体可以详解reppoints论文中的page 6 Localization/class target assignment.)。

对于refine阶段,我们这里采用的先通过maxiou assigner将initial stage的初步预测框先与GT box进行assign,后续就是你所说的_先进行一次梯度不更新的前向传播计算这些正样本的分类loss + 定位loss + 方向loss -> 再根据这些loss值从小到大排序取topk,其余的质量太低重新标为负样本 -> 重采样后的正样本点正常进行训练。_
在通过这三项的loss值,可以选择initial 阶段预测的高质量旋转框(点集),其re-assign后的个数就是这里的num_pos,但这个数应该不会为50这么大,因为在fpn每个level根据loss值先进行一个初步的选择(fpn 每层最大样本数为6),然后对fpn 所有level的样本汇总(具体参考代码)再进行根据top ratio的值进行选择。initial 和refine 两个阶段正负样本分配没有直接联系,即这里的num_total_pos_init 和refine阶段的re-assign后的正样本个数num_pos是没有直接联系的。

在re-assign的过程中,该工作总体**是和PAA有些类似,都是从loss角度进行re-assign,但该工作重点想说明的一点是对于旋转目标检测,结合分类loss、定位loss以及方向loss三个方面的考虑,一个简单的topk就能实现高质量旋转样本的选择,而不需要PAA中GMM相对复杂的高斯参数收敛过程(模型训练中)

以上,希望对你有帮助!

你好!
对于此部分的理解上,你可能存在一些偏差。
首先该模型是一个cascaded模型,分为两个initial 和 refine阶段,initial阶段进行初步旋转框(点集)的回归,第二阶段在第一阶段的(点集位置)的基础上是进一步的refine,同样这两个阶段都需要进行正负样本分配,从而分别进行loss的计算。对于initial阶段的正负样本分配,采用的方法和原始的reppoints是一致的,也就是config文件中的point assigner(具体可以详解reppoints论文中的page 6 Localization/class target assignment.)。

对于refine阶段,我们这里采用的先通过maxiou assigner将initial stage的初步预测框先与GT box进行assign,后续就是你所说的_先进行一次梯度不更新的前向传播计算这些正样本的分类loss + 定位loss + 方向loss -> 再根据这些loss值从小到大排序取topk,其余的质量太低重新标为负样本 -> 重采样后的正样本点正常进行训练。_
在通过这三项的loss值,可以选择initial 阶段预测的高质量旋转框(点集),其re-assign后的个数就是这里的num_pos,但这个数应该不会为50这么大,因为在fpn每个level根据loss值先进行一个初步的选择(fpn 每层最大样本数为6),然后对fpn 所有level的样本汇总(具体参考代码)再进行根据top ratio的值进行选择。initial 和refine 两个阶段正负样本分配没有直接联系,即这里的num_total_pos_init 和refine阶段的re-assign后的正样本个数num_pos是没有直接联系的。

在re-assign的过程中,该工作总体**是和PAA有些类似,都是从loss角度进行re-assign,但该工作重点想说明的一点是对于旋转目标检测,结合分类loss、定位loss以及方向loss三个方面的考虑,一个简单的topk就能实现高质量旋转样本的选择,而不需要PAA中GMM相对复杂的高斯参数收敛过程(模型训练中)

以上,希望对你有帮助!

明白了,你一说cascade就很清晰了,十分感谢。
我还有一个不清楚的地方就是代码中使用的凸多边形IoU loss是如何进行梯度的回传的呢?流程我清楚:就是points点集通过Jarvis march法转为一个凸多边形,再与GT Box进行凸多边形IoU计算,IoU Loss采用GIoU的公式进行计算,然后所得IoU作为loss来指导网络的学习。这个过程由于都是用CUDA代码完成的,所以了解起来挺费劲的,请问有相关的资料可以参考吗,主要是传递梯度这一块,我感觉整个流程似乎不可导,但用了某种工程上的方法把梯度传了回去,毕竟Beyond Bounding Box这篇文章对这个IoU的可导性直接一笔带过了,没有相关公式直接推导这个IoU是可微的

@hukaixuan19970627
搞清该问题,首先需要搞清楚rotated iou loss的梯度回传,在理论上确实存在有不可导的地方, 具体可以参考论文[1]和代码链接[2],有详细介绍。

这里的convex giou loss的梯度回传和rotated iou loss的求导过程本质是一致的,是对两个polygons在工程上求insection和union,
这里本身是多了一步Jarvis march算法,该算法是确定哪些点是进行梯度回传的,哪些点是不进行的。

另外,beyond bounding box[3]提供的convex giou loss代码仍然是存在一定的限制和改进空间,比如点的个数是固定的(9个点)以及算法收敛速度较慢。

[1] IoU Loss for 2D/3D Object Detection.
[2] https://github.com/csuhan/s2anet/tree/master/configs/rotated_iou
[3] Beyond Bounding-Box: Convex-hull Feature Adaptation for Oriented and Densely Packed Object Detection.