这篇文章,我会详细描述R-CNN(Regions with CNN features),R-CNN被证明对于检测和分类自然图像中的物体是非常有效的,相对于其之前的技术来说,R-CNN实现了很高mAP分数,详细的论文见下面的链接:
Rich feature hierarchies for accurate object detection and semantic segmentationarxiv.org Fast R-CNNsarxiv.org ruotianluo/pytorch-faster-rcnngithub.com本文中使用的很多的术语(比如不同层的名称)都遵守代码中的术语规则,理解本文提供的信息,会让你更容易的理解PyTorch实现RCNNs,并可以做出你的更改。
文章结构
- 第一部分,图像预处理:这个部分,会对一些适用于输入图像的预处理技术进行说明,这些技术包括提取平均像素值、缩放图像...Training和Inference之间的预处理步骤必须相同。
- 第二部分,网络结构组织:这个部分,会对主要的三种网络结构进行说明—The 'head' Network,The Region Proposal Network(RPN),the classification Network。
- 第三部分,实现细节(Training):这个部分是本文最详细的部分,说明了Training过程所有的实现细节。
- 第四部分,实现细节(Inference):这个部分中,对包括在Inference中的各个步骤进行了解释,比如使用训练好的R-CNN网络识别有前景的区域,并对这些区域内的目标进行分类。
- 附录:这里包含了一些在R-CNN操作中经常使用的算法的细节,如非最大抑制和ResNet 50架构的细节。
图像预处理Image Pre-Processing
在一个图片被传入网络进行学习前,需要进行预处理步骤,如上图所示,无论是Training过程亦或是Inference过程,预处理必须相同。平均值向量(3x1,每个颜色通道对应一个数字)不是当前图像中像素中的平均值,而是所有训练和测试图像中相同的配置值。
网络结构组织Network Organization
一个R-CNN使用神经网络来解决如下两个问题:
- 识别输入图像中,可能包含前景对象的希望区域——ROI(Region of Interest)
- 计算每个ROI的对象类的概率分布,即,计算ROI包含某个类的对象的概率。然后用户可以选择最高的对象类作为分类的结果。
R-CNNs包括了三种主要的网络:
- Head网络
- Region Proposal Network(RPN)
- Classification Network
R-CNNs使用与训练网络开始的一些层,比如ResNet50 来从一张输入图像中识别希望特征。使用一个为了解决不同问题而训练的网络是可能的来进行迁移学习是可能的。网络的前几层学习检测一般的特征,比如边缘、色块等,这种特征提取不会因为数据集的不同而发生改变,实际上,它们是跨越许多问题的很好的特征提取器。后面层学到的是更加高级层次的,更加具体的问题特征。进行迁移学习时,可以删除这些层,或者当你做BP时,对这些层的权重进行Fine-tuned(微调)。
构成预网络网络初始化的前几层构成"head"网络。接着通过Region Proposal Network(RPN)传递head网络生成的卷积特征图。它使用一些的卷积和Fully connected 层来生成希望的ROIs,这些ROIs很有可能包含前景对象(第一个问题)。然后这些希望的ROI区域从head网络生成的特征图中剪裁出相应的区域。 这叫做“Crop Pooling”。通过crop pooling生成的区域接着被传入一个Classification network,来对每个ROI包含的物体进行分类识别。
网络结构Network Architecture
上图显示了三个网络的各个机构组成,图里展示出每个网络层的输入和输出的维度,这有助于我们理解数据是如何被网络的每一层转换的。w和h代表着输入图像(预处理之后)的width和height。
Training过程实现细节 Implementation Details: Training
这个部分,会对训练一个R-CNN的详细细节进行阐述,只要你理解trainging过程的工作原理,那么理解inference过程会简单很多,因为后面inference过程只用了training过程中的某几步。training的目标是调整RPN(Region Proposal Network)以及分类网络的权重,并对head network中的权值进行fine-tune(这些权重的初始化来自预训练的网络,比如ResNet)。回想一下,RPN网络的主要任务是produce promising ROIs,而分类网络(classification Networks)的任务是为每个ROI分配给个类的得分。因此,为了训练这些网络,我们需要相应的corresponding ground truth,比如,图像中出现的物体的bounding box的坐标以及这些物体的类别。这些ground truth来自免费使用的图像数据库,这些数据库对于每个图像都会有一个注释文件,包含了这些信息——bounding box的坐标信息以及对象的类别标签。这些图像数据集已经被用来支持各种对象分类和检测的挑战。这两个共用数据集是:
- PASCAL VOC:VOC2007 数据集包括了9963张图片(training/validation/test),这些图片中的20个对象类别附有24640条注释。
- Person: person
- Animal: bird, cat, cow, dog, horse, sheep
- Vehicle: aeroplane, bicyle, boat, bus, car, motorbike, train
- Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor
- COCO(Common Objects in Context)数据集:The COCO 数据集相对于VOC来说要大得多,它包含的图片数>200K,包括90多种类别。
我使用要小很多的PASCAL VOC 2007数据集来进行训练,R-CNN可以同时训练RPN(Region Proposal Network)以及分类网络。
现在来学习一下“bounding box regression coefficients”以及 “bounding box overlap”的概念。
- Bounding Box Regression Coeffiencts(有时也会叫做“regression coefficients”或者是“regression targets”):R-CNN的目标之一是产生比较好的bounding boxes,以便于很好的匹配要检测的对象的边界。R-CNN通过获取一个给定的bounding box(每个边界框由左上角坐标、宽度、高度唯一定义),并通过应用一组“Regression coefficients”对其左上角、宽度、高度进行调整,从而生成这些边界框。这些系数通过下列方式进行计算:
- 设目标与原始bounding box左上角的坐标分别为:
;
- 设目标与原始bounding box的宽度和高度分别为:
;
- 然后regression targets(将原始bounding box转换为目标bounding bo的函数的系数)如下:
- 设目标与原始bounding box左上角的坐标分别为:
-
-
-
这个函数很容易可逆,给定左上角的回归系数和坐标以及原始边界框的宽度和高度,则可以很容易地计算出左上角和目标框的宽度和高度。注意,如果进行了无剪裁的仿射变化,回归系数不会发生改变,这一点很重要,在计算分类loss时,target regression coefficients在原始条件比例下进行计算,而分类网络输出regression coefficients则是在对正方形特征图(1:1长径比)经过ROI池化步骤后计算得出。
-
- Intersection over Union(IoU) Overlap:我们需要去衡量一个给定的bounding box距离另一个bounding box的距离,这个度量非常的直观,即两个重合的bounding box有着1的重叠,两个完全不重合的bounding box,重叠为0。IOU用下面的图很容易解释。
-
先把这些准备工作完成后,就可以来学习训练一个R-CNN的实现细节了。软件实现上,R-CNN的执行被分解为以下几层:一个层封装了一系列的逻辑步骤,这些步骤包括通过一个神经网络运行数据,以及包括比较各个bounding box之间的overlap,执行non-maxima supression等等。
- Anchor Generation Layer: 这一层,生成固定数量的“anchors”(bounding boxes ),首先生成9个不同尺度和纵横比的anchors,然后通过将它们平移到横跨整个图像的均匀网格点实现anchors的复制。
- Proposal Layer : 这一层,根据bounding box的回归系数来对这些anchors进行变换,接着通过使用anchor作为前景的概率来应用non-maximum suppression,来删除一定数量的anchors。
- Anchor Target Layer : anchor target layer层的目的是生成一系列"good"的anchors以及对应的前景/背景的label和target回归系数来训练Region Proposal Network,这一层的输出只用来训练RPN网络,不会被classification layer用到。给定一些列 anchors(由anchor generation layer生成,anchor target layer识别promising的前景和背景anchors,promising前景anchors是指与那些与ground truth box的重叠值高于阈值的那些;背景boxes是那些与ground truth box的重叠值小于阈值的那些。the anchor target layer同时也会输出一组bounding box的回归器。即,每一个anchor target 距离最近的bounding box的距离的度量。这些回归器只适用于前景boxes,因为背景框没有“closest bounding box”的概念。)
- RPN Loss:The RPN Loss Function,是优选训练RPN网络时的最小化的度量,RPN损失函数是以下两个的结合:
- 由RPN生成的正确分类为前景/背景的bounding boxes的比例;
- 预测值与target 回归系数之间的距离度量;
- Proposal Target Layer:Proposal Target Layer的目的是对Proposal Layer 生成的的一系列的anchors进行修剪,然后生成特定类的bounding box回归目标,这可以用来训练分类层生成良好的类标签以及回归目标。
- ROI Pooling Layer:实现一个空间转换网络,该网络对输入特征图进行采样,给定proposal target layer生成的region proposals的bounding box坐标。这些坐标一般不会落在整数边界上,因此需要基于插值的采样。
- Classification Layer:分类层将ROI池层生成的特征图通过一些列卷积层传递,输出通过两个全连接FC层提供,第一层生成每个region proposal的类概率分布;第二层生成一系列特定类的bounding box回归器。
- Classification Loss:与RPN Loss相似,分类损失是优化训练分类网络时的最小化度量。在 BP期间,反向传播过程中,误差梯度也会流向RPN网络,因此训练分类器会改变RPN网络的权值。后面对于这点会详细说,classification loss包括:
- RPN生成的正确分类的bounding box的比例(作为正确的对象类)
- 预测与目标回归系数之间的距离度量。
- 下面会对这些层进行详细介绍。
Anchor Generation Layer
- 给定:
- - 一系列 纵横比(0.5,1,2)
- - Anchor Scales(8,16,32)
- - 步长16(stride length)缩小、缩放由Resnet头执行
- - 创造均匀的空间网格,
- - 向每个网格位置添加anchors
- Anchor Generation Layer生成一系列bounding boxes(所谓的anchor boxes),而且是变尺寸的,不同的大小和长宽比遍布整个输入图像,这些bounding boxes对所有的图像都是一样的,它们不知道图像的内容。其中的一些bounding boxes会包围前景中的对象,而有一些则不会,RPN网络的目标是学习去识别这项boxes哪些是“good”boxes,也就是说,可能包含前景对象并生成target regression coefficients,当应用到一个anchor box时,会讲这个anchor box变成一个更好的bounding box(更适合封闭前景object对象)。
Appendix附录
Non-max suppression(NMS)
Non-max suppresion是一种用于减少候选boxes数量的技术,该技术通过评估boxes的重叠数是否超过一个阈值来进行筛选。Boxes首先通过一些标准进行排序(一般是右下角y坐标值)。接着,遍历所有的boxes,抑制那些与这个box的IOU值超过阈值的box。通过y坐标排序导致会导致保留一组重叠框中的最低框。有时往往不是我们想要的结果。R-CNN使用的NMS根据前景分数进行排序。这个结果保留的具有最高分数的box。下图两种情况,均假设box之间的重叠高于NMS的重叠阈值。