Bryce1010 / DeepLearning-Project

7 stars 5 forks source link

Detection 目标检测 #11

Closed Bryce1010 closed 3 years ago

Bryce1010 commented 4 years ago

综述

Bryce1010 commented 4 years ago

Two-Stage

(2015 NIPS)Faster R-CNN

image Faster R-CNN的改进在于图像生成feature map后, 使用一个网络RPN自动生成proposals, 而不是使用slective search, 这样可以减少大量生成proposals的时间。

(2017 NIPS) R-FCN: Object Detection via Region-based Fully Convolutional Networks

整体来说,本文在FCN网络中使用一个位置敏感的RoI pooling层,得到一个“位置敏感度图”作为输出,完成一个端到端的目标检测网络结构,其主要网络流程如下图: image

图中可以清楚看出,整个R-FCN网络依旧是采用RPN+detection两个部分,分别进行候选proposal提取和检测。RPN类似于原始设计,进行前景背景的分离,而在R-FCN的结尾连接着RoI pooling层,该层产生对应于每一个RoI区域的分数。 在R-FCN的后面阶段里,所有卷积权值共享。和fast rcnn相比,主要差别就在后面跟的是ResNet,ResNet101有100个卷积层,一个pooling层一个1000类的fc层,本文为了应用在目标检测,将pooling层和fc层去除,只保留其卷积层得到的feature map,进一步产生分数图进行检测。

image

(2019 CVPR) Libra R-CNN Towards Balanced Learning for Object Detection

在检测过程中,作者对在CNN中连续卷积不同尺寸的feature map划分成三个层次:sample level, feature level, objective level. 并提出 Libra R-CNN 来对object detection也就是上面三个level进行平衡。其中, Libra R-CNN 集称了三个部件:

Balanced IoU sampling image

Balanced feature pyramid image 将AVG的feature经过 non-local network 或者 conv 再次得到和之前各层的相同尺寸4个的feature {P2, P3, P4, P5} Balanced L1 loss

Bryce1010 commented 4 years ago

One-Stage

(2016 CVPR) YOLO — You only look once, real time object detection

image YOLO的思想是one-stage, 不需要提前生成proposal, 而是将图片划分为S*S的网格, 然后每一个网格取bounding box, 最后将取到的bounding box用于网络最后的classification和regression。

(2016 ECCV) SSD: Single Shot MultiBox Detector

image

image

(2017 CVPR) YOLO9000: Better, Faster, Stronger

YOLO V3

image

(2017 ICCV Best Student Paper Award) RetinaNet — Focal Loss

two-stage可以使用OHEM增加hard example的作用, 但是one-stage没有相似应用。

image

Bryce1010 commented 4 years ago

Tricks

image

image

Bryce1010 commented 4 years ago

neck

additional blocks

path-aggregation blocks

Bryce1010 commented 4 years ago

目标检测比赛中的tricks

https://zhuanlan.zhihu.com/p/102817180

1. 数据增强

引入albumentations数据增强库进行增强

MMDetection自带数据增强

Bbox增强

2. Multi-scale Training/ Testing 多尺度训练或测试

[MMdetection中文文档-4. 技术细节]
输入图片的尺寸对检测模型的性能影响相当明显,事实上,多尺度是提升精度最明显的技巧之一。在基础网络部分常常会生成比原图小数十倍的特征图,导致小物体的特征描述不容易被检测网络捕捉。通过输入更大、更多尺寸的图片进行训练,能够在一定程度上提高检测模型对物体大小的鲁棒性,仅在测试阶段引入多尺度,也可享受大尺寸和多尺寸带来的增益。

multi-scale training/testing最早见于[Spatial Pyramid Pooling],训练时,预先定义几个固定的尺度,每个epoch随机选择一个尺度进行训练。测试时,生成几个不同尺度的feature map,对每个Region Proposal,在不同的feature map上也有不同的尺度,我们选择最接近某一固定尺寸(即检测头部的输入尺寸)的Region Proposal作为后续的输入。在[Convolutional Feature Maps]中,选择单一尺度的方式被Maxout(element-wise max,逐元素取最大)取代:随机选两个相邻尺度,经过Pooling后使用Maxout进行合并,如下图所示。

image

3.Global Context 全局语境

这一技巧在[ResNet的工作] 中提出,做法是把整张图片作为一个RoI,对其进行RoI Pooling并将得到的feature vector拼接于每个RoI的feature vector上,作为一种辅助信息传入之后的R-CNN子网络。目前,也有把相邻尺度上的RoI互相作为context共同传入的做法。

4. Box Refinement/ Voting 预测框微调法/投票法/ 模型融合

微调法和投票法由工作[Object detection via a multi-region & semantic segmentation-aware CNN model] 提出,前者也被称为Iterative Localization。

微调法最初是在SS算法得到的Region Proposal基础上用检测头部进行多次迭代得到一系列box,在ResNet的工作中,作者将输入R-CNN子网络的Region Proposal和R-CNN子网络得到的预测框共同进行NMS(见下面小节)后处理,最后,把跟NMS筛选所得预测框的IoU超过一定阈值的预测框进行按其分数加权的平均,得到最后的预测结果。

投票法可以理解为以顶尖筛选出一流,再用一流的结果进行加权投票决策。

不同的训练策略,不同的 epoch 预测的结果,使用 NMS 来融合,或者soft_nms

需要调整的参数:

模型融合主要分为两种情况:

  1. 单个模型的不同epoch进行融合 这里主要是在nms之前,对于不同模型预测出来的结果,根据score来排序再做nms操作。

  2. 多个模型的融合

这里是指不同的方法,比如说faster rcnn与retinanet的融合,可以有两种情况:

a) 取并集,防止漏检。

b) 取交集,防止误检,提高精度。

5. 随机权值平均 (Stochastic Weight Averaging, SWA)

[Stochastic Weight Averaging (SWA) github]
随机权值平均只需快速集合集成的一小部分算力,就可以接近其表现。SWA 可以用在任意架构和数据集上,都会有不错的表现。根据论文中的实验,SWA 可以得到我之前提到过的更宽的极小值。在经典认知下,SWA 不算集成,因为在训练的最终阶段你只得到一个模型,但它的表现超过了快照集成,接近 FGE(多个模型取平均)。

image 左图:W1、W2、W3分别代表3个独立训练的网络,Wswa为其平均值。中图:WSWA 在测试集上的表现超越了SGD。右图:WSWA 在训练时的损失比SGD要高。

结合 WSWA 在测试集上优于 SGD 的表现,这意味着尽管 WSWA 训练时的损失较高,它的泛化性更好。

SWA 的直觉来自以下由经验得到的观察:每个学习率周期得到的局部极小值倾向于堆积在损失平面的低损失值区域的边缘(上图左侧的图形中,褐色区域误差较低,点W1、W2、3分别表示3个独立训练的网络,位于褐色区域的边缘)。对这些点取平均值,可能得到一个宽阔的泛化解,其损失更低(上图左侧图形中的 WSWA)。

6. OHEM 在线难例挖掘

[OHEM](Online Hard negative Example Mining,在线难例挖掘) 。
两阶段检测模型中,提出的RoI Proposal在输入R-CNN子网络前,我们有机会对正负样本(背景类和前景类)的比例进行调整。通常,背景类的RoI Proposal个数要远远多于前景类,Fast R-CNN的处理方式是随机对两种样本进行上采样和下采样,以使每一batch的正负样本比例保持在1:3,这一做法缓解了类别比例不均衡的问题,是两阶段方法相比单阶段方法具有优势的地方,也被后来的大多数工作沿用。

image 作者将OHEM应用在Fast R-CNN的网络结构,如上图,这里包含两个RoI network,上面一个RoI network是只读的,为所有的RoI 在前向传递的时候分配空间,下面一个RoI network则同时为前向和后向分配空间。在OHEM的工作中,作者提出用R-CNN子网络对RoI Proposal预测的分数来决定每个batch选用的样本。这样,输入R-CNN子网络的RoI Proposal总为其表现不好的样本,提高了监督学习的效率。

首先,RoI 经过RoI plooling层生成feature map,然后进入只读的RoI network得到所有RoI 的loss;然后是hard RoI sampler结构根据损失排序选出hard example,并把这些hard example作为下面那个RoI network的输入。

实际训练的时候,每个mini-batch包含N个图像,共|R|个RoI ,也就是每张图像包含|R|/N个RoI 。经过hard RoI sampler筛选后得到B个hard example。作者在文中采用N=2,|R|=4000,B=128。 另外关于正负样本的选择:当一个RoI 和一个ground truth的IoU大于0.5,则为正样本;当一个RoI 和所有ground truth的IoU的最大值小于0.5时为负样本。

总结来说,对于给定图像,经过selective search RoIs,同样计算出卷积特征图。但是在绿色部分的(a)中,一个只读的RoI网络对特征图和所有RoI进行前向传播,然后Hard RoI module利用这些RoI的loss选择B个样本。在红色部分(b)中,这些选择出的样本(hard examples)进入RoI网络,进一步进行前向和后向传播。

7. Soft NMS 软化非极大抑制

在传统的NMS中,跟最高预测分数预测框重合度超出一定阈值的预测框会被直接舍弃,作者认为这样不利于相邻物体的检测。提出的改进方法是根据IoU将预测框的预测分数进行惩罚,最后再按分数过滤。配合Deformable Convnets(将在之后的文章介绍),Soft NMS在MS COCO上取得了当时最佳的表现。算法改进如下 image

上图中的[公式]即为软化函数,通常取线性或高斯函数,后者效果稍好一些。当然,在享受这一增益的同时,Soft-NMS也引入了一些超参,对不同的数据集需要试探以确定最佳配置。

test_cfg = dict(
    rpn=dict(
        nms_across_levels=False,
        nms_pre=1000,
        nms_post=1000,
        max_num=1000,
        nms_thr=0.7,
        min_bbox_size=0),
      rcnn=dict(
        score_thr=0.05, nms=dict(type='nms', iou_thr=0.5), max_per_img=100)   # max_per_img表示最终输出的det bbox数量
    # soft-nms is also supported for rcnn testing
    # e.g., nms=dict(type='soft_nms', iou_thr=0.5, min_score=0.001)            # soft_nms参数
)

8. ROIAlign ROI对齐

RoIAlign是Mask R-CNN([7])的工作中提出的,针对的问题是RoI在进行Pooling时有不同程度的取整,这影响了实例分割中mask损失的计算。文章采用双线性插值的方法将RoI的表示精细化,并带来了较为明显的性能提升。这一技巧也被后来的一些工作(如light-head R-CNN)沿用。

Bryce1010 commented 4 years ago

tricks in MMdetection

Bryce1010 commented 4 years ago

NMS算法过程

(1)将所有框的得分排序,选中最高分及其对应的框 (2)遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。 (3)从未处理的框中继续选一个得分最高的,重复上述过程。 image

# python3
import numpy as np

def py_nms(dets, thresh):
    """Pure Python NMS baseline."""
    #x1、y1、x2、y2、以及score赋值
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]

    #每一个候选框的面积
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    #order是按照score降序排序的
    order = scores.argsort()[::-1]

    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        #计算当前概率最大矩形框与其他矩形框的相交框的坐标,会用到numpy的broadcast机制,得到的是向量
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])

        #计算相交框的面积,注意矩形框不相交时w或h算出来会是负数,用0代替
        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        #计算重叠度IOU:重叠面积/(面积1+面积2-重叠面积)
        ovr = inter / (areas[i] + areas[order[1:]] - inter)

        #找到重叠度不高于阈值的矩形框索引
        inds = np.where(ovr <= thresh)[0]
        #将order序列更新,由于前面得到的矩形框索引要比矩形框在原order序列中的索引小1,所以要把这个1加回来
        order = order[inds + 1]
    return keep

# test
if __name__ == "__main__":
    dets = np.array([[30, 20, 230, 200, 1], 
                     [50, 50, 260, 220, 0.9],
                     [210, 30, 420, 5, 0.8],
                     [430, 280, 460, 360, 0.7]])
    thresh = 0.35
    keep_dets = py_nms(dets, thresh)
    print(keep_dets)
    print(dets[keep_dets])
Bryce1010 commented 4 years ago

5.20 detection 调研

survy

one-stage

two stage

anchor free

nas

neck

unknown

loss function
Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression

activation function

semi-supervised

weakly supervised

few-shot

3D object detection

tracking

segmentation

augmentation

backbone

domain adaptation

Bryce1010 commented 4 years ago

Recent Detection papers

2019

2020