百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

用偏移范围预测来改善目标检测的精度

toyiye 2024-06-21 12:08 8 浏览 0 评论

这篇文章的思路比较简洁,也有比较清晰的理论依据,我本人比较喜欢这种风格。


中国电子科技大学的团队

我们看看作者团队是如何介绍自己的思路的。


目标检测是由目标分类和目标定位配合完成的。

自动驾驶,视频安防和机器人都需要比较精准的目标检测。


一般的目标检测

  • 用一个回归网络来预测候选窗和真实目标之间的偏移量。 注意这里是偏移量,这个值是连续的,可取任意实数。

对于这个连续的实数,优化问题就只能是回归问题了,用的损失函数loss function也就是回归常用的损失函数比如L2 loss,L1 loss等,或者是Smooth L1 loss.

损失函数中的两项:预测的偏移量t_x和真实的偏移t_x_*量的计算公式如下图:



优化完成后,就是网络模型训练好后,就可以通过这个偏移量tx,ty,tw,th和候选窗(来计算的到网络预测的框



我们来回顾一下BBox回归的方法:

在R-CNN中回归用的是L2 loss,就是MSE,mean square error, 平均误差平方,简称均方差。这个loss函数对其自变量x的梯度为:.

也就是说x越大,梯度就越大。

这里的x其实是误差,预测值与真实值之间的误差。

也就是说误差越大,梯度就越大。

实际上,我们在用梯度下降算法的时候,并不是梯度越大越好的,太大的梯度容易造成梯度爆炸。计算机会输出很多"nan"符号。这个符号的意思是not a number,不是一个数据。因为这个数据太大,计算机无法表达出来,所以就显示not a number.

这里其实还有个疑问,我们这里的x,其实就是误差,是预测值 和 真实值之间的误差,这个误差不会很大的,也就是1000,10000,这个量级,即便再乘以2,这样大小的数据计算机是毫无压力的。那么为什么会产生让计算机无法表示出来的数据了呢?

因为梯度下降法里面求梯度的方法是链式求导。

链式求导:串联函数总的梯度等于各自梯度连乘。

梯度连乘的话,如果这些连乘的梯度每一项都大于1,只要大于1,连乘出来的梯度就会非常大。

正是由于这个现象的存在,在我们使用梯度下降算法的时候,梯度的绝对值不适合太大,这样会造成梯度爆炸,梯度也不应该太小,会造成梯度消失,梯度的绝对值应该是在1左右的。

那么在R-CNN用了L2 loss 显然不能很好地控制梯度爆炸问题。

在Fast R-CNN的时候,就用Smooth L1 loss 代替了L2 loss。比较好地解决了L2 loss的梯度爆炸问题。smooth L1 中,当误差x比较大的时候,其对应梯度的绝对值总是1.这就很稳定了。

但是总是1也有问题,就是对于确实误差比较大的样本,这个梯度是太小了,优化不到位。需要太多的训练步骤。而这个需要太多训练步骤,对我们来说,在实际操作中,会造成训练不足。

总的来说,就是Smooth L1 loss 虽然改进了L1 loss 的梯度爆炸问题,但同时也带来的新的问题,对于某些样本来说,梯度是”消失“的,一些样本始终无法得到很好的训练。

该如何解决这个问题呢?

论文给出了一个解决问题的办法:把原来的预测偏移量,分为两步:先预测偏移范围,再进行具体偏移量的回归。

这个思路先把大致的偏移范围预测出来,然后再以偏移范围的偏移量为基准,预测最终偏移量与这个偏移范围中心的偏移值。

这样,我们就将问题转化为预测两级偏移量。由两级偏移量级连堆叠得到最终的偏移量。

当最终偏移量比较大时,这样分成两级后,每一级就比原来小,也就容易训练了。

我们看看作者是如何实现的:


先将总的偏移量划分为N个 bins,也就是N个范围,

也就是说,我们预测最终偏移量是属于这N个范围中的哪一个,得到这个范围对应的第一级偏移量

也就是说,我们预测最终偏移量是属于这N个范围中的哪一个,得到这个范围对应的第一集偏移量

也就是说,我们预测最终偏移量是属于这N个范围中的哪一个,得到这个范围对应的第一集偏移量

也就是说,我们预测最终偏移量是属于这N个范围中的哪一个,得到这个范围对应的第一集偏移量

预测出具体属于哪一个bin后,得到这个bin的偏移量,同时得到这个对应的,由网络分类头输出的置信度概率,然后利用这个概率来求t的期望,从而得到最终的偏移量。


那么要预测最终偏移量到底属于这N个范围中的哪一个?其实就是分类问题。输入N类中的哪一类。所以训练的时候,我们就使用交叉熵loss(cross-entropy)。

总结:我们把原来直接预测偏移量转化为先分类偏移范围,同时得到第一级偏移量和其概率,然后再预测最终偏移量的操作。把原来的一个回归问题,转化为一个分类加一个求期望的问题。这样就既避免了梯度爆炸,又避免了对偏移比较大的样本训练不足的问题。

很好的解决了Smooth L1 对误差较大的框训练不足的问题。

我们再来看看这个bins,这个偏移量的范围是如何构建的:



以上两图是论文截图。我们翻译一下。

如图4,我们把在[-a,a]划分之间划分m个bins,每个bin的宽度为w=2a/m.

另外,我们把小于-a和大于a的部分也都作为一个bin,所以我们一共有n=m+2个bins.每个bin的标签定义为,其公式就可以写为公式(5)所示。

公式中的t就是第一级偏移量的具体值。

当l=0时,第一级偏移量t为-a+a/m,
当l=1时,第一级偏移量t为-a+[(2+1)/2]*2*a/m=-a+3a/m

当l=m-1时,第一级偏移量t为-a+[(2m-2+1)/2]*2*a/m=a-a/m

当l=m时,第一级偏移量t为-a+[(2m+1)/2]*2*a/m=a+a/m

由于l必须取整数,公式中的t取不到-a,a的值,所以,我们认为规定了

当l=m+1时,t为-a

当l=m+2时,t为a

我们训练的时候,主要是分类出我们最终要求的偏移量,到底属于哪个第一级偏移量t。

如图4,我们在[-5,5]的范围上分了5个bins,每个bin的宽度为10/5=2.

当l=0时,第一级偏移量t为-5+5/5=-4

当l=1时,第一级偏移量t为-5+3*5/5=-2

当l=4时,第一级偏移量t为5-5/5=4

当l=5时,第一级偏移量t为5+5/5=6


图4


算到这里,也就是说,我们把[-5,5]分成了5个 bin, 然后小于5分成一个bin, 大于5分成一个bin,一共是7个bin。

那么这个7个bin对应的偏移量t分别为:-5,-4,-2,0,2,4,5.

注意到,咩有6,也就是说l会等于m.

关于这点,我认为这里是作者的笔误,因为作者前面也说了构建了m+2个bin,上下文中的意思也就说有m+x的bin,而在公式中,如果l=m就是有m+3个bin的偏移量了,所以这里大胆推测做核这里在计算代表每个bin的偏移量t时,这里l=m是笔误了

公式应该改为:

那么得到这个第一级偏移量之后,我们如何得到最终的偏移量呢?

答案是求偏移量期望。


按照公式10,求出偏移量的期望即可得到最终的偏移量值。

按照图4中,有7个偏移量[-5,-4,-2,0,2,4,5],我们预测出来这7个偏移量的概率p分别为[0.1,0.1,0.1,0.5,0.1,0.1,0]

那么最终的偏移量为:0.1x-5+0.1x-4+0.1x-2+0.5x0+0.1x2+0.1x4+0x5=-0.5

这就是Offset Bin Classification Network思路。如下图:


利用第一级偏移量t的期望得到最终偏移量。

那么顺着这个思路,其实我们可以把预测范围递归划分,就可以把预测精度做得更加精准,如下图所示:

这其实是一个由粗到细的过程。

本文也是做了大量的实验,实验结果如下:



总结:


本文贡献:

1 用偏移范围分类预测代替偏移量回归预测,避免梯度爆炸问题和特殊样本训练不足的问题。

2 采用求期望的方法将离散的第一级偏移量转换为连续的最终偏移量。

3 偏移范围分类思路还可以递归起来,由粗到细地进一步提高预测框的精度。


附作者的论文全文:











相关推荐

今日精选5篇教程:用Python3带你从小白入门机器学习实战教程手册

正文1:教程标题:英伟达SuperSloMoGithub项目开放作者:英伟达教程摘要:今年6月份,英伟达发布了一份生成高质量慢动作视频的论文——《SuperSloMo:HighQual...

电子书 | 笨办法学 Python 3(笨办法学python3pdf)

本周更新了5本IT电子书资源,同时站内已经有12本Python入门方面的相关电子书,可供新手选择。1、笨办法学Python3本书是一本Python入门书,适合对计算机了解不多,没有...

Python2 已终结,入手Python 3,你需要这30个技巧

选自medium作者:Erik-JanvanBaaren机器之心编译参与:王子嘉、一鸣Python2在今年和我们说拜拜了,Python3有哪些有趣而又实用的技巧呢?这篇教程有30个你会喜欢...

Python 3 系列教程(python3.9基础教程)

Python的3.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python3.0在设计的时候没有考...

Python第三课3. Python 的非正式介绍

3.Python的非正式介绍?在下面的例子中,通过提示符(>>>与...)的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每...

如何使用 Python 构建一个“谷歌搜索”系统?| 内附代码

来源|hackernoon编译|武明利,责编|Carol出品|AI科技大本营(ID:rgznai100)在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统。基本上,这...

Python 模拟微博登陆,亲测有效!(如何用python爬微博)

今天想做一个微博爬个人页面的工具,满足一些不可告人的秘密。那么首先就要做那件必做之事!模拟登陆……代码是参考了:https://www.douban.com/note/201767245/,我对代码进...

Python 驱动的 AI 艺术批量创作: 免费的Bing 绘图代码解析

这篇文章将深入分析一段Python代码,该代码利用Bing的AI绘图功能,即bing的images/create,根据用户提供的文本提示生成图像。我们将详细探讨其工作原理、代码结构、...

Python爬虫Scrapy库的使用入门?(python scrapy爬虫)

Scrapy是一个开源的并且支持高度可扩展的Python爬虫框架,主要被用来实现从网站提取数据。出现之初就是为网页抓取而设计,但是现在它也可以被用于从APIs中抓取数据或通用的Web抓取任务。Sc...

Python3 标准库概览(python标准库有什么)

操作系统接口os模块提供了不少与操作系统相关联的函数。>>>importos>>>os.getcwd()#返回当前的工作目录'C:\\Python34...

零基础入门学习Python(三):变量和字符串

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。今天小编为大家带来的是...

Python读写docx文件(python读写word)

Python读写docx文件Python读写word文档有现成的库可以处理pipinstallpython-docx安装一下。https://python-docx.readthedocs.io/...

如何利用Xpath抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

如何利用Xpath选择器抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

python之Scrapy爬虫案例:豆瓣(python爬虫书籍豆瓣评分)

python模块之Scrapy爬虫框架...

取消回复欢迎 发表评论:

请填写验证码