以下链接是个人关于mmdetection(Foveabox-目标检测框架)所有见解,如有错误欢迎大家指出,我会第一时间纠正。有兴趣的朋友可以加微信:17575010159 相互讨论技术。若是帮助到了你什么,一定要记得点赞!因为这是对我最大的鼓励。 文末附带 \color{blue}{文末附带} 文末附带 公众号 − \color{blue}{公众号 -} 公众号− 海量资源。 \color{blue}{ 海量资源}。 海量资源。
目标检测00-00:mmdetection(Foveabox为例)-目录-史上最新无死角讲解

前言

从前面的博客,我们已经知道了数据读取,数据增强,以及训练架构等等。那么接下来,久要深入的了解 Foveabox 这个网络了。那么这篇博客。我们就来讲解一下其训练的流程吧。主要的相关代码位于 mmdet/models 文件夹(后续默认都以该文件夹为主-如果没有特别提示)。在了解模型是如何构件之前,我们先查看项目根目录 configs\foveabox\my_fovea_r50_fpn_4x4_2x_coco.py,该文件为本人自己编写,可以通过如下链接复制:目标检测00-04:mmdetection(Foveabox为例)-config文件注释-持续更新。找到其中的 model 字典,内容如下:

# model settings
model = dict(type='FOVEA', # 设置为FOVEA,则其最终会调用到类mmdet.models.detectors.fovea.FOVEAbackbone=dict( # 主干网络相关配置type='ResNet', # 主干网络的类型......)neck=dict(type='FPN', # FPN,特征金字塔......)bbox_head=dict(type='FoveaHead', # 头部网络类型......loss_cls=dict( # FocalLoss 的相关配置type='FocalLoss',......)loss_bbox=dict(type='SmoothL1Loss', .......)
)

总的来说,一个网络的构件,主要包含了三个部分,分别为 backbone(主干网络),neck(衔接网络),bbox_head(头部网络)。下面我们就来看看 Foveabox 究竟是如何构件的吧。

模型总体构建

根据上面的 model 字典结构,其首先执行的是 type=‘FOVEA’,对应 mmdet/models/detectors/fovea.py 中的 FOVEA。其代码十分的简单,就是继承于 SingleStageDetector(单阶段目标检测),然后调用其父类的初始化函数,那么我们就来看看 SingleStageDetector 的流程吧。本人注释代码如下:

@DETECTORS.register_module()
class SingleStageDetector(BaseDetector):"""Base class for single-stage detectors.Single-stage detectors directly and densely predict bounding boxes on theoutput features of the backbone+neck."""def __init__(self,backbone,neck=None,bbox_head=None,train_cfg=None,test_cfg=None,pretrained=None):super(SingleStageDetector, self).__init__()# 根据主干网网络参数构建主干网络self.backbone = build_backbone(backbone)# 如果设置了衔接网络,则构件衔接网络if neck is not None:self.neck = build_neck(neck)# 对头部网络的参数进行更新(训练和推理的配置参数有些不一样)bbox_head.update(train_cfg=train_cfg)bbox_head.update(test_cfg=test_cfg)# 根据配置参数构件头部网络self.bbox_head = build_head(bbox_head)# 赋值训练以及测试参数self.train_cfg = train_cfgself.test_cfg = test_cfg# 如果设置了预训练模型,则加载预训练模型。self.init_weights(pretrained=pretrained)def init_weights(self, pretrained=None):"""Initialize the weights in detector.权重初始化Args:pretrained (str, optional): Path to pre-trained weights.Defaults to None."""super(SingleStageDetector, self).init_weights(pretrained)self.backbone.init_weights(pretrained=pretrained)if self.with_neck:if isinstance(self.neck, nn.Sequential):for m in self.neck:m.init_weights()else:self.neck.init_weights()self.bbox_head.init_weights()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 xdef forward_dummy(self, img):"""Used for computing network flops.See `mmdetection/tools/get_flops.py`用于计算网络的浮点型大小,通过 mmdetection/tools/get_flops.py 可以看到具体介绍"""x = self.extract_feat(img)outs = self.bbox_head(x)return outsdef forward_train(self,img,img_metas,gt_bboxes,gt_labels,gt_bboxes_ignore=None):"""Args:img (Tensor): Input images of shape (N, C, H, W).Typically these should be mean centered and std scaled.img_metas (list[dict]): A List of image info dict where each dicthas: 'img_shape', 'scale_factor', 'flip', and may also contain'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'.For details on the values of these keys see:class:`mmdet.datasets.pipelines.Collect`.gt_bboxes (list[Tensor]): Each item are the truth boxes for eachimage in [tl_x, tl_y, br_x, br_y] format.gt_labels (list[Tensor]): Class indices corresponding to each boxgt_bboxes_ignore (None | list[Tensor]): Specify which boundingboxes can be ignored when computing the loss.Returns:dict[str, Tensor]: A dictionary of loss components."""# 提取图像的金字塔特征,如果输入图像大小为[640,480],batch_size=b,那么其输出为存在五个元素的一个列表,# x = [(b,256,60,80), (b,256,30,40), (b,256,15,20), (b,256,8,10), (b,256,4,5)]x = self.extract_feat(img)# 如果是进行训练,则调用头部网络的forward_train,获得loss返回,同于反向传播losses = self.bbox_head.forward_train(x, img_metas, gt_bboxes,gt_labels, gt_bboxes_ignore)return lossesdef simple_test(self, img, img_metas, rescale=False):"""Test function without test time augmentation.单张图片进行测试,测试功能不带有数据增强Args:imgs (list[torch.Tensor]): List of multiple imagesimg_metas (list[dict]): List of image information.rescale (bool, optional): Whether to rescale the results.Defaults to False.Returns:np.ndarray: proposals"""# 提出图像金字塔特征x = self.extract_feat(img)# 通过头部网络获得论文中的(tx1, ty1, tx2, ty2),以及其对应的类别概率, 但是大家要注意,这里出来是特征金字塔,如下(假设输入图像大小为640x480):# box的偏移值: outs[1]=[(1,4,60,80), (1,4,30,40), (1,4,15,20), (1,4,8,10), (1,4,4,5)]# box对应的类别概率 outs[0]=[(1,num_class,60,80), (1,num_class,30,40), (1,num_class,15,20), (1,num_class,8,10), (1,num_class,4,5)]outs = self.bbox_head(x)# 把(tx1, ty1, tx2, ty2) 转换为对应的 box 坐标,同时进行了 nms 处理。# img_metas 主要记录了输入图像的路径, 原始大小,当前大小,缩放因子,正则化参数。# 返回的 bbox_list 包含了两个元素,第一个元素存储所有 box 坐标以及概率值,第二元素存储 box 对应的类别。bbox_list = self.bbox_head.get_bboxes(*outs, img_metas, rescale=rescale)# skip post-processing when exporting to ONNX,如果导出为 ONNX,则跳过后期处理if torch.onnx.is_in_onnx_export():return bbox_list# 把结果转化成numpy数组的形式。bbox_results = [bbox2result(det_bboxes, det_labels, self.bbox_head.num_classes)for det_bboxes, det_labels in bbox_list]return bbox_results[0]def aug_test(self, imgs, img_metas, rescale=False):"""Test function with test time augmentation."""raise NotImplementedError

代码领读

其实代码还是十分简单的,主要核心部分为 _init_ 函数的如下部分:

        # 根据主干网网络参数构建主干网络self.backbone = build_backbone(backbone)# 如果设置了衔接网络,则构件衔接网络if neck is not None:self.neck = build_neck(neck)# 根据配置参数构件头部网络self.bbox_head = build_head(bbox_head)

其构件的过程,跟前面配置文件中的 model 字典是一致的,如下:

# model settings
model = dict(type='FOVEA', # 设置为FOVEA,则其最终会调用到类mmdet.models.detectors.fovea.FOVEAbackbone=dict( # 主干网络相关配置type='ResNet', # 主干网络的类型......)neck=dict(type='FPN', # FPN,特征金字塔......)bbox_head=dict(type='FoveaHead', # 头部网络类型......)
)

ResNet 位于代码 mmdet\models\backbones\resnet.py 之中,FPN 位于 mmdet\models\necks\fpn.py 之中。经过 self.neck 网络输出的最终结果为一个列表,形状如下如下(假设网络输入图片大小为640x480):

 [(b,256,60,80), (b,256,30,40), (b,256,15,20), (b,256,8,10), (b,256,4,5)]

拿到这个结果之后,其会送入到 self.bbox_head 进行出来。这里就是我们下篇博客的重点了,同时也是这片论文的重点。对于 self.backbone 以及 self.neck 的具体过程,本人就不进行讲解了,因为这些并不是 Foveabox 这片论文的重点。有兴趣的朋友可以自己分析一下源码。

目标检测00-09:mmdetection(Foveabox为例)-源码无死角解析(2)-模型构建总览相关推荐

  1. 目标检测00-02:mmdetection(Foveabox为例)-官方数据训练测试-COCO

    以下链接是个人关于mmdetection(Foveabox-目标检测框架)所有见解,如有错误欢迎大家指出,我会第一时间纠正.有兴趣的朋友可以加微信:17575010159 相互讨论技术.若是帮助到了你 ...

  2. (01)ORB-SLAM2源码无死角解析-(54) 闭环线程→闭环检测:寻找闭环候选关键帧 LoopClosing::DetectLoop()

    讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (0 ...

  3. 刷新COCO目标检测纪录!谷歌只靠AI扩增数据,就把一个模型变成SOTA,已开源

    栗子 发自 凹非寺  量子位 报道 | 公众号 QbitAI 谷歌大脑Quoc Le团队,又训练出了一只地表最强的模型. 这是一个目标检测模型,从前并不是最强大. 但自从团队用机器学习解锁了特别的数据 ...

  4. 人脸检测MTCNN和人脸识别Facenet(附源码)

    原文链接:人脸检测MTCNN和人脸识别Facenet(附源码) 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第九节.人脸检测之Haa ...

  5. 【DPDK】dpdk样例源码解析之三:dpdk-l3fwd_001

    本篇文章主要介绍dpdk-l3fwd实例源码,通过分析代码逻辑,学习DPDK中几个API接口作用以及如何使用? 操作系统版本:CentOS 8.4 DPDK版本:dpdk-20.11.3 如何单独创建 ...

  6. c语言案例分析105,C语言实战105例源码

    C语言实战105例源码 以下程序大家如有兴趣可在文件夹下载即可 第1部分 基础篇 实例1 一个价值"三天"的BUG 2 实例2 灵活使用递增(递减)操作符 5 实例3 算术运算符计 ...

  7. 2022 个人目标日历定作工具 微信小程序源码

    这是一个个人目标日历制作小工具 简单来说就相当于手机上面带的提醒事项类似 另外拥有日历查看功能 2022 个人目标日历定作工具 微信小程序源码

  8. 【DPDK】dpdk样例源码解析之五:dpdk-rss

    本篇文章介绍DPDK-RSS相关的功能,RSS是网卡提供的分流机制,简单讲就是一个HASH值,如果使用DPDK收包,开启RSS后,会根据配置项将数据包分流到不同的收包队列,用来是实现负载均衡. 通过D ...

  9. 人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码

    人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码 目录 人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码 1.人体姿态估计2D Pose方法 2.人体姿 ...

最新文章

  1. RubyGems 库发现了后门版本的网站开发工具 bootstrap-sass
  2. Latex中设置字体颜色
  3. 数据库事务隔离技术之 Next-Key Locks
  4. 【模型训练】如何选择最适合你的学习率变更策略
  5. oracle 中的常用exception
  6. pygame外星人2
  7. CodeForces - 1534E Lost Array(bfs+交互)
  8. c++可达矩阵_测试分析人员必备知识—需求管理和可追溯性矩阵
  9. pv原语模拟实现_并发编程信号量的使用方法和其实现原理
  10. Python+OpenCV:图像轮廓
  11. 1.4 Flink HDFS Connector /Flink HDFS连接器
  12. Codeforces Round #365 Div.2
  13. atitit 需求条目的自动化生成原型html h5界面ui与解决方案
  14. 人体关节正常活动范围
  15. 资治通鉴-6 听的智慧
  16. 风控模型开发的特征选择与常用数据源介绍
  17. 中国地方方言交流学习总群 QQ群208192582
  18. 乐观数据:企业抖音蓝V账号获取流量运营的四个技巧
  19. 冯诺依曼体系结构 —(收藏版)
  20. 导数,差商,牛顿插值法

热门文章

  1. nodejs项目实例拼车租车平台
  2. 深度学习系列(三):简单网络的自编码学习
  3. 给STM32新人的建议——如何开始学习STM32
  4. Arduino GY85 I2C测试
  5. MacBook M1系统录屏录制屏内声音
  6. 人工智能实战:识别分类货船与游轮
  7. 百度 android 市场,百度宣布下线91和安卓市场渠道,第三方应用商店继续走向衰落...
  8. 流浪地球2投资成本多少?春节上映,吴京主演有多少票房
  9. testflight测试的直播软件,怎么使用 TestFlight 测试 App,注意些什么?
  10. Y430p下win8、ubuntu双系统