目标检测(2)-RCNN

2024-05-14 09:08
文章标签 目标 检测 rcnn

本文主要是介绍目标检测(2)-RCNN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址:https://zhuanlan.zhihu.com/p/27473413

RCNN注意事项:https://blog.csdn.net/u010417185/article/details/79723974

RCNN作为第一篇目标检测领域的深度学习文章,大幅提升了目标检测的识别精度,在PASCAL VOC2012数据集上将MAP从35.1%提升至53.7%。使得CNN在目标检测领域成为常态,也使得大家开始探索CNN在其他计算机视觉领域的巨大潜力。这篇文章的创新点有以下几点:将CNN用作目标检测的特征提取器、有监督预训练的方式初始化CNN、在CNN特征上做BoundingBox 回归。

摘要

从ILSVRC 2012、2013表现结果来看,CNN在计算机视觉的特征表示能力要远高于传统的HOG、SIFT特征等,而且这种层次的、多阶段、逐步细化的特征计算方式也更加符合人类的认知习惯。但是,如何将在目标检测领域重现这种奇迹呢?目标检测区别于目标识别很重要的一点是其需要目标的具体位置,也就是BoundingBox。而产生BoundingBox最简单的方法就是滑窗,可以在卷积特征上滑窗。但是我们知道CNN是一个层次的结构,随着网络层数的加深,卷积特征的步伐及感受野也越来越大。例如AlexNet的Pool5层感受野为195*195,步伐为32*32,显然这种感受野是不足以进行目标定位的。使用浅层的神经网络能够保留这种空间结构,但是特征提取的性能就会大打折扣。RCNN另辟蹊径,既然我们无法使用卷积特征滑窗,那我们通过区域建议方法产生一系列的区域,然后直接使用CNN去分类这些区域是目标还是背景不就可以吗?当然这样做也会面临很多的问题,不过这个思路正是RCNN的核心。因此RCNN全称为Regions with CNN features。

整体结构


RCNN的输入为完整图片,首先通过区域建议算法产生一系列的候选目标区域,其中使用的区域建议算法为Selective Search,具体可以参照:目标检测(1)-Selective Search - 知乎专栏。然后对于这些目标区域候选提取其CNN特征,并训练SVM分类这些特征。最后为了提高定位的准确性在SVM分类后区域基础上进行BoundingBox回归。

  • 产生目标区域候选

这部分其实就是直接使用Selective Search,选择2K个置信度最高的区域候选,关于筛选的细节以及排序规则可以参照本专栏上一篇文章。

  • CNN目标特征提取

RCNN使用的是AlexNet,可以参见我们的相关文章:卷积神经网络模型(2)-AlexNet解读 - 知乎专栏由于CNN的参数量巨大,训练CNN需要大量的样本,此前的方法是大家先用无监督的预训练初始化CNN的参数,然后再在样本集上使用监督的训练方法。不同于这些方法,RCNN使用ImageNet的有标签数据进行有监督的预训练,然后再在本数据集上微调最后一层全连接层。直到现在,这种方法已经成为CNN初始化的标准化方法。但是训练CNN的样本量还是不能少的,因此RCNN将正样本定义的很宽松,为了尽可能获取最多的正样本,RCNN将IOU>0.5(IoU 指重叠程度,计算公式为:A∩B/A∪B)的样本都称为正样本。每次迭代批大小为128,其中正样本个数为32,负样本为96.其实这种设置是偏向于正样本的,因为正样本的数量实在是太少了。由于CNN需要固定大小的输入,因此对于每一个区域候选,首先将其放缩至227*227,然后通过CNN提取特征。


对IOU的进一步理解或再详细了解RCNN可参照博文 https://blog.csdn.net/u010417185/article/details/79723463


CNN特征层选取

现在CNN已经能够提取到目标的特征了,但是CNN的层数很多,选择哪一层作为特征提取层呢?RCNN进行了宽泛的实验,最终选择的fc层。


对比Pool5层以及FC层,可以看出fc层相对的MAP要高很多,尤其是经过预训练后的网络。一方面原因是Pool5层的特征尺寸比较大,另一方面是全连接层特征更加符合类别信息。但是选用Fc6还是Fc7呢差距还是不明显的。其中R-CNN FT fc7 BB取得了最高的MAP,数据是在经过微调的RCNN上取得Fc7层特征,然后训练SVM,并通过BoundingBox回归得到的最终结果。

  • 目标种类分类器

在通过CNN提取区域候选的特征后,RCNN对于每个种类训练SVM用以分类这些特征具体属于哪个种类。但是这里面的样本确定和CNN中的样本也是不一样的啦,因为CNN需要大量的样本去驱动特征提取,因此正样本的阈值比较低。而SVM适合小样本的分类,通过反复的实验,RCNN的SVM训练将ground truth样本作为正样本,而IOU>0.3的样本作为负样本,这样也是SVM困难样本挖掘的方法。

  • 贪婪非极大值抑制

由于有多达2K个区域候选,我们如何筛选得到最后的区域呢?RCNN使用贪婪非极大值抑制的方法,假设ABCDEF五个区域候选,首先根据概率从大到小排列。假设为FABCDE。然后从最大的F开始,计算F与ABCDE是否IoU是否超过某个阈值,如果超过则将ABC舍弃。然后再从D开始,直到集合为空。而这个阈值是筛选得到的,通过这种处理之后一般只会剩下几个区域候选了。

  • BoundingBox回归

为了进一步提高定位的准确率,RCNN在贪婪非极大值抑制后进行BoundingBox回归,进一步微调BoundingBox的位置。不同于DPM的BoundingBox回归,RCNN是在Pool5层进行的回归。而BoundingBox是类别相关的,也就是不同类的BoundingBox回归的参数是不同的。例如我们的区域候选给出的区域位置为:也就是区域的中心点坐标以及宽度和高度

我们要做的就是找到一个映射把他转换到真实的位置:

那我们就要定义一些转换的参数啦:
这些就是我们需要的参数,我们想得到关于尺寸无关的X,Y偏移量,以及尺度变化信息。如果求解到了这四个参数,我们就能成功的映射到真是目标位置了。


RCNN选用的特征是Pool5层特征,然后假设每个偏移量是Pool5特征的一个线性映射,也就是:

然后我们要求解这个W就可以了,RCNN使用的是L2范数的最小均方误差,也就是下面这个式子,T就是我们的目标,根据我们上面的GP的公式可以很容易得到T的表达式,也就是最后这个式子:
这就是个规则的最小均方误差的问题了,很容易求解,比如BP算法。需要注意的一点就是在对于训练样本的选择上,我们做的只是微调,因此不能选择目标建议与真实位置相差较大的情况。

  • 为什么不直接使用Fc8的结果作为贪婪极大值抑制的输入而是重新训练很多的SVM呢?

作者有去尝试使用Fc8结果作为输入,但是发现精度大约下降了4%,产生这种情况的原因是我们CNN的图片正样本定义为IOU>0.5,这是个很宽松的条件,导致CNN并不能定位到很精确的位置。那能不能将IOU设置的高一点呢?答案是否定的,因为CNN需要大量的样本,当正样本设置为真是BoundingBox时效果很差,而IOU>0.5相当于30倍的扩充了样本数量。而我们近将CNN结果作为一个初选,然后用困难负样本挖掘的SVM作为第二次筛选就好多了。

  • 存在的问题

RCNN虽然效果很好,但是存在一些问题,比如时间代价太高了,网络训练是分阶段的,太麻烦了等。而这些问题将在我们后面的文章一一解决。直到最终版本Faster RCNN可以说是近乎完美的目标检测模型了,网络优美,速度快。







这篇关于目标检测(2)-RCNN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988340

相关文章

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

3月份目标——刷完乙级真题

https://www.patest.cn/contests/pat-b-practisePAT (Basic Level) Practice (中文) 标号标题通过提交通过率1001害死人不偿命的(3n+1)猜想 (15)31858792260.41002写出这个数 (20)21702664840.331003我要通过!(20)11071447060.251004成绩排名 (20)159644

基于深度学习的轮廓检测

基于深度学习的轮廓检测 轮廓检测是计算机视觉中的一项关键任务,旨在识别图像中物体的边界或轮廓。传统的轮廓检测方法如Canny边缘检测和Sobel算子依赖于梯度计算和阈值分割。而基于深度学习的方法通过训练神经网络来自动学习图像中的轮廓特征,能够在复杂背景和噪声条件下实现更精确和鲁棒的检测效果。 深度学习在轮廓检测中的优势 自动特征提取:深度学习模型能够自动从数据中学习多层次的特征表示,而不需要

自动驾驶---Perception之Lidar点云3D检测

1 背景         Lidar点云技术的出现是基于摄影测量技术的发展、计算机及高新技术的推动以及全球定位系统和惯性导航系统的发展,使得通过激光束获取高精度的三维数据成为可能。随着技术的不断进步和应用领域的拓展,Lidar点云技术将在测绘、遥感、环境监测、机器人等领域发挥越来越重要的作用。         目前全球范围内纯视觉方案的车企主要包括特斯拉和集越,在达到同等性能的前提下,纯视觉方

YOLOv9摄像头或视频实时检测

1、下载yolov9的项目 地址:YOLOv9 2、使用下面代码进行检测 import torchimport cv2from models.experimental import attempt_loadfrom utils.general import non_max_suppression, scale_boxesfrom utils.plots import plot_o

Java内存泄漏检测和分析介绍

在Java中,内存泄漏检测和分析是一个重要的任务,可以通过以下几种方式进行:   1. 使用VisualVM VisualVM是一个可视化工具,可以监控、分析Java应用程序的内存消耗。它可以显示堆内存、垃圾收集、线程等信息,并且可以对内存泄漏进行分析。 2. 使用Eclipse Memory Analyzer Eclipse Memory Analyzer(MAT)是一个强大的工具,可

Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接

在进行参数化读取时发现一个问题: 发现问题: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8081): Max retries exceeded with url: /jwshoplogin/user/update_information.do (Caused by NewConn

基于CDMA的多用户水下无线光通信(3)——解相关多用户检测

继续上一篇博文,本文将介绍基于解相关的多用户检测算法。解相关检测器的优点是因不需要估计各个用户的接收信号幅值而具有抗远近效应的能力。常规的解相关检测器有运算量大和实时性差的缺点,本文针对异步CDMA的MAI主要来自干扰用户的相邻三个比特周期的特点,给出了基于相邻三个匹配滤波器输出数据的截断解相关检测算法。(我不知道怎么改公式里的字体,有的字母在公式中重复使用了,请根据上下文判断字母含义) 1

前景检测算法_3(GMM)

因为监控发展的需求,目前前景检测的研究还是很多的,也出现了很多新的方法和思路。个人了解的大概概括为以下一些: 帧差、背景减除(GMM、CodeBook、 SOBS、 SACON、 VIBE、 W4、多帧平均……)、光流(稀疏光流、稠密光流)、运动竞争(Motion Competition)、运动模版(运动历史图像)、时间熵……等等。如果加上他们的改进版,那就是很大的一个家族了。

基于感知哈希算法的视觉目标跟踪

偶然看到这三篇博文[1][2][3],提到图片检索网站TinEye和谷歌的相似图片搜索引擎的技术原理。以图搜图搜索引擎的使命是:你上传一张图片,然后他们尽全力帮你把互联网上所有与它相似的图片搜索出来。当然了,这只是他们认为的相似,所以有时候搜索结果也不一定对。事实上,以图搜图三大搜索引擎除了上面的老牌的TinEye和Google外,还有百度上线不算很久的新生儿:百度识图。之前听余凯老师的一个D