面试真题总结:Faster Rcnn,目标检测,卷积,梯度消失,Adam算法
目标检测可以分为两大类,分别是什么,他们的优缺点是什么呢?
答案:目标检测算法分为单阶段和双阶段两大类。单阶段目标验测算法(one-stage),代表算法有 yolo 系列,SSD 系列;直接对图像进行计算生成检测结果,检测速度快,但检测精度低。双阶段目标验测算法(two-stage),代表算法 RCNN 系列;先对图像提取候选框,然后基于候选区域做二次修正得到检测点结果,检测精度较高,但检测速度较慢。【单阶段偏应用,因为在精度没有差很多的情况下,速度很快,就会选择单阶段目标检测算法;双阶段偏比赛,只注重精度高低,速度不考虑】
Faster Rcnn,为什么设置RPN这个层?RPN如果没有的话,他会对大目标更好还是对小目标更好?问的是roi这一层呢?
答案:RPN的作用是生成合适的region proposals。网络结构分为一个卷积层和一个两分支的网络,其中一个分支是softmax分类网络,另一个用于bbox回归。具体的步骤是:生成anchors -> softmax分类器提取 positive anchors -> 对positive anchors进行bbox 回归 -> Proposal Layer综合所有 positive anchors及其偏移量用来生成更精确的proposals。RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。 20000 然后用cnn去找出其中的positive anchors并对它进行回归,使得框的大小和位置更准确。生成anchor的过程:特征图上每个点都配备k个anchor,然后对每个anchor要做二分类和四个值的回归。
目标检测预测的时候为什么都会用到NMS?
NMS,一句话概括就是去除重复的检测框。非极大值抑制,顾名思义就是抑制不是极大值的元素,在目标检测中,就是提取置信度高的目标检测框,而抑制置信度低的误检框。使用深度学习模型会检测出很多目标框,具体数量由anchor数量决定,其中有很多重复的框定位到同一个目标,nms用来去除这些重复的框,获得真正的目标框。
NMS代码实现:
import numpy as np def NMS(dects,threshhold): """ input: detcs:二维数组(n_samples,5),5列:x1,y1,x2,y2,score threshhold: IOU阈值 """ x1=dects[:,0] y1=dects[:,1] x2=dects[:,2] y2=dects[:,3] score=dects[:,4] ndects=dects.shape[0]#box的数量 area=(x2-x1+1)*(y2-y1+1) order=score.argsort()[::-1] #score从大到小排列的indexs,一维数组 keep=[] #保存符合条件的index suppressed=np.array([0]*ndects) #初始化为0,若大于threshhold,变为1,表示被抑制 for _i in range(ndects): i=order[_i] #从得分最高的开始遍历 if suppressed[i]==1: continue keep.append(i) for _j in range(i+1,ndects): j=order[_j] if suppressed[j]==1: #若已经被抑制,跳过 continue xx1=np.max(x1[i],x1[j])#求两个box的交集面积interface yy1=np.max(y1[i],y1j]) xx2=np.min(x2[i],x2[j]) yy2=np.min(y2[i],y2[j]) w=np.max(0,xx2-xx1+1) h=np.max(0,yy2-yy1+1) interface=w*h overlap=interface/(area[i]+area[j]-interface) #计算IOU(交/并) if overlap>=threshhold:#IOU若大于阈值,则抑制 suppressed[j]=1 return keep 【dects自己随便设置个数组测试即可】
卷积网络里的感受野是什么意思?
在卷积神经网络CNN中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野。用数学的语言感受野就是CNN中的某一层输出结果的一个元素对应输入层的一个映射。再通俗点的解释是,feature map上的一个点对应输入图上的区域。
你都知道什么激活函数?
https://blog.csdn.net/weixin_46112766/article/details/109255872
梯度消失有什么办法规避么?如何确定是否出现梯度爆炸?
首先我们要知道什么情况属于发生了梯度消失现象,如:模型无法从训练数据中获得更新(如低损失);模型不稳定,导致更新过程中的损失出现显著变化;训练过程中,模型损失变成 NaN。
解决办法:
-
重新设计网络模型
梯度爆炸可以通过重新设计层数更少的网络来解决。使用更小的批尺寸
(batchsize)
对网络训练也有好处。另外也许是学习率(learning rate)
过大导致的问题,减小学习率。 -
使用 ReLU 激活函数
梯度爆炸的发生可能是因为激活函数,如之前很流行的Sigmoid和Tanh函数。使用ReLU激活函数可以减少梯度爆炸。采用ReLU激活函数是最适合隐藏层的,是目前使用最多的激活函数。
relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。relu的主要贡献在于解决了梯度消失、爆炸的问题计算方便,计算速度快,加速了网络的训练同时也存在一些缺点:由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)输出不是以0为中心的
-
使用leaky relu
leak relu就是为了解决relu的0区间带来的影响,而且包含了relu的所有优点,其数学表达为: l e a k y r e l u = m a x ( k ∗ x , x ) leaky relu = max(k*x,x) leakyrelu=max(k∗x,x);其中k是leaky系数,一般选择0.01或者0.02,或者通过学习而来。
-
使用elu激活函数
解决relu的0区间带来的影响,其数学表达为:
使用elu相对于leaky relu,计算更消耗时间一些。
-
使用梯度截断(Gradient Clipping)
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
-
使用权重正则化(Weight Regularization)
如果梯度爆炸仍然存在,可以尝试另一种方法,即检查网络权重的大小,并惩罚产生较大权重值的损失函数。该过程被称为权重正则化,通常使用的是 L1 惩罚项(权重绝对值)或 L2 惩罚项(权重平方)。比如在tensorflow中,若搭建网络的时候已经设置了正则化参数,则调用以下代码可以直接计算出正则损失:
regularization_loss = tf.add_n(tf.losses.get_regularization_losses(scope='my_resnet_50'))
正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式: L o s s = ( y − W T x ) 2 + α ∣ ∣ W ∣ ∣ 2 Loss = (y-W^Tx)^2+\alpha||W||^2 Loss=(y−WTx)2+α∣∣W∣∣2,其中,α 是指正则项系数,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。
事实上,在深度神经网络中,往往是梯度消失出现的更多一些。
-
预训练加finetunning
其基本思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,这就是逐层预训练。在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。现在基本都是直接拿imagenet的预训练模型直接进行finetunning。
-
批量归一化
Batchnorm具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
-
残差结构
残差网络的出现导致了image net比赛的终结,自从残差提出后,几乎所有的深度网络都离不开残差的身影,相比较之前的几层,几十层的深度网络,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分,残差网络通过加入 shortcut connections,变得更加容易被优化。包含一个 shortcut connection 的几层网络被称为一个残差块(residual block),如下图:
Adam算法你了解了么?
Adam是对随机梯度下降算法的扩展,Adam使用动量和自适应学习率来加快收敛速度。随机梯度下降保持一个单一的学习速率(称为alpha),用于所有的权重更新,并且在训练过程中学习速率不会改变。每一个网络权重(参数)都保持一个学习速率,并随着学习的展开而单独地进行调整。Adam方法则是从梯度的第一次和第二次矩的预算来计算不同参数的自适应学习速率。
解释下梯度下降?
https://blog.csdn.net/weixin_46112766/article/details/112308601
softmax的函数一般用在哪里?怎么计算的,softmax的函数输出的结果是个标量还是个向量?
softmax函数一般用在分类任务的最后一层,进行一个概率化的输出。结果是一个向量,具体计算请看激活函数篇文章。
损失函数的意思是什么?
https://blog.csdn.net/weixin_46112766/article/details/111314068
数据量是多少? 多少张(2000张),数据输入的时候大小大概多大,即图像大小多大?是320*320还是224#224?你有没有测过你的帧率是多少,多少毫秒一张图像,那你的主干网络用的是什么?
参考答案:数据量1-2w张左右,帧率20-30之间比较好,主干网络就是一些常见的经典网络。
此题目是开放性题目,根据自己的项目情况回答即可。
大概讲下deepsort的流程是什么?指标是多少?
deepsort通过yolo等网络进行检测,然后检测出来的物体再通过卡尔曼滤波进行位置修正,最后匈牙利算法对前后帧的框进行匹配。
具体的deepsort,只运行 yolo 检测, 速率大概为 11-13 fps, 添加 deep_sort 多目标追踪后, 速率大概为 11.5 fps (显卡 GTX1060.)
fps:每秒钟能传输多少帧
机器学习了解么?了解哪些机器学习算法?
线性回归,kmeans,svm,神经网络,后面的深度学习卷积神经网络,循环神经网络等。
Faster-RCNN的结构是什么?
首先,Faster RCNN主要分为四个部分:卷积层(backbone)、Region Proposal Networks、roi pooling和最后的分类回归网络。
卷积层就是一般的分类模型,比如VGG-16和ResNet-101。在图片输入到卷积层之前,会先resize到一定的尺寸,然后利用卷积层提取特征图。
RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
Roi Pooling收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
最后的分类回归模块利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。回归的损失函数是smooth L1 loss,分类的损失函数是交叉熵损失。
anchor(就是检测出来的那个框)是怎么生成的?在每个网格上是怎么生成的?
Faster rcnn中Anchor生成过程:Faster R-CNN中的Anchor有3种不同的尺度128×128,256×256,512×512 ,3种形状也就是不同的长宽比W:H=1:1,1:2,2:1,这样Feature Map中的点就可以组合出来9个不同形状不同尺度的Anchor Box。
Faster R-CNN进行Anchor Box生成的Feature Map是原图下采样16倍得到的,这样不同的长宽比实际上是将面积为16×16的区域,拉伸为不同的形状,如下图:
不同的ratio生成的边框的面积是相同的,具有相同的大小。三种不同的面积(尺度),实际上是将上述面积为16×16的区域进行放大或者缩小。128×128是16×16放大8倍;256×256是放大16倍;512×512则是放大32倍。如下图:
Yolo Anchor:YOLO v2,v3的Anchor Box 的大小和形状是通过对训练数据的聚类得到的。
采用标准的k-means方法。官方的 V2,V3的Anchor
anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 (yolo v2) anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 (yolo v3)
需要注意的是 anchor计算的尺度问题。
yolo v2的是相对最后一个Feature Map (13×13)来的,yolo v3则是相对于原始输入图像的416×416的。
这也是在计算目标检测中,边框计算中需要注意的问题,就是计算的边框究竟在相对于那个尺度得出的。
在一个 14*14的特征图上面,你认为有多少anchor?在哪里生成?
答案:一个特征图上生成anchor数量的计算公式:【h * w * k】
w:图像的宽 h:图像的高 k:anchors的数量
此题的答案为: 14 ∗ 14 ∗ 9 14*14*9 14∗14∗9,每个像素点生成k个anchor
像素点在特征图上是怎么反应的呢?那14*14的特征图上有多少个像素点呢?
参照感受野得答案回答即可。
Resnet18网络结构下采样的strides是多少?他有多少个下采样层?
下采样的步长是2
resnet18进行5次卷积下采样
Resnet18的bottlenets是什么结构?Resnet的残差结构是什么?他有几个阶段?(有几个块儿)一般常用的有哪些Resnet?
残差结构如图所示:
卷积实现的两种方式:
除了resnet18,还有resnet50/101/152
Faster-RCNN这样的算法在两个阶段计算损失有多少个?两个阶段分别是什么损失?
PRN阶段会有回归box的loss和判断前景和后景的loss。第二阶段同样会有精修box坐标的loss和真正的分类loss
Faster-RCNN里面,在做框回归的时候,有个回归的loss,为什么不直接用框的坐标直接计算loss?
无论是在RPN还是RoIHead中,回归结果都不是bounding box的坐标,而是相对(正样本anchor、RoI)中心点坐标的位移和长宽比。为方便叙述,一般把两者分别称之为offset和scale。直观地看,直接回归bounding box的坐标更方便,免去了传参(RPN中需要传入anchor,RoIHead中需要传入RoI)与坐标计算。但是,如果回归的是坐标,那么在计算损失时,大尺寸bbox的坐标误差占的比重可能就会比小尺寸bbox之间的坐标误差大得多,从而使得模型更偏向于学习大bbox,从而导致小目标的检测效果不佳。
在选anchor计算的时候,在回归框的时候,不是回归的坐标,回归的是个差值,但实际上他在做偏值的时候,而是在偏值上乘个均值在除了个方差,这是为什么呢?
为了对数据进行标注化处理
mask r-cnn的网络结构以及和Faster-RCNN的区别?
(多了一个网络分支)这两个网路主要的区别在于mask rcnn在faster-rcnn的网络基础上增加了一个分支进行mask的检测。
ROI-align的实现原理?ROI-pooling 的区别?
在常见的两级检测框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。
- 将候选框边界量化为整数点坐标值。
- 将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。
为了解决ROI Pooling的上述缺点,作者提出了ROI Align这一改进的方法。ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。
BN层他在做前向和推理的时候有什么区别?
https://www.jiqizhixin.com/articles/2021-01-06-6
mmask r-cnn在做评测时候 用的什么评测指标?用什么方法评测的?
主要是用了mAP进行性能指标的计算,即通过计算PR曲线的面积来衡量模型性能。
Focal loss 的思想介绍下?
针对样本不平衡的情况下,使用Focal Loss作为损失函数,加强对于hard example的训练!从而一定程度上解决样本不平衡问题!它的核心思想就是:整体缩放Loss,易分类样本缩放的比难分类样本更多,从而损失函数中就凸显了难分类样本的权重,使得模型在训练时更专注于难分类的样本。
跟踪算法介绍下?
deepsort算法是先用yolo进行每一帧的object的检测然后通过卡尔曼滤波进行位置精修,最后配合匈牙利算法进行前后两帧object的匹配。
人脸识别是分类问题还是非分类问题?这种分类问题和常规的分类问题的区别在哪里?
人脸识别是分类问题,只不过人脸的这种分类,需要先检测到人脸位置。对于人脸的多分类问题。有多少分类,取决于所处理问题的人脸库大小,人脸库中有多少目标人脸,就需要机器进行相应数量的细分类。如果想要机器认出每个他看到的人,则有多少人,人脸就可以分为多少类,而这些类别之间的区别是非常细微的。由此可见人脸识别问题的难度。更不要提,这件事还要受到光照,角度,人脸部的装饰物等各种因素的影响。比如在人脸的二分类问题中的Triplet loss是一个学习人脸识别卷积网络参数的好方法,他可以讲人脸识别当成一个二分类的方法。(如果问到Triplet loss相关的知识点和含义具体可参照课程和人脸识别的文档讲述即可)
常用的人脸识别的loss有哪些?
https://blog.csdn.net/intflojx/article/details/82378520
人脸识别loss论文和知识点汇总,建议有时间可以看看:
含公式推导:https://zhuanlan.zhihu.com/p/64314762
loss上下姊妹篇:
上:https://zhuanlan.zhihu.com/p/34404607
下:https://zhuanlan.zhihu.com/p/34436551?refer=DCF-tracking
ps://zhuanlan.zhihu.com/p/64314762](https://zhuanlan.zhihu.com/p/64314762)
loss上下姊妹篇:
上:https://zhuanlan.zhihu.com/p/34404607
下:https://zhuanlan.zhihu.com/p/34436551?refer=DCF-tracking
focal loss(解决正负、难易样本问题,用一句目标检测)原理:https://zhuanlan.zhihu.com/p/80594704
作者根据朋友、学生及自己的面试经验,整理成册,名为《名企AI面经100篇:揭开三个月薪资翻倍的秘诀》,现免费分享给大家,祝大家早日进入心仪的公司!
注:可以扫码领取,添加时备注:领取面经100篇
- 目标检测 RCNN, SPPNet, Fast RCNN, Faster RCNN 总结
- 使用Faster-Rcnn进行目标检测的原理
- 深度学习笔记之使用Faster-Rcnn进行目标检测 (实践篇)
- 1:基于深度学习的目标检测技术:RCNN、Fast R-CNN、Faster R-CNN
- py-faster-rcnn制作自己的数据集做目标检测
- 目标检测网络发展历程从R-CNN到Faster-RCNN
- 目标检测之Faster-RCNN的pytorch代码详解(模型准备篇)
- 深度学习笔记之目标检测算法系列(包括RCNN、Fast RCNN、Faster RCNN和SSD)
- 【目标检测大集合】R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记
- 目标检测:yolo-v3与faster-rcnn
- 使用Faster-Rcnn进行目标检测(实践篇)转载
- caffe框架下目标检测——faster-rcnn实战篇操作
- 【目标检测】R-CNN系列之Faster-RCNN
- 【修改anchor】目标检测框架py-faster-rcnn修改anchor_box
- 目标检测框架py-faster-rcnn修改anchor_box
- 使用Faster-Rcnn进行目标检测的原理
- 目标检测之Faster-RCNN的pytorch代码详解(数据预处理篇)
- 【目标检测】rcnn-spp-fast-faster进展
- 目标检测——从RCNN到Faster RCNN 串烧
- 目标检测总结:RCNN系列(1)