面试中可能会遇到的问题大集合

参考链接:

  1. 【深度学习】从30+场秋招面试中总结出的超强面经——目标检测篇(含答案)..._风度78的博客-CSDN博客
  2. 目标检测面经_qq_40484000的博客-CSDN博客
  3. 算法目标检测面经_fanfan是我啊的博客-CSDN博客
  4. CV面试宝典:目标检测共性问题总结与详解_和风细动帘帷暖的博客-CSDN博客
  5. 面试真题总结:Faster Rcnn,目标检测,卷积,梯度消失,Adam算法_rcnn 题目_柏拉图工作室-AI学科的博客-CSDN博客
  6. 计算机视觉岗社招面经_pytorch的dataloader面试_嵌入式视觉的博客-CSDN博客
  7. 计算机视觉实习生面经(百度 | 地平线 | 小米 | 旷视 | 快手)_百度计算机视觉面试_凌青羽的博客-CSDN博客
  8. 计算机视觉面经(持续更新)_小鹏AI的博客-CSDN博客
  9. 2023届-计算机视觉算法岗实习面经_思谋科技视觉算法面经_liuz_notes的博客-CSDN博客
  10. 计算机视觉岗社招面经_pytorch的dataloader面试_嵌入式视觉的博客-CSDN博客
  11. 腾讯计算机视觉实习面经_腾讯计算机视觉面试题_jianafeng的博客-CSDN博客
  12. 计算机视觉面经系列问题及解答汇总_深山里的小白羊的博客-CSDN博客
  13. 目标检测比赛思路、tricks集锦、资料汇总 - 知乎
  14. 计算机视觉面试31题:CV面试考点,精准详尽解析 - 知乎
  15. 万物心选算法实习面试题7道|含解析 - 知乎
  16. 2023暑期实习面经(CV算法) - 知乎
  17. 计算机视觉知识点总结
  18. 字节跳动计算机视觉算法实习生视频面试 - 知乎
  19. 深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)

1、faster RCNN原理介绍,要详细画出图

cb38a768d1c24b21c5b4a37f2d45e613.jpeg

Faster R-CNN是一种两阶段(two-stage)方法,它提出的RPN网络取代了选择性搜索(Selective search)算法后使检测任务可以由神经网络端到端地完成。在结构上,Faster RCNN将特征抽取(feature extraction),候选区域提取(Region proposal提取),边框回归(bounding box regression),分类(classification)都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显

2、RPN(Region Proposal Network)网络的作用、实现细节

RPN网络的作用:
RPN的本质是基于滑窗的无类别obejct检测器,专门用来提取候选框,这个阶段不分类。RPN耗时少,也可以很容易结合到Fast RCNN中,成为一个整体。候选框提取不是在原图上做,而是在通过特征提取网络输出的特征图上做。在原图上一个像素一个像素平移没意义,这样会重复提取特征,平移必须在特征图上平移,因为特征图最后总能映射回原图。此外,低分辨率特征图意味着更少的计算量。

57881e20520a7ca845e9ef1ef313c6f4.jpeg

RPN网络的实现细节
一个特征图经过sliding window处理,得到256维特征,对每个特征向量做两个分支的全连接操作,一个得到2个分数(前景和后景的概率),一个得到4个坐标(框的左上和右下的坐标)。
1、生成基础 anchor,一个位置往往是9个anchor(3种长宽比(1:1, 1:2,2:1)和3种缩放尺度(8, 16, 32))。anchor_num = 9
2、根据 base_anchor,对特征图上的每一个像素,都会以它为中心生成9种不同尺寸的边界框。特征图的尺寸是H*W*C,那个就会生成H*W*9个框。特征图上的每个点生成一个Anchors,特征图上的这些点相当于原图上的一个个位置,这个位置的大小或间隔就是原图的尺寸比特征图的尺寸。
3、anchor的筛选。首先将定位层输出的坐标偏移应用到所有生成的 anchor,然后将所有 anchor 按照 前景概率/得分 从高到低进行排序。只取前 pre_nms_num 个 anchor(训练阶段),最后 anchor 通过 nms 筛选得到 post_nms_num(训练阶段)个anchor,也称作 roi。

3、RPN网络和Faster RCNN的loss分类损失+回归损失

9aa9837d73738c6698f12dc6c4c8e66e.jpeg

损失函数中包含了RPN交叉熵、RPN Box的regression、RCNN的交叉熵、RCNN Box的regression以及参数正则化损失。

Anchor[i]是正样本时, Pi=1 ;Anchor[i]是负样本时,Pi=0 ;

需要对正样本进行loss计算,满足以下条件的Anchor是正样本:
与Ground Truth Box的IOU(Intersection-Over-Union) 的重叠区域最大的Anchor;
与Gound Truth Box的IOU的重叠区域>0.7;

满足以下条件的Anchor是负样本:
与Gound Truth Box的IOU的重叠区域 <0.3;

既不属于正样本又不属于负样本的Anchor不参与训练。

分类损失:RPN这里的分类损失采用的是对数损失

而Fast RCNN是多分类的交叉熵损失

回归损失:Smoooh L1 Loss  (注意回归的不是坐标和宽高,而是由它们计算得到的偏移量)

 

4、Anocher为什么要使用不同尺寸和长宽比?

为了得到更大的交并比。为了更好地匹配真实框从而方便训练

5、为什么引入Anocher?

使得模型更容易学习。目标检测中模型不仅需要学习目标的类别,更需要学习到目标的位置和大小,这不是一个简单的任务

6、anchor box的选择的方式:

人为经验选取, k-means聚类, 作为超参数进行学习。

7、RoI Pooling是怎么做的?有什么优缺点?有什么作用

RoI Pooling的过程就是将一个个大小不同的box矩形框,都映射成大小固定(w * h)的矩形框。方便后续的全连接层处理。

具体操作:(1)根据输入image,将ROI映射到feature map对应位置(2)将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);(3)对每个sections进行max pooling操作;

两次整数化(量化)过程:1.region proposal的xywh通常是小数,但是为了方便操作会把它整数化。2.将整数化后的边界区域平均分割成 k x k 个单元,对每一个单元边界进行整数化。  //经过上述两次整数化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度

怎么做的映射: 把各个坐标除以“输入图片与feature map的大小的比值”

优点: 1.允许我们对CNN中的feature map进行再次利用;2.可以显著加速training和testing速度;3.允许end-to-end的形式训练目标检测系统。

缺点: 由于 RoIPooling 采用的是最近邻插值(即INTER_NEAREST) ,在resize时,对于缩放后坐标不能刚好为整数的情况,采用了粗暴的舍去小数,相当于选取离目标点最近的点,损失一定的空间精度。

8、ROI Pooling与ROI Align(Mask R-CNN)的区别

ROI Align舍去了近似像素取整数的量化方法,改用双线性插值的方法确定特征图坐标对应于原图中的像素位置.ROI Align很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。

对于检测图片中大目标物体时,两种方案的差别不大,而如果是图片中有较多小目标物体需要检测,则优先选择RoiAlign,更精准些

9、NMS非极大值抑制实现细节 ,手写NMS代码

用处:本质是搜索局部极大值,抑制非极大值元素。

原理:NMS为非极大值抑制,用来抑制检测时冗余的框。

算法流程
1.对所有预测框的置信度降序排序
2.选出置信度最高的预测框,确认其为正确预测,并计算他与其他预测框的IOU
3.根据2中计算的IOU去除重叠度高的,IOU>threshold阈值就删除
4.剩下的预测框返回第1步,直到没有剩下的为止

缺点:1、NMS算法中的最大问题就是它将相邻检测框的分数均强制归零(即将重叠部分大于重叠闻值Nt的检测框移除)。在这种情况下,如果一个真实物体在重叠区域出现,则将导致对该物体的检测失败并降低了算法的平均检测率。
2、NMS的闯值也不太容易确定,设置过小会出现误删,设置过高又容易增大误检。
3、NMS一般只能使用CPU计算,无法使用GPU计算。

改进思路

1、根据手动设置阈值的缺陷,通过自适应的方法在目标系数时使用小阈值,目标稠密时使用大阈值。例如Adaptive NMS

2、将低于阈值的直接置为0的做法太hard,通过将其根据IoU大小来进行惩罚衰减,则变得更加soft。例如Soft NMS,Softer NMS。

3、只能在CPU上运行,速度太慢的改进思路有三个,一个是设计在GPU上的NMS,如CUDA NMS,一个是设计更快的NMS,如Fast NMS,最后一个是掀桌子,设计一个神经网络来实现NMS,如 ConvNMS。

4、IoU的做法存在一定缺陷,改进思路是将目标尺度、距离引进IoU的考虑中。如DIoU

def py_cpu_nms(dets, thresh):
    """Pure Python NMS baseline."""
    x1 = dets[:, 0]                     # pred bbox top_x
    y1 = dets[:, 1]                     # pred bbox top_y
    x2 = dets[:, 2]                     # pred bbox bottom_x
    y2 = dets[:, 3]                     # pred bbox bottom_y
    scores = dets[:, 4]              # pred bbox cls score

    areas = (x2 - x1 + 1) * (y2 - y1 + 1)    # pred bbox areas
    order = scores.argsort()[::-1] #对置信度做降序,返回索引 加上[::-1]是降序,不加是升序。

    results = []    # NMS后,保留的pred bbox
    while order.size > 0:
        i = order[0]          # top-1 score bbox
        results.append(i)   # top-1 score的话,自然就保留了

        # 将得分最高的边框与剩余边框进行比较 获得交际区域的坐标
        xx1 = np.maximum(x1[i], x1[order[1:]])   # top-1 bbox(score最大)与order中剩余bbox计算NMS
        yy1 = np.maximum(y1[i], y1[order[1:]])   # order[1:]是除了第一个数,保留后面的数
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])

        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h

        iou  = inter / (areas[i] + areas[order[1:]] - inter)      # 无处不在的IoU计算~~~

        # 将重叠度大于给定阈值的边框剔除掉,仅保留剩下的边框,返回相应的下标
        inds = np.where(iou  <= thresh)[0]     # 这个操作可以对代码断点调试理解下,结合step-3,我们希望剔除所有与当前top-1 bbox IoU > thresh的冗余bbox,
                                              # 那么保留下来的bbox,自然就是ovr <= thresh的非冗余bbox,其inds保留下来,作进一步筛选
        order = order[inds + 1]   # 保留有效bbox,就是这轮NMS未被抑制掉的幸运儿,为什么 + 1?因为ind = 0就是这轮NMS的top-1,剩余有效bbox在IoU计算中与top-1做的计算,
                                  # inds对应回原数组,自然要做 +1 的映射,接下来就是step-4的循环
    return results    # 最终NMS结果返回

10、faster rcnn训练步骤

  1. 在已经训练好的model上,训练RPN网络
  2. 利用步骤1中训练好的RPN网络,收集proposals
  3. 第一次训练Fast RCNN网络
  4. 第二训练RPN网络
  5. 再次利用步骤4中训练好的RPN网络,收集proposals
  6. 第二次训练Fast RCNN网络

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

限制正负样本比例为1:1,如果正样本不足,就用负样本补充。

12、Faster rcnn有什么不足的地方吗?如何改进?

改进:1.更好的特征网络ResNet等;2.更精确的RPN:可以使用FPN网络架构来设计RPN网络3.更好的ROI分类方法:比如ROI分别在conv4和conv5上做ROI-Pooling,合并后再进行分类,这样基本不增加计算量,又能利用更高分辨率的conv4;4.使用softNMS代替NMS;

13、soft NMS

nms算法很简单,简单来说,就是将不是极大值的框抑制掉,也就是删除为0,只保留下置信度最大的那个框

nms算法设置阈值如果过小,那么会少检测到目标;如果设置过大,又会经常出先误检。

soft-nms算法,对于一个与得分最大框的iou大于阈值的框,不是将其删除,而是用较低的分数取代原来较高的分数,取得更好的效果。

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

One-Stage检测算法,没有selective search产生region proposal的阶段,直接产生物体的类别概率和位置坐标,经过单次检测即可直接获得最终的检测结果。相比Two-Stage有更快的速度。代表网络有YOLO v1/v2/v3,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都没有覆盖到这个目标,那么这个目标就会漏检。)

15、FPN网络具体是怎么操作的  FPN网络的结构

508dc3c51e31a8697af73195891ff0cc.jpeg

这个金字塔结构包括一个自底向上的线路,一个自顶向下的线路和横向连接

低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。FPN将高层次和低层次的语义信息做独立预测,并进行了融合

每个分辨率的 feature map 引入后一分辨率缩放两倍的 feature map 做 element-wise 相加的操作。通过这样的连接,每一层预测所用的 feature map 都融合了不同分辨率、不同语义强度的特征,融合的不同分辨率的 feature map 分别做对应分辨率大小的物体检测。这样保证了每一层都有合适的分辨率以及强语义(rich semantic)特征

16、FPN的作用

 对于小目标来说,ROI映射到feature map很可能没有了。那我用浅层一点好不好:不好,因为深层的特征含有比较高级的语义信息,浅层的对于准确定位比较有用,只用浅层的就发挥不了深度网络的强大能力了。FPN就是一种结合多层级特征来解决多尺度问题的特征金字塔模型

17、FPN的特征融合为什么是相加操作呢

如果用concat,因为分辨率小的特征通道数更多,计算量是一笔不小的开销。所以FPN里特征融合使用相加操作可以理解为是为了降低计算量。

18、FPN为什么能提升小目标的准确率

低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。原来多数的object detection算法都是只采用顶层特征做预测。FPN同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同特征层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的。所以可以提升小目标的准确率

19、简要阐述一下RetinaNet

RetinaNet=ResNet+FPN+Two sub-network+Focal Loss; RetinaNet由backbone网络和两个子任务网络组成,backbone网络负责计算feature map,子任务网络一个负责目标分类,一个负责bbox回归,网络的loss使用Focal loss。

作者对one-stage检测器准确率不高的问题原因进行探究,发现主要问题在于正负类别不均衡,提出Focal Loss来解决类别不平衡问题。目的是通过减少易分类样本的权重,从而使得模型在训练时更注重于难分类的样本。

20、讲一下目标检测优化的方向

可以从数据集下手,提升特征表征强度(backbone下手,加深加宽或者换卷积方式),RPN下手(级联,FPN,IOU NET),LOSS(行人检测领域有些问题,如重叠,可以靠修改loss提升准确度)

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

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

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

add是为了减少计算量,如果是concat的话,后续的卷积核的数量会增加一倍

两者都可以理解为整合特征图信息。concat是通道数的增加;add是特征图相加,通道数不变。对于两路输入来说,如果是通道数相同且后面带卷积的话,add等价于concat之后对应通道共享同一个卷积核,因此add可以认为是特殊的concat形式。但是add的计算量要比concat的计算量小得多。

23、如何检测小物体

小目标难以检测的原因:分辨率低,图像模糊,携带的信息少。

①借鉴FPN的思想,在FPN之前目标检测的大多数方法都是和分类一样,使用顶层的特征来进行处理。虽然这种方法只是用到了高层的语义信息,但是位置信息却没有得到,尤其在检测目标的过程中,位置信息是特别重要的,而位置信息又是主要在网络的低层。因此FPN采用了多尺度特征融合的方式,采用不同特征层特征融合之后的结果来做预测。

②要让输入的分布尽可能地接近模型预训练的分布。先用ImageNet做预训练,之后使用原图上采样得到的图像来做微调,使用微调的模型来预测原图经过上采样的图像。该方法提升效果比较显著。

③采用多尺度输入训练方式来训练网络;

④借鉴Cascade R-CNN的设计思路,优化目标检测中Two-Stage方法中的IOU阈值。检测中的IOU阈值对于样本的选取是至关重要的,如果IOU阈值过高,会导致正样本质量很高,但是数量会很少,会出现样本比例不平衡的影响;如果IOU阈值较低,样本数量就会增加,但是样本的质量也会下降。如何选取好的IOU,对于检测结果来说很重要。⑤采用分割代替检测方法,先分割,后回归bbox来检测微小目标。

24、阐述一下目标检测任务中的多尺度

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

检测网络SSD中最后一层是由多个尺度的feature map一起组成的。FPN网络中采用多尺度feature map分层融合,分层预测的方法可以提升小目标的检测效果。

25、如何进行多尺度训练

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

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

26、小目标不好检测的原因 和 改进方法

1)数据集中包含小目标的图片比较少,导致模型在训练的时候会偏向medium和large的目标。2)小目标的面积太小了,导致包含目标的anchor比较少,这也意味着小目标被检测出的概率变小。

改进方法: 1)对于数据集中含有小目标图片较少的情况,使用过度采样(oversample)的方式,即多次训练这类样本。2)对于第二类问题,则是对于那些包含小物体的图像,将小物体在图片中复制多分,在保证不影响其他物体的基础上,人工增加小物体在图片中出现的次数,提升被anchor包含的概率。3)使用FPN;4)RPN中anchor size的设置一定要合适,这样可提高proposal的准确率。5)对于分辨率很低的小目标,我们可以对其所在的proposal进行超分辨率,提升小目标的特征质量,更有利于小目标的检测。

27、yolo核心思想

把目标检测转变成一个回归问题。将整个图像作为网络的输入,仅仅经过一个神经网络,得到边界框的位置及其所属的类别。

28、yolo系列的不同——输入侧

yolov1

标签分配:GT的中心落在哪个grid,那个grid对应的两个bbox中与GT的IOU最大的bbox为正样本,其余为负样本,(由于是回归模型,不是分类模型,其解决类别不平衡的方式为各项loss采取不同的权重),即虽然一个grid分配两个bbox,但是只有一个bbox负责预测一个目标(边框和类别),这样导致YOLOv1最终只能预测7*7=49个目标。

边框回归方式:直接预测(x, y, w, h),而不是像rcnn系列那样预测偏移量(tx, ty, tw, th),其中心点的预测是相对于gird左上角的位置。

输入就是固定尺寸的图像,调整输入图像的尺寸以支持对图像细粒度特征的挖掘与检测

yolov2

标签分配:(1)由YOLOv1的7*7个grid变为13*13个grid,划分的grid越多,多个目标中心落在一个grid的情况越少,越不容易漏检;(2)一个grid分配由训练集聚类得来的5个anchor(bbox);(3)对于一个GT,首先确定其中心落在哪个grid,然后与该grid对应的5个bbox计算IOU,选择IOU最大的bbox负责该GT的预测,即该bbox为正样本;将每一个bbox与所有的GT计算IOU,若Max_IOU小于IOU阈值,则该bbox为负样本,其余的bbox忽略。
边框回归方式:预测基于grid的偏移量(tx, ty, tw, th)和基于anchor的偏移量(tx, ty, tw, th),具体体现在loss函数中。
在YOLOv1的基础上引入了多尺度训练(Multi-Scale Training),模型每训练一定的Epoch,改变输入图片的尺寸,使得模型对不同的输入尺寸更鲁棒,能够从容地对不同尺寸的图像进行检测。

优化了预训练模型(High Resolution Classifier)。使用32的倍数作为输入的尺寸,具体使用了320、352、384、416、448、480、512、544、576、608这10种尺寸。

一般基于ImageNet预训练的模型的输入尺寸都是小于256×256的。YOLOv2使用的输入尺寸是448×448,比YOLOv1的要大,故预训练模型网络需要使用大分辨率输入在ImageNet上进行微调。

yolov3

标签分配:三个特征图一共 8 × 8 × 3 + 16 × 16 × 3 + 32 × 32 × 3 = 4032 个anchor。

正例:任取一个ground truth,与4032个anchor全部计算IOU,IOU最大的anchor,即为正例。并且一个anchor,只能分配给一个ground truth。例如第一个ground truth已经匹配了一个正例anchor,那么下一个ground truth,就在余下的4031个anchor中,寻找IOU最大的anchor作为正例。ground truth的先后顺序可忽略。正例产生置信度loss、检测框loss、类别loss。标签为对应的ground truth标签(需要反向编码,使用真实的(x, y, w, h)计算出(tx, ty, tw, th) );类别标签对应类别为1,其余为0;置信度标签为1。
负例:正例除外(特殊情况:与ground truth计算后IOU最大的anchor,但是IOU小于阈值,仍为正例),与全部ground truth的IOU都小于阈值(0.5)的anchor,则为负例。负例只有置信度产生loss,置信度标签为0。
忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5)的anchor,则为忽略样例。忽略样例不产生任何loss。

边框回归方式:与YOLOv2一致

真正的多尺度训练,一共有3种尺度,分别是13*13,26*26,52*52三种分辨率,分别负责预测大,中,小的物体边框,这种改进对小物体检测更加友好。

yolov4

标签分配:YOLOv3是1个anchor负责一个GT,YOLO v4中用多个anchor去负责一个GT

对于某个GT来说,计算其与所有anchor的IOU,IOU大于一定阈值(MAX_thresh=0.7)的anchor都设为正样本;如果该GT与所有anchor的IOU都小于阈值(MAX_thresh=0.7),选择IOU最大的为正样本,保持每个GT至少有一个anchor负责预测;如果一个anchor与所有的GT的IOU都小于(MIN_thresh=0.3),则该anchor为负样本;其余的anchor都忽略。
边框回归方式:与YOLOv2、YOLOv3一致,都是预测(tx, ty, tw, th)

使用了Mosaic和CutMix高阶数据增强来提升模型的整体性能

yolov5

标签分配:考虑邻域的正样本anchor匹配策略增加了正样本

边框回归方式:与之前一致,预测(tx, ty, tw, th)

同样使用了Mosaic高阶数据增强策略,并增加自适应图像调整策略(letterbox)。

letterbox可以优化常规图像缩放填充引入过多无效信息导致Inference耗时增加的问题。其逻辑主要是计算图像原生尺寸与输入尺寸的缩放比例,并获得缩放后的图像尺寸,最后再进行自适应填充获得最后的输入图像

yolovx

摒弃了预训练逻辑,并使用Mosaic和MixUp高阶数据增强算法

MixUp最初应用在分类任务上,将两张图片通过设定的融合系数进行融合,两个图片上的label也对应融合。由于Mosaic和MixUp高阶数据增强算法已经足够强大,在这种情况下ImageNet预训练并不能带来有效增益,故YOLOx摒弃了预训练逻辑,并从头训练。

yolov6沿用了YOLOv5的整体逻辑,并没有引入新的Tricks
yolov7

标签分配:YOLOV5的跨网格搜索,以及YOLOX的匹配策略。

沿用了YOLOv5的整体逻辑,并没有引入新的Tricks

29、yolo系列的不同——backbone

yolov1受启发于GoogLeNet思想,都是卷积操作。Leaky ReLu激活函数,但并没有引入BN层
yolov2

Darknet-19,引入了BN层,计算量比YOLOv1中采用的GoogleNet更少,最后用average pooling层代替全连接层进行Inference

yolov3

Darknet-53,将YOLOv2的Darknet-19加深了网络层数,

引入了ResNet的残差思想,也正是残差思想让YOLOv3将Backbone深度大幅扩展至Darknet-53。

优化了下采样方式(无池化层结构),采用卷积层来实现,而YOLOv2中采用池化层实现。

yolov4CSPDarknet53,在YOLOv3的基础上,受CSPNet网络结构启发,将多个CSP子模块进行组合设计成为CSPDarknet53,并且使用了Mish激活函数。除Backbone以外的网络结构依旧使用LeakyReLU激活函数。
yolov5同样使用了YOLOv4中使用的CSP思想
yolovxDarknet-53, 沿用了YOLOv3的Backbone结构
yolov6

在YOLOv5的基础上,设计了EfficientRep Backbone,不但能够高效利用硬件算力,而且还具有较强的表征能力。

将普通卷积都替换成了RepConv结构。同时,在RepConv基础上设计了RepBlock结构,其中RepBlock中的第一个RepConv会做channel维度的变换和对齐

yolov7

设计了E-ELAN和MPConv结构

MPConv结构由常规卷积与maxpool双路径组成,增加模型对特征的提取融合能力。不管是E-ELAN还是MPConv结构,都将特征重用逻辑演绎到了比较高的水准。

30、yolo系列的不同——neck

yolov1
yolov2

yolov3较好的引入了FPN的思想,以支持后面的Head侧采用多尺度来对不同size的目标进行检测,越精细的grid cell就可以检测出越精细的目标物体
yolov4

FPN、主要包含了SPP模块和PAN模块

SPP模块代替了卷积层后的常规池化层,可以增加感受野,更能获取多尺度特征。包含3个最大池化层,其滑动核(sliding kernel)尺寸分别是和5×5,9×9和13×13,并通过Padding操作,使每个最大池化层的输出特征图不变,用于Concat融合操作。

PAN模块对不同层次的特征进行疯狂融合,其在FPN模块的基础上增加了自底向上的特征金字塔结构,保留了更多的浅层位置特征,将整体特征提取能力进一步提升。

yolov5也使用了SPP模块和PAN模块,但是在PAN模块进行融合后,将YOLOv4中使用的常规CBL模块替换成借鉴CSPnet设计的CSP_v5结构,加强网络特征融合的能力。
yolovx依然使用了YOLOv3的结构,并且使用了SPP模块
yolov6基于RepVGG style设计了可重参数化、更高效的Rep-PAN。Rep-PAN在PAN模块基础上,引入RepVGG style的RepBlock替换了YOLOv5中使用的CSP-Block,同时对整体Neck中的算子进行了调整,目的是在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力。
yolov7

主要包含了SPPSCP模块和优化的PAN模块

SPPCSP模块在SPP模块基础上在最后增加concat操作,与SPP模块之前的特征图进行融合,更加丰富了特征信息

PAN模块引入E-ELAN结构,使用expand、shuffle、merge cardinality等策略实现在不破坏原始梯度路径的情况下,提高网络的学习能力。

31、yolo系列的不同——head

yolov1

YOLOv1中,图片被划分为 7×7 的网格(grid cell),每个网络在Head结构中进行独立检测。如果一个物体的ground truth中心点坐标在一个grid cell中,那么就认为这个grid cell就是包含这个物体,这个物体的预测就由该grid cell负责。不是对图片进行切片,并不会让网格的视野受限且只有局部特征。

  1. 使用NMS算法,过滤掉一些重叠的检测框。
  2. 同一网格中的不同检测框有不同作用,也就是置信度误差损失的设计逻辑,这样可以增加召回率
  3. Inference时使用 P×C 作为输出置信度。使用物体的类别预测最大值 P乘以最合适的预测框C,这样也可以过滤掉一些大部分重叠的检测框,同时考虑了检测框与类别让输出更加可信。
yolov2

在YOLOv1的基础上去掉了最后的全连接层,采用了卷积和anchor boxes来预测检测框。由于使用卷积对特征图进行下采样会使很多细粒度特征(Fine-Grained Features)的损失,导致小物体的识别效果不佳。故在YOLOv2Head侧中引入了passthrough layer结构,将特征图一分为四,并进行concat操作,保存了珍贵的细粒度特征。

yolov3

在YOLOv2的基础上引入了多尺度检测逻辑和多标签分类思想,优化了损失函数。

在Neck结构的基础上顺势而为融合了3个尺度,在多个尺度的融合特征图上分别独立做检测。再将Anchor Box由5个增加至9个,每个尺度下分配3个Anchor Box,最终对于小目标的检测效果提升明显。

YOLOv3将YOLOv2的单标签分类改进为多标签分类,Head结构将用于单标签分类的Softmax分类器改成多个独立的用于多标签分类的Logistic分类器,取消了类别之间的互斥,可以使网络更加灵活。

yolov4

Head结构沿用了YOLOv3的整体架构

引入了CIOU Loss和DIOU NMS来提升Head结构的整体性能

yolov5

在YOLOv4的基础上引入了Auto Learning Bounding Box Anchors(自适应anchor box)和邻域正负样本分配策略

YOLOv5的anchor box是自适应于训练数据的,会根据不同的训练数据自动学习适配相应的anchor box

由于增加高质量正样本检测框可以显著加速收敛,故YOLOv5设计了相应的邻域正负样本分配策略。比起yolov4中一个ground truth只能匹配一个正样本,YOLOv5能够在多个grid cell中都分配到正样本,有助于训练加速和正负样本平衡。

yolovx

在YOLOv5的基础上在网络结构中引入了Decoupled Head,并使用anchor-free思想和SimOTA正负样本分配策略进行损失函数的计算与优化

使用了三个Decoupled Head(解耦头),分别聚焦cls(分类信息),reg(检测框信息)和IOU(置信度信息)。常规的检测头在特征的表达与学习能力上比起Decoupled Head有所欠缺,并且Decoupled Head模块能加快模型的收敛速度。

使用anchor-free思想,比起YOLO系列中常规的anchor-based,在Head侧可以减少约 2/3 的参数

目标检测场景一张图像中往往负样本占绝大多数,而正样本只是少数。为了获得更多高质量的正样本,YOLOx中设计了样本初筛+SimOTA逻辑。SimOTA能够算法动态分配正样本,进一步提高检测精度。而且比起OTA由于使用了Sinkhorn-Knopp算法导致训练时间加长,SimOTA算法使用Top-K近似策略来得到样本最佳匹配,大大加快了训练速度。

yolov6

和YOLOx一样使用Anchor-free逻辑和SimOTA标签分配策略

依然采用了Decoupled Head结构,并对其进行了精简设计。YOLOX的检测头虽然提升了检测精度,但一定程度上增加了网络延时。YOLOv6采用Hybrid Channels策略重新设计了一个更高效的Decoupled Head结构,在维持精度的同时降低了延时,缓解了Decoupled Head中 3×3 卷积带来的额外延时开销。

为了进一步提升回归精度,YOLOv6使用了SIoU检测框回归损失函数来优化网络的学习过程。

yolov7

使用了和YOLOv5一样的损失函数

引入RepVGG style改造了Head网络结构,并使用了辅助头(auxiliary Head)训练以及相应的正负样本匹配策略

RepVGG style在训练过程中可以通过多路分支提升性能,推理可以通过结构重新参数化实现推理速度的加快

32、yolo系列的不同——输出

yolov1一个 7×7×30 的张量,7×7 表示把输入图片划分成 7×7 的网格,每一个网格的通道维度等于 30=(2×5+20),代表YOLOv1中每个网格能预测2个框,每个框能预测5个参数 (x,y,w,h,c) 再加上20个种类。
yolov2

输出的feature map大小为 13×13,每个grid cell设置了 5 个anchor box预测得到 5 个检测框,一共有 13×13×5=845 个检测框,与YOLOv1相比大大提高目标的定位准确率。

yolov3输出52×52×3(1+C+4)、26×26×3(1+C+4)和13×13×3(1+C+4)三个预测张量,然后将这些预测结果汇总到一起,进行后处理,得到最终的检测结果。
yolov4和V3一样
yolov5输出19×19×3(1+C+4)、38×38×3(1+C+4)和76×76×3(1+C+4)三个预测张量
yolovx三个Decoupled Head中最上面的分支对应着大anchor框,中间的分支对应着中等anchor框最下面的分支对应着小anchor框。最后的输出将这个三个分支融合成一个 85×8400 的特征向量。
yolov6和yolovx相同
yolov7输出80×80×3(1+C+4)、40×40×3(1+C+4)和20×20×3(1+C+4)三个预测张量

33、yolo系列的不同——loss和trick

loss:

yolov1

1.相同的位置误差对大目标和小目标的影响是不同的,相同的偏差对于小目标来说影响要比大目标大,故作者选择将预测的bbox的w,h先取其平方根,再求均方差损失

2.一个网格预测2个bbox,在计算损失函数的时候,只取与ground truth box中IoU大的那个预测框来计算损失

3.分类误差,只有当单元格中含有目标时才计算,没有目标的单元格的分类误差不计算在内

yolov2

YOLOv2是拿(tx, ty, tw, th)来计算的,这就决定了YOLOv1是直接回归,YOLOv2是回归偏移量(offset)

yolov3

Yolov3 Loss为三个特征图Loss之和

yolov4

置信度loss采用MSE loss;分类loss采用BCE loss,边框回归loss变为CIOU loss

yolov5

置信度和分类分支都是BCE loss,回归分支采用CIOU loss

yolovx

置信度和分类分支都是BCEWithLogitsLoss(将Sigmoid激活函数和二进制交叉熵损失结合在一起),边框回归loss为IOU loss

yolov6

由分类损失、框回归损失和可选对象损失(Object Loss)组成

分类loss采用VFL;边框回归loss:SIoU应用于YOLOv6-N和YOLOV 6-T,而其他的使用GIoU;

Object Loss它没有带来很多积极的效果

yolov7

不带辅助训练头时:

目标置信度损失和分类损失采用BCEWithLogitsLoss(带log的二值交叉熵损失),坐标损失采用CIoU损失

带辅助训练头时:

loss函数和不带辅助头相同,加权系数不能过大(aux head loss 和lead head loss 按照0.25:1的比例),否则会导致lead head出来的结果精度变低。匹配策略和上面的不带辅助头(只有lead head)只有很少不同,其中辅助头

 trick:

yolov1
yolov2

设计了分类与检测的联合训练方法,使得YOLO能够实时检测多达9000种目标,在这种方法下输出的模型称为YOLO9000

yolov3Adam优化器结合了AdaGrad和RMSProp两种优化算法的优点。对梯度的一阶矩估计(First Moment Estimation,即梯度的均值)和二阶矩估计(Second Moment Estimation,即梯度的未中心化的方差)进行综合考虑,计算出更新步长。
yolov4

SAT(self adversarial training) 使用基于FGSM原理的梯度攻击技术,生成对抗样本进行对抗训练。

CmBN(Cross mini-Batch Normalization)CmBN是独立利用多个mini-batch内的数据进行BN操作(每四个迭代后统一计算一次整体BN)用来解决在Batch-Size较小时,BN的效果不佳问题。

Label Smooth可以看作是一种防止过拟合的正则化方法。其主要是在One-Hot标签中加入噪声,减少训练时GroundTruth在计算损失函数的权重,来达到防止过拟合的作用,增强模型的泛化能力。

yolov5

基本上和YOLOv4一致,并在此基础上引入了更多的工程优化逻辑

通过不同的训练参数配置,用来获得不同复杂度的模型

yolovx

使用了YOLOv5中提到的模型EMA(Exponential Moving Average)策略,并且使用余弦退火学习率优化训练过程

余弦退火学习率衰策略(CosineAnnealingLR)使得学习率呈周期性变化,但我们通常取它的一个余弦周期来完成整个训练过程。

yolov6

进行了很多蒸馏方向上的尝试

比如Self-distillation,Reparameterizing Optimizer,使用 Channel-wise Distillation进行量化感知训练等方法,进一步加强模型的整体性能。

yolov7也使用了YOLOv5中提到的模型EMA(Exponential Moving Average)策略,并引入了YOLOR中使用的隐性知识

34、重参数化卷积(yolov7的创新)

在YOLOv7中,网络最后使用RepConv重参数化卷积

重参数化的作用:在保证模型性能的条件下加速网络,主要是对卷积+BN层以及不同卷积进行融合,合并为一个卷积模块。

在训练时,网络的结构是多分支进行的,而在推理时则将分支的参数进行重参数化,合为一个分支来进行的,所以推理的速度要比多分支网络快很多,并且精度也比单分支的网络更高。

35、k-means聚类

在yolo中,锚框大小的计算就是采用的k-means聚类的方法形成的。

我们知道所有已经标注的bbox的长宽大小,而锚框则是对于预测这些bbox的潜在候选框,所以锚框的长宽形状应该越接近真实bbox越好。而又由于YOLO网络的预测层是包含3种尺度的信息的(分别对应3种感受野),每种尺度的anchor又是三种,所以我们就需要9种尺度的anchor,也即我们需要对所有的bbox的尺寸聚类成9种类别
计算锚框的算法流程:
第一步:
无区别的将所有图片的所有矩形框提取出来,放在一起。
第二步:获得所有训练数据bounding boxes的宽高数据。
第三步: 初始化k个anchor box
第四步:计算每个bounding box与每个anchor box的iou值,由于iou越大越好,所以定义一个误差d = 1-iou。
第五步: 比较每boundingbox其对于每个anchor box的误差大小d,选取最小误差的那个anchor box,将这bounding box分类给它,对于每个bounding box都做这个操作,记录下来每个anchor box有哪些bounding box属于它。
第六步: anchor box更新对于每个anchor box中的那些bounding box,求这些bounding box的宽高中值大小,将其作为该anchor box新的尺寸。
第七步:重复操作第四步到第六步,直到在第五步中发现对于全部bounding box其所属的anchor box类与之前所属的anchor box类完全样。

传统的聚类方法是使用欧氏距离来衡量差异,也就是说如果我们运用传统的k-means只聚类算法,可以直接聚类bounding box的宽和高,产生k个宽、高组合的anchor boxes,但是作者发现此方法在box尺寸比大的时候,其误差也更大,所以作者引入了iou值,可以避免这个问题

聚类效果跟数据集的数量有很大关系,一两千张图片,聚类出来效果可能不会很好

优点:

容易理解,聚类效果不错,虽然是局部最优,但往往局部最优就够了:
处理大数据集的时候,该算法可以保证较好的伸缩性;
当簇近似高斯分布的时候,效果非常不错;
算法复杂度低

缺点:
K值需要人为设定,不同 K 值得到的结果不一样;
对初始的簇中心敏感,不同选取方式会得到不同结果;
对异常值敏感
样本只能归为一类,不适合多分类任务;
不适合太离散的分类、样本类别不平衡的分类、非凸形状的分类

36、传统目标检测

1.使用不同尺度的滑动窗口选定图像的某一区域为候选区域;
2.从对应的候选区域提取如Harr HOG LBP LTP等一类或者多类特征
3. 使用Adaboost SVM 等分类算法对对应的候选区域进行分类,判断是否属于待检测的目标。

缺点:
1.基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余
2.手工设计的特征对于多样性的变化没有很好的鲁棒性

37、Mask RCNN相比于Faster RCNN的改进

1.强化了基础网络:通过ResNeXt-101+FPN用作特征提取网络,达到state-of-the-art的效果。
2.ROIAlign替换之前faster rcnn中的ROI Pooling,解决错位(Misalignment)问题。
3.使用新的Loss Function:Mask RCNN的损失函数是分类,回归再加上mask预测的损失之和。
4.可以在有效地完成目标检测的同时完成实例分割。

38、正负样本极不平衡

目标检测算法为了定位目标会生成大量的anchor box(锚框),而一幅图中真实的目标(正样本)个数很少,大量的anchor box处于背景区域(负样本),这就导致了正负样本极不平衡。

简单来说,正样本是 预测的anchor box 框住了真实的目标;负样本是 预测的anchor box 没有框住真实的目标,框了背景。由于正样本的数量太少、负样本的数据量太多,导致正负样本极不平衡。

39、two-stage 怎样缓解样本不平衡问题

two-stage方法在第一阶段生成候选框,RPN只是对anchor box进行简单背景和前景的区分,并不对类别进行区分,经过这一轮处理,过滤掉了大部分属于背景的anchor box,较大程度降低了anchor box正负样本的不平衡性。

只是减轻了样本不平衡并没有解决样本不平衡。同时在第二阶段采用启发式采样(如:正负样本比1:3)或者OHEM进一步减轻正负样本不平衡的问题。

40、Focal Loss

思想:针对样本不平衡的情况下,使用Focal Loss作为损失函数,加强对于hard example的训练!从而一定程度上解决样本不平衡问题!它的核心思想就是:整体缩放Loss,易分类样本缩放的比难分类样本更多,从而损失函数中就凸显了难分类样本的权重,使得模型在训练时更专注于难分类的样本。

Focal Loss在平衡交叉熵损失函数的基础上,增加一个调节因子降低易分类样本权重,聚焦于困难样本的训练,其定义如下

\alpha权重帮助处理了类别的 不均衡。

 其中,(1-p_{t})^{\gamma }调节因子\gamma≥ 0是可调节的聚焦参数,下图展示了\gamma ∈ [0, 5]不同值时focal loss曲线

当使用γ> 1的Focal Loss可以减少“分类得好的样本”或者说“模型预测正确概率大”的样本的训练损失,而对于“难以分类的示例”,比如预测概率小于0.5的,则不会减小太多损失。 

Focal Loss特点:

  1. 当很小时(样本难分,不管分的是否正确),调节因子趋近1,损失函数中样本的权重不受影响;当很大时(样本易分,不管分的是否正确),调节因子趋近0,损失函数中样本的权重下降很多
  2. 聚焦参数可以调节易分类样本权重的降低程度,越大权重降低程度越大

41、产生梯度消失和梯度爆炸的原因

梯度消失/爆炸是激活函数和权重相互作用产生的联合效果,一般出现在层数比较多的神经网络中。

【梯度消失】经常出现,产生的原因有:一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。

【梯度爆炸】一般出现在深层网络权值初始化值太大的情况下。在深层神经网络或循环神经网络中,误差的梯度可在更新中累积相乘。如果网络层之间的梯度值大于 1.0,那么重复相乘会导致梯度呈指数级增长,梯度变的非常大

多层神经网络中向上游传递的梯度可能在(0,1)之间,如果层层之间的梯度均在(0,1)之间,层层缩小,那么就会出现梯度消失。反之,如果层层传递的梯度大于1,那么经过层层扩大,就会出现梯度爆炸,可见梯度的消失与爆炸与激活函数没有特别大的关系,反而和权重有较大关系,因此权重的初始化对神经网络的训练很重要。

42、梯度消失爆炸的解决方案

  1. - 预训练加微调
  2. - 权重正则: 根据正则项在可以看出,如果发生梯度爆炸,那么权值的范数就会变的非常大,反过来,通过限制正则化项的大小,也可以在一定程度上限制梯度爆炸的发生
  3. - 逐层训练:每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层的输出作为下一层的输入。
  4. - 使用不同的激活函数
  5. - 使用batchnorm批量归一化
  6. - 使用残差结构
  7. - 梯度剪切/梯度截断:针对梯度爆炸提出的,其思想是设值一个剪切阈值,如果更新梯度时,梯度超过了这个阈值,那么就将其强制限制在这个范围之内。这样可以防止梯度爆炸。
  8. - 使用 ReLU 激活函数或leaky relu

43、OHEM(Online Hard Example Mining )在线困难样例挖掘

运用于R-CNN,fast R-CNN,faster rcnn等two-stage模型与SSD等(有anchor的)one-stage模型训练时的训练方法。

OHEM和focal loss的作用类似

主要原理

1、根据损失进行筛选,选出对分类和检测影响大的样本。

2、将ROI网络进行扩充为2个,一个只有前向传播,计算loss,另一个正常前向和反向传播,但是只以hard example作为输入。计算损失和梯度回传。

OHEM 作为一种设计思路,很容易嵌入到检测网络当中

44、交叉熵损失 Cross Entropy Loss

在这里插入图片描述

p(x)表示样本的真实分布,q(x)表示模型所预测的分布 ,实际上就是经过softmax后的概率值。

交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。在分类问题中常常与softmax是标配

45、batch normalization

BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布

其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度

46、模型压缩

为了解决模型使用成本的问题。通过提高推理速度,降低模型参数量和运算量。现在主流的模型压缩方法包含两大类:剪枝和量化。模型的剪枝是为了减少参数量和运算量,而量化是为了压缩数据的占用量。

47、目标检测两阶段比一阶段的算法精度高的原因

1.正负样本的不均衡性

当某一类别的样本数特别多的时候,训练出来的网络对该类的检测精度往往会比较高。而当某一类的训练样本数较少的时候,模型对该类目标的检测精度就会有所下降,这就是所谓样本的不均衡性导致的检测精度的差异。

对于一阶段的目标检测来说,它既要做定位又要做分类,最后几层中1×1的卷积层的loss都混合在一起,没有明确的分工哪部分专门做分类,哪部分专门做预测框的回归,这样的话对于每个参数来说,学习的难度就增加了。

对于二阶段的目标检测来说(Faster RCNN),在RPN网络结构中进行了前景和背景的分类和检测,这个过程与一阶段的目标检测直接一上来就进行分类和检测要简单的很多,有了前景和背景的区分,就可以选择性的挑选样本,是的正负样本变得更加的均衡,然后重点对一些参数进行分类训练。训练的分类难度会比一阶段目标检测直接做混合分类和预测框回归要来的简单很多。

2.样本的不一致性

怎么理解样本不一致性呢?首先我们都知道在RPN获得多个anchors的时候,会使用一个NMS。在进行回归操作的时候,预测框和gt的IoU同回归后预测框和gt的IOU相比,一般会有较大的变化,但是NMS使用的时候用的是回归前的置信度,这样就会导致一些回归后高IoU的预测框被删除。这就使得回归前的置信度并不能完全表征回归后的IoU大小。这样子也会导致算法精度的下降。在第一次使用NMS时候这种情况会比较明显,第二次使用的时候就会好很多,因此一阶段只使用一次NMS是会对精度有影响的,而二阶段目标检测中会在RPN之后进行一个更为精细的回归,在该处也会用到NMS,此时检测的精度就会好很多。

48、如何解决目标检测中密集遮挡问题

遮挡本身也可以分为两种类型,一种是由于非目标造成的遮挡,一种是由于也是需要检测的目标造成的遮挡。这两种遮挡分别被叫做occlusioncrowded

对于前一种类型遮挡,很难有针对性的办法去解决,最好的办法也就是使用更多的数据和更强的feature。可以从训练数据入手。加掩膜,加扰动,提高算法对遮挡的应对能力。

对于第二种遮挡,提出了两个针对这个问题的loss,

通过设置损失函数的方式,即Repulsion Loss,使预测框和所负责的真实目标框的距离缩小,而使得其与周围非负责目标框(包含真实目标框和预测框)的距离加大 。如下式,如果与周围目标的距离越大,损失值会越小。

soft nms也可以

49、“狭长形状”目标检测有什么合适方法

使用可旋转bonding box进行标注,因为可能框内的目标部分占比很少,造成提取困难

手工设计anchors

50、如何解决动态目标检测

动态目标检测(Dynamic Object Detection)是指在视频序列中检测和跟踪移动的目标物体。与静态图像目标检测不同,动态目标检测需要考虑目标在时间上的变化和运动。

1.光流法光流是空间运动物体在观察成像平面上像素运动的瞬时速度。光流法利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。

2.相邻帧差法:将前后两帧图像对应的像素值相减,在环境亮度变化不大的情况下,如果对应像素值相差值很小,可认为此处景物是静止的,反之,则是运动物体。

3.背景差法:将输入图像与背景模型进行比较,通过判定灰度等特征的变化,或用直方图等统计信息的变化来判断异常情况的发生和分割运动目标

4. 事件相机:通过检测每个像素的亮度变化来生成一个事件,相比于传统相机,更适合在高动态和高速度的环境下使用,具有高动态范围 (HDR)、高时间分辨率和无运动模糊的优势。

5.基于深度学习的方法:一种常见的方法是将目标检测器(如Faster R-CNN、YOLO等)与目标跟踪器(如Kalman滤波器、卡尔曼滤波器、SORT等)相结合。这种方法能够实现准确的目标检测和鲁棒的目标跟踪,从而有效地应对视频中的移动目标检测任务。

6.新的技术:基于图神经网络GNN(Graph Neural Networks)的动态目标检测,结合时空注意力机制的方法,以进一步提高动态目标检测的性能。

51、如何解决小目标识别问题

通用的定义来自 COCO 数据集,定义小于 32x32 pix 的为小目标。

难点:在提取特征的过程中,能提取到的特征非常少,现有数据集中小目标占比少,小目标聚集问题。下采样过多,会导致小目标的信息在最后的特征图上只有几个像素(甚至更少),信息损失较多

解决办法

1.数据提高图像采集的分辨率:基于 GAN 的方法解决的也是小目标本身判别性特征少的问题,其想法非常简单但有效:利用 GAN 生成高分辨率图片或者高分辨率特征。

2.Data Augmentation。一些特别有用的小物体检测增强包括随机裁剪随机旋转马赛克增强copy pasting增加小目标数量缩放与拼接,增加中小目标数量

3.修改模型输入尺寸提高模型的输入分辨率,也就是减少或者不压缩原图像。tiling,将图像切割后形成batch,可以在保持小输入分辨率的同时提升小目标检测,但是推理时也需要 tiling,然后把目标还原到原图,整体做一次 NMS。

4.修改 Anchor适合小目标的 Anchor

5.Anchor Free。锚框设计难以获得平衡小目标召回率与计算成本之间的矛盾,而且这种方式导致了小目标的正样本与大目标的正样本极度不均衡,使得模型更加关注于大目标的检测性能,从而忽视了小目标的检测。

6.多尺度学习FPN, 空洞卷积,通过多尺度可以将下采样前的特征保留,尽量保留小目标

7.减小下采样率。比如对于 YOLOv5 的 stride 为 32, 可以调整其 stride 来减小下采样率,从而保留某些比较小的特征。

8.SPP 模块增加感受野,对小目标有效果,SPP size 的设置解决输入 feature map 的size 可能效果更好。

9.损失函数小目标大权重,此外也可以尝试 Focal Loss。

52、如何解决训练数据样本过少的问题

利用预训练模型进行迁移微调(fine-tuning),预训练模型通常在特征上拥有很好的语义表达。此时,只需将模型在小数据集上进行微调就能取得不错的效果。这也是目前大部分小数据集常用的训练方式。视觉领域内,通常会ImageNet上训练完成的模型。自然语言处理领域,也有BERT模型等预训练模型可以使用。

单样本或者少样本学习(one-shotfew-shot learning),这种方式适用于样本类别远远大于样本数量的情况等极端数据集。例如有1000个类别,每个类别只提供1-5个样本。少样本学习同样也需要借助预训练模型,但有别于微调的在于,微调通常仍然在学习不同类别的语义,而少样本学习通常需要学习样本之间的距离度量。

常用的方式:数据集增强、正则或者半监督学习等方式来解决小样本数据集的训练问题。

53、微调 fine-tuning

微调(Fine-tuning)是指使用预训练模型作为初始参数,然后在新的数据集上进行少量的训练,以获得更好的性能。预训练模型通常是在大规模数据集上进行训练得到的,因此具有较好的泛化性能。将预训练模型用于微调可以在小数据集上进行训练,并获得更好的性能。

微调的流程如下:

  1. 选择一个预训练模型,该模型通常在大型数据集上进行了训练,并且在相关任务上获得了较好的性能。
  2. 将预训练模型加载到内存中,并进行必要的修改,例如修改输出层的维度或者修改输入的形状。
  3. 使用新的数据集对修改后的预训练模型进行训练,通常使用较小的学习率进行训练,并且在少量的迭代中进行。
  4. 如果需要,在训练过程中可以逐步解冻模型的一些层,使其参与训练。
  5. 对微调后的模型进行测试,以评估其在新的数据集上的性能。

54、NMS的改进思路

1.根据手动设置阈值的缺陷,通过自适应的方法在目标系数时使用小阈值,目标稠密时使用大阈值。例如Adaptive NMS

2.将低于阈值的直接置为0的做法太hard,通过将其根据IoU大小来进行惩罚衰减,则变得更加soft。例如Soft NMS,Softer NMS。

3.只能在CPU上运行,速度太慢的改进思路有三个,一个是设计在GPU上的NMS,如CUDA NMS,一个是设计更快的NMS,如Fast NMS,最后一个是掀桌子,设计一个神经网络来实现NMS,如 ConvNMS。

4.IoU的做法存在一定缺陷,改进思路是将目标尺度、距离引进IoU的考虑中。如DIoU

55、IOU相关优化(作为损失函数)

重叠中心点纵横比优点缺点
IOU××尺度不变性,非负性;同一性;对称性;三角不等性。1.如果两个框不相交,不能反映两个框距离远近 2.无法精确的反映两个框的重合度大小
GIOU××解决检测框和真实框没有重叠时loss等于0问题

1.当检测框和真实框出现包含现象的时候GIOU退化成IOU

2.两个框相交时,在水平和垂直方向上收敛慢

DIOU×直接回归两个框中心点的欧式距离,加速收敛。回归过程中未考虑Bounding box的纵横比,精确度上尚有进一步提升的空间
CIOU增加了检测框尺度的loss,增加了长和宽的loss,这样预测框就会更加的符合真实框。

1. 纵横比描述的是相对值,存在一定的模糊

2. 未考虑难易样本的平衡问题

EIOU分别计算宽高的差异值取代了纵横比,同时引入Focal Loss解决难易样本不平衡的问题。

IOU的缺点

1、如果两个框没有相交,根据定义,IoU=0,不能反映两者的距离大小(重合度)。同时因为loss=0,没有梯度回传,无法进行学习训练。
2、IoU无法精确的反映两者的重合度大小

作为loss时要变成1-iou或-ln(iou)

GIOU(Generalized IoU)

重合部分减去白色部分

GIOU的回归精度更高

GIOU也存在它的缺点:当两个预测框高宽相同,且处于同一水平面时,GIOU就退化为IOU。

此外,GIOU和IOU还有两个缺点:收敛较慢、回归不够准确

DIOU(Distance-IoU)

优点:

(1)DIoU loss可以直接最小化两个目标框的距离,因此比GIoU loss收敛快得多。

(2)对于包含两个框在水平方向和垂直方向上这种情况,DIoU损失可以使回归非常快。

(3)DIoU还可以替换普通的IoU评价策略,应用于NMS中,使得NMS得到的结果更加合理和有效。

b82ffb3342d69d08bdfc47730fe48fdf.jpega1fd3a10c3509e09fff374b650ba8981.jpeg

缺点

        虽然DIOU能够直接最小化预测框和真实框的中心点距离加速收敛,但是Bounding box的回归还有一个重要的因素纵横比暂未考虑。如下图,三个红框的面积相同,但是长宽比不一样,红框与绿框中心点重合,这时三种情况的DIoU相同,证明DIoU不能很好的区分这种情况。

59747cf882fb43db94ce9f45fa83c0ff.png

CIOU(Complete-IoU)

一个优秀的回归定位损失应该考虑三种几何参数:重叠面积、中心点距离、长宽比。CIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,这样预测框就会更加的符合真实框。

8b5cd4c27ad94ef1f4e4004c9f178b36.jpeg
优点:考虑了框的纵横比,可以解决DIoU的问题。

缺点:通过CIoU公式中的v反映的纵横比的差异,而不是宽高分别与其置信度的真实差异,所以有时会阻碍模型有效的优化相似性。

EIOU(Efficient-IoU)

 为了解决CIoU的问题,有学者在CIOU的基础上将纵横比拆开,提出了EIOU Loss,并且加入Focal聚焦优质的预测框,与CIoU相似的,EIoU是损失函数的解决方案,只用于训练。

优点:

1)将纵横比的损失项拆分成预测的宽高分别与最小外接框宽高的差值,加速了收敛提高了回归精度。

2)引入了Focal Loss优化了边界框回归任务中的样本不平衡问题,即减少与目标框重叠较少的大量锚框对BBox 回归的优化贡献,使回归过程专注于高质量锚框。

56、卷积网络里的感受野是什么意思

决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野。feature map上的一个点对应输入图上的区域。

57、什么是激活函数?

神经网络中每层的输入是上一层的输出,每层输出是下一层的输入,所以在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数

58、为什么要用激活函数?

不使用激活函数的话,神经网络的每层都只是做线性变换,线性函数无论叠加多少层,都是线性的,只是斜率和截距不同,叠加网络对解决实际问题没有多大帮助;因为需要神经网络解决的实际问题基本都是非线性的。

59、你知道哪些激活函数?

1、Relu   线性整流函数

relu=max(0,x)

优点:
1、ReLU解决了梯度消失的问题,至少x在正区间内,神经元不会饱和。
2、由于ReLU线性、非饱和的形式,在SGD中能够快速收敛。
3、算速度要快很多。ReLU函数只有线性关系,不需要指数计算,计算速度都比sigmoid和tanh快。
缺点:
1、ReLU的输出不是“零为中心”。
2、随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。这种神经元的死亡是不可逆转的死亡。

2、Leaky ReLU

Leaky ReLU函数通过把x xx的非常小的线性分量给予负输入0.01 x 0.01x0.01x来调整负值的零梯度问题。
Leaky有助于扩大ReLU函数的范围,通常α \alphaα的值为0.01左右。
Leaky ReLU的函数范围是负无穷到正无穷。

3、softmax

softmax简单理解:将输出值变成概率化。在这里插入图片描述

 将输出的值,带入saoftmax公式,得到的y yy就会被映射到( 0   1 ) (0 ~1)(0 1)之间,这些值的和为1 11,在最后的输出选取概率输出的最大值为分类结果。Softmax函数确保较小的值具有较小的概率,并且不会直接丢弃。

  • 在零点不可微。
  • 负输入的梯度为零,这意味着对于该区域的激活,权重不会在反向传播期间更新,因此会产生永不激活的死亡神经元。

4、Sigmoid

特性与优缺点:

Sigmoid函数的输出范围是0到1。由于输出值限定在0到1,因此它对每个神经元的输出进行了归一化。
用于将预测概率作为输出的模型。由于概率的取值范围是0到1,因此Sigmoid函数非常合适
梯度平滑,避免跳跃的输出值
函数是可微的。这意味着可以找到任意两个点的Sigmoid曲线的斜率
明确的预测,即非常接近1或0。
函数输出不是以0为中心的,这会降低权重更新的效率
Sigmoid函数执行指数运算,计算机运行得较慢。

5、Tanh  双曲正切函数

 

 解决了Sigmoid函数的不以0为中心输出问题,然而,梯度消失的问题和幂运算的问题仍然存在

6、SiLU Sigmoid Linear Unit

相对于ReLU函数,SiLU函数在接近零时具有更平滑的曲线,并且由于其使用了sigmoid函数,可以使网络的输出范围在0和1之间

在这里插入图片描述

在使用SiLU时,如果数据存在过大或过小的情况,可能会导致梯度消失或梯度爆炸,因此需要进行一些调整,例如对输入数据进行归一化等。而ReLU在这方面较为稳定,不需要过多的处理。

60、解释下梯度下降

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。我们可以理解为斜率。

61、批量梯度下降(Batch Gradient Descent)

最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行梯度的更新。

优点:
  (1)一次迭代是对所有样本进行计算,此时利用矩阵进行运算实现了并行
  (2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,批量梯度下降一定能够得到全局最优解

缺点:
  (1)有时我们会遇到样本数目 m 很大的训练集合,如果有几十上百万,甚至上亿的训练样本。这意味着我们每执行一次批梯度下降算法,都要对m个样本进行求和。我们的程序也就需要检测这上百万的样本,甚至我们完成值下降的第一步都十分困难。这样会导致,训练过程很慢花费很长的时间

62、随机梯度下降(Stochastic Gradient Descent)

算法中对\Theta的每次更新不需要再全部遍历一次整个样本,只需要查看一个训练样本进行更新,之后再用下一个样本进行下一次更新,像批梯度下降一样不断迭代更新。这样,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就可以迭代完了。如果我们一定需要一个大规模的训练集,我们可以尝试使用随机梯度下降法来代替批量梯度下降法。

优点:
  (1)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快

缺点:
  (1)准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。
  (2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。
  (3)不易于并行实现

63、小批量梯度下降(Mini-Batch Gradient Descent)

批量梯度下降以及随机梯度下降的一个折中办法。

每次迭代使用 ** batch_size** 个样本来对参数进行更新。它克服上面两种方法的缺点,又同时兼顾两种方法的优点。

优点:
  (1)通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
  (2)每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。(比如上例中的30W,设置batch_size=100时,需要迭代3000次,远小于随机梯度下降的30W次)
  (3)可实现并行化。

缺点:
  (1)batch_size的不当选择可能会带来一些问题。

64、梯度下降算法的调优方法(目的:加快收敛速度)

如果样本量比较小,采用批量梯度下降算法。如果样本太大,或者在线算法,使用随机梯度下降算法。在实际的一般情况下,采用小批量梯度下降算法。

1、 学习速率(Learning Rate)\alpha调优
2、 选取最优的初始值\Theta
3、 特征数据归一化处理

65、学习率调整

学习率设置的过小时,收敛过程将变得十分缓慢。而当学习率设置的过大时,梯度可能会在最小值附近来回震荡,甚至可能无法收敛。 

刚开始训练时:学习率以 0.01 ~ 0.001 为宜。
一定轮数过后:逐渐减缓。
接近训练结束:学习速率的衰减应该在100倍以上。
如果是 迁移学习 ,由于模型已在原始数据上收敛,此时应设置较小学习率 (≤0.0001) 在新数据上进行微调 。

学习率衰减机制:

方法1.每N轮学习率减半(学习率按训练轮数增长指数差值递减)

方法2.最常用的是指数衰减,也是最为有效的

方法3.通过引入BN层来解决,由于BN层(也叫归一化层)它可以防止网络中间层在训练过程中国,数据分别发生改变,它和卷积、池化都属于网络层的一种。

66、Adam优化器 (Adaptive momentum)自适应动量

Adam是对随机梯度下降算法SGD的扩展,Adam使用动量自适应学习率来加快收敛速度。

随机梯度下降保持一个单一的学习速率(称为alpha),用于所有的权重更新,并且在训练过程中学习速率不会改变。每一个网络权重(参数)都保持一个学习速率,并随着学习的展开而单独地进行调整。

Adam方法则是从梯度的第一次和第二次矩的预算来计算不同参数的自适应学习速率。

Adam配置参数
alpha α:也被称为学习速率或步长。最重要的超参,一般都需要去调节。权重比例被校正(例如001)。更大的值(例如0.3)在速率校正之前会加快初始学习速度。较小的值(例如1.0e-5)在培训期间降低学习速度
beta1 
β:第一次估计的指数衰减率(如9)。一般默认值分别是0.9
beta2 β:第二次估计的指数衰次减率(例如999)。在稀疏梯度问题(例如NLP和计算机视觉问题)上,这个值应该接近1.0。一般默认值分别是0.999
epsilon ε:是一个非常小的数字,可以防止任何在实施中被0划分(例如,10e-8)。一个不怎么重要的超参,一般不用调节

Adam的优点:

  1. 计算效率高
  2. 很少的内存需求
  3. 梯度的对角线重缩放不变(这意味着亚当将梯度乘以仅带正因子的对角矩阵是不变的,以便更好地理解此堆栈交换)
  4. 非常适合数据和/或参数较大的问题
  5. 适用于非固定目标
  6. 适用于非常嘈杂和/或稀疏梯度的问题
  7. 超参数具有直观的解释,通常需要很少的调整

67、如何选择优化器

总结: 从针对手头问题类型的最常用的优化器开始。

  • 没有一个优化器是适用于所有类型的机器学习问题和模型架构的‘最佳’优化器。即使只是 比较优化器的性能也是一项艰巨的任务。 🤖

  • 坚持使用成熟、流行的优化器,尤其是在开始新项目时。

    • 理想情况下,选择用于同类问题的最常用优化器。
  • 做好关注选择的优化器的 *所有* 超参数的准备。

    • 具有更多超参数的优化器可能需要更多的调优工作才能找到最佳配置。

    • 当我们试图找到各种其他超参数(例如架构超参数)的最佳值时,将优化器超参数视为冗余参数是有意义的,这在项目的初始阶段尤其重要。

    • 在项目的初始阶段,从更简单的优化器开始会更可取(例如,具有固定动量的 SGD ) ,之后可以切换到更通用的优化器。

  • 常用且较为完善的优化器包括(但不限于):

68、如何选择BatchSize

通常来说,可用硬件支持的最大Batch Size是较为理想的数值。

  • Batch Size是决定训练时间计算资源消耗的关键因素。
  • 增加Batch Size通常会减少训练时间。这非常有益,因为它:
    • 能使固定时间间隔内超参数调整更彻底,最终训练出更好的模型。
    • 减少开发周期的延迟,能更多地测试新想法。
  • 资源消耗和Batch Size之间并没有明确的关系,增加Batch Size让资源消耗增加、减少或是保持不变都有可能。
  • Batch Size不应该被当作验证集性能的可调超参数。
    • 只要调整好所有超参数(尤其是学习率和正则化超参数)并且训练步数足够,理论上任意的Batch Size都能获得相同的最终性能

69、如何确定可行的Batch Size并估计训练吞吐量

对于每个Batch Size,我们应该训练足够长的时间以准确估计训练吞吐量

训练吞吐量 =每秒处理的样本数量

或者,我们可以估计每步时间 :

每步时间 =(Batch Size)/(训练吞吐量)

当加速器内存未饱和时,如果Batch Size加倍,训练吞吐量也应该加倍(或至少接近加倍)。等效地,随着Batch Size的增加,每步的时间应该是恒定的(或至少接近恒定的)。

  • 如果训练吞吐量到某个Batch Size之后就不再增加,那么我们只考虑使用该Batch Size(即使硬件支持更大的Batch Size)
    • 使用更大Batch Size的所有好处都假定训练吞吐量增加。如果没有,请修复瓶颈或使用较小的Batch Size。
    • 使用梯度积累技术可以支持的更大的Batch Size。但其不提供任何训练吞吐量优势,故在应用工作中通常应避免使用它。

70、如何选择合适的Batch Size以最小化训练时间

训练时间 =(每步时间)x(总步数)

对于所有可行的Batch Size,我们通常可以认为每步的时间近似恒定(实际上,增加Batch Size通常会产生一些开销)

Batch Size越大,达到某一性能目标所需的步数通常会减少(前提是在更改Batch Size时重新调整所有相关超参数

  • 例如,将Batch Size翻倍可能会使训练步数减半。这称为完美缩放
  • 完美缩放适用于Batch Size在临界值之前,超过该临界总步数的减少效果将会下降。
  • 最终,增加Batch Size不会再使训练步数减少(永远不会增加)。
  • 最小化训练时间的Batch Size通常是最大的Batch Size,也同时减少了所需的训练步数。
    • Batch Size取决于数据集、模型和优化器,除了通过实验为每个新问题找到它之外,如何计算它是一个悬而未决的问题。
    • 比较Batch Size时,请注意效果(epoch)预算(运行所有实验,固定训练样本的数量达到设定的效果所花的时间)和步数预算(运行设定步数的试验)之间的区别。
      • 将Batch Size与效果预算进行比较只会涉及到完美缩放的范围,即使更大的Batch Size仍可能通过减少所需的训练步数来提供有意义的加速。
    • 通常,可用硬件支持的最大Batch Size将小于临界Batch Size。因此,一个好的经验法则(不运行任何实验)是使用尽可能大的Batch Size。
  • 如果最终增加了训练时间,那么使用更大的Batch Size就没有意义了。

71、如何选择合适的Batch Size以最小化资源消耗

有两种类型的资源成本与增加 batch size有关:
1、前期成本,例如购买新硬件或重写训练工作流以实现多GPU/多TPU训练。
2、使用成本,例如,根据团队的资源预算计费,从云供应商处计费,电力/维护成本

资源消耗 = (每步的资源消耗) x (总步数)

增加 batch size通常可以减少总步骤数。资源消耗是增加还是减少,将取决于每步的消耗如何变化。
        增加 batch size可能会减少资源消耗。例如,如果大batch size的每一步都可以在与小batch size相同的硬件上运行(每一步只增加少量时间),那么每一步资源消耗的增加可能被步骤数的减少所抵消。
        增加 batch size可能不会改变资源消耗。例如,如果将batch size增加一倍,所需的步骤数减少一半,所使用的GPU数量增加一倍,总消耗量(以GPU小时计)将不会改变。
        增加 batch size可能会增加资源消耗。例如,如果增加batch size需要升级硬件,那么每步消耗的增加可能超过训练所需步数的减少。

72、更改Batch Size需要重新调整大多数超参数

  • 大多数超参数的最佳值对Batch Size敏感。因此,更改Batch Size通常需要重新开始调整过程。
  • 与Batch Size交互最强烈的超参数是优化器超参数(学习率、动量等)和正则化超参数,所以有必要对于针对每个Batch Size单独调整它们。
  • 在项目开始时选择Batch Size时请记住,如果您以后需要切换到不同的Batch Size,则为新的Batch Size重新调整所有内容可能会很困难、耗时且成本高昂。

73、应该使用哪种学习率衰减方案作为默认值?

linear decay或cosine decay,其他一些方案可能也不错

74、为什么有些论文有复杂的学习率衰减方案?

  • 许多复杂的 LR 衰减方案是根据验证集性能以临时方式调整衰减方案的结果:
    1. 使用一些简单的 LR 衰减(或恒定学习率)开始执行单次训练。
    2. 继续训练,直到性能提升似乎停滞为止。如果发生这种情况,请暂停训练。 从此时开始,使用可能更陡峭的 LR 衰减方案(或更小的恒定学习率)恢复它。 重复此过程,直到会议/发布截止日期。

75、Adam 的超参数应该如何调整?

并非 Adam 中的所有超参数都一样重要。 以下经验法则对应于研究中试验次数的不同“预算”。

  • 如果在一次研究中,训练次数试验次数小于10,那么只需要对基本学习率α进行调整。
  • 如果试验次数在10到25次之间, 那么需要对学习率以及β1 进行调整。
  • 如果试验次数在25次以上,那么需要对学习率、 β1 以及 ε进行调整。
  • 如果可以运行的试验次数大于25次,还需要额外调整 β2

76、常见训练不稳定模式的潜在修复方式

1、使用学习率预热,最适合用于早期训练不稳定的情况。

2、使用梯度截断,对于早期和中期训练中不稳定情况都有好处,可能会解决一些学习率预热无法解决的问题

3、尝试使用新的优化器,Adam 有时可以处理一些 Momentum 无法处理的不稳定影响。这也是该领域的一个活跃研究领域

4、添加残差连接和归一化

5、归一化应该是残差之前的最后一个操作。例如, x +Norm(f(x))

6、降低学习率,这是最终手段

77、学习率预热 warmup

大多数情况下,遇到 loss 变成 NaN 的情况大多数是由于学习率选择不当引起的

Warmup是在训练开始的时候先选择使用一个较小的学习率,训练了一些steps或者epoches,再修改为预先设置的学习来进行训练。

为什么使用Warmup?

刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。

应用场景:

(1)训练出现NaN:当网络非常容易nan时候,采用warm up进行训练,可使得网络正常训练;(2)过拟合:训练集损失很低,准确率高,但测试集损失大,准确率低,可用warm up;

78、卷积和池化后输出图片尺寸计算公式

1、卷积CNN

H(input)表示输入特征图的高
W(input)表示输入特征图的宽
C(input)表示输入特征图的通道数(如果是第一个卷积层则是输入图像的通道数,如果是中间的卷积层则是上一层的输出通道数
K表示输出通道数,就是过滤器的个数
F表示卷积核(过滤器)边长
S为步幅stride
P为padding
那么:

H(output)=(H(input)−F+2P)/S+1
W(output)=(Winput−F+2P)/S+1
C(output)=K

参数量:F×F×C(input)×K+K
注意C(input)只乘一次weights的参数量:F×F×C(input)×K,biases的参数量:K,二者相加。

2、池化

池化层的输出深度(通道数)与输入的深度相同

new_height = (input_height - filter_height)/S + 1
new_width = (input_width - filter_width)/S + 1

池化没有参数量,但是计算量是有的

3、全连接层FC

输出尺寸就是一个数,代表有多少个神经元N
参数量:N_in * N_out         输入维度为 N_in,输出维度为 N_out

若输入大小为32×32×3的图片,全连接层有500个节点,则一层全连接网络的参数量为w+b = 32×32×3×500+500

这个节点往往是自己设置,没有特定的规律。

79、了解哪些机器学习算法?

线性回归,kmeans,svm,神经网络,决策树,聚类,降维,后面的深度学习卷积神经网络,循环神经网络等。

80、跟踪算法deepsort

先用yolo进行每一帧的object的检测然后通过卡尔曼滤波进行位置精修,最后配合匈牙利算法进行前后两帧object的匹配

81、如何在模型训练的时候判断是否过拟合,及模型过拟合问题如何解决?

将训练数据划分为训练集和验证集,80% 用于训练集,20% 用于验证集(训练集和验证集一定不能相交);训练的时候每隔一定 Epoch 比较验证集但指标和训练集是否一致,如果不一致,并且验证集指标变差了,即意味着过拟合。

解决办法:
1、数据增强, 增加数据多样性;
2、正则化策略:如 Parameter Norm Penalties (参数范数惩罚), L1, L2 正则化;
3、模型融合, 比如 Bagging 和其他集成方法;
4、添加 BN(batch normalization)层或者 dropout 层(现在基本不用);
5、早停,Early Stopping (提前终止训练)。

82、如何在模型训练的时候判断是否欠拟合,及模型欠拟合问题如何解决?

欠拟合的表现就是模型不收敛,即训练过程中验证集的指标比较差,Loss 不收敛

解决办法:
1、寻找最优的权重初始化方案:如 He 正态分布初始化 he_normal,深度学习框架都内置了很多权重初始化方法
2、使用适当的激活函数:卷积层的输出使用的激活函数一般为 ReLu
3、选择合适的优化器和学习速率:SGD 优化器速度慢但是会达到最优

83、最新的目标检测算法有哪些?

YOLOv8系列

84、FLOPs计算公式

1、全连接层:

I是输入神经元个数
无bias:FLOPs=(2I−1)∗O
有bias:FLOPs=2I∗O

2、CNN:

无bias:FLOPs=(2Cin*​K*K−1)H*W*Cout​
有bias:FLOPs=(2Cin*​K*K)H*W*Cout​

3、分组卷积:

K*K * in_channel * out_channel * H * W/G

4、深度可分离卷积:
K*K * out_channel * H * w

85、anchor-free 和 anchor-based 区别

区别在于是否使用预定义的anchor框来匹配真实的目标框。
带有RPN网络或SS算法产生锚框的算法搜属于anchor-based方法。

anchor-based
深度学习目标检测通常都被建模成对一些候选区域进行分类和回归的问题。在单阶段检测器中,这些候选区域就是通过滑窗方式产生的 anchor;在两阶段检测器中,候选区域是 RPN 生成的 proposal,但是 RPN 本身仍然是对滑窗方式产生的 anchor 进行分类和回归。

anchor-free
anchor-free是通过另外一种手段来解决检测问题的。同样分为两个子问题,即确定物体中心和对四条边框的预测。预测物体中心时,将中心预测融入到类别预测的 target 里面,也可以预测一个 soft 的 centerness score。对于四条边框的预测,则比较一致,都是预测该像素点到 ground truth 框的四条边距离,不过会使用一些 trick 来限制 regress 的范围。

anchor-based

优点:可以产生密集的anchor box,使得网络可以直接进行目标分类和边界框回归,提高了目标召回能力,尤其对小目标检测有明显的提升。
缺点:需要设定很多超参数,如尺度、长宽比等,这些参数很难设计,并且会影响检测性能。另外,anchor based的方法也会产生很多冗余的框,增加了计算量和内存消耗。

anchor-free

优点:不需要预设anchor,只需要对不同尺度的特征图的目标中心点和宽高进行回归,减少了耗时和算力。可以避免一些由于anchor设置不合理导致的漏检或重复检测问题
缺点:由于每个位置只预测一个框,可能会导致一些重叠或遮挡区域无法被检测到。需要一些特殊的损失函数或结构来提高精度和稳定性。

86、Python的优点

写代码效率高,开发速度快,跨平台性好(一次开发,到处运行,Window、Linux、Mac上只要有python解析器,就可以运行python代码)。相对容易学习,开源项目多

87、有哪些压缩类型

tar: 知识把多个文件打包在一起,不算压缩格式。

zip:最常见的压缩格式,速度相对快些。

rar:文件压缩率比zip高,但是压缩速度慢,随机访问速度慢。

88、yolov7的改进

89、simOTA动态标签匹配(yolox)

1、找到样本选择区间(GT+5*5grid的区间)

2、计算区间内前10的iou之和后向下取整,记为a

3、取cost前a的为正样本,绝大概率在并集部分

4、取正样本的iou为最后的iou损失

90、CNN中感受野的计算

  • L_k表示第k层(相对于第0层的原始图像)的感受野大小
  • L_k-1表示第k-1层的感受野大小
  • f_k表示第k层的kernel size
  • s_i表示第i层的stride(步长);注意连乘号上标,不包括当前k层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值