2

我一直在使用 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]]]

我已经将推理的结果与增强和不增强进行了比较,似乎通过增强,关键点几乎没有得到认可。天哪,怎么可能?

有人可以建议如何克服这些错误吗?我究竟做错了什么?

谢谢!

我添加了一个指向我的 google colab 笔记本的链接: https ://colab.research.google.com/drive/1uIzvB8vCWdGrT7qnz2d2npEYCqOxET5S?usp=sharing

4

1 回答 1

1

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

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

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

  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)是角的排列。

于 2021-07-15T13:10:56.997 回答