LiWentomng / OrientedRepPoints

The code for “Oriented RepPoints for Aerial Object Detection (CVPR 2022)”
268 stars 43 forks source link

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

Closed hukaixuan19970627 closed 3 years ago

hukaixuan19970627 commented 3 years ago

请问作者有相关博客仔细介绍一下这一部分吗?我有点没搞懂具体流程,大致流程论文里讲的比较清楚: 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,这个重采样后的正样本数量是怎么升上去的? 希望作者能帮忙解惑

LiWentomng commented 3 years ago

你好! 对于此部分的理解上,你可能存在一些偏差。 首先该模型是一个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相对复杂的高斯参数收敛过程(模型训练中)

以上,希望对你有帮助!

hukaixuan19970627 commented 3 years ago

你好! 对于此部分的理解上,你可能存在一些偏差。 首先该模型是一个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是可微的

LiWentomng commented 3 years ago

@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.