区域建议网络(RPN)的训练

数据挖掘 机器学习 神经网络 深度学习
2021-10-04 01:47:04

有一些关于 RPN(区域提案网络)的有趣文献。到目前为止,我发现的最简洁和有用的文档如下:https ://www.quora.com/How-does-the-region-proposal-network-RPN-in-Faster-R-CNN-work?share =1

但是通过我的各种讲座,我仍然不明白一些东西。RPN 旨在提出几个候选区域。从中进行选择,以了解哪些候选人适合我们的需求。

但是,RPN 和神经网络通常是确定性的。因此,一旦经过训练,它们总是会为给定的输入产生相同的输出;给定相同的输入图像,无法查询新的候选者。据我了解,RPN 被训练为为每个新图像生成固定数量的提案。但是培训是如何进行的呢?如果 RPN 必须产生 300 个候选者,那么我们用于训练的标记数据应该是什么,知道训练图像可能不会有超过 5 个黄金真值边界框?

然后,知道候选之间的边界框大小不一致,那么后面的 CNN 如何处理不同大小的输入?

2个回答

评论链接中的第一个答案回答了有关如何选择区域提案的一点。它是 Intersection Over Union(更正式的 Jaccard Index)指标。那么你的锚有多少与标签重叠。通常会为这个指标设置一个下限,然后过滤掉所有无用的提案,剩下的匹配可以排序,选择最好的。


我建议通读这个解释得很好的提案网络版本——Mask-R-CNN(Masked Region-based CNN)。如果您更喜欢查看代码,这里有完整的 repo,在 Keras/Tensorflow 中实现(还有一个 PyTorch 实现链接到某个地方)。

甚至还有一个解释性的 Jupyter notebook,它可能会帮助你点击。

要了解 RPN 是如何进行训练的,我们可以深入研究由 Matterport 编写的代码,该代码有 10,000 次凝视和 tf/keras 实现 Mask R-CNN 存储库。

您可以在mrcnn/model.py中查看build_rpn_targets函数

如果我们使用生成的anchors(取决于你的anchor scales、ratio、image size ...)来计算anchors和ground truth的IOU,

    # Compute overlaps [num_anchors, num_gt_boxes]
    overlaps = utils.compute_overlaps(anchors, gt_boxes)

我们可以知道锚点和地面实况之间的重叠情况。然后我们根据它们与ground truth的IOU来选择正锚和负锚。根据 Mask R-CNN 论文,IOU > 0.7 为正锚,< 0.3 为负锚,否则为中性锚,训练时不使用

    # 1. Set negative anchors first. They get overwritten below if a GT box is
    # matched to them. 
    anchor_iou_argmax = np.argmax(overlaps, axis=1)
    anchor_iou_max = overlaps[np.arange(overlaps.shape[0]), anchor_iou_argmax]
    rpn_match[anchor_iou_max < 0.3] = -1
    # 2. Set an anchor for each GT box (regardless of IoU value).
    # If multiple anchors have the same IoU match all of them
    gt_iou_argmax = np.argwhere(overlaps == np.max(overlaps, axis=0))[:,0]
    rpn_match[gt_iou_argmax] = 1
    # 3. Set anchors with high overlap as positive.
    rpn_match[anchor_iou_max >= 0.7] = 1

为了有效地训练 RPN,您需要仔细设置 RPN_TRAIN_ANCHORS_PER_IMAGE 以在一张图像中的对象很少时平衡训练。请注意,可以有多个锚点匹配一个基本事实,因为我们可以为每个锚点提供 bbox 偏移以适应基本事实。

希望答案对你来说很清楚!