前言
上次介绍到了配置文件如何使用,以及配置文件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()函数相关内容还未完成,待续~
码字不易,未经许可,请勿随意转载!