如何避免在推理过程中得到重叠的关键点?

How can I avoid getting overlapping keypoints during inference?

我一直在使用 Detectron2 识别每张图像上的 4 个关键点, 我的虚拟数据集包含 1000 张图像,并且我应用了扩充。

def build_train_loader(cls, cfg):
    augs = [
           T.RandomFlip(prob=0.5,horizontal=True),
           T.RandomFlip(prob=0.5,horizontal=False,vertical=True),
           T.RandomRotation(angle=[0, 180]),                           
           T.RandomSaturation(0.9, 1.9)
           ]
    return build_detection_train_loader(cfg, 
                                        mapper=DatasetMapper(cfg, 
                                                is_train=True,
                                                augmentations=augs)
                                    )

我检查了应用这些变换后的图像(每种变换都单独测试过),看起来效果不错,关键点位置正确。

训练阶段结束后 (keypoint_rcnn_R_50_FPN_3x.yaml), 我得到一些相同的关键点,这意味着在许多图像中关键点重叠, 以下是我的结果中的几个样本:

[[[180.4211, 332.8872,   0.7105],
[276.3517, 369.3892,   0.7390],
[276.3517, 366.9956,   0.4788],
[220.5920, 296.9836,   0.9515]]]

来自另一张图片:

[[[611.8049, 268.8926,   0.7576],
[611.8049, 268.8926,   1.2022],
[699.7122, 261.2566,   1.7348],
[724.5556, 198.2591,   1.4403]]]

我比较了推理的结果,有增强和没有增强, 似乎随着增强,关键点几乎没有得到认可。天哪,怎么可能?

有人可以提出任何想法来克服这些错误吗? 我做错了什么?

谢谢!

我已将 link 添加到我的 google colab 笔记本中: https://colab.research.google.com/drive/1uIzvB8vCWdGrT7qnz2d2npEYCqOxET5S?usp=sharing

问题是矩形的不同角没有什么独特之处。但是,在您的注释和损失函数中,有一个 隐式 假设角的顺序很重要:
角点以 特定的 顺序标记,并且网络被训练为以该特定顺序输出角点。

但是,当您通过翻转和旋转图像来扩充数据集时,您更改了角的隐式顺序,现在网络不知道每次要预测四个角中的哪一个。

据我所知,您有两种解决此问题的方法:

  1. 在角上明确强制顺序:
    确保无论图像进行了何种增强,对于每个矩形,地面实况点都按“左上”、“右上”、“左下”、“右下”的顺序排列。这意味着您必须变换角的坐标(就像您现在所做的那样),而且还要 重新排序 它们。
    添加这种一致性应该可以帮助您的模型克服识别不同角点时的歧义。

  2. 使损失对预测角点的顺序不变:
    假设您的地面真值矩形跨越域 [0, 1]x[0, 1]:您应该预测的四个角是 [[0, 0], [1, 1], [1, 0], [0, 1]]。请注意,如果您预测 [[1, 1], [0, 0], [0, 1], [1, 0]] 您的损失非常高,尽管您预测的正确角点的顺序与注释的顺序不同。
    因此,你应该让你的损失对预测点的顺序不变:
    其中 pi(i) 是角的排列。