FSOD with Attention-RPN and Multi-Relation 推理过程

测试过程

在少样本目标检测任务中,训练过程每次输入的是一个episode,也就是有一张query image需要检测对象,以及20张support images提供类别信息。在support images中,一共有2个类别,一个类别10张图片。在训练时会确保一个类和query image相同,一个类别和它不同。训练时模型的任务就是找到query image中属于support images类别的对象,然而在测试的时候每张图片需要和20个类别的support features做对比。

总体流程如下:

  1. 每个类别suppport featurequery feature结合得到100个proposals,这100个proposals只和该类support feature对比得到类别概率和坐标偏移,如果最终这个proposals能够作为预测结果保留,则它的类别就是这个support类。
  2. 这20个类别对应的proposals与对应的support feature对比得到其概率得分和坐标偏移,将正类概率作为置信度,保留符合要求的proposals
  3. 在剩下的proposals中再进行一次非极大值抑制,将剩下的不超过100个proposals作为最终的预测结果。

特征提取

为了测试结果的稳定性,预测挑选好200张support images,一共20个类别,每个类别10张图片,然后使用训练好的backbone对图片提取特征。

生成proposals

此时已经获得20个类别的support feature,将每个support feature作为attention与query image结合后输入到PRN中,每个RPN会生成100个proposals,所以一共生成2000个proposals。

		support_proposals_dict = {}  # 关键字是类别id,保存对应的proposals
        support_box_features_dict = {}  # 关键字是类别id,保存对应的supprot box特征
 		proposal_num_dict = {}  # 关键字是类别id,保存对应的proposals数量
        # 遍历20个类别的support feature
        for cls_id, res4_avg in self.support_dict['res4_avg'].items():
            query_images = ImageList.from_tensors([images[0]]) # one query image

            query_features_res4 = features['res4'] # one query feature for attention rpn
            query_features = {'res4': query_features_res4} # one query feature for rcnn

            # support branch ##################################
            support_box_features = self.support_dict['res5_avg'][cls_id]
           
            correlation = F.conv2d(query_features_res4, res4_avg.permute(1,0,2,3), groups=1024) # attention map
            support_correlation = {'res4': correlation} # attention map for attention rpn

            proposals, _ = self.proposal_generator(query_images, support_correlation, None)
            support_proposals_dict[cls_id] = proposals
            support_box_features_dict[cls_id] = support_box_features
         
            if cls_id not in proposal_num_dict.keys():
                proposal_num_dict[cls_id] = []
            proposal_num_dict[cls_id].append(len(proposals[0]))

        results, _ = self.roi_heads.eval_with_support(query_images, query_features, support_proposals_dict, support_box_features_dict)

计算Proposals类别及坐标偏移

上面已经提到,每个类别的support feature 和query image结合输入RPN生成100个proposals。在Faster-Rcnn检测框架的第二阶段,这100个proposas只与该类support feature进行对比,得到分类得分和坐标偏移。

        for cls_id in cls_ls:
            support_box_features = support_box_features_dict[cls_id]  # 该类别对应的support feature
            support_box_features_res3 = support_box_features_dict_res3[cls_id]
            query_features = box_features[cnt*100:(cnt+1)*100]  # 该类别对应的100个proposals feature
            query_features_res3 = box_features_res3[cnt*100:(cnt+1)*100]
            # 计算这100个propsals与该类表征的关系得分和坐标
            pred_class_logits, pred_proposal_deltas = self.box_predictor(query_features, support_box_features,
                                                                         query_features_res3, support_box_features_res3)
            full_scores_ls.append(pred_class_logits)
            full_bboxes_ls.append(pred_proposal_deltas)
            full_cls_ls.append(torch.full_like(pred_class_logits[:, 0].unsqueeze(-1), cls_id).to(torch.int8))
            del query_features
            del support_box_features
            cnt += 1
        
        class_logits = torch.cat(full_scores_ls, dim=0)  # 2000个proposals是正类和负类的得分  [2000,2]
        proposal_deltas = torch.cat(full_bboxes_ls, dim=0)  # 2000个proposals的位置  [2000,4]
        pred_cls = torch.cat(full_cls_ls, dim=0) #.unsqueeze(-1)  # # 2000个proposals对应的类别
    
        predictions = class_logits, proposal_deltas

推断模型预测结果

得到每个proposal的类别得分和坐标偏移之后,可以推断其是正负类的概率以及最后的预测框坐标。

       # 根据预测的proposals偏移量以及propsals位置得到模型预测框
        boxes = self.predict_boxes(predictions, proposals)
        # 经过softmax得到每个proposals是正类和负类的概率
        scores = self.predict_probs(predictions, proposals)
        num_inst_per_image = [len(p) for p in proposals]
        # 每个proposal对应的类别
        pred_cls = pred_cls.split(num_inst_per_image, dim=0)
        # 每个proposals的尺寸
        image_shapes = [x.image_size for x in proposals]

将proposals为正类的概率作为置信度,设置阈值0.05只保留置信度高于0.05的proposals。在剩下的proposals中再进行一次非极大值抑制,最终只保留不超过100个proposals作为预测结果。

    # proposals正类的概率
    scores = scores[:, :-1]  # [2000,1]
    # 类别数 20
    cls_num = pred_cls.unique().shape[0]
    # 每个类别对应的proposals数目  100
    box_num = int(scores.shape[0] / cls_num)
    # scores[i,j]表示这个proposal是类别j的概率
    scores = scores.reshape(cls_num, box_num).permute(1, 0)  # [100,20]
    boxes = boxes.reshape(cls_num, box_num, 4).permute(1, 0, 2).reshape(box_num, -1)  # [100,80]
    pred_cls = pred_cls.reshape(cls_num, box_num).permute(1, 0)  # [100,20]
    # 回归类别数  20
    num_bbox_reg_classes = boxes.shape[1] // 4
    # Convert to Boxes to use the `clip` function ...
    boxes = Boxes(boxes.reshape(-1, 4))
    boxes.clip(image_shape)
    boxes = boxes.tensor.view(-1, num_bbox_reg_classes, 4)  # [100,20,4]

    # 找到置信度高于阈值的proposals  0.05
    filter_mask = scores > score_thresh  # [100,20]
    # R行表示2000个proposals中有R个置信度符合要求,每行的数据表示该proposal的二维索引
    # 第一列表示proposal的索引,第二列表示其对应的类别索引
    filter_inds = filter_mask.nonzero()  # [R,2]
    # 符合要求的proposals位置
    if num_bbox_reg_classes == 1:
        boxes = boxes[filter_inds[:, 0], 0]
    else:
        boxes = boxes[filter_mask]  # [R,4]
    scores = scores[filter_mask]   # 184
    pred_cls = pred_cls[filter_mask]  # 184

    # 进行非极大值抑制,返回保留的proposals的索引
    keep = batched_nms(boxes, scores, filter_inds[:, 1], nms_thresh)
    if topk_per_image >= 0:
        keep = keep[:topk_per_image]

    boxes, scores, filter_inds, pred_cls = boxes[keep], scores[keep], filter_inds[keep], pred_cls[keep]

    result = Instances(image_shape)
    result.pred_boxes = Boxes(boxes)
    result.scores = score
    result.pred_classes = pred_cls

代码源于FewX

### 回答1: "few-shot object detection with attention-rpn and multi-relation detector" 是一种使用注意力机制的少样本目标检测方法。它通过使用 Attention-RPN(Region Proposal Network)和 Multi-Relation Detector 来实现对目标的检测。 Attention-RPN 可以在提议区域中识别关键部位,而 Multi-Relation Detector 则可以在少量样本中识别目标并定位它们。这种方法在训练和测试时都需要少量样本,因此可以减少模型的训练时间和资源消耗。 ### 回答2: 随着人工智能技术的不断发展,目标检测的研究也得到了越来越多的关注。其中,Few-shot object detection with attention-rpn and multi-relation detector是目前在目标检测领域上的一个最新研究成果。那这个算法是什么呢? 针对目前目标检测领域中的一大难点——少样本学习,此研究提出了一种基于RPN(region proposal network)和注意力机制的多关系检测算法,使得模型只需使用少量的训练数据,就能在未见过的类别中达到较高的检测准确率。 具体来说,该算法通过在RPN中引入注意力交互模块来提供精细的检测区域,同时通过设计多组关系特征提取器,能够有效处理不同目标类别之间的相互关系。在训练阶段,该算法将训练数据集划分为meta-train和meta-test集合,然后在较小的meta-train集合中学习关系特征提取器和注意力交互模块,最后在meta-test集合的未知类别中进行目标检测。 综合以上基本思路,该算法通过引入注意力机制和多关系特征提取器来实现Few-shot object detection。该算法在目前的Few-shot目标检测基准测试数据集上进行了实验证明,实现了较高的检测准确率,在很大程度上解决了少样本学习的问题。未来,这个技术还需要进一步实践和推广,使得得到更广泛的使用。 ### 回答3: 本文介绍了一种基于注意力机制RPNAttention-RPN)和多关系检测器(Multi-Relation Detector)的小样本目标检测技术(Few-shot Object Detection)。该技术可以利用预训练的模型来辅助小样本检测任务,并可以适应新的目标类别。 本文中的Attention-RPN是一种针对小样本学习的改进版本,它可以通过选择性的关注训练数据中的重要区域来提高小样本的性能。同时,Attention-RPN还可以利用先前训练模型的知识来指导小样本的训练过程,从而提高检测结果的准确性。 而多关系检测器则是一种可以检测目标之间关系的模型。通过学习目标之间的关系,可以更好地理解图像中的场景,并且可以更准确地定位和分类目标。本文中的多关系检测器采用了一种新的模型结构,其中用到了一种称为Transformers的自注意力机制,它可以自适应地聚焦于任务中的关键区域,从而提高检测性能。 在实验中,本文采用了COCO、VOC和miniImagenet等数据集进行测试。结果表明,本文所提出的Few-shot Object Detection技术可以在少量样本的情况下取得好的检测结果。同时,Attention-RPNMulti-Relation Detector也能分别提高小样本和多样本的检测性能,证明它们是十分有效的模型改进方式。 综上所述,本文提出了一种新的小样本目标检测技术,并通过Attention-RPNMulti-Relation Detector的改进来提高检测性能。该技术对于具有高效率和精度要求的目标检测任务具有十分重要的意义,可能对未来的计算机视觉研究和工业应用产生积极的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值