YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything


YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第1张图片

NMS和SoftNMS

NMS=None Maximum Suppress,非极大值抑制,简单来说就是目标检测结果里有个bbox置信度的score_threshold,还有多个bboxes重复IOU的iou_threshold。NMS和SoftNMS的区别在于:

  • NMS里score(也就是bbox的confidence score)最大的bbox会把其他重叠iou超过iou_threshold的bbox都给抑制掉,一个不留。带来的问题就是有些置信度比较高的小物体会有些损失
  • SoftNMS其实就是会把和score最大的bbox其他重叠iou超过iou_threshold的bbox对应的score进行一些衰减,直接的NMS可以看作是衰减成0。以下是一个使用numpy完成的code,这部分code不需要训练,一般实现在cuda里进行加速
import numpy as np
from typing import List

def softnms(bboxes:np.ndarray, scores:np.ndarray, iou_threshold=0.6, score_threshold=0.5, eps = 0.001, sigma2=1, method='hard'):
    # bboxes是二维ndarray,dim=1对应的格式是x1,y1,x2,y2
    # scores是一位ndarray
    # 返回bboxes中没被抑制的bboxes的下标,也是个ndarray
    sorted_indices = scores.argsort()[::-1]
    sorted_bboxes, sorted_scores = bboxes[sorted_indices], scores[sorted_indices]
    sorted_areas = np.clip(np.prod(sorted_bboxes[:,2:]-sorted_bboxes[:,:2], axis=1), a_min=eps, a_max=None)
    bboxes_count = len(bboxes)
    for i in range(bboxes_count-1):
        min_max = np.minimum(sorted_bboxes[i,2:],sorted_bboxes[i+1:,2:])-np.maximum(sorted_bboxes[i,:2],sorted_bboxes[i+1:,:2])
        min_max_clip = np.clip(min_max, a_min=eps, a_max=None) #把不相交的矩形框裁成0
        inter = np.prod(min_max_clip, axis=1)
        iou = inter / (sorted_areas[i]+sorted_areas[i+1:]-inter)
        mask_indices = np.where(iou >= iou_threshold)[0] #表示要被抑制掉的下标,当然可能为空
        # np.where返回的是一个tuple,tuple里第一个元素是下标的list

        weights = np.ones_like(sorted_scores[i+1:])
        # 这个weights是想要和sorted_scores基础上打折
        # 注意这里写成np.ones_like(sorted_scores[i+1:])而不是np.ones_like(mask_indices),mask_indices可能为空,weights[mask_indices]没问题,但是sorted_scores[i+1:]*weights就会出问题
        if method == 'linear':
            weights[mask_indices] -= iou[mask_indices]
        elif method == 'gaussian':
            weights[mask_indices] *= np.exp(-iou[mask_indices]**2/sigma2)
        else:
            weights[mask_indices] = 0

        sorted_scores[i+1:] = sorted_scores[i+1:]*weights
    res = sorted_indices[sorted_scores > score_threshold]
    return res

if __name__ == '__main__':
    bboxes = np.array([
        [0, 0, 1, 1],
        [2, 2, 3, 3],
        [0, 0, 2, 1],
        [0, 0, 1, 2]
    ])
    scores = np.array([0.7, 0.7, 0.5, 0.6])
    res = softnms(bboxes, scores)
    print(res)

再来个Pytorch版本:

import numpy as np
from typing import List
import torch

def softnms(bboxes:torch.Tensor, scores:torch.Tensor, iou_threshold=0.6, score_threshold=0.5, eps = 0.001, sigma2=1, method='hard'):
    # bboxes是二维ndarray,dim=1对应的格式是x1,y1,x2,y2
    # scores是一位ndarray
    # 返回bboxes中没被抑制的bboxes的下标,也是个ndarray
    sorted_indices = scores.argsort(descending=True)
    sorted_bboxes, sorted_scores = bboxes[sorted_indices], scores[sorted_indices]
    sorted_areas = torch.clip(torch.prod(sorted_bboxes[:,2:]-sorted_bboxes[:,:2], axis=1), min=eps, max=None)
    bboxes_count = len(bboxes)
    for i in range(bboxes_count-1):
        inter_raw = torch.prod(torch.minimum(sorted_bboxes[i,2:],sorted_bboxes[i+1:,2:])-torch.maximum(sorted_bboxes[i,:2],sorted_bboxes[i+1:,:2]), axis=1)
        inter = torch.clip(inter_raw, min=eps, max=None)
        iou = inter / (sorted_areas[i]+sorted_areas[i+1:]-inter)
        mask_indices = torch.where(iou >= iou_threshold)[0]
        weights = torch.ones_like(sorted_scores[i+1:]) #注意这里写成np.ones_like(sorted_scores[i+1:])而不是np.ones_like(mask_indices),mask_indices可能为空,weights[mask_indices]没问题,但是sorted_scores[i+1:]*weights就会出问题
        if method == 'linear':
            weights[mask_indices] -= iou[mask_indices]
        elif method == 'gaussian':
            weights[mask_indices] *= np.exp(-iou[mask_indices]**2/sigma2)
        else:
            weights[mask_indices] = 0

        sorted_scores[i+1:] = sorted_scores[i+1:]*weights
    res = sorted_indices[sorted_scores > score_threshold]
    return res

if __name__ == '__main__':
    bboxes = torch.Tensor([
        [0, 0, 1, 1],
        [0, 0, 2, 1],
        [0, 0, 1, 2]
    ])
    scores = torch.Tensor([0.7, 0.5, 0.6])
    res = softnms(bboxes, scores)
    print(res)

YoLo v1

YOLOv1的基本思想是把一副图片,首先reshape成448×448大小(由于网络中使用了全连接层,所以图片的尺寸需固定大小输入到CNN中),然后将划分成SxS个单元格(原文中S=7),以每个格子所在位置和对应内容为基础,来预测检测框和每个框的Confidence以及每个格子预测一共C个类别的概率分数。

创新点:

  • 将整张图作为网络的输入,直接在输出层回归bounding box的位置和所属的类别
  • 速度快,one stage detection的开山之作损失函数设计细节: YOLOv1对位置坐标误差,IoU误差,分类误差均使用了均方差作为损失函数。激活函数(最后一层全连接层用线性激活函数,其余层采用leak RELU)

缺点:

  • 首先,每个单元格只预测2个bbox,然后每个单元格最后只取与gt_bbox的IOU高的那个最为最后的检测框,也只是说每个单元格最多只预测一个目标。
  • 损失函数中,大物体 IOU 误差和小物体 IOU 误差对网络训练中 loss 贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的 IOU 误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。
  • 由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率的图片。
  • 和two-stage方法相比,没有region proposal阶段,召回率较低

SSD

SSD网络的特点是对不同尺度下的feature map中的每一个点都设置一些default box,这些default box有不同的大小和横纵比例,对这些default box进行分类和边框回归的操作。SSD的核心是对固定设置的default box(不同尺度feature map中每一个空间位置都设置一组default box,这里只考虑空间位置,不考虑feature的通道个数)计算属于各类物体的概率以及坐标调整的数值。这个计算方式是对每层的feature map做卷积操作,卷积核设定为3*3,卷积核的个数是与default box个数相关。

  • 优点:SSD的优点是运行速度超过yolo,精度在一定条件下超过faster rcnn。缺点是需要人工设置先验框(prior box)和min_size,max_size和长宽比(aspect_ratio)值,网络中default_box的基础大小和形状不能直接通过学习获得,而是需要手工设置,虽然使用了图像金字塔的思路,但是对小目标的recall(召回率)依然一般简述SSD网络前向是如何计算的
    1数据增强,获取训练样本,将训练数据统一resize到固定尺寸;
    2.通过卷积网络获取feature map:①使用的卷积网络,前半部分使用基础分类网络获取各层的feature map,这部分称为base network。②下一步计算的输入,就是上述的不同尺寸的feature map;
    3.通过卷积操作,从特征图中获取检测信息。①此处实现方式与yolo类似;②与Faster R-CNN类似,在特征图中每个点新建若干固定尺寸的anchor。检测信息包括每个anchor的信息。主要包括:confidence(代表这个anchor中是否存在物体)、分类信息以及bbox信息。

  • 缺点:SSD对小目标的检测效果一般,作者认为小目标在高层没有足够的信息对小目标检测的改进可以从下面几个方面考虑:

    • 增大输入尺寸
    • 使用更低的特征图做检测(比如S3FD中使用更低的conv3_3检测)
    • FPN(已经是检测网络的标配了)

YoLo v2

  • Convolution with anchor boxes使用先验框)Dimension clusters(聚类提取先验框的尺度信息)Yolo v2使用k-means算法来聚类获取先验锚点,距离度量并没有采用欧式距离,而是采用1-IOU(box,centorid)的方式,使得它更适合检测任务。Direct location prediction(约束预测边框的位置)YOLOv2直接在预先设定的锚框上提取特征。YOLO使用卷积神经网络作为特征提取器,在卷积神经网络之后加上全连接层来预测边界框的中心位置、大小和置信度;而YOLOv2借鉴了Faster R-CNN的思路,用卷积神经网络直接在锚点框上预测偏移量和置信度,该方法要比YOLO更简单、更容易学习。
  • 在卷积层后面添加了Batch Normalization,加快收敛速度,防止过拟合
  • 高分辨率fine-tune 图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以YOLO v1使用ImageNet的图像分类样本采用 224×224 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448×448 的图像作为输入。但这样切换对模型性能有一定影响。所以YOLO2在采用 224*224 图像进行分类模型预训练后,再采用 448×448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448×448 的分辨率。然后再使用 448×448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。
  • Fine-Grained Features(passthrough层检测细粒度特征)对象检测面临的一个问题是图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLO2中输入416×416经过卷积网络下采样最后输出是13×13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个pooling之前,特征图的大小是26×26×512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
  • Multi-ScaleTraining(多尺度图像训练)区别于之前的补全图片的尺寸的方法,YOLO v2每迭代几次都会改变网络参数。每10个Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352……608},最小320×320,最大608×608,网络会自动改变尺寸,并继续训练的过程。这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在YOLO v2的速度和精度上进行权衡。
  • hi-res detector(高分辨率图像的对象检测)YOLOv2 使用新的卷积特征提取网络 DarkNet-19。当时大多数检测模型的特征提取部分都采用VGGNet-16 作为网络主体,VGGNet-16 虽然效果良好,但是参数过多,运行缓慢。DarkNet-19 采用 3×3 的卷积核,共有 19 个卷积层和 5 个池化层。

YoLo 9000

其能检测超过9000种类别的物体

  • 检测数据集和分类数据集联合训练
  • 构建字典树,合并了ImageNet分类标签和COCO检测标签数据集

YoLo V3

  • FPN. Our system extracts features from those scales using a similar concept to feature pyramid networks
  • 检测数据可能存在一些语义上重叠的标签(如女人和人),但 Softmax 函数基于一个假设,即每个检测框内的物体只存在一个类别。因此,YOLOv3 使用二元交叉熵损失函数, 而不是 Softmax 函数,这样可以更好地支持多标签的检测
  • YOLOv3 采用了更深的网络作为特征提取器,即 DarkNet-53,它包含了 53 个卷积层。为了避免深层网络带来的梯度消失问题,DarkNet-53 借鉴了残差网络的快捷连接(shortcut)结构。同时,YOLOv3 还采用了 3 个不同大小的特征图进行联合训练,使其在小物体上也能获得很好的检测效果。
  • concat操作与加和操作的区别:加和操作来源于ResNet思想,将输入的特征图,与输出特征图对应维度进行相加,即 y=f(x)+x ;而concat操作源于DenseNet网络的设计思路,将特征图按照通道维度直接进行拼接,例如8816的特征图与8816的特征图拼接后生成8832的特征图。
  • 利用IOU分配正负例。任取一个ground truth,与4032个框全部计算IOU,IOU最大的预测框,即为正例。并且一个预测框,只能分配给一个ground truth。例如第一个ground truth已经匹配了一个正例检测框,那么下一个ground truth,就在余下的4031个检测框中,寻找IOU最大的检测框作为正例。ground truth的先后顺序可忽略。正例产生置信度loss、检测框loss、类别loss。预测框为对应的ground truth box标签(需要反向编码,使用真实的x、y、w、h计算出 );类别标签对应类别为1,其余为0;置信度标签为1。忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5),则为忽略样例。忽略样例不产生任何loss。
  • cos lr schedule

简要阐述一下RetinaNet

RetinaNet的作者对one-stage检测器准确率不高的问题原因进行探究,发现主要问题在于正负类别不均衡,提出Focal Loss来解决类别不平衡问题。目的是通过减少易分类样本的权重,从而使得模型在训练时更注重于难分类的样本。RetinaNet=ResNet+FPN+Two sub-network+Focal Loss; RetinaNet由backbone网络和两个子任务网络组成,backbone网络负责计算feature map,子任务网络一个负责目标分类,一个负责bbox回归,网络的loss使用Focal loss。

阐述一下ssd和retinanet的区别

SSD的基础网络是VGG,且SSD在使用多层feature map时只是简单的在不同层的feature map上放default box,并没有真正将低维度特征和高维度特征进行融合。且SSD网络中使用的控制正负样本数量比的方法是难样本挖掘方法,loss是分类+回归的loss。而RetinaNet网络的基础网络是resnet+FPN,是真正将低维度的特征和高维度的特征进行了特征融合后再来做检测的。且控制正负样本的方法是使用Focal Loss。

YoLo X

  • Decoupled Head。检测框内的分类和检测框位置的回归要分开,因为分类和回归本质上是两个任务,在YoLo V3里这俩是concat起来的,loss实际上是有冲突的

  • Strong Data Augmentation。例如Mixup等技巧

  • Anchor Free的方式。YoloV3、V4、V5都是有anchor的,到YoloX正式把anchor去掉,简单来说就是把feature map里的anchor信息给存到了embedding里,细节可以看博客https://zhuanlan.zhihu.com/p/397993315,下图来自该博客:

  • Multi Positive。 一个正例会被分配到不同FPN层进行回归,这有点类似Focal loss的做法

  • SimOTA。运输优化算法,这里不得不提到OTA(Optimal Transport Assignment,Paper: https://arxiv.org/abs/2103.14259),这里简单解释一下,后续计划出个专栏来解释OTA。在目标检测中,有时候经常会出现一些模棱两可的anchor,如图3,即某一个anchor,按照正样本匹配规则,会匹配到两个gt,而retinanet这样基于IoU分配是会把anchor分配给IoU最大的gt,而OTA作者认为,将模糊的anchor分配给任何gt或背景都会对其他gt的梯度造成不利影响,因此,对模糊anchor样本的分配是特殊的,除了局部视图之外还需要其他信息。因此,更好的分配策略应该摆脱对每个gt对象进行最优分配的惯例,而转向全局最优的思想,换句话说,为图像中的所有gt对象找到全局的高置信度分配。(和DeTR中使用使用匈牙利算法一对一分配有点类似)

简要阐述一下One-Stage、Two-Stage模型

  • One-Stage检测算法,没有selective search产生region proposal的阶段,直接产生物体的类别概率和位置坐标,经过单次检测即可直接获得最终的检测结果。相比Two-Stage有更快的速度。代表网络有YOLO v1/v2/v3/9000,SSD,Retina-Net.
  • two-stage算法中的roi pooling会对目标做resize, 小目标的特征被放大,其特征轮廓也更为清晰,因此检测也更为准确。Two-Stage检测算法将检测问题划分成两个阶段,首先是获取region proposal进行位置精修和分类阶段。相比于One-Stage,精度高,漏检率也低,但是速度较慢,代表网络有Fast rcnn,Faster rcnn,mask rcnn等。

Two-Stage中第一阶段和One-Stage的异同

Two-Stage先对前景背景做了筛选,再进行回归,回归效果比较好,准度高但是相比较慢,One-Stage是直接对特征上的点进行直接回归,优点是速度快,因为用了多层特征图出框可能小目标效果比较好一点(个人看法),缺点是因为正负样本失衡导致效果较差,要结合难例挖掘。

one stage在哪些具体方面检测精度不高(ROI+default box的深层理解)

one-stage算法对小目标检测效果较差,如果所有的anchor都没有覆盖到这个目标,那么这个目标就会漏检。

Faster rcnn的两阶段训练和end-to-end训练的不一样

回答的是就是把RPN和二阶段拆开训,然后追问RPN在ENDTOEND中怎么回传,答TOTALLoss中有一阶段和二阶段的LOSS,只是回传影响的部分不一样。
RPN网络训练有两个Loss:

  • Lcls:softmax loss,用于分类anchors属于前景还是背景(也有说用二分类交叉熵Loss的)
  • Lreg:smooth L1 loss,用于修正anchor框,前面乘了一个pi*表示只回归有目标的框

各算法的Label Assignment机制如何?

部分转载自https://blog.csdn.net/Bismarckczy/article/details/129717080,一般把anchor到gt之间如何匹配的方法称为label assignment,也就是给预设的anchor打上正负样本等标签,方便我们后续进一步回归。简单来说就是给gt分配超过IOU的anchor、给anchor分配超过IOU的gt、取不取最大IOU这样一系列策略

为什么Faster rcnn和RetinaNet中用了Focal Loss,但是Yolo V3中就没用?

这个问题在YOLOv3: An Incremental Improvement中也有提到,个人理解是和label assignment机制有关系。YoloV3在下面解释的label assignment机制是「得到与gt最大iou的那个anchor作为正样本,小于定阈值的作为负样本,大于设定阈值但不是最大iou的为忽略样本。」像RetinaNet中就是「IoU低于0.4为negative,高于0.5为positive,其他为ignore」,yolov3的正负样本相对没那么悬殊,所以Focal Loss就没起到作用

Faster rcnn中label assignment机制

  1. 对于每一个anchor,与所有gt的最大IOU 小于 0.3,视为负样本,也就是背景0类
  2. 对任何一个gt,与其最大的IOU的anchor视为正样本
  3. 对任意一个anchor,与所有标签的最大IOU大于0.7,视为正样本。

条件2覆盖了1,条件3是对2的补充。另外faster rcnn里面应该GT可以有多个anchors,而一个anchor只对应一个GT

RetinaNet 中label assignment机制

IoU低于0.4为negative,高于0.5为positive,其他为ignore

YOLOv3 中label assignment机制

  1. yolov3输出了三个feature map 13x13,26x26,52x52。anchors设置了9种形状,(10×13),(16×30),(33×23),(30×61),(62×45),(59× 119), (116 ×90), (156 × 198),(373 × 326) ,顺序为w × h,注意anchors是在原图基础上设置的!其中大的anchor对应小的feature map。举例对于13x13的feature map来说,先验框由416x416尺度下的 (116 × 90), (156×198),(373 × 326) 缩小32倍,变成 (3.625× 2.8125), (4.875× 6.1875),(11.6563×10.1875),其共有13x13个grid cell,则这每个169个grid cell都会被分配3个13*13尺度下的先验框(anchors)
  2. 那么具体的label assignment过程就是那么现在有一个gt,它在13x13尺度特征图下,其gt中心点左上角为原点,对应着该尺度下、该原点的3个先验框,将gt与这3个先验框(anchors)分别计算iou,并分别在26x26 feature map、52x52 feature map下执行相同操作,得到与gt最大iou的那个anchor作为正样本,小于定阈值的作为负样本,大于设定阈值但不是最大iou的为忽略样本。
    如下图所示!

  3. 可以看到,最左边小汽车在13*13尺度下的中心坐标为[4.82,5.81,1.9,2.7],分别对应中心点x、y,宽高w、h。
  4. yolov3中的build_targets函数的目的就是找出与该gt最匹配的anchor,并且返回return tcls, tbox, indices, anch
    其中tbox(该gt中心点相对于该先验框锚点的偏移量,为0.82,0.81,以及该gt在该尺度下的宽、高,为1.9,2.7);
    tcls(该gt所属类别,为汽车类别);
    indices(与gt匹配的anchor的x,y坐标,为4,5);
    anch(与gt匹配的anchor的宽高,为2.2, 2.2)。

Faster R-CNN是如何解决正负样本不平衡的问题?

限制正负样本比例为1:1,如果正样本不足,就用负样本补充,这种方法后面研究工作用的不多。通常针对类别不平衡问题可以从调整样本数或修改loss weight两方面去解决,常用的方法有OHEM、OHNM、class balanced loss和Focal loss。

  • Online Hard Example Mining, OHEM(2016)。将所有sample根据当前loss排序,选出loss最大的N个,其余的抛弃。这个方法就只处理了easy sample的问题

  • Online Hard Negative Mining, OHNM, SSD(2016)里使用的一个OHEM变种, 在Focal Loss里代号为OHEM 1:3。在计算loss时, 使用所有的positive anchor, 使用OHEM选择3倍于positive anchor的negative anchor。同时考虑了类间平衡与easy sample

  • Class Balanced Loss。计算loss时,正负样本上的loss分别计算, 然后通过权重来平衡两者。暂时没找到是在哪提出来的,反正就这么被用起来了。它只考虑了类间平衡

  • Focal Loss(2017), 最近提出来的。不会像OHEM那样抛弃一部分样本, 而是和Class Balance一样考虑了每个样本

部分转载自:https://zhuanlan.zhihu.com/p/475440014

anchor设置的意义

其实就是多尺度的滑动窗口

如果只能修改RPN网络的话,怎么修改可以提升网络小目标检出率

  1. 修改RPN网络的结构,比如引入FPN结构,利用多层feature map融合来提高小目标检测的精度和召回;
  2. 针对小目标重新精细设计Anchor的尺寸和形状,从而更好地对小目标进行检测;

如何理解concat和add这两种常见的feature map特征融合方式

两者都可以理解为整合特征图信息。concat是通道数的增加;add是特征图相加,通道数不变。 add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。而concatenate是通道数的合并,也就是说描述图像本身的特征数(通道数)增加了,而每一特征下的信息是没有增加。 concat每个通道对应着对应的卷积核。 而add形式则将对应的特征图相加,再进行下一步卷积操作,相当于加了一个先验:对应通道的特征图语义类似,从而对应的特征图共享一个卷积核(对于两路输入来说,如果是通道数相同且后面带卷积的话,add等价于concat之后对应通道共享同一个卷积核)。因此add可以认为是特殊的concat形式。但是add的计算量要比concat的计算量小得多。

阐述一下如何检测小物体

  1. 借鉴FPN的思想,在FPN之前目标检测的大多数方法都是和分类一样,使用顶层的特征来进行处理。虽然这种方法只是用到了高层的语义信息,但是位置信息却没有得到,尤其在检测目标的过程中,位置信息是特别重要的,而位置信息又是主要在网络的低层。因此FPN采用了多尺度特征融合的方式,采用不同特征层特征融合之后的结果来做预测。
  2. 要让输入的分布尽可能地接近模型预训练的分布。先用ImageNet做预训练,之后使用原图上采样得到的图像来做微调,使用微调的模型来预测原图经过上采样的图像。该方法提升效果比较显著。
  3. 借鉴Cascade R-CNN的设计思路,优化目标检测中Two-Stage方法中的IOU阈值。检测中的IOU阈值对于样本的选取是至关重要的,如果IOU阈值过高,会导致正样本质量很高,但是数量会很少,会出现样本比例不平衡的影响;如果IOU阈值较低,样本数量就会增加,但是样本的质量也会下降。如何选取好的IOU,对于检测结果来说很重要。
  4. 采用分割代替检测方法,先分割,后回归bbox来检测微小目标。

阐述一下如何进行多尺度训练

多尺度训练可以分为两个方面:一个是图像金字塔,一个是特征金字塔

  1. 人脸检测的MTCNN就是图像金字塔,使用多种分辨率的图像送到网络中识别,时间复杂度高,因为每幅图都要用多种scale去检测。
  2. FPN网络属于采用了特征金字塔的网络,一次特征提取产生多个feature map即一次图像输入完成,所以时间复杂度并不会增加多少3、faster rcnn多个anchor带来的多种尺寸的roi可以算muti scale思想的应用。

介绍一下CenterNet的原理,它与传统的目标检测有什么不同点?

YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第2张图片
CenterNet有两篇paper,对于目标检测一般指的是《Objects as Points》,而不是《CenterNet:Keypoint Triplets for Object Detection》
CenterNet是属于anchor-free系列的目标检测算法的代表作之一,与它之前的目标算法相比,速度和精度都有不小的提高,尤其是和yolov3相比,在速度相同的情况下,CenterNet精度要比yolov3高好几个点。它的结构非常的简单,而且不需要太多了后处理,连NMS都省了(省的原因是we only have one positive “anchor” per object, and hence do not need NonMaximum Suppression (NMS)),直接检测目标的中心点和大小,实现了真正的anchor-free(A center point can be seen as a single shape-agnostic anchor,our CenterNet assigns the “anchor” based solely on location, not box overlap as Figure 3。其实只是把anchor换了,并不是彻底没了anchor)。
YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第3张图片

CenterNet论文中用到了三个主干网络:ResNet-18、DLA-34(Deep Layer Aggregation DLA is an image classification network with hierarchical skip connections)和Hourglass-104(Each hourglass module is a symmetric 5-layer down- and up-convolutional network with skip connections,可以看成是FPN的上下采样版本),实际应用中,也可以使用resnet-50等网络作为backbone;CenterNet的算法流程是:一张512x512(1x3x512x512)的图片输入到网络中,经过backbone特征提取后得到下采样32倍后的特征图(1x2048x16x16),然后再经过三层反卷积模块上采样到128x128的尺寸,最后分别送入三个head分支进行预测:分别预测物体的类别、长宽尺寸和中心点偏置。其中推理的核心是从headmap中提取需要的bounding box,通过使用3*3的最大池化,检查当前热点的值是否比周围的8个临近点值都大,每个类别取100个这样的点,经过box后处理后再进行阈值筛选,得到最终的预测框。

你知道哪些边缘端部署的方案?

目前大多数深度学习算法模型要落地对算力要求还是比较高的,如果在服务器上,可以使用GPU进行加速,但是在边缘端或者算力匮乏的开发板子上,不得不对模型进一步的压缩或者改进,也可以针对特定的场景使用市面上现有的推理优化加速框架进行推理。目前来说比较常见的几种部署方案为:

  • nvidia GPU:pytorch->onnx->TensorRT
  • intel CPU: pytorch->onnx->openvino(Open Visual Inference and Neural Network Optimization)
  • 移动端(手机、开发板等):pytorch->onnx->MNN(阿里出的)、NCNN(Neural Network Computing Library腾讯出的)、TNN、TF-lite、Paddle-lite、RKNN等

你最常用的几种目标检测算法是什么?为什么选择这些算法,你选择它们的场景分别是什么?

在工作中,我通常会根据不同的任务选取不同的算法模型:

目标检测:yolov5、yolov3、CenterNet、SSD、Faster RCNN、EfficientDet;
图像分类:ResNet系列、ShuffleNetV2、EfficientNet;
实例分割:mask-rcnn、yolact、solo;
语义分割:deeplabv3、deeplabv3+、UNet;
文本检测:CTPN、PSENet、DBNet、YOLOV5;
文本识别:CRNN+CTC、CRNN+Attention;

通常,我比较喜欢性能好的模型,性能的指标由两部分,一个是精度,一个是速度。比如在目标检测中,用的比较多的是yolo系列,特别是v4、v5出来后。通常在图像分类的任务上,分类并不困难的情况下会选择一些轻量型的网络,能够一定程度上节省算力资源。其他领域的任务算法抉择也大同小异。

阐述一下Mask RCNN网络,这个网络相比于Faster RCNN网络有哪些改进的地方

Mask rcnn网络是基于faster rcnn网络架构提出的新的目标检测网络。该网络可以在有效地完成目标检测的同时完成实例分割。Mask RCNN主要的贡献在于如下:

  1. 强化了基础网络:通过ResNeXt-101+FPN用作特征提取网络,达到state-of-the-art的效果。
  2. ROIAlign替换之前faster rcnn中的ROI Pooling,解决错位(Misalignment)问题。
  3. 使用新的Loss Function:Mask RCNN的损失函数是分类,回归再加上mask预测的损失之和。总结来说,mask rcnn的主要贡献就是采用了ROI Align以及加了一个mask分支。

DETR(Detection Transformer)

DETR的缺点就是慢,比Faster RCNN还慢!

把目标检测看成集合预测的问题(所以Hungarian loss就用上了,scipy里的linear sum assignment),扔掉了NMS。object_query作用类似于anchor和rpn网络里的proposals。系统架构如下图:

一些补充的细节:

  • 最后object queries是先做自注意力再做Cross Attention,这样目的是少一些冗余框
  • Auxiliary decoding losses. We add prediction FFNs and Hungarian loss after each
    decoder layer. All predictions FFNs share their parameters. We use an additional shared layer-norm to normalize the input to the prediction FFNs from different decoder layers.

Deformable DETR

来自DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION,主要思路是把DETR做成多尺度,每个参考点仅关注邻域的一组采样点,这些采样点的位置并非固定,而是可学习的(和可变形卷积一样),从而实现了一种局部(local)&稀疏(sparse)的高效注意力机制。重点实现了以下两个策略:

  1. Deformable Attention。可变形注意力的道理用大白话来说很简单:query不是和全局每个位置的key都计算注意力权重,而是对于每个query,仅在全局位置中采样部分位置的key,并且value也是基于这些位置进行采样插值得到的,最后将这个局部&稀疏的注意力权重施加在对应的value上。类似于Deformable Conv
  2. Multi-Scale Features & Scale-Level Embedding
    部分转载自: https://zhuanlan.zhihu.com/p/372116181

RT-DETR

这里面比较细了https://mp.weixin.qq.com/s/yNtKv6ae9JDAIdGD1rvqLA,直接说为啥比DETR快吧:

  • Specifically, we find that although the introduction of multiscale features is beneficial in accelerating the training convergence and improving performance (Deformable DETR), it also leads to a significant increase in the length of the sequence feed into encoder. As a result, the transformer encoder becomes the computational bottleneck of the model due to the high computational cost. To achieve real-time object detection, we design an efficient hybrid encoder to replace the original transformer encoder. By decoupling the intra-scale interaction and cross-scale fusion of multi-scale features, the encoder can efficiently process features with different scales.
  • Furthermore, previous works [40, 24] showed that the object query initialization scheme of the decoder is crucial for the detection performance. To further improve the performance, we propose IoU-aware query selection, which provides higher quality initial object queries to the decoder by providing IoU constraints during training.
  • In addition, our proposed detector supports flexible adjustment of the inference speed by using different decoder layers without the need for retraining, which benefits from the design of the decoder in the DETR architecture and facilitates the practical application of the real-time detector. 这里用的是一个DiNo的decoder

IoU、GIoU、DIoU、CIoU、Dice Loss的区别

一般来说Dice Loss在分割任务中用的多些,Dice Loss实际就是优化F1 Score,分析参考https://blog.csdn.net/taoqick/article/details/124182037

IoU损失的最大问题是当两个物体没有互相覆盖时,损失值都会变成1,而不同的不覆盖情况明显也反应了检测框的优劣。可以看出当ground truth(黑色框)和预测框(绿色框)没有交集时,IOU的值都是0,而GIoU则拥有不同的值,而且和检测效果成正相关。
YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第4张图片

GIOU(Generalized覆盖来纠正loss)和DIoU(Distance中心点距离)和CIoU(Complete在DIoU基础上考虑了aspect ratio)

YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第5张图片
YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第6张图片
YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第7张图片

YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第8张图片
YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第9张图片

GLIP(Grounded Language-Image Pre-training)

GLIP实际上是预训练的目标检测了,利用对比学习的思路,把文本和bbox对齐:
YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第10张图片

Kosmos1和Kosmos2

Kosmos1实际上是MetaLM(Language Models are General-Purpose Interfaces)这篇工作的延续,MetaLM的思路是
Semi-causal language modeling as a meta-pretraining task,把各种任务都融合到一个任务里来:
YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第11张图片
然而Kosmos1在VQA任务上效果并还没有特别好,紧接着Kosmos2就结合GLIP开始搞目标检测任务,Kosmos2(KOSMOS-2: Grounding Multimodal Large Language
Models to the World)基本等于Kosmos1+GLIP

Segment Anything

这篇实际上就是图像分割领域里的预训练,数据工作做得非常扎实,几个关键的点:

  • 提供points做prompt,这个在DETR的论文里就有所体现。图片里提供某几个点来可视化Attention,可以很直观地看到分割出来的轮廓
  • 这篇文章重点是Data-centric更侧重于提高数据的质量和数量。「Data-centric」与「Data-driven」(数据驱动),是两个根本上不同的概念。后者仅强调使用数据去指导AI系统的搭建,这仍是聚焦于开发模型而不是去改变数据。Segment Anything Data Engine分为Assisted-manual stage、Semi-automatic stage和Fully automatic stage三个阶段。
    YoLo系列、SoftNMS、FasterRCNN、DETR系列、GIoU、DIoU、CIoU、Dice、GLIP、Kosmos系列、Segment Anything_第12张图片

参考:

  1. 葫芦书
  2. https://zhuanlan.zhihu.com/p/136382095
  3. https://zhuanlan.zhihu.com/p/392221567
  4. https://www.jianshu.com/p/02837513b012
  5. https://blog.csdn.net/weixin_42310154/article/details/119889682
  6. https://paperswithcode.com/method/centernet
  7. 【DETR 论文精读【论文精读】】https://www.bilibili.com/video/BV1GB4y1X72R?vd_source=e260233b721e72ff23328d5f4188b304
  8. End-to-End Object Detection with Transformers
  9. https://zhuanlan.zhihu.com/p/374398128
  10. https://www.zhihu.com/question/593888697/answer/2972047807
  11. https://zhuanlan.zhihu.com/p/372116181
  12. https://mp.weixin.qq.com/s/yNtKv6ae9JDAIdGD1rvqLA

你可能感兴趣的:(YOLO)