首页 >> 大全

通俗学AI(6):始入目标检测

2023-10-16 大全 21 作者:考证青年

目录

前言

R-CNN流程

建议区域的选择

图片输入

网络训练

SVM分类

训练样本问题

检测框回归

非极值抑制

前言

今天我们换换口味,来看看目标检测方面的论文。目标检测的任务和目标分类很类似,但多了一个定位的活。往网络里塞一张图,网络告诉你这个图属于哪一类,那就是分类问题,如果它把图里的物体都找出来并框住,同时告诉你属于哪一类,这就是目标检测了。

今天我们要看的论文是目标检测的鼻祖文章《Rich for and 》,也就是我们常说的R-CNN。这篇论文是包括了语义分割的内容的,但我们今天的主题是目标检测,所以我们就略过这部分内容,等以后讲语义分割再回来讲吧。

R-CNN流程

在我们现在已经有了一定目标分类的基础上,我们在初次面对目标检测任务时,可能会有这样一个想法:我们想办法找出目标在图上的位置,然后把这个位置的图片裁剪出来,塞进目标分类网络,不就行了吗。

R-CNN的大体思路就是这样。首先,R-CNN先使用了一个叫 的算法,在原图上找到2000个候选的框框,框住那些算法认为是物体的内容。这样的区域就叫 ,也就是建议区域。当然这个算法选出的这些区域大多数都是不太靠谱的,不然也不会有2000多个。

图片来自论文

真正重要的是后面的卷积网络。在寻找到2000多个建议区域后,作者将他们塞到了一个卷积神经网络里进行计算,这里使用的是。这个网络我们之前讲过,在这里就发挥了作用,不记得的小伙伴可以回顾一下。

但是当时我们使用后是输入到里进行分类的,但R-CNN是使用很多个SVM进行分类。SVM是机器学习的内容,大家可以百度学习相关内容,这里不多赘述。

分类完后,我们就知道这些框框里物体的类别了,但刚才也说了,这些建议区域都不太靠谱,因此我们还要对这个框进行精细的调整,然后去除重复的框框才是最后的结果。

下面我们将对每一步进行详细的讲解。

_目标检测传统方法_目标检测课程

建议区域的选择

我们刚才说了,这一步使用的是叫 的算法,这个算法是另外一篇论文的内容了,本篇论文里没有详说。我搜集了一些相关的资料,咋们简单地聊聊这个算法的流程。

首先这个算法分为两个内容,第一个内容是层次分组算法。说人话就是先用另外一篇论文里的方法得到一些初始区域。然后计算相邻区域之间两两的相似度,然后把这些相似度全部放到S这个容器里存着。随后在S中找到相似度最大的,将这两个区域合二为一,将与原来两个区域有关的相似度删掉,增加新区域与领域的相似度到S中,同时把新区域加到区域集合R中,然后不断重复这个过程。

第二个内容与上个内容的相似度计算有关( )。主要是根据颜色、纹理、重合度来进行计算,这里不多赘述。

因为R-CNN的实际效果(速度与精度)都比较原始,方法也不够优雅,所以我们只需要了解一些比较重要的技术就好,无需对每个东西都细究(比如这个 算法),所以这一步看不懂可以略过,有兴趣可以找到这个算法的原文进行阅读。

图片输入

作者选择的卷积网络就是我们之前说的。我们记得的图片输入是固定的,但我们选出来的建议区域它不是固定大小的,那怎么办呢?这个作者就比较粗暴了,首先他给这个框周围几圈(论文里写的是16),然后把这张裁剪出来的新的图像,硬缩成网络要求的输入尺寸。

网络训练

解决了输入问题,这里还有另一个问题,就是我们可以使用的数据集不够大(没有当初参与目标分类比赛时那么多)。用一个小数据集去训练大容量网络很容易造成过拟合,所以我们的论文作者使用了一招惊天地泣鬼神的方法:先用大数据集预训练一遍,然后用小数据集微调一下。如果你有用过一些网上的代码来训练自己的数据集,一般都是加载人家给你准备好的预训练权重,然后再用自己的数据集训练一下,然后就会发现效果还不错。但如果你用自己的数据集直接重头训练,你会发现效果根本不能看。

我觉得这种思想就是要网络先从大型数据集中学会一些基础形状颜色等先验知识,然后再去学习你给它的新知识,就事半功倍。而论文作者这里使用的大型数据集是。

SVM分类

实际上作者选取的不是整个,最后一个全连接层(由4096个神经元到1000的那层)是被扔掉的,因此卷积网络输出的最终结果是一个[2000,4096]的矩阵,这是一个二维矩阵,我们可以把它看成一个有2000行、4096列的矩阵(2000是因为有2000个候选框,4096是因为最后一层神经元有4096个),我们要把它整成一个[2000,21]的矩阵,2000是指有2000个候选框,21是指20类加一个背景判断,相当于一个候选框对应一条向量,向量里有21个数,其中每个代表这个物体属于这一类的概率,还有一个数是指这个物体属于背景的概率。

那根据矩阵乘法,我们应该要让[2000,4096]乘上一个[4096,21]的矩阵,相当于训练21个SVM分类器,把每个候选框那4096个输出值塞进去做分类。

训练样本问题

首先我们先来了解一下如何定义两个框的重叠度。我们这里使用IOU衡量重叠度。IOU就是两个框的交集除两个框的并集,如下图。

图片来自网络

然后我们再回到训练样本的问题。我们要知道,CNN(也就是卷积神经网络)使用小样本进行训练很容易拟合,所以我们要尽量平均正例和负例的比例。首先,我们用 算法获取2000个框,计算每个框和我们自己标注的框(label)之间的IOU,然后IOU大于0.5,那么我们就认为这个框为正例,如果小于0.5,那么就是反例。随后我们每次训练时以128张图为一批(32个正例,96个反例)。

但等我们训练SVM分类器时,我们就以IOU小于0.3的为反例,以我们标注的框(label)为正例,其他忽略掉。

因为SVM是小样本训练,所以我们可以设置严格的标准,提高结果精度而不影响训练。而CNN是大样本训练,我们需要更多的数据,尽可能平衡正反例的比例,所以我们选取比较宽松的IOU标准。如果我们使用来做分类器,要和CNN连在一起训练,要大样本,选取标准就宽松,最后的效果就比较差。这也是为什么不用简单的,而搞这么复杂用SVM的原因。

检测框回归

刚才也说了,因为我们使用 算法选出的2000个候选框,他的位置不一定靠谱,所以我们要在原来的基础上对候选框进行精修。所谓精修,就是将这个框进行平移,同时进行缩放,使这个框和我们自己标注的label相似。平移涉及框在图片上的位置,放缩涉及框的长宽,因此我们在目标检测任务中一般使用四个量来描述一个框:x和y代表框中点在像素坐标系上的坐标,w和h代表框的宽和高。因此论文中提出这么一个公式:

图片来自论文

解释一下,P为我们原来的候选框,而G为我们标注的label中的框(也就是-true),而G上面戴着个小帽子代表这是我们将P修正后的框,我们期望它与G在位置和形状上很相似。而d代表了一个函数,我们将P代入就能得到的缩放值。

举个例子,一个戴帽子的G的下标是x,说明这个是修正框的x,而得到这个值的办法就是让候选框的x乘上一个数,这个数由P代入d函数中得到,最后再加上原来候选框的x。

所以说这四个d函数是关键,但我们不能只求四个固定的d函数,如果固定了,就相当于所有的候选框都遵循同一个平移放缩原则,所以我们应该需要2000组d函数,也就是每个候选框都有四个与之对应的d函数。

这时候很多人情不自禁地想到,我可以弄一个[4,4]的矩阵,让[2000,4]的矩阵(2000个初始候选框)去乘它,不就得到了一个[2000,4]的结果了嘛?(2000个修正后的框)

这是不对的,因为如果这样做,就代表了不管它是哪一张图,只要候选框的信息固定,就有一个与之对应的修正框,这样明显是不对的。

我们需要根据实际情况来得到每个框的四个d函数。因此作者是将最后一个池化层的结果:[2000,4096]作为输入,乘上一个[4096,4]的矩阵,得到一个[2000,4]的矩阵(2000个候选框对应的四个d函数)。最后SVM得到结果后,再把候选框代进对应的四个d函数,根据上面的公式就能算出修正框的位置了。

那么这个[2000,4]的矩阵如何得到呢?答案是线性回归,假设一个式子Y=W*X,然后我有大量的X和对应的Y,我就能把W学习出来。而我们把G近似看成G戴帽子,再把上述图片中的公式移项一下,就得到了下面这堆公式。理论上来说t就是d。

图片来自论文

我们根据G和P把t算出来,随后我们以最后一个池化层的结果为Φ5,根据下面这个损失函数进行训练:

图片来自论文

机器学习的内容,不多赘述了,后面的正则化项特别重要(作者说的)。

非极值抑制

上面都跑完后,我们会得到很多重叠的框框,如下图的情况。这个时候我们就要用到一个叫做非极值抑制(NMS)的技术,它的作用是将这么多个框变为一个。

图片改自论文

首先,我们有一堆的框,以及我们知道每个框代表的类别和概率。我们先把概率低于一定阈值(这个阈值自己设定)的框的概率设为0。然后我们将所有框按照概率的高低由高到低排序。这样之后,每一类最高概率那几个框肯定排在前面。然后我们重头往后遍历,每次选择一个框A,计算排在后面的与框A同类的框B和框A之间的IOU,如果大于某个阈值(自己设定),就删除框B,直至遍历完成。

NMS算法其实就是从靠得很紧的一类框里,选出概率(或者说是分数)最高的那个。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了