mmdetection中faster_rcnn的实现

mmdetection中faster_rcnn的实现【待完善】前置内容:mmdetecion 中类注册的实现(@x.register_module())内容包括:faster_rcnnbackboneneckrpn_headfaster_rcnn@DETECTORS.register_module()class FasterRCNN(TwoStageDetector):在代码中,fasterRCNN继承了TwoStageDetector,TwoStageDetector继承了Base
摘要由CSDN通过智能技术生成

mmdetection中faster_rcnn的实现

前置内容:
mmdetecion 中类注册的实现(@x.register_module())

内容包括:
faster_rcnn
backbone
neck
rpn_head

faster_rcnn

@DETECTORS.register_module()
class FasterRCNN(TwoStageDetector):

在代码中,fasterRCNN继承了TwoStageDetector,TwoStageDetector继承了BaseDetector,在BaseDetector中实现了forward,其中判断训练和test调用了forward_train和forward_test,我们关注的也就是forward_train()
faster_rcnn依次调用了backbone,neck,rpn,roi,之后计算loss

def forward_train(self,
                      img,
                      img_metas,
                      gt_bboxes,
                      gt_labels,
                      gt_bboxes_ignore=None,
                      gt_masks=None,
                      proposals=None,
                      **kwargs):
        
        x = self.extract_feat(img)  # 特征提取+fpn

        losses = dict()

        # RPN 过程
        if self.with_rpn:
            proposal_cfg = self.train_cfg.get('rpn_proposal',
                                              self.test_cfg.rpn)
            rpn_losses, proposal_list = self.rpn_head.forward_train(
                x,
                img_metas,
                gt_bboxes,
                gt_labels=None,
                gt_bboxes_ignore=gt_bboxes_ignore,
                proposal_cfg=proposal_cfg,
                **kwargs)
            losses.update(rpn_losses)
        else:
            proposal_list = proposals
		#roi过程
        roi_losses = self.roi_head.forward_train(x, img_metas, proposal_list,
                                                 gt_bboxes, gt_labels,
                                                 gt_bboxes_ignore, gt_masks,
                                                 **kwargs)
        losses.update(roi_losses)

        return losses

backbone

backbone的调用在

 x = self.extract_feat(img)  # 特征提取+fpn

在传入backbone后直接传入neck(如果有)

 def extract_feat(self, img):
        """Directly extract features from the backbone+neck."""
        x = self.backbone(img)
        if self.with_neck:
            x = self.neck(x)
        return x

我们使用的backbone配置文件为:

backbone=dict(
        type='ResNet',
        depth=50, # 使用res50
        num_stages=4, #4层
        out_indices=(0, 1, 2, 3), #输出前4层的特征,也就是C2,C3,C4,C5
        frozen_stages=1, # 冻结的stage数量,即该stage不更新参数,-1表示所有的stage都更新参数
        norm_cfg=dict(type='BN', requires_grad=True), #使用bach_norm
        norm_eval=True, #在test时候使用norm
        style='pytorch',
        init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')),

配置文件到类的转换可以查看[mmdetecion 中类注册的实现(@x.register_module())](https://blog.csdn.net/qq_39518314/article/details/123053614)在这里插入图片描述

由out_indices=4可以获得我们输出的层数为4,如果batch_size为16,图像大小为800*800,那么最终输出的4个特征分别为:
(16,256,200,200)(16,512,100,100)(16,1024,50,50)(16,2048,25,25)

neck

neck之所以叫neck,他是用于处理特征提取和head之间的内容
以fpn为例:

neck=dict(
        type='FPN',
        in_channels=[256, 512, 1024, 2048],
        out_channels=256,
        num_outs=5),

in_channels表示输入的4层,通道数分别为256, 512, 1024, 2048,对应我们上面res50的输出层数和通道数
具体的处理如下图:
在这里插入图片描述

def forward(self, inputs):
        """Forward function."""
        assert len(inputs) == len(self.in_channels)

        # 使用1x1卷积的部分
        laterals = [
            lateral_conv(inputs[i + self.start_level])
            for i, lateral_conv in enumerate(self.lateral_convs)
        ]

        # 经过最近线性插值之后加上,得到m
        used_backbone_levels = len(laterals)
        for i in range(used_backbone_levels - 1, 0, -1):
            # In some cases, fixing `scale factor` (e.g. 2) is preferred, but
            #  it cannot co-exist with `size` in `F.interpolate`.
            if 'scale_factor' in self.upsample_cfg:
                laterals[i - 1] += F.interpolate(laterals[i],
                                                 **self.ups
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MMDetection是一个开源目标检测框架,它支持许多不同的目标检测模型,包括Faster R-CNN。要训练Faster R-CNN模型,您需要准备数据集、模型配置文件以及训练脚本。可以参考MMDetection的官方文档(https://mmdetection.readthedocs.io/en/latest/tutorials/train.html),了解详细的训练步骤。 ### 回答2: mmdetection是一个用于目标检测的开源框架。其Faster R-CNN是其一种比较常用的检测网络,主要通过Region Proposal Network(RPN)生成候选区域,然后利用RoI Pooling对这些区域进行特征提取和分类。在训练Faster R-CNN时,我们需要做以下几步: 1. 数据预处理:将数据转换为合适的格式,例如将图片和标注转换为COCO(Common Objects in Context)格式。 2. 模型搭建:使用mmdetection提供的配置文件进行模型搭建,并进行相应的超参数设置。在进行设置时,需要考虑到训练时可能需要使用的GPU数量,以及学习率,权重衰减等参数。 3. 数据扩增:为了提高模型的鲁棒性,在训练前需要进行数据扩增,常用的方法包括随机裁剪、随机翻转、随机旋转等。 4. 数据加载:定义DataLoader来实现数据的批量加载,并设置数据的并行数,以便加快训练速度。 5. 损失函数:Faster R-CNN常用的损失函数包括分类损失和回归损失。在训练时需要同时计算这两种损失函数,并设置相应的权重。 6. 模型训练:对模型进行训练。在训练过程,可以使用Adam等优化器对模型进行优化,并进行学习率调整、权重更新等操作。训练时需要注意过拟合的问题,并及时进行模型的调整。 7. 模型测试:在训练完成后,使用测试集数据对模型进行测试,以验证模型的准确性和鲁棒性。 总之,mmdetection训练Faster R-CNN需要进行许多步骤,其需要注意的是数据的预处理、模型搭建和调整超参数、数据扩增、损失函数的设定、并行计算和过拟合的问题。通过对这些步骤进行科学、合理的设置,可以获得较好的结果。 ### 回答3: mmdetection是一个开源的目标检测框架,其包含了许多常用的检测算法如Faster R-CNN,RetinaNet等模型,同时也提供了细粒度的API接口方便用户进行自定义的检测模型开发。 在使用mmdetection训练Faster R-CNN模型时,首先需要准备数据集。一般而言,数据集应包含包含训练图片、标注文件和验证图片。其标注文件指的是通过标注工具标记每张图片要检测的区域,并且标注的格式应符合COCO格式。 接着需要进行模型配置,mmdetection支持许多的配置项,如数据增强方式、anchor设计和ROI pooling等。用户可以根据自己的需求进行设置。对于Faster R-CNN模型而言,它一般需要设置backbone、RPN以及ROI pooling等模块的参数。 在模型配置完成后,就可以使用mmdetection提供的训练函数进行模型训练了。通常使用的是SGD或Adam等优化器,训练时可进行多次迭代,不断优化模型的参数。 另外,模型训练过程还需要进行模型验证。通常在每一次训练迭代结束后,对于验证集上的表现进行评估,了解模型的效果。在评估过程,可以计算模型的精度、召回率等指标,据此判断模型的性能是否达到要求,并进行参数的微调。 需要注意的是,Faster R-CNN模型的训练所需要的时间和硬件资源比较大,因此在进行模型训练时,可选择使用GPU进行加速。此外,也需要耐心地对模型进行调整和优化,以提高模型的检测效果。 总的来说,mmdetection训练Faster R-CNN模型需要进行数据集准备、模型配置、模型训练和模型验证等步骤。需要注意的是,模型训练时间较长,需要耐心对模型进行调整和优化,保证最终的检测效果达到要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值