R-CNN三部曲(一):目标检测与R-CNN

R-CNN是深度学习最早应用到目标检测的模型,主要还是对CNN进行改进,补充一些结构功能,使得模型能够满足目标检测的目标位置确定与分类。

CNN的图像分类效果是非常好的,遗憾的是它无法对目标进行定位,所以R-CNN的思路就是,既然CNN没法定位目标,那不如把图像中潜在的目标都找出来,再分析找得对不对。

第一步要做的就是找出图像中潜在的目标,也就是生成候选区域,方法有很多,比如selective search、edge boxes,这里以selective search为例,它主要的思路就是根据图像的颜色、纹理、尺寸相似性和空间重合度,划分出一个个区域:

在这里插入图片描述

可以看出,其实选出来的区域大小是不一致的,但是CNN要求输入应为固定大小,所以我们就简单粗暴地对图像进行缩放变形,使得它变成我们预设的尺寸。

调整了尺寸之后,会继续输入到CNN,利用CNN对每个候选区域(你没看错,是每个,所以R-CNN效率很低)进行分类。在这里我们先回想一下,CNN做分类,其实就是利用卷积层池化层提取特征,最后再用全连接层做分类,而R-CNN在利用CNN提取了特征之后,会有两个head,一个head继续做分类,一个head做边界框回归:

在这里插入图片描述

首先我们继续看看分类操作,还是像传统的CNN那样,最后利用全连接层进行分类,而在R-CNN的论文中,最后还利用SVM(上图没有显示出来),进一步分析CNN的分类结果是否正确(进行二分类判断对错)。主要原因有两点,第一是实验证明在这里SVM的分类效果比CNN好,所以利用SVM进一步提高模型的分类准确度,第二是SVM分类的结果是一个01之间的数值,这个数值可以看成置信度或者分类得分,在测试过程中,我们就可以根据这个得分,挑选前n个最可能的目标。除此之外还有一个作用,比如有几个候选框,框中了同一个人的头、手和全身,然后用CNN分类都得到这是一个人,这时候模型就认为图像里面有三个人了,可是我们引入了SVM对分类结果评分之后,可能只有全身的分类得到较高,其他两个分类得分较低,这时候我们只需要设定一个合理的阈值,就能只保留最合理的那个识别结果(具体可了解一下非极大值抑制)。

而边界框回归(bounding-box regression)则主要是为了调整候选框的尺寸位置,使得它更接近真实边界框,这里详细讲解一下。

首先,我们要知道,训练数据是有明确说明图像中的目标以及边界框的具体位置信息的,我们可以用下式表示真实边界框:

G i = ( G x i , G y i , G w i , G h i ) G^i = (G_x^i, G_y^i, G_w^i, G_h^i) Gi=(Gxi,Gyi,Gwi,Ghi)

分别表示边界框的左上角坐标以及框的宽和高。

候选边界框可以表示为:

P i = ( P x i , P y i , P w i , P h i ) P^i = (P_x^i, P_y^i, P_w^i, P_h^i) Pi=(Pxi,Pyi,Pwi,Phi)

边界框回归,就是想办法让候选边界框无限接近真实边界框(ground-truth bounding box),那么候选边界框怎么才能接近真实边界框呢?我们可以认为主要通过两种操作:一个是对边界框进行尺度变换,也就是变形,使得它的形状尺寸接近真实边界框,也就是对框的宽和高进行处理;另一个是对边界框进行平移变换,改变框的位置,也就是框的坐标。平移变换的公式如下:

G ^ x = P w d x ( P ) + P x \hat G_x = P_w d_x(P) + P_x G^x=Pwdx(P)+Px
G ^ y = P h d y ( P ) + P y \hat G_y = P_h d_y(P) + P_y G^y=Phdy(P)+Py

尺度变换公式如下:

G ^ w = P w e x p ( d w ( P ) ) \hat G_w = P_w exp(d_w(P)) G^w=Pwexp(dw(P))
G ^ h = P h e x p ( d h ( P ) ) \hat G_h = P_h exp(d_h(P)) G^h=Phexp(dh(P))

接下来分析的重点就是,为什么平移变换和尺度变换的公式的形式是这样。

首先来看看平移变换公式,我们先来想象一下,如果想要候选框变换成真实框,那么从坐标的角度来说,只需要在xy轴的坐标分别加上一个差值常数不就行了,所以可以看到,Gx和Gy都是由Px、Py(候选框坐标)加上另一个项。但是如果知道真实框,当然可以直接加一个数,现在的问题就是不知道,所以我们就需要从模型的输入(CNN特征图)出发,利用模型计算出这个"常数"。

假设坐标差为:

Δ x = G x − P x = P w d x ( P ) \Delta x = G_x - P_x = P_w d_x(P) Δx=GxPx=Pwdx(P)
d x ( P ) = Δ x / P w d_x(P) = \Delta x / P_w dx(P)=Δx/Pw

也就是说,模型要通过输入计算的实际上就是一个经过归一化的坐标差,为什么要归一化,或者说为什么差值要处以候选框的宽和高,个人认为,更多是为了增强模型的鲁棒性。这里边界框回归的输入尺度是一样的,所以进不进行归一化看起来都差不多,但是在后期的模型(比如Faster R-CNN中的RPN),我们会对不同尺度的输入进行边界框回归,这时候边界框的宽高不同,就会影响了模型对于差值计算的判断,所以如果让模型直接学习归一化的差值,再乘上归一化项得出差值,模型的效果就会更好。

再说一下这个d§,先来看看模型,输入的是CNN的特征图,所以边界框回归就是通过特征图利用不同的参数计算出d_x§和d_y§,而那些参数就是模型要学习的东西了。

对于尺度变换,思路上也是差不多,乘上一个项使得候选框的宽高接近真实框的宽高。问题在于要有一个exp函数,主要原因就是保证这个数值大于0,不然模型如果算出一个负数就不可解释了。

顺带一提,通过模型求得的参数,可以得知候选框如果要转化为真实边界框,需要进行的变换的程度,而这个指标正正可以作为模型的损失函数,判断候选框与真实框的接近程度。关于边界框回归还有很多细节值得探讨,这里暂不详细讨论,感兴趣的朋友可以继续深入研究。如果是做计算机视觉的朋友,对于边界框回归的这些公式推导细节,都是值得慢慢深入研究的。

最后再简单说一下模型的训练过程,主要看看模型的损失函数。损失函数和模型一样由两部分相加,一个是分类的损失,一个是边界框回归损失,训练数据标注了真实边界框的信息,所以我们训练模型,就是希望模型的分类结果尽可能准确,得到的候选框尽可能接近真实边界框。

作为总结,再说一下R-CNN的优缺点,首先优点当然是首次把CNN引入到目标检测领域,但是缺点也很明显,第一,选出候选框就很耗时间,一般来说,一幅图像需要选出两千多个候选框,第二,我们需要对每个候选框进行一次CNN计算,也就是说,即使只是处理一幅图,也要进行两千多次CNN计算,十分耗时,所以针对R-CNN的这些缺点,就有了改进的Fast R-CNN、Faster R-CNN等模型。

在github写的自然语言处理入门教程,持续更新:NLPBeginner

在github写的机器学习入门教程,持续更新:MachineLearningModels

想浏览更多关于数学、机器学习、深度学习的内容,可浏览本人博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值