maskrcnn-benchmark-master(二): GeneralizedRCNN类

 前言

上次介绍到了配置文件如何使用,以及配置文件cfg对象最后传到了一个GeneralizedRCNN类中。本篇,我们介绍一下GeneralizedRCNN类究竟是怎么构建出一个模型的。GeneralizedRCNN结构简图如下所示:

GeneralizedRCNN类

GeneralizedRCNN类在your_project/maskrcnn_benchmark/modeling/detector/generalized_rcnn.py文件中,我们首先看构造函数_init_():

def __init__(self, cfg):
        super(GeneralizedRCNN, self).__init__()
        '''
        build_backbone()  build_rpn()  build_roi_heads()重点需要了解的函数
        build_backbone()主要是创建ResNet+FPN等特征提取网络
        build_rpn()主要是创建RPN结构
        build_roi_heads()主要是创建ROI box head  ROI mask head等结构
        
        '''

        # 创建骨干网络
        self.backbone = build_backbone(cfg)
        # 创建rpn
        self.rpn = build_rpn(cfg, self.backbone.out_channels)
        # 创建roi_heads
        self.roi_heads = build_roi_heads(cfg, self.backbone.out_channels)

 从构造函数可以看出,整个网络主要由3个部分组成:backbone、rpn、roi_heads。(以类变量的形式存在)

而这三个部分主要是由build_backbone()、build_rpn()、build_roi_heads()三个函数所生成,我后面会依次介绍这三个函数。

接着,我们看一下GeneralizedRCNN类的forward()函数,观察上面上面三个类变量是如何进行工作的:

    def forward(self, images, targets=None):
        """
        Arguments:
            images (list[Tensor] or ImageList): images to be processed
            targets (list[BoxList]): ground-truth boxes present in the image (optional)

        Returns:
            result (list[BoxList] or dict[Tensor]): the output from the model.
                During training, it returns a dict[Tensor] which contains the losses.
                训练阶段返回loss值
                During testing, it returns list[BoxList] contains additional fields
                like `scores`, `labels` and `mask` (for Mask R-CNN models).
                测试阶段返回预测的结果(得分, 标签, mask)
        """
         # 训练过程,输入的数据必须有对应的标签,不然没法计算损失
        if self.training and targets is None:
            raise ValueError("In training mode, targets should be passed")
        images = to_image_list(images)
        # 图像经过backbone之后  输出提取的图像特征
        features = self.backbone(images.tensors)
        # 特征经过RPN网络得到proposals和相应的loss值(因此RPN的作用就是获取Proposals和训练时RPN的loss)
        # self.rpn返回值的proposals中是cat_Boxlist得到的结果list(BoxList) shape is (batch size,)
        proposals, proposal_losses = self.rpn(images, features, targets)
        if self.roi_heads:
            # result是检测的结果,detection_losses的损失(如果存在mask分支,result和detection_loss都是包含有mask的检测结果和mask的损失的)
            x, result, detector_losses = self.roi_heads(features, proposals, targets)
        else:
            # 如果只提取Proposals(Proposal只是表示可能是需要检测的物体,
            # 具体是什么了类别还不清楚),而不对Proposals进行分类
            # RPN-only models don't have roi_heads
            x = features
            result = proposals
            detector_losses = {}

        # 将loss值都放到一个字典里面保存
        if self.training:
            losses = {}
            losses.update(detector_losses)
            losses.update(proposal_losses)
            return losses

        return result

从forward()函数中可以得知:

如果是训练过程,forward返回值就是loss值。

如果不是训练过程,返回值就是检测的结果(bounding box、类别、mask)。

下面将主要介绍build_backbone()、build_rpn()和 build_roi_heads()函数的相关内容:

maskrcnn-benckmark-master(三):build_backbone()函数

maskrcnn-benchmark-master(四):build_rpn()函数

maskrcnn-benchmark-master(五):RPN的inference文件

build_roi_heads()函数相关内容还未完成,待续~

码字不易,未经许可,请勿随意转载!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值