微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何避免在推理过程中出现重叠的关键点?

我一直在使用 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],366.9956,0.4788],[220.5920,296.9836,0.9515]]]

来自另一张图片

[[[611.8049,268.8926,0.7576],[611.8049,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

解决方法

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

然而,当你通过翻转和旋转图像来扩充数据集时,你改变了角的隐含顺序,现在网络不知道每次预测四个角中的哪一个。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。