真锋
永远保持一颗学习和专注的心
嵌入式视觉

目标检测模型学习笔记

目标检测的数据增强

  • 有应用在整张图片上、但不会影响边界框的那种变换,比如从图像分类里借来的颜色变换 (Color Transformations)。
  • 也有不影响整张图片、但改变边界框位置的那种变换,比如图像平移 (Translating) 或剪切 (Shearing) 。
  • 还有只针对边界框里的目标,而进行的变换

比起图像分类任务的数据扩增,目标检测的难点在于,要保持边界框和发生形变的图像之间的一致性 (Consistency) 。

目标检测基本理论

CNN中的卷积操作

  • 对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!
  • 对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!
  • 过滤器的深度其实就是过滤器的数量!
  • 线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近,即Y=WX。

卷积神经网络层数

  • VGG16是卷积层conv+全连接层FC层数是16层,ResNet50是卷积层conv+全连接层FC层数是50层,这样命名是因为池化层不产生权重参数。后面的数字代表权值层数量。
  • resnet残差网络可以找到网络训练的最佳层数 。

目标检测经典模型

目标检测经典模型分为:两阶段(2-stage)检测模型和单阶段(1-stage)检测模型。
2-stage检测模型分成两个步骤解决目标检测问题:

  • 生成可能区域(Region Proposal) & CNN提取特征
  • 分类器识别目标类别并修正检测框位置

R-CNN网络结构


R-CNN可被抽象为两个过程:一是基于图片提出若干个可能包含待检测物体的区域(Region Proposal),使用的算法是Selective Search算法;二是在提出的这些区域上运行当时表现好的分类网络(AlexNet),以得到每个区域物体的类别。

Fast RCNN结构


上图是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)。

Faster R-CNN网络结构

Faster R-CNN结构图解析

图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)

Region Proposal Networks(RPN)理解

图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。所以,仅仅是个二分类而已!

Faster R-CNN总结

此图像的alt属性为空;文件名为image-15.png
图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网络将这一任务建模为二分类(是否为物体)的问题。 

  • 算法第一步是在一个滑动窗口上生成不同大小和长宽比例的anchor box(如上图右边部分),取定IoU的阈值,按Ground Truth标定这些anchor box的正负。于是,传入RPN网络的样本数据被整理为anchor box(坐标)和每个anchor box是否有物体(二分类标签)。RPN网络将每个样本映射为一个概率值和四个坐标值,概率值反应这个anchor box有物体的概率,四个坐标值用于回归定义物体的位置。最后将二分类和坐标回归的损失统一起来,作为RPN网络的目标训练。 
  • 第二步由RPN得到Region Proposal在根据概率值筛选后经过类似的标记过程,被传入R-CNN子网络,进行多分类和坐标回归,同样用多任务损失将二者的损失联合。 

RPN每个滑动位置默认生成9个框的由来:By default we use 3 scales and 3 aspect ratios, yielding k=9 anchors at each sliding position.

  1. 在RPN的时候,已经对anchor做了一遍NMS,在RCNN测试的时候,还要再做一遍。
  2. 在RPN的时候,已经对anchor的位置做了回归调整,在RCNN阶段还要对RoI再做一遍。
  3. 在RPN阶段分类是二分类,而Fast RCNN阶段是21分类(论文中)。

Faster R-CNN四类损失

虽然原始论文中用的4-Step Alternating Training 即四步交替迭代训练。然而现在github上开源的实现大多是采用近似联合训练(Approximate joint training),端到端,一步到位,速度更快。 
训练Faster RCNN的时候有四个损失

  1. RPN 分类损失:anchor是否为前景(二分类)
  2. RPN位置回归损失:anchor位置微调
  3. RoI 分类损失:RoI所属类别(21分类,多了一个类作为背景)
  4. RoI位置回归损失:继续对RoI位置微调 
    四个损失相加作为最后的损失,反向传播,更新参数。

Faster RCNN解读参考资料

一文读懂Faster RCNN 
从编程实现角度解读Faster RCNN

Mask R-CNN结构

Mask R-CNN结构解析

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.

  • Mask R-CNN基本结构:与Faster RCNN采用了相同的two-state步骤:首先是找出RPN,然后对RPN找到的每个RoI进行分类、定位、并找到binary mask。这与当时其他先找到mask然后在进行分类的网络是不同的。
  • Mask R-CNN的损失函数: $$
  • Mask的表现形式(Mask Representation):因为没有采用全连接层并且使用了RoIAlign,可以实现输出与输入的像素一一对应。
  • RoIAlign:RoIPool的目的是为了从RPN网络确定的ROI中导出较小的特征图(a small feature map,eg 7×7),ROI的大小各不相同,但是RoIPool后都变成了7×7大小。RPN网络会提出若干RoI的坐标以[x,y,w,h]表示,然后输入RoI Pooling,输出7×7大小的特征图供分类和定位使用。问题就出在RoI Pooling的输出大小是7×7上,如果RON网络输出的RoI大小是8*8的,那么无法保证输入像素和输出像素是一一对应,首先他们包含的信息量不同(有的是1对1,有的是1对2),其次他们的坐标无法和输入对应起来(1对2的那个RoI输出像素该对应哪个输入像素的坐标?)。这对分类没什么影响,但是对分割却影响很大。RoIAlign的输出坐标使用插值算法得到,不再量化;每个grid中的值也不再使用max,同样使用差值算法。

FPN结构理解

  • RPN网络结构就介绍到这里,总结起来就是:
    生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals。
  • RPN网络生成的proposals的方法:对foreground anchors进行bounding box regression,这样获得的proposals也是大小形状各不相同。
  • FPN(Feature Pyramid Network)算法可以同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式不同

目标检测模型测试与训练技巧

模型选择

常用模型:Faster RCNN、Mask RCNN、Retinanet、Cascade RCNN等。 
当前检测竞赛圈的通用配置还是 Cascade-R-CNN + ResNeXt/ResNet 系列 + FPN+DCN 2

数据预处理

  • 离线数据增强
  • 在线数据增强(图像亮度、光照强度调整、高斯模糊、上下左右翻转、旋转45°、仿射变换)
  • 数据过采样(对难以坚持的类别进行过采样)
  • mixup:将两张图按照一定的比例混合在一起,来源于李沐的论文。比如在在工业类缺陷检测或者违禁物品检测中,常常会给出一些不含有待检测目标的正常图像,可以将含有目标的图像和随机选取的正常图像进行 mixup(随机意味着更多的组合~),这样数据量又上来了。
  • 填鸭式数据扩增:所谓填鸭式,就是将一些目标(也可以是误捡的)扣出来,放到没有目标的图上去,增加图像的鲁棒性。比如有人在钢筋识别的时候,有一些小石子和吊机容易被误判成钢筋,索性就选了一些图,把这些伪目标填充合理的位置上,效果就是没有再误判过了。

预训练模型

  • 使用ImageNet预训练的backbone
  • 使用coco预训练的完整检测模型权重(效果更佳)

训练策略

  • 预训练模型训练1-4epoch,解冻模型、训练完整模型一定epoch
  • 每隔一定epoch,学习率衰减2/10倍

多尺度训练

每次加载图像都从图像size列表(比如514+i*32, 1024)里,随机选一个尺寸读取图像。即每隔一次iter(每次load image data),都随机选一个图像尺寸训练。

lr选择

检测任务中常用的计算方法是: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 中的相应配置。

TTA测试数据增强

效果有提升,但是耗时较长

Soft-NMS

Soft-NMS 改进了之前比较暴力的 NMS,当 IOU 超过某个阈值后,不再直接删除该框,而是降低它的置信度 (得分),如果得分低到一个阈值,就会被排除;但是如果降低后仍然较高,就会被保留。实现细节移步:NMS 与 soft NMS。

参考资料

Kaggle实战目标检测奇淫技巧合集

目标检测基本概念

准确率、召回率与IoU、mAP

混淆矩阵:

  • True Positive(真正例, TP):将正类预测为正类数.
  • True Negative(真负例, TN):将负类预测为负类数.
  • False Positive(假正例, FP):将负类预测为正类数 → 误报 (Type I error).
  • False Negative(假负例子, FN):将正类预测为负类数 → 漏报 (Type II error).

查准率(准确率)P = TP/(TP+FP)
查全率(召回率)R = TP/(TP+FN)
准确率描述了模型有多准,即在预测为正例的结果中,有多少是真正例;召回率则描述了模型有多全,即在为真的样本中,有多少被我们的模型预测为正例。

不同的计算机视觉问题,对两类错误有不同的偏好,常常在某一类错误不多于一定阈值的情况下,努力减少另一类错误。在目标检测中,mAP(mean Average Precision)作为一个统一的指标将这两种错误兼顾考虑。
具体来说就是,在目标检测中,对于每张图片检测模型会输出多个预测框(远超真实框的个数),我们使用IoU(Intersection Over Union,交并比)来标记预测框是否预测准确。标记完成后,随着预测框的增多,查全率R总会上升,在不同查全率R水平下对准确率P做平均,即得到AP,最后再对所有类别按其所占比例做平均,即得到mAP指标。

交并比IOU

交并比(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介绍

在目标检测中,常会利用非极大值抑制算法(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算法

NMS主要就是通过迭代的形式,不断地以最大得分的框去与其他框做IoU操作,并过滤那些IoU较大的框。

目标检测算法基本操作

ROI Pooling与ROI Align

总结:知道了RoiPooling和RoiAlign实现原理,在以后的项目中可以根据实际情况进行方案的选择;对于检测图片中大目标物体时,两种方案的差别不大,而如果是图片中有较多小目标物体需要检测,则优先选择RoiAlign,更精准些….

参考资料

ROI Pooling与ROI Align笔记

赞赏
更多干货文章,欢迎关注我的微信公众号-嵌入式视觉。

发表回复

textsms
account_circle
email

嵌入式视觉

目标检测模型学习笔记
目标检测的数据增强 有应用在整张图片上、但不会影响边界框的那种变换,比如从图像分类里借来的颜色变换 (Color Transformations)。也有不影响整张图片、但改变边界框位置的那种变换,…
扫描二维码继续阅读
2019-04-22