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

深度学习-目标检测(四)-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.lryc.cn/news/438477.html

相关文章:

  • MATLAB中的无线通信系统设计有哪些最佳实践
  • Java的发展史与前景
  • 2024年上海小学生古诗文大会倒计时30多天:做几道今年的官方模拟题
  • IDEA 常用配置和开发插件
  • 还在为企微联系人烦恼?一招解决!企业微信2024年效率升级全攻略
  • 【docker npm】npm 私库
  • 完整gpt应用(自用)
  • 【信息论基础第二讲】离散信源的数学模型及其信息测度包括信源的分类、信源的数学模型、离散信源的信息测度、二元信源的条件熵联合熵
  • 在 Spring Boot 项目中连接 IBM AS/400 数据库——详细案例教程
  • VUE + NODE 历史版本安装
  • git reset 几点疑问
  • Rust Windows下编译 静态链接VCRuntime140.dll
  • 从“天宫课堂”到人工智能:中国少儿编程的未来在哪里?
  • ARM base instruction -- blr
  • 宠物猫领养馆会员管理系统---附源码72579
  • 驾驶员注意力分神状态检测系统源码分享
  • 基于less和scss 循环生成css
  • opencv之Canny边缘检测
  • springBoot 集成https
  • 数据库连接池与Druid【后端 16】
  • C#使用Access数据库使用总结
  • 使用Dataherald组件进行数据分析:从安装到查询的完整指南
  • sqlx1.3.4版本的问题
  • Rust 编译器使用的 C++ 编译器吗?
  • Python计算机视觉 第10章-OpenCV
  • 多层感知机 (Multilayer Perceptron, MLP)
  • reg和wire的区别 HDL语言
  • 前置声明和头文件之间的关系 问题
  • Linux02
  • df 命令:显示磁盘空间使用情况