计算机视觉算法整理(一):Faster RCNN,bounding box regression,IOU,GIOU-程序员宅基地

技术标签: 深度学习 Deep Learning  算法  

专门收录一下一些有趣的,计算机视觉中我想记录一下的算法,重点关注的是loss function,顺便说下相关算法。因为是收录,只为日后查看之需,有一些会借用一些资料,我会给出引用。

1、Faster RCNN

两阶段目标检测的代表作,可以说是开创了目标检测的一番局面。现在很多公司实际在商用的目标检测算法,依然很多是基于Faster RCNN的。虽然后来各种论文都号称吊打Faster RCNN,但是实际上往往是调参下的结果(有很多,但不是全部)。如果对Faster RCNN也进行细致调参,替换更好的预训练backbone,以及进行样本均衡、难负样本挖掘(hard negtive mining)、loss优化等技术,往往可以得到不错的结果。

经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显[1]

总体结构

在这里插入图片描述
图1

Faster RCNN其实可以分为4个主要内容[1]:

  • Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  • Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
  • Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  • Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

对Faster RCNN的更详细的一个结构图如下:
在这里插入图片描述图2

上图展示了python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构,可以清晰的看到该网络对于一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;而Conv layers中包含了13个conv层+13个relu层+4个pooling层;RPN网络首先经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)[1]。

说实话,Faster RCNN整个端到端流程非常复杂,并不是一下子发明的,首先其集成了大量以往CV领域的成熟技术,比如NMS去重框,以及继承了RCNN,Fast-RCNN发展过来的思路,还有提出Anchor技术,有点集大成的感觉。这些想要细看的同学推荐去看下原论文,以及帖子:Fast R-CNN文章详细解读,以及一文读懂Faster RCNN。记得我自己16年看的时候也是费了不少劲,这里先不赘述了。

bounding box regression

我要重点记录的是 bounding box regression,以及其loss。bounding box regression主要是用来修正anchors(基准框)获得精确的proposals(预测的物体框)。字面意思,regression就是说是要预测出bounding box的位置,所以后面肯定得跟一个回归loss,下面会说。注意的是,bounding box regression在图2的流程中实际上用了两次,一次在proposal框的地方,一次在后面bbox_pred的地方。可以看做第一次是粗调,后一次是细调。

下图所示绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。w
在这里插入图片描述
图3

对于窗口一般使用四维向量[x,y,w,h]表示,分别表示窗口的中心点坐标和宽高。对于图 3,红色的框A代表原始的positive Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:

在这里插入图片描述
在这里插入图片描述
图4
在这里插入图片描述
所以呢,dx(A),dy(A),dw(A),dh(A)这四个值就是要求的变换值,知道后就可以直接基于A框的原始位置得到G‘的位置。怎么得到这四个值呢?用regression!

在这里插入图片描述
形式如下[2]:
在这里插入图片描述
在这里插入图片描述(这里的 x x x就是前面的 G x G_x Gx x a x_a xa就是前面的 A x A_x Ax。其他几个字母也类似。)

2、IOU,GIOU

IoU,又被称为Jaccard指数,是用于评估两个任意形状相似度的最常用指标,比如用于目标检测和图像分割中。对于如图1中的两个边界框A和B,我们计算出两者的交集I(红色部分),然后计算并集U,那么IoU就是两者的比值[3]:

在这里插入图片描述
在这里插入图片描述
图5

IoU编码的是两个边界框的形状性质,那么边界框的长,宽以及位置信息已经包含在内,所以说IoU是对物体尺度是不敏感的。而且IoU是一个归一化的指标,其值范围在[0,1]之间,当两个物体完全无交集时为0,而完全重叠时为1。所以IoU用于评价预测框和真实框的一致性是非常合适的。

而实际上主流的目标检测模型在训练时都是采用的回归损失,如L1和L2(Faster R-CNN采用smooth L1),我们来分析一下回归损失所面临的问题,边界框通常用左上和右下两个顶点来表示:(x1,y1,x2,y2)。下图给出了相同回归loss下边界框的差异性,其IoU值相差较大。

在这里插入图片描述
图6

其中绿色是真实框,而黑色是预测框,对于图6a,我们固定了两个框的左下顶点,同时固定了右上顶点的距离,此时预测框可以变化多测,但是L2损失是固定的。我们计算IoU值后发现也是变化非常大。同样的图6b可以看到L1损失存在类似的问题。这说明回归loss可能会陷入IoU指标的一个局部极值点。

(不过,也有一点牵强,比如上面写的Faster RCNN,并不是简单用顶点来回归的)

IoU loss已经被应用在图像分割中(与检测不太一样),IoU作为一种损失函数是可以进行BP的,因而可用于模型训练。但是IoU有一个致命的缺点,那就是当两个形状没有任何重叠时,IoU值为0,无法反映两个形状的具体偏差,而且梯度是0,无法对模型进行优化。图7可以展示这个问题,蓝色是真实框,图7a的黄色框和3的绿色框均与真实框没有交集,但是明显7b的预测更好,但是反映在IoU上均为0。

在这里插入图片描述
图7

由于IoU本身存在的问题,论文据此提出了一种新的指标:generalized IoU (GIoU),其计算公式如下:
在这里插入图片描述
最重要的是GIoU会克服IoU的短板,当A和B完全不重合时,GIoU依然起作用。还是前面的例子如图8所示,可以看到图8a相比图b,C的大小较大,这样图8a的GIoU值是小于图b的,这说明GIoU对这种情况是可以处理的,虽然IoU值为0,但是当预测更好时,GIoU值是增加的。论文中以YOLOv3和Faster R-CNN进行实验,发现采用GIoU作为边界框loss,效果有提升。

在这里插入图片描述
图8

在这里插入图片描述

参考资料

[1] https://zhuanlan.zhihu.com/p/31426458
[2] https://blog.csdn.net/liuxiaoheng1992/article/details/81779474
[3] 另辟蹊径!斯坦福大学提出边界框回归任务新Loss:GIoU
[4] Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression
[5] Generalized Intersection over Union(GIOU)论文核心思想解读笔记
[6] 白话mAP

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xbinworld/article/details/103339889

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签