目标检测 - 二阶段检测 - Faster-RCNN

2024-04-24 11:08
文章标签 目标 检测 阶段 faster rcnn

本文主要是介绍目标检测 - 二阶段检测 - Faster-RCNN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

部分内容参考:
1、https://blog.csdn.net/liuxiaoheng1992/article/details/81843363
2、mmdetection源码(下面简称为mmdet)

论文解读

模型结构

论文中的图
在这里插入图片描述
一个更详细的图
在这里插入图片描述

Faster-RCNN有两部分组成:RPN和Fast-RCNN。两者共享同一个backbone。具体来说,Faster-RCNN由以下几部分组成:
1、backbone(VGG,ResNet等)
2、neck(FPN,原版的faster没有,FPN出来之后后人才加上的)
3、rpn_head(RPNHead)
4、bbox_roi_extractor(SingleRoIExtractor > RoIAlign,RoIPool)
5、bbox_head(SharedFCBBoxHead)
上面是参考mmdet的config来分类的。backbonhe和neck无需多言,很常见的操作。下面讲以下剩下的三个部分。
rpn_head
在这里插入图片描述上图是论文中的图,conv feature map是backbone出来的,或者是neck出来的特征。在mmdet代码中,滑动窗用一个3x3的conv来实现,独立的分类和回归层分别用两个1x1的conv来实现。代码如下:

@HEADS.register_module
class RPNHead(AnchorHead):def __init__(self, in_channels, **kwargs):super(RPNHead, self).__init__(2, in_channels, **kwargs)def _init_layers(self):self.rpn_conv = nn.Conv2d(self.in_channels, self.feat_channels, 3, padding=1)  # in:256, out:256self.rpn_cls = nn.Conv2d(self.feat_channels,self.num_anchors * self.cls_out_channels, 1)# self.cls_out_channels = 2 前景和背景self.rpn_reg = nn.Conv2d(self.feat_channels, self.num_anchors * 4, 1)def init_weights(self):normal_init(self.rpn_conv, std=0.01)normal_init(self.rpn_cls, std=0.01)normal_init(self.rpn_reg, std=0.01)# 对单个feature map做操作,forward在AnchorHead中定义,将forward_single应用到feats上def forward_single(self, x):x = self.rpn_conv(x)x = F.relu(x, inplace=True)rpn_cls_score = self.rpn_cls(x)rpn_bbox_pred = self.rpn_reg(x)return rpn_cls_score, rpn_bbox_pred

rpn_head输出proposal的得分+框的位置信息。

bbox_roi_extractor
从名字就可以知道,bbox_roi_extractor是对bbox_roi进行特征提取的组件,faster-rcnn论文中用的是roi_pooling,mask-rcnn中用的是roi_align,R-FCN中的position-sensitive RoI pooling layer等。

训练
论文中的训练方式

论文中,给出了三种训练方式
1、交替训练
先训RPN,然后将RPN得到的proposal拿去训Fast-RCNN,接着Fast-RCNN微调后的网络去初始化RPN,然后训RPN,这个过程交替进行。(这里有一个疑问,是在每一个batch进行交替,还是训好RPN,再训Fast-RCNN这样进行,如果是每一个batch进行交替,那么可以保证proposal在batch内是不变的,如果是另一种,那么需要保证训好RPN之后,要把RPN冻住,才能保证proposal的稳定)
2、近似联合训练
RPN和Fast-RCNN当成一个整体,前向过程中,RPN生成的proposal当成是预先生成好去训练Fast-RCNN,反向传播过程,对于共享的卷积层,计算梯度的是RPN loss和Fast RCNN的losss相加,其他独立的部分就是各自的Loss。"approximate"体现在反向传播阶段RPN产生的置信误差能够获得梯度以更新参数,但是region proposals的坐标预测则直接把梯度舍弃了,也就是说box误差不参与loss的计算(和交替训练相比,这种方法的好处在于缩短训练时间)。
3、非近似联合训练
和近似联合训练相比,非近似联合训练,把RPN生成的proposal的loss也考虑进行梯度回归,通过“RoI warping” 层进行梯度反传???
四步训练法
第一步:imagenet初始化,训RPN,得到proposal
第二步:imagenet初始化,用RPN的proposal训Fast-RCNN
第三步:Fast-RCNN初始化共有卷积,训RPN(fix共有卷积)
第四步:fix共有卷积和RPN,训Fast-RCNN

mmdetection中的训练
RPN生成proposals->RCNN样本匹配(FPN)
# 超参
# 1. nms_pre: 进行nms之前的数目, 2. nms_post: nms之后的输出个数, 3. nms_thr: nms阈值
# 4. max_num: 单张图片最终输出proposals最多的个数, 5. nms_across_levels: 是否在跨levels进行nms操作mlvl_proposals = []
for stride in strides:# 1. 在多个strides下对模型预测值进行解码,获取预测框# 2. 做一些过滤的操作do clipremove smallnms # nms_pre和nms_post通常等于2000# 得到每个stride的proposals# 3. mlvl_proposals.append(proposals)
# 将各个strides的proposals给concat起来
if nms_across_levels:proposals, _ = nms(proposals, cfg.nms_thr)proposals = proposals[:cfg.max_num, :]
else:scores = proposals[:, 4]num = min(cfg.max_num, proposals.shape[0])_, topk_inds = scores.topk(num)proposals = proposals[topk_inds, :]
return proposals

这篇关于目标检测 - 二阶段检测 - Faster-RCNN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931584

相关文章

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

3月份目标——刷完乙级真题

https://www.patest.cn/contests/pat-b-practisePAT (Basic Level) Practice (中文) 标号标题通过提交通过率1001害死人不偿命的(3n+1)猜想 (15)31858792260.41002写出这个数 (20)21702664840.331003我要通过!(20)11071447060.251004成绩排名 (20)159644

大型网站架构演化(一)——初始阶段的网站架构

大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户,问题就会变得很棘手。大型网站架构主要是解决这类问题。         大型网站都是从小型网站发展而来,网站架构也是一样,是从小型网站架构逐步演化而来。小型网站最开始时没有太多人访问,只需要一台服务器就绰绰有余,这时的网站架构如图所示。

基于深度学习的轮廓检测

基于深度学习的轮廓检测 轮廓检测是计算机视觉中的一项关键任务,旨在识别图像中物体的边界或轮廓。传统的轮廓检测方法如Canny边缘检测和Sobel算子依赖于梯度计算和阈值分割。而基于深度学习的方法通过训练神经网络来自动学习图像中的轮廓特征,能够在复杂背景和噪声条件下实现更精确和鲁棒的检测效果。 深度学习在轮廓检测中的优势 自动特征提取:深度学习模型能够自动从数据中学习多层次的特征表示,而不需要

自动驾驶---Perception之Lidar点云3D检测

1 背景         Lidar点云技术的出现是基于摄影测量技术的发展、计算机及高新技术的推动以及全球定位系统和惯性导航系统的发展,使得通过激光束获取高精度的三维数据成为可能。随着技术的不断进步和应用领域的拓展,Lidar点云技术将在测绘、遥感、环境监测、机器人等领域发挥越来越重要的作用。         目前全球范围内纯视觉方案的车企主要包括特斯拉和集越,在达到同等性能的前提下,纯视觉方

爬虫阶段思考

内容:写这篇文章是因为最近帮同学改了很多的爬虫代码,感触良多。 我用豆瓣为例,并不是不会用别的,而是这个我个人感觉最经典。然后还会写我遇到的一些问题以及解决方法。 首先,我们得先知道怎样爬取。我用的scrapy框架爬取。 我对此图的理解就是: 从spiders中获得一个请求(REQUEST),通过引擎传递给调度器,之后再返回给引擎,引擎把url封装好后传递给下载器,下载器将资源下载好后

YOLOv9摄像头或视频实时检测

1、下载yolov9的项目 地址:YOLOv9 2、使用下面代码进行检测 import torchimport cv2from models.experimental import attempt_loadfrom utils.general import non_max_suppression, scale_boxesfrom utils.plots import plot_o

Java内存泄漏检测和分析介绍

在Java中,内存泄漏检测和分析是一个重要的任务,可以通过以下几种方式进行:   1. 使用VisualVM VisualVM是一个可视化工具,可以监控、分析Java应用程序的内存消耗。它可以显示堆内存、垃圾收集、线程等信息,并且可以对内存泄漏进行分析。 2. 使用Eclipse Memory Analyzer Eclipse Memory Analyzer(MAT)是一个强大的工具,可

Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接

在进行参数化读取时发现一个问题: 发现问题: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8081): Max retries exceeded with url: /jwshoplogin/user/update_information.do (Caused by NewConn

基于CDMA的多用户水下无线光通信(3)——解相关多用户检测

继续上一篇博文,本文将介绍基于解相关的多用户检测算法。解相关检测器的优点是因不需要估计各个用户的接收信号幅值而具有抗远近效应的能力。常规的解相关检测器有运算量大和实时性差的缺点,本文针对异步CDMA的MAI主要来自干扰用户的相邻三个比特周期的特点,给出了基于相邻三个匹配滤波器输出数据的截断解相关检测算法。(我不知道怎么改公式里的字体,有的字母在公式中重复使用了,请根据上下文判断字母含义) 1