一个简单的定位示例:
除了将该图像标记为猫外,还需要定位图中的猫,典型方法是在该猫周围画一个边界框,这个方框可以看做定义该方框的一系列坐标,(x,y) 可以是方框的中心w 和 h 分别表示方框的宽和高。 要计算这些值 我们可以使用典型分类 CNN,用到的很多相同结构。
一种定位方式是首先将给定图像传入一系列卷积层和池化层 并为该图像创建一个特征向量,保留相同的全连接层进行分类,然后在特征向量之后添加另一个全连接层,目的是预测边界框的位置和大小,称其为边界框坐标。 在这个 CNN 中:
在训练 CNN 对一组图像进行分类时,通过比较输出的预测类别和真实类别标签并查看二者是否匹配来训练 CNN。通常使用交叉熵衡量这些类别之间的误差。因为当具有不确定性的预测类别与真实类别标签越来越接近时,交叉熵损失会逐渐降低。但是当我们比较一组点时例如脸部位置/点或定义图像特定区域的点,我们需要一种衡量这些坐标值之间相似性的损失函数,这不是分类问题而是回归问题。分类是预测类别标签,回归是预测数量。 对于回归问题,例如预测(x,y)坐标,我们需要一个损失函数来比较这些数量并衡量它们之间的近似程度。
前两种方法都适合衡量点之间的距离,但是所有损失函数都具有优势和弊端。L1 损失可能会忽略小的误差值而 MSE 损失对大的误差值最敏感,导致可能会放大很大但是不常见的误差-离群值。
为了预测边界框,我们训练模型将图像作为输入和输出坐标值:(x,y,w,h)。这种模型可以扩展到任何具有坐标值作为输出的问题!一个这样的例子是 人体姿势估计 。
可以通过跟踪身体关节的14个点来估计人体的姿势
如何训练具有两个不同输出(一个类和一个边界框)的网络以及这些输出的不同损失?
在这种情况下,我们使用分类交叉熵来计算我们的预测类和真实类的损失,并使用回归损失(类似Smooth L1损失)来比较预测和真实边界框。
但是,我们必须使用一次损失训练整个网络,那么我们如何将它们结合起来呢?
有几种方法可以训练多种损失函数,实际上,我们经常使用加权分类和回归损失(例如0.5*cross_entropy_loss + 0.5*L1_loss
),结果是一个单一的值,我们误差,可以使用它来进行反向传播。这引入了一个超参数:损失权重。我们希望对每次损失进行加权,以便有效地平衡和组合这些损失,并且在研究中经常引入另一个正则项来帮助确定最佳组合这些损失权重值。
考虑上面的图像,认为如何选择最佳建议区域? 我们要分析的区域是那些包含完整对象的区域。我们希望摆脱包含图像背景或仅包含对象的一部分的区域。因此,提出了两种常见方法:
要定位并分类图像中的多个对象,希望能够识别有限数量的裁剪区域供 CNN 查看.在理想情况下,我们将为图像中的三个不同对象生成三个完美裁剪的区域。为了实现这一目标并生成数量合理的裁剪区域,诞生了候选区域的概念。候选区域使我们能够快速查看图像,并仅为认为可能存在对象的部分生成区域。 R-CNN架构: 使用候选区域算法生成一组有限的裁剪区域,通常称之为感兴趣区域(Regions of interstets,ROIs),然后将这些区域挨个地传入分类 CNN 中,看网络对每个裁剪区域预测出什么样的分类标签. R-CNN 为每个感兴趣区域生成一个类别,因此可以识别图像中有狗的区域和有猫的区域.
在此示例中我们还包含了一个类别叫做背景,用于捕获任何有噪区域。 因为这些区域通常具有不同的大小 因此首先需要被转换成标准大小 ,CNN 能够接受为输入图像。 R-CNN方法的主要缺点是依然很耗时,因为需要将每个裁剪区传入整个CNN中,然后才能生成一个类别标签。 与其他模型不同,R-CNN没有明确地产生表示对象是否在区域中的置信度得分,而是巧妙地产生一组类别得分,其中一个类是“背景”。 这最终起到了类似的作用,例如,如果一个区域的类得分是Pbackground = 0.10,它可能包含一个对象,但如果它的Pbackground = 0.90,那么该区域可能不包含一个对象。
R-CNN的下一个发展架构是Fast R-CNN。 这种架构使整个图像仅传入分类CNN一次,而不是通过分类CNN单独处理每个感兴趣区域(ROIs). 图像经过一系列卷积和池化层,在这些层级之后是一个特征图堆栈。我们依然需要识别感兴趣区域,但是我们将这些候选区域投射到更小的特征图层级上,而不是裁剪原始区域,特征图中的每个区域对应于原始图像中更大的区域。从特征途中获取候选区域,并依次将他们送到一个全连接层,为每个不同区域生成一个类别。 在这种模式下 我们可以仅执行最耗时的步骤一次,即通过一系列卷积层处理图像,然后选择性地使用该特征图获得期望的输出。
同样,我们需要处理这些投射中不同大小的区域,因为网络中的更深的层级要求输入时固定大小。因此,需要执行感兴趣区域(ROIs)池化,将这些区域调整为固定大小,然后再送到全连接层中。
这个网络比 R-CNN 要快,但是依旧需要生成候选区域所以速度依然很慢,并且它依然会查看根本不包含对象的区域
为了将感兴趣的区域转化为一致的大小以供进一步分析,对此使用ROL池化层。ROL池化层是网络中的一个附加层,它接收任意大小的矩形区域,对该区域执行maxpooling操作,使输出为固定形状。下面是一个将一些像素值分割成若干块的区域的示例,将对该区域应用池化。
[[0.85,0.34,0.76],
[0.32,0.74,0.21]]
在池化之后单个最大值:0.85。把这些应用到这些图片之后,可以看到任何一个矩形区域是如何被压缩成一个更小的正方形的。 可以在下面看到从输入图像到区域到缩小,最大化池化区域的完整过程:
FAST R-CNN是R-CNN的10倍,因为它只为给定的图像创建卷积层一次。Fast R-CNN也需要更短的时间来测试一个新图。测试时间主要由创建候选区域时间决定。
Faster R-CNN 学会生成自己的候选区域
通过消除非对象区域分析步骤,Faster R-CNN是所有区域CNN中最快速的模型。
你可能想知道在Faster R-CNN架构中,ROIs 是怎么在候选区域网络生成。 候选区域网络以类似于YOLO目标检测的方式在Faster R-CNN中工作。RPN查看最后一个卷积层的输出,即生成的特征图,并采用滑动窗口方法来检测可能的对象。它在特征映射上滑动一个小的(典型的3x3)窗口,然后对于每个窗口RPN:
训练候选区域网络: 在这种情况下,由于没有基本真实区域,该如何训练候选区域网络? 对于任何区域,都可以检查它是否与任何真实对象重叠。也就是说,对于一个区域,我们将该区域分为对象与非对象。 区域选择 速度瓶颈: 包括Faster R-CNN在内的这些网络结构,是通过减少生成和决定候选区域所需的时间来提高对象检测模型速度。 Faster R-CNN实现