当前位置: 首页 > article >正文

深度学习-目标检测(四)-Faster R-CNN

目录

一.模型框架

二:步骤详细

1.conv layers

2.RPN

3.anchors

4.cls layer分类

5.reg layer回归

 6.Proprosal

7.Rol pooling

8.Classification

三.训练

1.训练RPN网络

2.全连接层部分训练:

 都看到这里了,点个赞把!!!!!


 

在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。

一.模型框架

如图:

1.conv layers:用于提取特征,通过conv+relu+pooling层来提取图像的feature maps (特征图)

2.RPN(Region Proposal Network)区域候选网络:替换了之前哪些的Selective Searvh,用于生成候选框。它里面做了一个二分类任务,一类是判断anchor是属于positive(识别的东西),另一类是判断是否是negative(不是目标的背景);还有一个bounding box regression:修正anchors得到较为准确的proposals,简单来说就是让候选框准确点。RPN是判断这张图片里面有没有目标,具体目标是什么这里还没判断,以及修正anchor的边框

3.Rol Pooling(兴趣域池化):简单来是就是收集RPN中选出来的候选框的坐标,一般收集左上角和右下角。并且将这些坐标对于1中提取的特征图中的特征,生成proposals feature maps送人全连接层

4.Classification and Regression:利用3中送入的数据计算出整个图片中的类别,同时再做一次bounding box regression获得检测框最终的精准位置

二:步骤详细

1.conv layers

如上图所示,共有13个conv层,13个relu层,4个pooling层

conv:kernel_size=3,padding=1,stride=1。核卷积操作类似,使用3*3的卷积核,一层零,步长为1

pooling:kernel_size=2,padding=0,stride=2。池化操作

经过conv层时数据变化为:

height=(h-k+2*p)/s+1=h-3+3,数据大小没变

width=(w-k+2*p)/s+1,数据大小没变

经过pooling时,因为步长为2,所以数据的宽高变为了之前的一办,有四个pooling,所以数据变为之前的1/16

2.RPN

图中所示,分为两个操作

1.softmax分类anchors获得positive和negative分类

2.计算对于每个anchors的bounding box regression(边框)偏移量,以获取比较精确的proposal

两步操作后在proposal结合,proposal层复杂将positive anchors和对应的bounding box regression偏移量获取修正后的proposals。同时剔除没有框住物体的和超出图片边界的proposals。

3.anchors

 经过conv leyer处理后的feature map(特征图)的大小为原来的1/16,同时在这些feature map中,经过conv操作后因为设置的是kernel_size=3的映射,所以对于每一个像素点,设置了9个预测anchor。这9个anchor的大小按照三种长宽比ratio[1:1,1:2,2:1]设置,具体大小根据输入图像的原始目标大小灵活设置。

设置anchor是为了覆盖图像上各个位置各种大小的目标,那么原图上anchor的数量就是(M/16) x (N/16) x 9。这么多anchor,第一肯定不准确,第二肯定不能要这么多,所以后续还会淘汰一大批以及修正anchor位置

4.cls layer分类

在拿到conv layers的feature map后,先经过一个3x3卷积(卷积核个数为256)红色框是一个anchor,所以通过这个卷积层后feature map的通道数也是256,k是anchor个数(文中默认是9)

 (M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x2k的输出,因为这里是二分类判断positive和negative,所以该feature map上每个点的每个anchor对应2个值,表示目标和背景的概率(为什么有2个,是因为这里是用的softmax,这两个值加起来等于1;也可以用sigmoid,就只需要1个值了)

 Reshape层是技术细节问题,对feature map进行维度变换,使得有一个单独的维度为2,方便在该维度上进行softmax操作,之后再Reshape恢复原状。

5.reg layer回归

 (M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x4k的输出,因为这里是生成每个anchor的坐标偏移量(用于修正anchor),[tx,ty,tw,th]共4个所以是4k。注意,这里输出的是坐标偏移量,不是坐标本身,要得到修正后的anchor还要用原坐标和这个偏移量运算一下才行。

偏移量计算公式

 其中[xa,ya,wa,ha]是anchor的中心点坐标和宽高,[tx.ty,tw,th]是这个回归层预测的偏移量,通过这个公式计算出修正后的anchor坐标[x,y,w,h]。计算如下:

 [px,py,pw,ph]表示原始anchor的坐标
[dx,dy,dw,dh]表示RPN网络预测的坐标偏移
[gx,gy,gw,gh]表示修正后的anchor坐标。

 

 6.Proprosal

分类和偏移量计算完后,将数据输入到Proposal,输入的有三个

cls层生成的数据

reg层生成的数据

im_info=[宽,高,scale_factor]

接收数据后会进行:

1.利用reg层的偏移量对所有原始的anchor进行修改

2.利用cls层的scores,按positive socres排序,取前面分数大的

3.将太大的positive anchor收拢到边框处,将太小的剔除

4.对剩余的positive anchors进行非极大抑制(NMS)

5.输出每个positive anchors的左上角和右下角坐标

7.Rol pooling

RoI Pooling层则负责收集proposal(上一个操作输出的坐标数据),并计算出proposal feature maps(从conv layers后的feature map中扣出对应位置),输入有两个:

1.conv layers 剔除的原始特征图feature map

2.RPN网络生成的Proposals

因为全连接层的每次输入数据大小都需要是固定的,所有需要一个操作来讲这些数据的大小统一一下,,而Rol Pooling就是讲图片固定大小的

8.Classification

具体分类,这里的分类是讲前面准备好的positive anchors识别具体分类,这里就可以分辨出是背景还是具体物体了。

1.通过全连接层的softmax对所有的proposals进行具体分类

2.再次对proposals进行bounding box regression处理,获得更好的边框

三.训练

Faster RCNN由于是two-stage检测器,训练要分为两个部分进行,一个是训练RPN网络,一个是训练后面的分类网络。

1.先使用ImageNet的预训练权重初始化RPN网络的共享conv层(RPN特有层可随机初始化),然后训练RPN网络。训练完后,共享conv层和RPN特有层的权重都更新了。

2.根据训练好的RPN网络拿到proposals(和测试过程一样)

3.再次使用ImageNet的预训练权重初始化Faster RCNN网络的贡献conv层(Faster RCNN特有层随机初始化),然后训练Faster RCNN网络。训练完后,共享conv层和Faster RCNN特有层的权重都更新了

4.使用第三步训练好的共享conv层和第一步训练好的RPN特有层来初始化RPN网络,第二次训练RPN网络。但这次要把共享conv层的权重固定,训练过程中保持不变,只训练RPN特有层的权重

5.根据训练好的RPN网络拿到proposals(和测试过程一样)

6.依然使用第三步训练好的共享conv层和第三步训练好的Faster RCNN特有层来初始化Faster RCNN网络,第二次训练Faster RCNN网络。同样,固定conv层,只fine tune特有部分

1.训练RPN网络

因为使用的是softmax,所以使用交叉熵损失来训练anchors是物体还是背景

对于边框部分训练,使用smooth L1 loss训练

smooth L1 loss:

2.全连接层部分训练:

和RPN一样,都是使用softmax分类和训练边框

 都看到这里了,点个赞把!!!!!

 


http://www.kler.cn/a/305228.html

相关文章:

  • uni-app中使用 unicloud 云开发平台③
  • 智享AI 无人自动直播的崛起 ,引领智能互动与自动带货新潮流!
  • 鸿蒙next版开发:订阅应用事件(ArkTS)
  • windows C#-LINQ概述
  • ODOO学习笔记(3):Odoo和Django的区别是什么?
  • window下安装rust 及 vscode配置
  • C#实现串口中继
  • 不废话简单易懂的Selenium 页面操作与切换
  • Python实现一个简单的爬虫程序(爬取图片)
  • postgresql 导出CSV格式数据
  • 电脑连手机热点,上不了网
  • CSS 响应式设计(补充)——WEB开发系列36
  • [数据集][图像分类]痤疮严重程度分级分类数据集999张3类别
  • QT学习第五天
  • mysql workbench 如何访问远程数据库
  • 快手手撕 力扣2487 从链表中移除节点 单调栈 递归
  • HTTP 请求方式`application/x-www-form-urlencoded` 与 `application/json` 怎么用?有什么区别?
  • C++编译环境(IDE)推荐及安装
  • 美国硅谷大带宽服务器带宽堵塞解决方案
  • Oracle发邮件功能:设置的步骤与注意事项?
  • 【Oracle】TIMESTAMP类型时间计算时间差
  • SprinBoot+Vue宠物共享平台的设计与实现
  • 性能诊断的方法(五):架构和业务诊断
  • 前端下载word、excel文件的两种方法
  • [数据集汇总]智慧交通-铁路相关数据集汇总
  • dedecms靶场(四种webshell姿势)