Contents
- 1 目标检测的数据增强
- 2 目标检测基本理论
- 2.1 CNN中的卷积操作
- 2.2 卷积神经网络层数
- 3 目标检测经典模型
- 3.1 R-CNN网络结构
- 3.2 Fast RCNN结构
- 3.3 Faster R-CNN网络结构
- 3.3.1 Faster R-CNN结构图解析
- 3.3.2 Region Proposal Networks(RPN)理解
- 3.3.3 Faster R-CNN总结
- 3.3.4 Faster R-CNN四类损失
- 3.3.5 Faster RCNN解读参考资料
- 3.4 Mask R-CNN结构
- 3.4.1 Mask R-CNN结构解析
- 3.5 FPN结构理解
- 4 目标检测模型测试与训练技巧
- 4.1 模型选择
- 4.2 数据预处理
- 4.3 预训练模型
- 4.4 训练策略
- 4.5 多尺度训练
- 4.6 lr选择
- 4.7 损失函数选择
- 4.8 TTA测试数据增强
- 4.9 Soft-NMS
- 4.10 参考资料
- 5 目标检测基本概念
- 5.1 准确率、召回率与IoU、mAP
- 5.2 交并比IOU
- 5.3 NMS介绍
- 5.4 NMS算法
- 6 目标检测算法基本操作
- 6.1 ROI Pooling与ROI Align
- 6.1.1 参考资料
- 6.1 ROI Pooling与ROI Align
目标检测的数据增强
- 有应用在整张图片上、但不会影响边界框的那种变换,比如从图像分类里借来的颜色变换 (
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总结
图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.
- 在RPN的时候,已经对anchor做了一遍NMS,在RCNN测试的时候,还要再做一遍。
- 在RPN的时候,已经对anchor的位置做了回归调整,在RCNN阶段还要对RoI再做一遍。
- 在RPN阶段分类是二分类,而Fast RCNN阶段是21分类(论文中)。
Faster R-CNN四类损失
虽然原始论文中用的4-Step Alternating Training 即四步交替迭代训练。然而现在github上开源的实现大多是采用近似联合训练(Approximate joint training),端到端,一步到位,速度更快。 在训练Faster RCNN的时候有四个损失:
- RPN 分类损失:anchor是否为前景(二分类)
- RPN位置回归损失:anchor位置微调
- RoI 分类损失:RoI所属类别(21分类,多了一个类作为背景)
- 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。 计算公式如下:
代码实现如下:
代码语言:javascript复制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笔记