边框回归(Bounding Box Regression)详解

原文地址:http://blog.csdn.net/zijin0802034/article/details/77685438

Bounding-Box regression

最近一直看检测有关的Paper, 从rcnn, fast rcnn, faster rcnn, yolo, r-fcn, ssd,到今年cvpr最新的yolo9000。这些paper中损失函数都包含了边框回归,除了rcnn详细介绍了,其他的paper都是一笔带过,或者直接引用rcnn就把损失函数写出来了。前三条网上解释比较多,后面的两条我看了很多paper,才得出这些结论。

  • 为什么要边框回归?
  • 什么是边框回归?
  • 边框回归怎么做的?
  • 边框回归为什么宽高,坐标会设计这种形式?
  • 为什么边框回归只能微调,在离Ground Truth近的时候才能生效?

为什么要边框回归?

这里引用王斌师兄的理解,如下图所示:


这里写图片描述

 

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

边框回归是什么?

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

 


这里写图片描述

 

边框回归的目的既是:给定(Px,Py,Pw,Ph) 寻找一种映射f , 使得f(Px,Py,Pw,Ph)=(Gx^,Gy^,Gw^,Gh^) 并且(Gx^,Gy^,Gw^,Gh^)(Gx,Gy,Gw,Gh)

边框回归怎么做的?

那么经过何种变换才能从图 2 中的窗口 P 变为窗口G^ 呢? 比较简单的思路就是: 平移+尺度放缩

  1. 先做平移(Δx,Δy)Δx=Pwdx(P),Δy=Phdy(P) 这是R-CNN论文的:
    G^x=Pwdx(P)+Px,(1)
    G^y=Phdy(P)+Py,(2)
  2. 然后再做尺度缩放(Sw,Sh) , Sw=exp(dw(P)),Sh=exp(dh(P)) , 对应论文中:
    G^w=Pwexp(dw(P)),(3)
    G^h=Phexp(dh(P)),(4)

观察(1)-(4)我们发现, 边框回归学习就是dx(P),dy(P),dw(P),dh(P) 这四个变换。下一步就是设计算法那得到这四个映射。

线性回归就是给定输入的特征向量 X, 学习一组参数 W, 使得经过线性回归后的值跟真实值 Y(Ground Truth)非常接近. 即YWX 。 那么 Bounding-box 中我们的输入以及输出分别是什么呢?

Input:

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

Output:

需要进行的平移变换和尺度缩放 dx(P),dy(P),dw(P),dh(P) , 或者说是Δx,Δy,Sw,Sh 。 我们的最终输出不应该是 Ground Truth 吗? 是的, 但是有了这四个变换我们就可以直接得到 Ground Truth, 这里还有个问题, 根据(1)~(4)我们可以知道, P 经过 dx(P),dy(P),dw(P),dh(P) 得到的并不是真实值 G, 而是预测值G^ 。 的确, 这四个值应该是经过 Ground Truth 和 Proposal 计算得到的真正需要的平移量(tx,ty) 和尺度缩放(tw,th)
这也就是 R-CNN 中的(6)~(9):

tx=(GxPx)/Pw,(6)


ty=(GyPy)/Ph,(7)


tw=log(Gw/Pw),(8)


th=log(Gh/Ph),(9)

 

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

 

Loss=iN(tiw^Tϕ5(Pi))2

 

函数优化目标为:

 

W=argminwiN(tiw^Tϕ5(Pi))2+λ||w^||2

 

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

为什么宽高尺度会设计这种形式?

这边我重点解释一下为什么设计的tx,ty 为什么除以宽高,为什么tw,th 会有log形式!!!

首先CNN具有尺度不变性, 以图3为例:


这里写图片描述

 

x,y 坐标除以宽高

上图的两个人具有不同的尺度,因为他都是人,我们得到的特征相同。假设我们得到的特征为ϕ1,ϕ2 ,那么一个完好的特征应该具备ϕ1=ϕ 。ok,如果我们直接学习坐标差值,以x坐标为例,xi,pi 分别代表第i个框的x坐标,学习到的映射为f , f(ϕ1)=x1p1 ,同理f(ϕ2)=x2p2 。从上图显而易见,x1p1x2p1 。也就是说同一个x对应多个y,这明显不满足函数的定义。边框回归学习的是回归函数,然而你的目标却不满足函数定义,当然学习不到什么。

宽高坐标Log形式

我们想要得到一个放缩的尺度,也就是说这里限制尺度必须大于0。我们学习的tw,th 怎么保证满足大于0呢?直观的想法就是EXP函数,如公式(3), (4)所示,那么反过来推导就是Log函数的来源了。

为什么IoU较大,认为是线性变换?

当输入的 Proposal 与 Ground Truth 相差较小时(RCNN 设置的是 IoU>0.6), 可以认为这种变换是一种线性变换, 那么我们就可以用线性回归来建模对窗口进行微调, 否则会导致训练的回归模型不 work(当 Proposal跟 GT 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这里我来解释:

Log函数明显不满足线性函数,但是为什么当Proposal 和Ground Truth相差较小的时候,就可以认为是一种线性变换呢?大家还记得这个公式不?参看高数1。

 

limx=0log(1+x)=x

 

现在回过来看公式(8):

 

tw=log(Gw/Pw)=log(Gw+PwPwPw)=log(1+GwPwPw)

 

当且仅当GwPw =0的时候,才会是线性函数,也就是宽度和高度必须近似相等。

对于IoU大于指定值这块,我并不认同作者的说法。我个人理解,只保证Region Proposal和Ground Truth的宽高相差不多就能满足回归条件。x,y位置到没有太多限制,这点我们从YOLOv2可以看出,原始的边框回归其实x,y的位置相对来说对很大的。这也是YOLOv2的改进地方。详情请参考我的博客YOLOv2。

总结

里面很多都是参考师兄在caffe社区的回答,本来不想重复打字的,但是美观的强迫症,让我手动把latex公式巴拉巴拉敲完,当然也为了让大家看起来顺眼。后面还有一些公式那块资料很少,是我在阅读paper+个人总结,不对的地方还请大家留言多多指正。

转载于:https://www.cnblogs.com/lzhu/p/8406959.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(2718):重读vue电商网站38之通过input输入框优化

通过增加 clearable 属性&#xff0c;我们的输入框就可以多一个 x&#xff0c;然后通过绑定 clear 事件&#xff0c;当我们进行清除 &#xff08;即点击由 clearable 属性生成的清空按钮时触发)时&#xff0c;就会重新获取我们的用户列表&#xff0c;不再需要用户再次点击搜索按…

Oracle不连续的值,如何实现查找上一条、下一条

1. 遇到的问题 已知一个题库&#xff0c;希望实现当前页切换上一题&#xff0c;下一题的需求。 查看得知&#xff0c;数据库中用于查询的字段(主键)是不连续的。如上图所示&#xff1a;stxh为主键number类型。 2. 实现方式lead over 2.1 实现代码 下一条 select nowId, afte…

前端学习(2719):重读vue电商网站39之正则表达式验证邮箱和手机号码

Javascript // 验证邮箱的规则var checkEmail (rule, value, cb) > {const regEmail /^([a-zA-Z]|[0-9])(\w|-)[a-zA-Z0-9]\.([a-zA-Z]{2,4})$/if (regEmail.test(value)) {// 合法的邮箱return cb()}cb(new Error(请输入合法的邮箱))}// 验证手机号码的规则var checkMobi…

支付宝提现,单笔转账到支付宝账户

很简单。只需三个参数实现 单笔转账到支付宝账户 1、获取开放平台创建的APPID&#xff0c;同时必须添加 单笔转账到支付宝账户 这个功能 开放平台&#xff1a;https://open.alipay.com/platform/home.htm 2、登录支付宝商家中心平台&#xff1a;https://b.alipay.com/index.h…

前端学习(2730):重读vue电商网站40之使用vue-table-with-tree-grid

安装新的依赖 vue-tabel-with-tree-gridvue-tabel-with-tree-grid 官方文档 安装完成后&#xff0c;在 main.js 入口文件内先导入 tree-tabel 然后全局注册组件 tree-tabel 页面中&#xff0c;我们使用了如下属性&#xff1a; data 确定我们的数据源&#xff0c;columns定义我…

前端学习(2731):重读vue电商网站41之自定义格式化时间的全局过滤器

在 main.js 入口文件全局注册格式化时间的过滤器&#xff0c;代码如下所示&#xff1a; Javascript // 自定义格式化时间的全局过滤器 Vue.filter(dataFormat, function(originVal) {const dt new Date(originVal)const year dt.getFullYear()const mon (dt.getMonth() 1 …

sign check fail: check Sign and Data Fail

支付宝开发报错&#xff1a;com.alipay.api.AlipayApiException: sign check fail: check Sign and Data Fail 解决方法&#xff1a; 确认使用的支付宝公钥是否正确&#xff0c;不同的环境使用的支付宝公钥不同&#xff0c; 如沙箱环境、线上openapi网关和mapi网关对应的支付…

前端学习(2732):重读vue电商网站42之添加富文本编辑器

vue-quill-editor 官方文档传送门 通过 vue-ui 界面&#xff0c;可以安装我们所需要的依赖&#xff0c;或者使用下文 npm 或 yarn安装。 NPM Js npm install vue-quill-editor --save# or yarn add vue-quill-editorMount with global Js import Vue from vue import VueQui…

1、Flutter_初体验_创建第一个应用_AndroidStudio_windows

1.前言 至于 Flutter 是啥&#xff0c;我就不在这啰嗦了&#xff0c;下面以 windows 为例&#xff0c;展示一下从安装 Flutter 到运行 APP 整个过程&#xff1b; 2.安装 Flutter 2.1、中文介绍文档&#xff1a;https://flutterchina.club/get-started/install/ &#xff08;我的…

jquery.min.js一引入到工程中显示红叉,或其他.js文件显示红叉

1.可能的原因&#xff1a; Eclipse或者MyEclipse校验失败的错误&#xff0c;不影响程序正常执行 2.解决方案&#xff1a; 选择项目&#xff0c;右键 Myeclipse--> ManaValidation--> ExcludeResource 将出现问题的js前的复选框选中。点击“应用” “确定”。如果以上…

【JEECG技术文档】Online唯一校验使用说明

1、功能介绍 配置了唯一校验的字段&#xff0c;在录入和编辑页面中&#xff0c;动态查询用户输入值是否存在校验。 要使用online唯一校验功能必须先在online表单开发中配置唯一字段的校验方式为唯一校验。 2、配置唯一校验 登录系统&#xff0c;在线开发-online表单开发&#x…

eclipse 安装 lombok插件

下载插件 官网下载 &#xff1a;https://projectlombok.org/ 有些小伙伴官网可能打不开&#xff0c;现提供我的下载地址&#xff1a;https://files.cnblogs.com/files/niceyoo/lombok.zip 安装 lombok 插件 1、右键打开 2、选择 eclipse.exe > install 博客地址&#xff1a;…

Android.View.InflateException: Binary XML File Line #异常的解决

这个运行错误&#xff0c;主要出现在安卓系统5.0一下手机系统。在5.0以上手机系统&#xff0c;不会出现这个错误 错误如下&#xff1a;在引入自定义VIEW时报错 原因&#xff1a;资源文件shape_new_message.xml在drawable-v24文件夹下&#xff0c;而不在drawable文件夹下 解决…

Android添加Header请求参数实例,java响应header请求实现demo

1、首先添加AsyncHttpClient.jar包到libs文件夹下 2、初始化请求类以及响应回调类 private AsyncHttpClient client; private AsyncHttpResponseHandler asyncHttpResponseHandler; 3、网络权限 <!-- 网络链接 --> <uses-permission android:name"android.perm…

苹果 ios 微信浏览器界面 ajax 提交带 file 的 form 总是走error方法

1. 问题 问题出在微信端&#xff0c;而且是苹果机的微信端(苹果你咋这么矫情&#xff0c;安卓正常).&#xff1b;代码还是之前的代码&#xff0c;貌似是苹果升级系统后部分版本出现的 BUG&#xff0c;后来证明确实跟 ios 版本有关&#xff0c;网上也找过类似的解决措施&#xf…

前端学习(2748):uniapp创建项目和演示

1创建项目 2运行项目 3配置在微信小程序注意 配置路径 4注意开启端口号

HttpServletResponse.getWriter().print乱码,request.getHeader乱码,解决方法

1、添加响应类型即可 //这句话的意思&#xff0c;是让浏览器用utf8来解析返回的数据 response.setHeader("Content-type", "text/html;charsetUTF-8"); 添加前后&#xff1a; 如果是header参数乱码&#xff0c;解决方法如下&#xff1a; HTTP H…

设计图与html 对比

简易打开旧版火狐 网页版火狐添加组件 新版有时也会没有 谷歌是腾讯的转载于:https://www.cnblogs.com/byksj/p/8426291.html