Contents
Color Transformations
)。Translating
) 或剪切 (Shearing
) 。比起图像分类任务的数据扩增,目标检测的难点在于,要保持边界框和发生形变的图像之间的一致性 (Consistency) 。
目标检测经典模型分为:两阶段(2-stage)检测模型和单阶段(1-stage)检测模型。 2-stage检测模型分成两个步骤解决目标检测问题:
R-CNN可被抽象为两个过程:一是基于图片提出若干个可能包含待检测物体的区域(Region Proposal),使用的算法是Selective Search算法;二是在提出的这些区域上运行当时表现好的分类网络(AlexNet),以得到每个区域物体的类别。
上图是Fast R-CNN的架构。图片经过feature extractor得到feature map, 同时在原图上运行Selective Search算法并将RoI(Region of Interset,实为坐标组,可与Region Proposal混用)映射到到feature map上,再对每个RoI进行RoI Pooling操作便得到等长的feature vector,将这些得到的feature vector进行正负样本的整理(保持一定的正负样本比例),分batch传入并行的R-CNN子网络,同时进行分类和回归,并将两者的损失统一起来。 注:说句题外话,由Selective Search算法提取的一系列可能含有object的boudning box,这些通常称为region proposals或者region of interest(ROI)。
图1
图2
上图1是 Faster R-CNN的流程图,Faster R-CNN的流程图与Fast R-CNN相同,采用外部候选区域方法代替了内部深层网络。 上图2是python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构(pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt)
图3
经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
上图3展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得foreground和background(检测目标是foreground),下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。 其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!
图4
Faster R-CNN是2-stage方法的奠基之作,提出RPN网络取代Selective Search算法使得检测任务可以由神经网络端到端地完成。粗略的讲,Faster R-CNN = RPN + Fast R-CNN,跟RCNN共享卷积计算的特性使得RPN引入的计算量很小,使得Faster R-CNN可以在单个GPU上以5fps的速度运行,而在精度方面达到SOTA(State of the Art,当前最佳)。 其最大贡献在于提出Regional Proposal Networks,替代之前的SS算法,使得训练变成端到端的神经网络训练。
RPN网络将这一任务建模为二分类(是否为物体)的问题。
RPN每个滑动位置默认生成9个框的由来:By default we use 3 scales and 3 aspect ratios, yielding k=9 anchors at each sliding position.
虽然原始论文中用的4-Step Alternating Training 即四步交替迭代训练。然而现在github上开源的实现大多是采用近似联合训练(Approximate joint training),端到端,一步到位,速度更快。 在训练Faster RCNN的时候有四个损失:
一文读懂Faster RCNN 从编程实现角度解读Faster RCNN
Mask R-CNN (regional convolutional neural network) is a two stage framework: the first stage scans the image and generates proposals(areas likely to contain an object). And the second stage classifies the proposals and generates bounding boxes and masks.
常用模型:Faster RCNN、Mask RCNN、Retinanet、Cascade RCNN等。 当前检测竞赛圈的通用配置还是 Cascade-R-CNN + ResNeXt/ResNet 系列 + FPN+DCN 2
每次加载图像都从图像size列表(比如514+i*32, 1024)里,随机选一个尺寸读取图像。即每隔一次iter(每次load image data),都随机选一个图像尺寸训练。
检测任务中常用的计算方法是:lr = 0.02 / 8 x num_gpus x img_per_gpu / 2
Focal Loss 这是 CV 中根据实验结果调整损失函数最先考虑的一个,论文: Focal Loss for Dense Object Detection, 主要是针对模型拟合困难的样例或者样本不均衡的样例,在图像分类中常用作最终的损失函数,直接进行优化,而在目标检测中却有两个选择,一个是在 RPN 层使用 FocalLoss,这样可以缓解由于目标占比较少导致生成的 anchor 正负样本比例失衡;另一种就是类似图像分类一样,在 bbox_head 中使用,mmdetection 中的相应配置。
效果有提升,但是耗时较长
Soft-NMS 改进了之前比较暴力的 NMS,当 IOU 超过某个阈值后,不再直接删除该框,而是降低它的置信度 (得分),如果得分低到一个阈值,就会被排除;但是如果降低后仍然较高,就会被保留。实现细节移步:NMS 与 soft NMS。
混淆矩阵:
查准率(准确率)P = TP/(TP+FP) 查全率(召回率)R = TP/(TP+FN) 准确率描述了模型有多准,即在预测为正例的结果中,有多少是真正例;召回率则描述了模型有多全,即在为真的样本中,有多少被我们的模型预测为正例。
不同的计算机视觉问题,对两类错误有不同的偏好,常常在某一类错误不多于一定阈值的情况下,努力减少另一类错误。在目标检测中,mAP(mean Average Precision)作为一个统一的指标将这两种错误兼顾考虑。 具体来说就是,在目标检测中,对于每张图片检测模型会输出多个预测框(远超真实框的个数),我们使用IoU(Intersection Over Union,交并比)来标记预测框是否预测准确。标记完成后,随着预测框的增多,查全率R总会上升,在不同查全率R水平下对准确率P做平均,即得到AP,最后再对所有类别按其所占比例做平均,即得到mAP指标。
交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,是产生的候选框(candidate bound)与原标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1。 计算公式如下:
代码实现如下:
def calculateIoU(candidateBound, groundTruthBound):
cx1 = candidateBound[0]
cy1 = candidateBound[1]
cx2 = candidateBound[2]
cy2 = candidateBound[3]
gx1 = groundTruthBound[0]
gy1 = groundTruthBound[1]
gx2 = groundTruthBound[2]
gy2 = groundTruthBound[3]
carea = (cx2 - cx1) * (cy2 - cy1) #C的面积
garea = (gx2 - gx1) * (gy2 - gy1) #G的面积
x1 = max(cx1, gx1)
y1 = max(cy1, gy1)
x2 = min(cx2, gx2)
y2 = min(cy2, gy2)
w = max(0, (x2 - x1))
h = max(0, (y2 - y1))
area = w * h #C∩G的面积
iou = area / (carea + garea - area)
return iou
在目标检测中,常会利用非极大值抑制算法(NMS,non maximum suppression)对生成的大量候选框进行后处理,去除冗余的候选框,得到最佳检测框,以加快目标检测的效率。其本质思想是其思想是搜素局部最大值,抑制非极大值。非极大值抑制,在计算机视觉任务中得到了广泛的应用,例如边缘检测、人脸检测、目标检测(DPM,YOLO,SSD,Faster R-CNN)等。即如图 2所示实现效果,消除多余的候选框,找到最佳的bbox。
NMS过程
以上图为例,每个选出来的Bounding Box检测框(既BBox)用(x,y,h,w, confidence score,Pdog,Pcat)表示,confidence score表示background和foreground的置信度得分,取值范围[0,1]。Pdog,Pcat分布代表类别是狗和猫的概率。如果是100类的目标检测模型,BBox输出向量为5+100=105。
NMS主要就是通过迭代的形式,不断地以最大得分的框去与其他框做IoU操作,并过滤那些IoU较大的框。
总结:知道了RoiPooling和RoiAlign实现原理,在以后的项目中可以根据实际情况进行方案的选择;对于检测图片中大目标物体时,两种方案的差别不大,而如果是图片中有较多小目标物体需要检测,则优先选择RoiAlign,更精准些….