2022-02-目标检测算法面试问题汇总

1说一下非极大值抑制(NMS)

用处:本质是搜索局部极大值,抑制非极大值元素。
原理:
NMS为非极大值抑制,用来抑制检测时冗余的框。
大致算法流程为:
@1.对所有预测框的置信度降序排序
@2.选出置信度最高的预测框,确认其为正确预测,并计算他与其他预测框的IOU
@3.根据2中计算的IOU去除重叠度高的,IOU>threshold阈值就删除
@4.剩下的预测框返回第1步,直到没有剩下的为止(需要注意的是:Non-Maximum Suppression一次处理一个类别,如果有N个类别,Non-Maximum Suppression就需要执行N次。)

假设两个目标靠的很近,则会识别成一个bbox,会有什么问题,怎么解决?

@当两个目标靠的非常近时,置信度低的会被置信度高的框抑制掉,从而两个目标靠的非常近时会被识别成一个bbox。为了解决这个问题,可以使用softNMS(基本思想:用稍低一点的分数来代替原有的分数,而不是直接置零)

2为什么提出anchor box?

主要有两个原因:一个窗口只能检测一个目标、无法解决多尺度问题。
目前anchor box尺寸的选择主要有三种方式:人为经验选取、k-means聚类、作为超参数进行学习
为什么使用不同尺寸和不同长宽比? 为了得到更大的交并比(IOU)。

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

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

Faster RCNN怎么筛选正负anchor

我们给两种锚点分配一个正标签:(i)具有与实际边界框的重叠最高交并比(IoU)的锚点,(ii)具有与实际边界框的重叠超过0.7 IoU的锚点。IoU比率低于0.3,我们给非正面的锚点分配一个负标签。

4简要阐述一下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,只是回传影响的部分不一样。)
目标检测的发展历程,从传统到深度(传统部分回答的算子结合分类器分类,简单说了一下缺陷,深度部分说了RCNN,FAST,FASTER,SSD,YOLO,FPN,MASK RCNN,Cascade RCNN,都简单的介绍了一下)传统目标检测:主线:区域选择->特征提取->分类器
传统的做目标检测的算法基本流程如下:

  1. 使用不同尺度的滑动窗口选定图像的某一区域为候选区域;
  2. 从对应的候选区域提取如Harr HOG LBP LTP等一类或者多类特征;
  3. 使用Adaboost SVM 等分类算法对对应的候选区域进行分类,判断是否属于待检测的目标。
    缺点:1)基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余2)手工设计的特征对于多样性的变化没有很好的鲁棒性

5YOLOV1、YOLOV2、YOLOV3复述一遍 YOLOv1到v3的发展历程以及解决的问题。

YOLO系列算法是一类典型的one-stage目标检测算法,其利用anchor box将分类与目标定位的回归问题结合起来,从而做到了高效、灵活和泛化性能好。YOLOv1:YOLOv1的核心思想就是利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别。
YOLOv1的基本思想是把一副图片,首先reshape成448×448大小(由于网络中使用了全连接层,所以图片的尺寸需固定大小输入到CNN中),然后将划分成SxS个单元格(原文中S=7),以每个格子所在位置和对应内容为基础,来预测检测框和每个框的Confidence以及每个格子预测一共C个类别的概率分数。

创新点:
  1. 将整张图作为网络的输入,直接在输出层回归bounding box的位置和所属的类别
  2. 速度快,one stage detection的开山之作损失函数设计细节: YOLOv1对位置坐标误差,IoU误差,分类误差均使用了均方差作为损失函数。激活函数(最后一层全连接层用线性激活函数,其余层采用leak RELU)
缺点:
  1. 首先,每个单元格只预测2个bbox,然后每个单元格最后只取与gt_bbox的IOU高的那个最为最后的检测框,也只是说每个单元格最多只预测一个目标。
  2. 损失函数中,大物体 IOU 误差和小物体 IOU 误差对网络训练中 loss 贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的 IOU 误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。
  3. 由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率的图片。
  4. 和two-stage方法相比,没有region proposal阶段,召回率较低
    YOLOv2: YOLOv2又叫YOLO9000,其能检测超过9000种类别的物体。相比v1提高了训练图像的分辨率;引入了faster rcnn中anchor box的想,对网络结构的设计进行了改进,输出层使用卷积层替代YOLO的全连层,联合使用coco物体检测标注数据和imagenet物体分类标注数据训练物体检测模型。
YOLOv3:

YOLOv3总结了自己在YOLOv2的基础上做的一些尝试性改进,有的尝试取得了成功,而有的尝试并没有提升模型性能。其中有两个值得一提的亮点,一个是使用残差模型,进一步加深了网络结构;另一个是使用FPN架构实现多尺度检测。
改进点:
1.多尺度预测 (类FPN):每种尺度预测3个box, anchor的设计方式仍然使用聚类,得到9个聚类中心。
2.更好的基础分类网络(ResNet)和分类器 darknet-53。
3.用逻辑回归替代softmax作为分类器。
(1)yolo的预测框是什么值(x,y,w,h)
(2)YOLOv2中如何通过K-Means得到anchor boxes卷积神经网络具有平移不变性,且anchor boxes的位置被每个栅格固定,因此我们只需要通过k-means计算出anchor boxes的width和height即可
(3)YOLOv3框是怎么聚出来的? YOLOv3有没有很致命的问题?
yolov3通过聚类的方式自定义anchor box的大小,在一定程度上,这可以提高定位的准确率。缺点: 识别物体位置精准性差,召回率低(在每个网格中预测两个bbox这种约束方式减少了对同一目标的多次检测)
(4)YOLO系列anchor的设计原理,kmeans的原理,anchor距离如何度量,如何改进k-means原理:
K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。由于从标记文件的width,height计算出的anchor boxes的width和height都是相对于整张图片的比例(w=anchor_width*****input_width/downsamples h=anchor_height*input_height/downsamples)

6.简要阐述一下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的致命缺点,如何改进SSD主要缺点:

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

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

7简要阐述一下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。

8faster rcnn和yolo,ssd之间的区别和联系

1.针对之前RCNN系列selective search的方法导致算法没有实时性,所以faster rcnn提出RPN网络来取代之前的方法,可以理解为fasterrcnn=fast rcnn+rpn网络,且rpn网络和fast rcnn的分类,回归网络共用特征提取层,这样使得引入RPN网络不会增加太多计算量。整体流程为先使用RPN网络找出可能存在object的区域,再将这些区域送入fast rcnn中进一步定位和分类。所以faster rcnn是典型的Two stage算法。因为faster rcnn中包含了两次定位,所以其精度一般高于YOLO和SSD算法,所以速度一般慢于YOLO和SSD。
2.YOLO算法的特点是将检测问题转换成回归问题,即YOLO直接通过回归一次既产生坐标,又产生每种类别的概率。YOLO中将每张图分成7*7的网格,每个网格默认可能属于2个object,即在一张图片上提取98个region proposal,相比于faster rcnn使用Anchor机制提取20k个anchor再从中提取最终的300个region proposal,所以faster rcnn的精度比YOLO要高,但是由于需要处理更多region proposal,所以faster rcnn的速度要比YOLO慢。
3.SSD相比于faster rcnn使用了多层网络特征,而不仅仅使用最后一层feature map。SSD还借鉴了YOLO算法中将检测任务转换为回归任务的思想,且SSD也借鉴了faster rcnn中的anchor机制,只是SSD的anchor不是每个位置的精调,而是类似于YOLO那样在feature map上分割出网格,在网格上产生anchor。但是SSD和YOLO不需要selective search步骤,所以SSD和YOLO同属于One-Stage算法。

阐述一下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分支。

9分析一下SSD,YOLO,Faster rcnn等常用检测网络对小目标检测效果不好的原因

SSD,YOLO等单阶段多尺度算法,小目标检测需要较高的分辨率,
1 SSD对于高分辨的低层特征没有再利用,而这些层对于检测小目标很重要。按SSD的设计思想,其实SSD对小目标应该有比较好的效果,但是需要重新精细设计SSD中的default box,比如重新设计min_sizes参数,扩大小default box的数量来cover住小目标。但是随着default box数量的增加,网络速度也会降低。
2 YOLO网络可以理解为是强行把图片分割成7*7个网格,每个网格预测2个目标,相当于只有98个anchor,所以不管是小目标,还是大目标,YOLO的表现都不是很理想,但是由于只需处理少量的anchor,所以YOLO的速度上有很大优势。
3 Faster rcnn系列对小目标检测效果不好的原因是faster rcnn只用卷积网络的最后一层,但是卷积网络的最后一层往往feature map太小,导致之后的检测和回归无法满足要求。甚至一些小目标在最后的卷积层上直接没有特征点了。所以导致faster rcnn对小目标检测表现较差。

10手写计算IOU代码

有两个框,设第一个框的两个关键点坐标:(x1,y1)(X1,Y1),第二个框的两个关键点坐标:(x2,y2)(X2,Y2)。以大小写来区分左上角坐标和右下角坐标。首先,要知道两个框如果有交集,一定满足下面这个公式:max(x1,x2)<=min(X1,X2) && max(y1,y2)<=min(Y1,Y2)!!!!

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

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

12 anchor设置的意义:

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

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

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

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

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

15 阐述一下如何检测小物体

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

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

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

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

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

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

17 如果有很长,很小,或者很宽的目标,应该如何处理目标检测中如何解决目标尺度大小不一的情况 小目标不好检测,有试过其他的方法吗?

吗?
比如裁剪图像进行重叠小目标不好检测的两大原因:
1)数据集中包含小目标的图片比较少,导致模型在训练的时候会偏向medium和large的目标。
2)小目标的面积太小了,导致包含目标的anchor比较少,这也意味着小目标被检测出的概率变小。
改进方法:
1)对于数据集中含有小目标图片较少的情况,使用过度采样(oversample)的方式,即多次训练这类样本。
2)对于第二类问题,则是对于那些包含小物体的图像,将小物体在图片中复制多分,在保证不影响其他物体的基础上,人工增加小物体在图片中出现的次数,提升被anchor包含的概率。
3)使用FPN;
4)RPN中anchor size的设置一定要合适,这样可提高proposal的准确率
5)对于分辨率很低的小目标,我们可以对其所在的proposal进行超分辨率,提升小目标的特征质量,更有利于小目标的检测。

18 介绍YOLO,并且解释一下YOLO为什么可以这么快?

yolo是单阶段检测算法的开山之作,最初的yolov1是在图像分类网络的基础上直接进行的改进,摒弃了二阶段检测算法中的RPN操作,直接对输入图像进行分类预测和回归,所以它相对于二阶段的目标检测算法而言,速度非常的快,但是精度会低很多;但是在迭代到目前的V4、V5版本后,yolo的精度已经可以媲美甚至超过二阶段的目标检测算法,同时保持着非常快的速度,是目前工业界内最受欢迎的算法之一。yolo的核心思想是将输入的图像经过backbone特征提取后,将的到的特征图划分为S x S的网格,物体的中心落在哪一个网格内,这个网格就负责预测该物体的置信度、类别以及坐标位置。

19 介绍一下YOLOv3的原理?

yolov3采用了作者自己设计的darknet53作为主干网络,darknet53借鉴了残差网络的思想,与resnet101、resnet152相比,在精度上差不多的同时,有着更快的速度,网络里使用了大量的残差跳层连接,并且抛弃了pooling池化操作,直接使用步长为2的卷积来实现下采样。
在特征融合方面,为了加强小目标的检测,引入了类似与FPN的多尺度特征融合,特征图在经过上采样后与前面层的输出进行concat操作,浅层特征和深层特征的融合,使得yolov3在小目标的精度上有了很大的提升。
yolov3的输出分为三个部分,首先是置信度、然后是坐标信息,最后是分类信息。在推理的时候,特征图会等分成S x S的网格,通过设置置信度阈值对格子进行筛选,如果某个格子上存在目标,那么这个格子就负责预测该物体的置信度、坐标和类别信息。

20 YOLO、SSD和Faster-RCNN的区别,他们各自的优势和不足分别是什么?

YOLO、SSD和Faster-RCNN都是目标检测领域里面非常经典的算法,无论是在工业界还是学术界,都有着深远的影响;Faster-RCNN是基于候选区域的双阶段检测器代表作,而YOLO和SSD则是单阶段检测器的代表;在速度上,单阶段的YOLO和SSD要比双阶段的Faster-RCNN的快很多,而YOLO又比SSD要快,在精度上,Faster-RCNN精度要优于单阶段的YOLO和SSD;不过这也是在前几年的情况下,目标检测发展到现在,单阶段检测器精度已经不虚双阶段,并且保持着非常快的速度,现阶段SSD和Faster-RCNN已经不更了,但是YOLO仍在飞快的发展,目前已经迭代到V4、V5,速度更快,精度更高,在COCO精度上双双破了50map,这是很多双阶段检测器都达不到的精度,而最近的Scale yolov4更是取得了55map,成功登顶榜首。当然虽然SSD和Faster-RCNN已经不更了,但是有很多他们相关的变体,同样有着不错的精度和性能,例如Cascade R-CNN、RefineDet等等。

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

CenterNet是属于anchor-free系列的目标检测算法的代表作之一,与它之前的目标算法相比,速度和精度都有不小的提高,尤其是和yolov3相比,在速度相同的情况下,CenterNet精度要比yolov3高好几个点。它的结构非常的简单,而且不需要太多了后处理,连NMS都省了,直接检测目标的中心点和大小,实现了真正的anchor-free。
CenterNet论文中用到了三个主干网络:ResNet-18、DLA-34和Hourglass-104,实际应用中,也可以使用resnet-50等网络作为backbone;CenterNet的算法流程是:一张512512(1x3x512x512)的图片输入到网络中,经过backbone特征提取后得到下采样32倍后的特征图(1x2048x16x16),然后再经过三层反卷积模块上采样到128128的尺寸,最后分别送入三个head分支进行预测:分别预测物体的类别、长宽尺寸和中心点偏置。其中推理的核心是从headmap中提取需要的bounding box,通过使用3*3的最大池化,检查当前热点的值是否比周围的8个临近点值都大,每个类别取100个这样的点,经过box后处理后再进行阈值筛选,得到最终的预测框。

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

目前大多数深度学习算法模型要落地对算力要求还是比较高的,如果在服务器上,可以使用GPU进行加速,但是在边缘端或者算力匮乏的开发板子上,不得不对模型进一步的压缩或者改进,也可以针对特定的场景使用市面上现有的推理优化加速框架进行推理。目前来说比较常见的几种部署方案为:
nvidia GPU:pytorch->onnx->TensorRT
intel CPU: pytorch->onnx->openvino
移动端(手机、开发板等):pytorch->onnx->MNN、NCNN、TNN、TF-lite、Paddle-lite、RKNN等

  1. 搭环境
    依赖库:动态库 *.o *.lib (官方) (开发环境是什么库,推理环境就得是什么库,不然可能发生不兼容)
    配置环境变量:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH (依赖库路径)

  2. 转模型
    pytorch->onnx->tensorRT

  3. 推理模型
    (1) 读取模型文件 根据每个框架的API
    (2) 送入输入数据 opencv 应该和原工程保持一致 Anchor, Mean(0.485, 0.456, 0.406), Std(1/255)
    (3) 推理模型 根据每个框架的API
    (4) 获取输出结果 根据API
    (5) 后处理 (1) 输出的是一个什么样的数据,它的形状是多少 (2) 知道输出的格式

  4. 模型部署难点:

  5. 模型大小 -> 量化(float16、int8)、蒸馏、剪枝

  6. 算子不适配 -> 根据框架提供的API来开发算子实现跑在硬件资源上

  7. 推理时间 -> 模型大小、模型层的复杂度、量化

  8. 当前部署场景精度 -> 训练事情

  9. 后处理 -> 写到对应框架里面去,调用框架本身对应的硬件资源(GPU, NPU, TPU)

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

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

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

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

24 介绍一下yolov5

yolov5和v4都是在v3基础上改进的,性能与v4基旗鼓相当,但是从用户的角度来说,易用性和工程性要优于v4,
v5的原理可以分为四部分:
输入端、backbone、Neck、输出端;
1、输入端:针对小目标的检测,沿用了v4的mosaic增强,当然这个也是v5作者在他复现的v3上的原创,对不同的图片进行随机缩放、裁剪、排布后进行拼接;
2、是自适应锚框计算,在v3、v4中,初始化锚框是通过对coco数据集的进行聚类得到,v5中将锚框的计算加入了训练的代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值;
3、backbone:沿用了V4的CSPDarkNet53结构,但是在图片输入前加入了Focus切片操作,CSP结构实际上就是基于Densnet的思想,复制基础层的特征映射图,通过dense block发送到下一个阶段,从而将基础层的特征映射图分离出来。这样可以有效缓解梯度消失问题,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。在V5中,提供了四种不同大小的网络结构:s、m、l、x,通过depth(深度)和width(宽度)两个参数控制。
4、Neck:采用了SPP+PAN多尺度特征融合,PAN是一种自下而上的特征金字塔结构,是在FPN的基础上进行的改进,相对于FPN有着更好的特征融合效果。
5、输出端:沿用了V3的head,使用GIOU损失进行边框回归,输出还是三个部分:置信度、边框信息、分类信息。

25 在你的项目中为什么选用yolov5模型而不用v4?

yolov4和v5都是yolo系列性能非常优秀的算法,性能上不分伯仲,而且最近出来的scale yolov4更是达到了55的map。在项目中选择v5的原因是因为在v4、v5出来之前,就一直在用U版的yolov3,相对于原版的v3,做了很多改进,而V5是在这个hub的基础上改进的,用起来上手比较快,而且代码和之前的v3相似度很高,可以无缝对接以前的项目。另一方面,v5可选的模型比较多,在速度和精度上对比v4有一定的优势,而且模型采用半精度存储,模型很小,训练和推理上都很友好。通常用s或者m版本的基本上都可以满足项目需求。
比较官方一点的回答:
1、使用Pytorch框架,对用户非常友好,能够方便地训练自己的数据集,相对于YOLOV4采用的Darknet框架,Pytorch框架更容易投入生产。
2、代码易读,整合了大量的计算机视觉技术,非常有利于学习和借鉴。
不仅易于配置环境,模型训练也非常快速,并且批处理推理产生实时结果。
3、 能够直接对单个图像,批处理图像,视频甚至网络摄像头端口输入进行有效推理。
4、 能够轻松的将Pytorch权重文件转化为安卓使用的ONXX格式,然后可以转换为OPENCV的使用格式,或者通过CoreML转化为IOS格式,直接部署到手机应用端。
5、最后YOLO V5s高达140FPS的对象识别速度令人印象非常深刻,使用体验非常棒。

26 介绍yolov5中Focus模块的原理和作用

Focus模块将W、H信息集中到通道空间,输入通道扩充了4倍,作用是可以使信息不丢失的情况下提高计算力。

具体操作为把一张图片每隔一个像素拿到一个值,类似于邻近下采样,这样我们就拿到了4张图,4张图片互补,长的差不多,但信息没有丢失,拼接起来相当于RGB模式下变为12个通道,通道多少对计算量影响不大,但图像缩小,大大减少了计算量。
以Yolov5s的结构为例,原始640×640×3的图像输入Focus结构,采用切片操作,先变成320×320×12的特征图,再经过一次32个卷积核的卷积操作,最终变成320×320×32的特征图。

27 yolov4和v5均引入了CSP结构,介绍一下它的原理和作用

CSP结构是一种思想,它和ResNet、DenseNet类似,可以看作是DenseNet的升级版,它将feature map拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行concate。主要解决了三个问题:

  1. 增强CNN的学习能力,能够在轻量化的同时保持着准确性;
  2. 降低计算成本;
  3. 降低内存开销。CSPNet改进了密集块和过渡层的信息流,优化了梯度反向传播的路径,提升了网络的学习能力,同时在处理速度和内存方面提升了不少。
    强CNN学习能力的Backbone:CSPNet

28 你还了解当下哪些比较流行的目标检测算法?

目前比较流行的目标检测算法有以下几种类型,不局限于这几种:

anchor-based:yolov3、yolov4、yolov5、pp-yolo、SSD、Faster-R-CNN、Cascade R-CNN、EfficientDet,RetinaNet、MTCNN;
anchor-free:CornerNet、CenterNet、CornerNet-lite、FCOS;
transform:DETR; mobile-detector:mobileNet-yolo、mobileNet-SSD、tiny-yolo、nanodet、yolo-fastest、YOLObile、mobilenet-retinaNet、MTCNN;

还有很多很多。。。mmdetection里面就实现了几十种,可以去看一看,这里面最想总结的是移动端的det,很多都是一些大佬在原生算法基础上的改进,有时间出一篇文章专门记录这个类型的检测器。

29 EfficentDet为什么可以做到速度兼精度并存 ?

30 介绍Faster R-CNN和Cascade R-CNN

Faster-RCNN是基于候选区域的双阶段检测器代表作,总的来说可以分为四部分:首先是主干卷积网络的特征提取,然后是RPN层,RPN层通过softmax判断anchors属于positive或者negative,再利用边框回归修正anchors获得精确的候选区域,RPN生成了大量的候选区域,这些候选区域和feature maps一起送入ROI pooling中,得到了候选特征区域,最后送入分类层中进行类别判断和边框回归,得到最终的预测结果。Cascade R-CNN算法是在Faster R-CNN上的改进,通过级联几个检测网络达到不断优化预测结果的目的,预普通的级联不同,Cascade R-CNN的几个检测网络是基于不同的IOU阈值确定的正负样本上训练得到的。简单来说cascade R-CNN是由一系列的检测模型组成,每个检测模型都基于不同IOU阈值的正负样本训练得到,前一个检测模型的输出作为后一个检测模型的输入,因此是stage by stage的训练方式,而且越往后的检测模型,其界定正负样本的IOU阈值是不断上升的。

31 SSD相比于YOLO做了哪些改进?

这里说的是SSD相对于YOLOv1的改进,因为现在SSD已经不更了,但是YOLO还如日中天,已经发展到v5,性能在目标检测算法里一骑绝尘。那么最原始的SSD相对于YOLOv1做了哪些改进呢?
1、SSD提取了不同尺度的特征图来做检测,而YOLO在检测是只用了最高层的Feature maps;
2、 SSD引入了Faster-RCNN的anchor机制,采用了不同尺度和长宽比的先验框;SSD网络结构是全卷积,采用卷积做检测,YOLO用到了FC(全连接)层;
SSD算法流程;
3、 输入一幅图,让图片经过卷积神经网络(VGG)提取特征,生成feature map 抽取其中六层的feature map,然后分别在这些feature map层上面的每一个点构造
4、个不同尺度大小的default box,然后分别进行检测和分类(各层的个数不同,但每个点都有) 将生成的所有default box都集合起来,全部丢到NMS中,输出筛选后的default box。

32 了解哪些开源的移动端轻量型目标检测?

轻量型的目标检测其实有很多,大多数都是基于yolo、SSD的改进,当然也有基于其他算法改的;比较常用的改进方法是使用轻量型的backbone替换原始的主干网络,例如mobilenet-ssd、mobilenet-yolov3、yolo-fastest、yolobile、yolo-nano、nanodet、tiny-yolo等等,在减少了计算量的同时保持着不错的精度,经过移动部署框架推理后,无论是在服务器还是移动端都有着不错的精度和速度

33 对于小目标检测,你有什么好的方案或者技巧?

1、图像金字塔和多尺度滑动窗口检测(MTCNN)
2、多尺度特征融合检测(FPN、PAN、ASFF)
3、增大训练、检测图像分辨率;
4、超分策略放大后检测;

34 介绍一下NMS和IOU的原理;

NMS全称是非极大值抑制,顾名思义就是抑制不是极大值的元素。在目标检测任务中,通常在解析模型输出的预测框时,预测目标框会非常的多,其中有很多重复的框定位到了同一个目标,NMS的作用就是用来除去这些重复框,从而获得真正的目标框。而NMS的过程则用到了IOU,IOU是一种用于衡量真实和预测之间相关度的标准,相关度越高,该值就越高。IOU的计算是两个区域重叠的部分除以两个区域的集合部分,
简单的来说就是交集除以并集。在NMS中,首先对预测框的置信度进行排序,依次取置信度最大的预测框与后面的框进行IOU比较,当IOU大于某个阈值时,可以认为两个预测框框到了同一个目标,而置信度较低的那个将会被剔除,依次进行比较,最终得到所有的预测框。

35 目标检测中如何处理正负样本不平衡的问题?

那么正负样本不均衡,会带来什么问题呢?
1、训练效率低下
2、模型精度变低。 过多的负样本会主导训练,使模型退化。

36 yolov3为什么这么快?

yolov3和SSD比网络更加深了,虽然anchors比SSD少了许多,但是加深的网络深度明显会增加更多的计算量,那么为什么yolov3会比SSD快3倍?
SSD用的很老的VGG16,V3用的其最新原创的Darknet,darknet-53与resnet的网络结构,darknet-53会先用1x1的卷积核对feature降维,随后再利用3x3的卷积核升维,这个过程中,就会大大降低参数的计算量以及模型的大小,有点类似于低秩分解。究其原因是做了很多优化,比如用卷积替代替代全连接,1X1卷积减小计算量等。

37 基于Anchor-base的目标检测算法相对于基于Anchor-free的目标检测算法有什么缺陷?

1、基于Anchor-base的目标检测算法需要在训练前通过聚类决定一系列的anchor,这些anchor具有很强的领域性,泛化差;
2、 anchor机制增加了detection heads的复杂性,增加了预测数量,这在边缘AI系统中,是一个瓶颈。

anchor-free在yolox中的做法是:

在每个位置只预测一次,预测四个值:左上角xy坐标的偏移、宽、高。将中心3X3=9的区域设置为正样本,称作:center sampling.

37 什么是梯度消失和梯度爆炸问题?

在反向传播过程中需要对激活函数进行求导,如果导数大于1,那么随着网络层数的增加梯度更新将会朝着指数爆炸的方式增加这就是梯度爆炸。同样如果导数小于1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少这就是梯度消失。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。

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

1、预训练加微调
2、权重正则化: 针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
3、relu、leakrelu、elu等激活函数
4、batch normalization :具有加速网络收敛速度,提升训练稳定性的效果。
反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。
5、LSTM
6、残差结构

参考文献:https://zhuanlan.zhihu.com/p/51490163

你可能感兴趣的:(2022-02-目标检测算法面试问题汇总)