常用的Region Proposal

  • Selective Search
  • Edge Boxes

Softmax-loss

softmax-loss层和softmax层计算大致是相同的,softmax是一个分类器,计算的是类别的概率(Likelihood),是Logistic Regression的一种推广。Logistic Regression只能用于二分类,而Softmax可以用于多分类,softmax和softmax-loss的区别:

Softmax计算公式:

而Softmax-loss的计算公式:

用户最终目的就是得到各个类别的概率似然值,这个时候就只需要一个Softmax层,而不一定要进行softmax-loss操作;或者用户有通过其他什么凡是已经得到了某种概率似然值,然后要做最大似然估计,此时则只需要后面的softmax-loss而不需要前面的softmax操作,因此提供两个不同的layer结构比值提供一个合在一起的Softmax-loss layer要灵活许多,不管是softmax layer还是softmax-loss layer都是没有参数的,只是层类型不同而已

softmax-loss layer:输出loss值

layer{

name:“loss”

type:"SoftmaxWithLoss"

bottom:"ip1"

bottom:"label"

top:"loss"

}

softmax layer:输出似然估计

layers{

bottom:"cls3_fc"

top:"prob"

name:"prob"

type:"Softmax"

}

Selective Search

这个策略其实是借助了层次聚类的思想,将层次聚类的思想应用到区域合并上面:

  1. 假设现在图像上有n个预分割的区域(Efficient Graph-Based image Segmentation)表示R={R1,R2,......,Rn}
  2. 计算每个region与其它相邻region(注意是相邻的区域)的相似度,这样会得到一个n*n的相似度矩阵(同一个区域之间和一个区域与不相邻区域之间的相似度可以设为NaN)从矩阵中找出最大相似度值对应的两个区域,将这两个区域合二为一,这时候图像上还剩下n-1个区域
  3. 重复上面的过程(只需要计算新的区域与它相邻区域的新相似度,其他的不用重复计算)重复一次,区域的总数目就减少1,直到最后所有的区域都合并成为了同一个区域(即此过程进行了n-1次,区域总数目最后变成了1),算法的流程图如下图所示:

SPP-NET

SPP-Net:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

R-CNN框架,对图像提完Region Proposal(2000个左右)之后将每个Proposal当成一张图像进行后续处理(CNN提特征+SVM分类)实际上对一张图像进行了2000次提特征和分类的过程!这2000个Region Proposal都是图像的一部分,那么完全可以对图像提一次卷积层特征,然后只需要将Region Proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个Region Proposal的卷积层特征输入到全连接层做后续操作(对于CNN来说,大部分运算都耗在卷积操作上,这样做可以节省大量时间)

现在的问题是每个Region Proposal的尺度不一样,直接输入全连接层肯定是不行的,因为全连接层输入必须是固定长度SPP-Net刚好可以解决这个问题

由于传统的CNN限制了输入必须固定大小(比如AlexNet是224*224)所以在实际使用中往往需要对原图进行crop或者warp的操作:

-crop:截取图片的一个固定大小的patch

-warp:将原图片的ROI缩放到一个固定大小的patch

无论是crop还是warp,都无法保证在不失真的情况下将图片传入CNN当中:

-crop:物体可能会产生截断,尤其是长宽比大的图片

-warp:物体被拉伸,失去“原形”,尤其是长宽比大的图片

SPP-Net为的就是解决上述问题,做到的效果为:不管输入的图片是什么尺度,都能够正确的传入网络。

具体的思路为:CNN的卷积层是可以处理任意尺度的输入的,只是在全连接层处有限制尺度-换句话说,如果找到一个方法,在全连接层之前将其输入限制到等长,那么就解决这个问题了。

具体方案如下:

如果原图输入是224*224,对于Conv5出来后的输出,是13*13*256的,可以理解成有256个这样的filter,每个filter对应一张13*13的activation map。如果像上图那样将activation map pooling成4*4 2*2 1*1三张子图,做max pooling后,出来的特征就是固定长度的(16+4+1)*256那么多维度了,如果原图的输入不是224*224,出来的特征依然是(16+4+1)*256;直觉地说,可以理解成将原来固定大小为(3*3)窗口的pool5改成了自适应窗口大小,窗口的大小和activation map成比例,经过了pooling后出来的feature的长度是一致的。

Bounding Box Regression

R-CNN中的bounding box回归

先介绍R-CNN和Fast R-CNN中所用到的边框回归方法

(1).什么是IOU?

IOU的定义:物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box,我们还要识别出bounding box里面的物体就是车辆,对于bounding box的定位精度,有一个很重要的概念,因为我们的算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU

IOU定义了两个bounding box的重叠度,如下图所示:

矩形框A和矩形框B的一个重合度IOU计算公式为IOU=(A∩B)/(A∪B)

就是矩形框A,B的重叠面积占A,B并集的面积比例:IOU=Si/(SA+SB-Si)

(2).为什么要做Bounding-box regression?

如上图所示,绿色的框为飞机的Ground Truth,红色的框是提取的Region Proposal,那么即便是红色框被分类器识别为飞机,但是由于红色的框定位不准(IOU<0.5),那么这张图相当于没哟正确的检测出飞机,我们能对红色的框进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样岂不是定位会更准确,确实Bounding-box regression就是用来微调这个窗口的。

(3).回归/微调的对象是什么?

对于窗口一般使用四维向量(x,y,w,h)来表示,分别表示窗口的中心点坐标和宽高,对于下图,红色的框P代表原始的Proposal,绿色的框G代表目标的Ground Truth,我们的目标是寻找一种关系使得输入原始的窗口P经过映射得到一个跟真事窗口G更接近的回归窗口G^(G hat).

即:给定(Px,Py,Pw,Ph),寻找一种映射f,使得

(4).Bounding-box regression(边框回归)

那么经过何种变换才能从图11中的窗口P变换为窗口G^(G hat)呢?比较简单的思路是:

[1].先做平移(△x,△y),△x = Pwdx(P),△y = Phdy(P)

  • 这就是R-CNN论文中的:

[2].后做尺度缩放(Sw,Sh),Sw = Pwdw(P),Sh = Phdh(P)

所以由上面的4个公式可以看出,我们需要学习dx(P),dy(P),dw(P),dh(P)这四个变换,下一步就是设计算法得到这四个映射。当输入Proposal与Ground Truth相差较小时(R-CNN设置的是IoU>0.6),可以认为这种变换是一种线性变换,那么就可以用线性回归来建模对窗口进行微调。

Note:只有当Proposal和Ground Truth比较接近时(线性问题)才能将其作为训练样本训练线性回归模型,否则会导致训练的回归模型不work(当Proposal跟Ground Truth离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理),这个也是G-CNN:an Interative Grid Based Object Dector多次迭代实现目标准确定位的关键。

线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(Ground Truth)非常相近。

输入:Region Proposal → P = (Px,Py,Pw,Ph),这个是什么?输入就是这四个数值?其实真正的输入是这个窗口对应的CNN特征,也就是R-CNN中Pool5 feature(特征向量)。(注:训练阶段输入还包括Ground Truth,也就是t*=(tx,ty,tw,th))。

输出:需要进行评议变换和尺度缩放dx(P),dy(P),dw(P),dh(P),或者说△x,△y,Sw,Sh,最终的输出不应该是Ground Truth吗?有了这四个变换就可以直接得到Ground Truth,这里还有一个问题,就是根据上面的4个公式可以知道P经过dx(P),dy(P),dw(P),dh(P)变换后,得到的并不是真实值G,而是预测值G^(G hat),的确,这四个值应该是经过Ground Truth和Proposal计算得到的真正需要的平移量和尺度缩放。也就是R-CNN中的:

那么目标函数可以表示为是输入Proposal的特征向量,W*是要学习的参数(*表示x,y,w,h,也就是每一个变换对应一个目标函数),d*(P)是得到的预测值,要让预测值跟真实值t* = (tx,ty,tw,th)差距最小,得到损失函数为:

函数的优化目标为:

利用梯度下降法或者最小二乘法就可以得到

Region Proposal Network

RPN的实现方式:在conv5_3的卷积feature map上用一个n*n的滑窗(论文作者选用了n=3,即3*3的滑窗)生成一个长度为256(ZF网络)或512(VGG网络)维长度的全连接特征,然后这个256维或者512维特征后产生两个分支的全连接层:

[1]:reg-layer :用于预测proposal的中心锚点对应的proposal的坐标x,y和宽高w,h

[2]:cls-layer,用于判定该proposal是前景还是背景,sliding window的处理方式保证reg-layer和cls-layer关联了conv5_3的全部特征空间,事实上,作者用全连接层实现方式介绍RPN层实现帮助我们理解这一过程,而在实现时作者选用了卷积层实现全连接层的功能。

[3]:全连接层本来就是特殊的卷积层,如果产生256或者512维的fc特征,事实上可以用Num_out=256或512,kernel_size=3*3,stride=1的卷积层来说海鲜conv5_3到第一个全连接特征的映射,然后再用两个Num_out分别为2*9=18,4*9=36,kernel_size = 1的卷积层来实现上一层特征到两个分支cls层和reg层的特征映射。

[4]:注意,这里的2*9中的2指cls层的分类结果包括前后背景两类,4*9的4表示一个Proposal的中心点坐标x,y和宽高w,h四个参数。采用卷积的方式实现全连接处理并不会减少参数的数量,但是使得输入图像的尺寸可以更加灵活,在RPN网络中,需要重点理解其中的anchros概念,Loss functions计算方式和RPN层训练数据生成的具体细节:

Anchros:字面上可以理解为锚点,位于之前提到的n*n的sliding window的中心处,对于一个sliding window,我们可以同时预测多个proposal,假设有k个,k个proposal即k个reference boxes,每一个reference box又可以用一个scale,一个aspect_ratio和sliding window中的锚点唯一确定,所以我们说一个anchor,就可以理解成一个anchro box或一个reference box。作者在论文中定义k = 9,即3种scales和3种aspect_ratio确定出当前sliding window位置处对应9个reference boxes,4*k个reg-layer的输出和2*k个cls-layer的score输出,对于一幅W*H feature map,对应W*H*H个锚点,所有的锚点都具有尺度不变性。

Loss Function:

在计算Loss值之前,作者设置了anchors的标定方法,正样本标定规则:

1):如果Anchor对应的reference box与ground truth的IoU值最大标记为正样本;

2):如果Anchor对应的reference box与ground truth的IoU>0.7,标记为正样本,事实上,采用第二个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference box与ground truth的IoU不大于0.7,可以采用第一种规则生成

3):负样本标定规则:如果Anchor对应的reference box与ground truth的IoU<0.3,标记为负样本

4):剩下的既不是正样本也不是负样本,不用于最终训练

5):训练RPN的Loss是有classification loss(即softmax loss)和regression loss(即L1 loss)按一定比重组成的,计算softmax loss需要的是anchors对应的ground truth标定结果和预测结果,计算regression loss需要三组信息:

  • 预测框,即RPN网络预测出的proposal的中心为主坐标x,y和宽高w,h
  • 锚点reference box,之前的9个锚点对应9个不同的scale和aspect_ratio的reference boxes,每一个reference boxes都有一个中心点位置坐标x_a,y_a,w_a,h_a
  • ground truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h* ,因此计算regression loss和总loss的方式如下:

RPN训练设置:

[1]:在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1

[2]:如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然

[3]:训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数;剩下没有的层参数用标准差=0.01的高斯分布初始化

RoI Pooling

RoI Pooling layer实际上是SPP-Net的一个精简版,SPP-Net对每个Proposal使用了不同大小的金字塔映射,而RoI Pooling layer只需要下采样到一个7*7的特征图,对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个7*7*512维度的特征向量作为全连接层的输入。RoI Pooling就是实现从原图区域映射到con5区域最后pooling到固定大小的功能。

Object-Detection中常用的概念解析的更多相关文章

  1. PMP考试--成本管理中常用的概念

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 净现值(NPV)   Net Present Value 在项目计算期内,按行业基准 ...

  2. 【尺度不变性】An Analysis of Scale Invariance in Object Detection – SNIP 论文解读

    前言 本来想按照惯例来一个overview的,结果看到1篇十分不错而且详细的介绍,因此copy过来,自己在前面大体总结一下论文,细节不做赘述,引用文章讲得很详细,另外这篇paper引用十分详细,如果做 ...

  3. .NET中常用的几种解析JSON方法

    一.基本概念 json是什么? JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是一种轻量级的数据交换格式,是存储和交换文本信息的语法. ...

  4. 2019-2-20C#开发中常用加密解密方法解析

    C#开发中常用加密解密方法解析 一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是 message-digest algorithm 5[|ˈmes ...

  5. 第三十四节,目标检测之谷歌Object Detection API源码解析

    我们在第三十二节,使用谷歌Object Detection API进行目标检测.训练新的模型(使用VOC 2012数据集)那一节我们介绍了如何使用谷歌Object Detection API进行目标检 ...

  6. 深度学习论文翻译解析(四):Faster R-CNN: Down the rabbit hole of modern object detection

    论文标题:Faster R-CNN: Down the rabbit hole of modern object detection 论文作者:Zhi Tian , Weilin Huang, Ton ...

  7. 【Network Architecture】Feature Pyramid Networks for Object Detection(FPN)论文解析(转)

    目录 0. 前言 1. 博客一 2.. 博客二 0. 前言   这篇论文提出了一种新的特征融合方式来解决多尺度问题, 感觉挺有创新性的, 如果需要与其他网络进行拼接,还是需要再回到原文看一下细节.这里 ...

  8. tensorfolw配置过程中遇到的一些问题及其解决过程的记录(配置SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural Networks for Real-Time Object Detection for Autonomous Driving)

    今天看到一篇关于检测的论文<SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural Networks for Real- ...

  9. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

随机推荐

  1. 针对16v554(ttyS0-15)的ttyAT0的login配置

    1 ## /etc/inittab# console::sysinit:/etc/init.d/rcSconsole::respawn:/sbin/getty -L 115200 ttyAT0 vt1 ...

  2. [Cxf] cxf 相关知识整理

    ① 请求方式为GET @GET @Path(value = "/userAddressManage") @Produces( { MediaType.APPLICATION_JSO ...

  3. MRF能量优化

    一个外国博客,写的比较清晰 http://nghiaho.com/?page_id=1366 MRF优化牛人 重庆大学的教授 1 http://qianjiye.de/2015/09/reparame ...

  4. 错题0925-java

    1.Given the following code: public class Test { private static int j = 0; private static Boolean met ...

  5. Unity3D 新版粒子系统 (Shuriken)

    Shuriken粒子系统是继Unity3.5版本之后推出的新版粒子系统,它采用了模块化管理,个性化的粒子模块配合粒子曲线编辑器使用户更容易创作出各种兵分复杂的粒子效果. 创建一个粒子系统的方式有两种: ...

  6. 【BZOJ】2555: SubString(后缀自动机)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2555 学到了如何快速维护right值orz (不过这仍然是暴力维护,可以卡到O(n) 首先我们在加一 ...

  7. 小结:A* & IDA* & 迭代深搜

    概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...

  8. c# windows service(服务)

    //安装%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe //卸载%Syst ...

  9. sublime text 2安装Emment插件

    写个自己看的 1. 命令行模式 ctrl+` 可以调出命令行模式(view->show console),主要支持python语法等,没试用过只知 quit()可以退出 ..不过sublime的 ...

  10. 开启mysql日志及若干问题

    今天学习了mysql日志功能,以前也有所了解,只不过没有深入的学习,所以趁着“余热”,把我从网上找到的资料与实践 结合起来,总结一下其基本用法.学习从来都不是无趣的,就看你怎么看待学习. 1.查看查询 ...