专栏首页YZh学习记录faster RCNN 学习记录
原创

faster RCNN 学习记录

一、faster RCNN 整体思路

二、RPN的理解

RPN

2.1 计算loss

loss的计算过程主要分为两类:分类loss,回归loss.

loss的计算过程需要知道真值和预测值。所以求取loss的过程就是真值与预测值求取的过程。

分类loss

真值:给Anchor打标签的过程,就是求真值的过程。

预测值:RPN网络预测出的分类结果,即是前景还是背景

回归loss

真值:Anchor与其对应的GT之间的offst值

预测值:RPN网络预测出的回归结果,即预测出的偏移量offst

很明显,回归的真值与分类的真值有关系,所有此过程的关键在于第一步,Anchor打标签的过程。

anchor打标签

Anchor的生成方式

在特征提取网络部分,以VGGNet为例,假设输入图像的维度为3×600×800,由于VGGNet 包含4个Pooling层,下采样率为16,因此输出的feature map的维度为512×37×50。

首先对 feature map进行3×3的卷积操作,得到的每一个点的维度是512维,这 512维的数据对应着原始图片上的很多不同的大小与宽高区域的特征, 这些区域的中心点都相同。如果下采样率为默认的16,则每一个点的坐 标乘以16即可得到对应的原图坐标。

特征图上的每一个像素点对应原图16x16大小区域的中心点,原图上16x16大小区域的中心点即为anchor的中心点。

根据不同面积,不同宽高比可得出9个不同大小的anchor。

因此Anchor的总数为37×50×9=16650个

Anchor的筛选方法

1. Anchor超出图像边缘部分进行过滤

实现思路:

根据第一个anchor的位置信息在原图上进行偏移,得到所有anchor的位置信息(左上角与右下角位置信息)

获得anchor总数,每一个anchor的位置信息;并将每一个anchor 的标签初始化为-1;

开始计算anchor与GT的IOU值

GT1

GT2

GT3

anchor1

anchor2

anchor3

横向比较:为anchor找到最大IOU值的GT

若最大IOU值小于0.3 ,直接看作负样本,标签为0

若最大IOU值大于0.7,直接看作正样本,标签为1

至于IOU值位于两者之间的数据,对训练没有帮助,直接视为无效数据,标签为-1

纵向比较:为GT找到最大IOU值的anchor,

最大IOU值的anchor直接看作正样本,标签为1(这里可以看作对前面正样本的补充)

2. Anchor 筛选

前面完成了anchor初步筛选,打标签的过程,但是负样本过多,正样本过少,导致正负样本不均衡。影响RPN网络的训练。

RPN默认选取256个Anchor参与损失计算。这里保证正负样本为1;1 .

因此分类loss的真值(即anchor的标签)得到了。

而回归损失的真值就是anchor与对应的GT的偏移量(offst)

Anchor 与GT 偏移量的求取过程:

ground truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h*

anchor box: 中心点位置坐标x_a,y_a和宽高w_a,h_a

所以,偏移量: △x=(x*-x_a)/w_a   △y=(y*-y_a)/h_a 

   △w=log(w*/w_a)   △h=log(h*/h_a)

2.2 RPN卷积网络

RPN训练设置:

在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个Anchor组成的,其中正负样本的比例为1:1。如果正样本不足128,则多用一些负样本以满足有256个Anchor可以用于训练,反之亦然

RPN 网络分为分类网络分支与回归网络分支

分类是二分类,即前景与背景的分类。由于每个点默认有9个Anchors,并且每个Anchor只预测其属于前景 还是背景,因此通道数为18。随后利用torch.view()函数将特征映射到 2×333×75,这样第一维仅仅是一个Anchor的前景背景得分,并送到 Softmax函数中进行概率计算,得到的特征再变换到18×37×50的维度, 最终输出的是每个Anchor属于前景与背景的概率。

即完成分类loss的预测值的求取过程。

在回归分支中,利用1×1卷积输出36×37×50的特征,第一维的36包 含9个Anchors的预测,每一个Anchor有4个数据,分别代表了每一个 Anchor的中心点横纵坐标及宽高这4个量相对于真值的偏移量。

即完成回归loss的预测值求取过程。

softmax的作用?sigmod有什么区别?

https://www.cnblogs.com/ymjyqsx/p/11379726.html

https://blog.csdn.net/yangwohenmai1/article/details/96156497?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

多分类与多标签分类

https://www.cnblogs.com/ai-learning-blogs/p/11748543.html

2.3 loss函数

分类部分:使用交叉熵损失函数

回归部分:使用smoothL1函数

smoothL1优势

https://cloud.tencent.com/developer/article/1441560

3. 生成Proposal

上文筛选256个Anchor是参与RPN训练的过程。

而RPN网络的输出的四个回归值△x,△y,△w,△h。

将网络中得到的回归偏移作用到Anchor上使Anchor更 加贴近于真值,并修剪超出图像尺寸的Proposal,得到最初的建议区 域。

在这之后,按照分类网络输出的得分对Anchor排序,保留前12000 个得分高的Anchors。由于一个物体可能会有多个Anchors重叠对应,因 此再应用非极大值抑制(NMS)将重叠的框去掉,最后在剩余的 Proposal中再次根据RPN的预测得分选择前2000个,作为最终的 Proposal。

3.1 Proosal再筛选

原因:

上一步生成的Proposal数量为2000个,其中仍然有很多背景框,真正包含物体的仍占少数,因此完全可以针对Proposal进行再一步筛选,过程与RPN中筛选Anchor的过程类似,利用标签与Proposal 构建IoU矩阵,通过与标签的重合程度选出256个正负样本。

优势:

·筛选出了更贴近真实物体的RoI,使送入到后续网络的物体正、负 样本更均衡,避免了负样本过多,正样本过少的情况。

·减少了送入后续全连接网络的数量,有效减少了计算量。

·筛选Proposal得到RoI的过程中,由于使用了标签来筛选,因此也 为每一个RoI赋予了正、负样本的标签,同时可以在此求得RoI变换到对应标签的偏移量,这样就求得了RCNN部分的真值。

实现过程:

首先计算Proposal与所有的物体标签的IoU矩阵,然后 根据IoU矩阵的值来筛选出符合条件的正负样本。筛选标准如下:

·对于任何一个Proposal,其与所有标签的最大IoU如果大于等于 0.5,则视为正样本。

·对于任何一个Proposal,其与所有标签的最大IoU如果大于等于0且 小于0.5,则视为负样本。

选出的正、负样本数量不一,在此设定正、 负样本的总数为256个,其中正样本的数量为p个。为了控制正、负样本 的比例基本满足1:3,在此正样本数量p不超过64,如果超过了64则从正 样本中随机选取64个。剩余的数量256-p为负样本的数量,如果超过了 256-p则从负样本中随机选取256-p个。

经过上述操作后,选出了最终的256个RoI,并且每一个RoI都赋予 了正样本或者负样本的标签。在此也可以进一步求得每一个RoI的真 值,即属于哪一个类别及对应真值物体的偏移量。

NMS理解

https://blog.csdn.net/fu6543210/article/details/80380660?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

三、 ROI Pooling

然而,由于RoI是由各种大小宽高不同的Anchors经过偏移修正、筛 选等过程生成的,因此其大小不一且带有浮点数,然而后续相连的全连 接网络要求输入特征大小维度固定,这就需要有一个模块,能够把各种 维度不同的RoI变换到维度相同的特征,以满足后续全连接网络的要 求,于是RoI Pooling就产生了。

Pooling 的过程关键在于生成7x7大小的区域特征。

两次量化:

第一次是生成的ROI大小 经过16倍下采样生成的特征图(向下取整)

假设大小为332×332,332/16=20.75。RoI Pooling的做法是直接将浮点数量化为整数,取整为20×20。

第二次(向下取整)

通过pooling,将20x20 变为7x7.

参考链接

https://www.cnblogs.com/wangyong/p/8513563.html

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CAM 系列论文阅读总结

    CAM全称Class Activation Mapping,既类别激活映射图,也被称为类别热力图。

    yzh
  • valgrind测试报告分析

    valgrind输出结果会报告5种内存泄露,"definitely lost", "indirectly lost", "possibly lost", "st...

    yzh
  • GhostNet: More Features from Cheap Operations论文解析

    由于内存和计算资源有限,很难在嵌入式设备上部署卷积神经网络(CNN)。特征图中的冗余是那些成功的CNN的重要特点,但很少在神经体系结构设计中进行研究。本文提出了...

    yzh
  • 云备份可以降低备份存储成本吗?

    数据保护最昂贵的成本之一是所有数据副本的存储成本。备份存储容量可能是主存储容量的10倍或更多。备份存储需要企业具有极高的IT预算和数据中心机房空间。 ? 而数据...

    静一
  • 开发直播app软件过程中的云存储和备份

    随着科技不断地发展和进步,云技术的应用已经开始大面积的普及,云技术主要是指在广域网或局域网内将硬件、软件和网络等一系列资源统一起来,实现数据的计算、储存、共享和...

    肉2466131704
  • 全栈必备 Redis基础

    在《老码农眼中的简明AI》一文中提到了图灵机和冯诺伊曼的计算机体系结构,数据存储是整个计算机软件系统中的一个关键节点。从个人电脑上的软件到基于计算机网络的分布式...

    半吊子全栈工匠
  • SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易

    目录 CLR 用户定义函数 模式匹配 数据提取 模式存储 匹配 在匹配项中进行数据提取 总结 尽管 T-SQL 对多数数据处理而言极其强大,...

    菩提树下的杨过
  • YAML 语言教程

    编程免不了要写配置文件,怎么写配置也是一门学问。 YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。 本文介绍 YAML 的语法,...

    ruanyf
  • caffe详解之mnist手写体识别

    caffe(https://github.com/BVLC/caffe/tree/master/examples/mnist)

    AI异构
  • 快速学习Jetty-idea安装Jetty

    cwl_java

扫码关注云+社区

领取腾讯云代金券