原标题:计算机视觉面试31题:CV面試考点精准详尽解析(1-10)
object detection,就是在给定的图片中精确找到物体所在位置并标注出物体的类别。所以object detection要解决的问题就是物体在哪里以忣是什么的整个流程问题。
然而这个问题可不是那么容易解决的,物体的尺寸变化范围很大摆放物体的角度,姿态不定而且可以出現在图片的任何地方,更何况物体还可以是多个类别
目前学术和工业界出现的目标检测算法分成3类:
2. 候选区域/框 + 深度学习分类:通过提取候选区域,并对相应区域进行以深度学习方法为主的分类的方案如:
1)区域选择(穷举策略:采用滑动窗口,且设置不同的大小不哃的长宽比对图像认证和篡改定位进行遍历,时间复杂度高)
2)特征提取(SIFT、HOG等;形态多样性、光照变化多样性、背景多样性使得特征鲁棒性差)
3)分类器分类(主要有SVM、Adaboost等)
在目标检测的评价体系中有一个参数叫做 IoU ,简单来讲就是模型产生的目标窗口和原来标记窗口的茭叠率具体我们可以简单的理解为: 即检测结果(DetectionResult)与 Ground Truth 的交集比上它们的并集,即为检测的准确率 IoU :
应该够详细了上幅图直观些。当然最理想的情况就是 DR 与 GT 完全重合即
Wikipedia上的 KNN词条 中有一个比较经典的图如下:
从上图中我们可以看到,图中的数据集是良好的数据即都打好了label,┅类是蓝色的正方形一类是红色的三角形,那个绿色的圆形是我们待分类的数据
如果K=3,那么离绿色点最近的有2个红色三角形和1个蓝色嘚正方形这3个点投票,于是绿色的这个待分类点属于红色的三角形
如果K=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方形这5個点投票,于是绿色的这个待分类点属于蓝色的正方形
我们可以看到,KNN本质是基于一种数据统计的方法!其实很多机器学习算法也是基於数据统计的
KNN是一种memory-based learning,也叫instance-based learning属于lazy learning。即它没有明显的前期训练过程而是程序开始运行时,把数据集加载到内存后不需要进行训练,僦可以开始分类了具体是每次来一个未知的样本点,就在附近找K个最近的点进行投票
如图所示,数据样本用圆点表示每个簇的中心點用叉叉表示:
(a)刚开始时是原始数据,杂乱无章没有label,看起来都一样都是绿色的。
(b)假设数据集可以分为两类令K=2,随机在坐标上选两個点作为两个类的中心点。
(c-f)演示了聚类的两种迭代先划分,把每个数据样本划分到最近的中心点那一簇;划分完后更新每个簇的中惢,即把该簇的所有数据点的坐标加起来去平均值这样不断进行”划分—更新—划分—更新”,直到每个簇的中心不在移动为止(图文來自Andrew ng的机器学习公开课)。
现在汇总一下KNN和K-Means的区别
KMeans是数据挖掘十大算法之一,在数据挖掘实践中我们也常常将KMeans运用于各种场景,因为它原理简单、易于实现、适合多种数据挖掘情景
如上图所示,数据样本用圆点表示每个簇的中心点用叉叉表示:
(a)刚开始时是原始数据,雜乱无章没有label,看起来都一样都是绿色的。
(b)假设数据集可以分为两类令K=2,随机在坐标上选两个点作为两个类的中心点。
(c-f)演示了聚類的两种迭代先划分,把每个数据样本划分到最近的中心点那一簇;划分完后更新每个簇的中心,即把该簇的所有数据点的坐标加起來去平均值这样不断进行”划分—更新—划分—更新”,直到每个簇的中心不在移动为止(图文来自Andrew ng的机器学习公开课)。
初始中心点的選择最简单的做法是随机从样本中选K个作为中心点但由于中心点的选择会影响KMeans的聚类效果,因此我们可以采取以下三种方式优化中心点嘚选取:
1.多次选取中心点进行多次试验并用损失函数来评估效果,选择最优的一组;
2.选取距离尽量远的K个样本点作为中心点:随机选取苐一个样本C1作为第一个中心点遍历所有样本选取离C1最远的样本C2为第二个中心点,以此类推选出K个初始中心点
3.特别地,对于像文本这样嘚高维稀疏向量我们可以选取K个两两正交的特征向量作为初始化中心点。
假设有一个包含很多图像认证和篡改定位的训练集每个图像認证和篡改定位都有一个对应的分类标签。这里并且这就是说,我们有N个图像认证和篡改定位样例每个图像认证和篡改定位的维度是D,共有K种不同的分类 比如在CIFAR-10中,我们有一个N=50000的训练集每个图像认证和篡改定位有D=32x32x3=3072个像素,而K=10这是因为图片被分为10个不同的类别(狗,猫汽车等)。我们现在定义评分函数为:该函数是原始图像认证和篡改定位像素到分类分值的映射。
上式中假设每个图像认证和篡改定位数据都被拉长为一个长度为D的列向量,大小为[D x 1]其中矩阵W大小为[K x D],列向量b大小为[K x 1]二者均称为该函数的参数(parameters)。以CIFAR-10为例就包含了第i个图像认证和篡改定位的所有像素信息,这些信息被拉成为一个[3072 x 1]的列向量矩阵W大小为[10x3072],列向量b的大小为[10x1]因此将3072个数字(原始像素數值)输入函数,函数输出10个数字(10个类别得分), 参数W被称为权重(weights)b被称为偏置向量(bias vector),因为它影响输出数值但是并不和原始数据产生關联。在实际情况中人们常常混用权重和参数这两个术语。
其中权重W的每一行都代表一个分类器10行分类表示10个类别的分类器,最终输絀10个类别的得分情况理解线性分类器 线性分类器计算图像认证和篡改定位中3个颜色通道中所有像素的值与权重的矩阵乘,从而得到分类汾值根据我们对权重设置的值,对于图像认证和篡改定位中的某些位置的某些颜色函数表现出喜好或者厌恶(根据每个权重的符号而萣)。比如可以想象“ship”类别就是被大量的蓝色所包围(对应的就是水)。那么“ship”分类器在蓝色通道上的权重就有很多的正权重(它們的出现提高了“ship”类别的分值)而在绿色和红色通道上的权重为负的就比较多(它们的出现降低了“ship”类别的分值)。
一个将图像认證和篡改定位映射到分类分值的例子;为了便于可视化假设图像认证和篡改定位只有4个像素(都是黑白像素,这里不考虑RGB通道)有3个汾类(红色代表猫,绿色代表狗蓝色代表船,注意这里的红、绿和蓝3种颜色仅代表分类,和RGB通道没有关系)首先将图像认证和篡改萣位像素拉伸为一个列向量,与W进行矩阵乘然后得到各个分类的分值。需要注意的是这个W一点也不好:猫分类的分值非常低。从上图來看算法倒是觉得这个图像认证和篡改定位是一只狗,因为上图中“dog”的类别分值最高
将线性分类器看做模板匹配:
关于权重W的另一個解释是它的每一行对应着一个分类的模板。一张图像认证和篡改定位对应不同分类的得分是通过使用内积来比较图像认证和篡改定位囷模板,然后找到和哪个模板最相似从这个角度来看,线性分类器就是在利用学习到的模板针对图像认证和篡改定位做模板匹配。
log对數损失函数的标准形式如下:
(1) log对数损失函数能非常好的表征概率分布在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信喥那它非常适合。
(2)健壮性不强相比于hinge loss对噪声更敏感。
(3)逻辑回归的损失函数就是log对数损失函数
Hinge损失函数标准形式如下:
(1)hinge损失函数表示洳果被分类正确,损失为0否则损失就为
。SVM就是使用这个损失函数
是预测值,在-1到1之间
是目标值(-1或1)。其含义是
的值在-1和+1之间就可以叻,并不鼓励
即并不鼓励分类器过度自信,让某个正确分类的样本距离分割线超过1并不会有任何奖励从而使分类器可以更专注于整体嘚误差。
(3) 健壮性相对较高对异常点、噪声不敏感,但它没太好的概率解释
交叉熵损失函数的标准形式如下:
(1)本质上也是一种对数似然函數,可用于二分类和多分类任务中二分类问题中的loss函数(输入数据是softmax或者sigmoid函数的输出):多分类问题中的loss函数(输入数据是softmax或者sigmoid函数的輸出):
(2)当使用sigmoid作为激活函数的时候,常用交叉熵损失函数而不用均方误差损失函数因为它可以完美解决平方损失函数权重更新过慢的問题,具有“误差大的时候权重更新快;误差小的时候,权重更新慢”的良好性质
1 交叉熵函数与最大似然函数的联系和区别?
区别:茭叉熵函数使用来描述模型预测值和真实值的差距大小越大代表越不相近;似然函数的本质就是衡量在某个参数下,整体的估计和真实嘚情况一样的概率越大代表越相近。
联系:交叉熵函数可以由最大似然函数在伯努利分布的条件下推导出来或者说最小化交叉熵函数嘚本质就是对数似然函数的最大化。怎么推导的呢我们具体来看一下。
因为我们只有一组采样数据
可以看到上式和交叉熵函数的形式几乎相同极大似然估计就是要求这个式子的最大值。而由于上面函数的值总是小于0一般像神经网络等对于损失函数会用最小化的方法进荇优化,所以一般会在前面加一个负号得到交叉熵函数(或交叉熵损失函数):
这个式子揭示了交叉熵函数与极大似然估计的联系,最尛化交叉熵函数的本质就是对数似然函数的最大化
现在我们可以用求导得到极大值点的方法来求其极大似然估计,首先将对数似然函数對
进行求导并令导数为0,得到
2. 在用sigmoid作为激活函数的时候为什么要用交叉熵损失函数,而不用均方误差损失函数
其实这个问题求个导,分析一下两个误差函数的参数更新过程就会发现原因了
对于均方误差损失函数,常常定义为:
那么为什么交叉熵损失函数就会比较好叻呢同样的对于交叉熵损失函数,计算一下参数更新的梯度公式就会发现原因交叉熵损失函数一般定义为:
候,权重更新慢这是一個很好的性质。所以当使用sigmoid作为激活函数的时候常用交叉熵损失函数而不用均方误差损失函数。
正则化最主要的功能是防止网络过拟合主要有L1正则和L2正则:
L2正则化(岭回归)可能是最常用的正则化方法了,以通过惩罚目标函数中所有参数的平方来防止过拟合即对于网絡中的每个权重,在目标函数中增加一个项其中是正则化惩罚系数。加上后该式子关于梯度就是而不是了L2正则化可以直观理解为它对於大数值的权重向量进行严厉惩罚,倾向于更加分散的权重向量由于输入和权重之间的乘法操作,使网络更倾向于使用所有输入特征洏不是严重依赖输入特征中某些小部分特征。最后需要注意在梯度下降和参数更新的时候使用L2正则化意味着所有的权重都以w
L1正则化(套索回归)是另一个相对常用的正则化方法。对于每个我们都向目标函数增加一个项L1和L2正则化也可以进行组合:,这也被称作弹性网络回歸L1正则化有一个有趣的性质,它会让权重向量在最优化的过程中变得稀疏(即非常接近0)也就是说,使用L1正则化的神经元最后使用的昰它们最重要的输入数据的稀疏子集同时对于噪音输入则几乎是不变的了。相较L1正则化L2正则化中的权重向量大多是分散的小数字。在實践中如果不是特别关注某些明确的特征选择,一般说来L2正则化都会比L1正则化效果好
constraints)是另一种形式的正则化,给每个神经元中权重姠量的量级设定上限并使用投影梯度下降来确保这一约束。在实践中与之对应的是参数更新方式不变,然后要求神经元中的权重向量必须满足这一条件一般值为3或者4。有研究者发文称在使用这种正则化方法时效果更好这种正则化还有一个良好的性质,即使在学习率設置过高的时候网络中也不会出现数值“爆炸”,这是因为它的参数更新始终是被限制着的
随机失活(Dropout)是一个简单又极其有效的正則化方法。该方法由Srivastava在论文Dropout: A Simple Way to Prevent Neural Networks from Overfitting中提出的与L1正则化,L2正则化和最大范式约束等方法互为补充在训练的时候,随机失活的实现方法是让神经え以超参数的概率被激活或者被设置为0
图片展示了其核心思路:在训练过程中,随机失活可以被认为是对完整的神经网络抽样出一些子集每次基于输入数据只更新子网络的参数(然而,数量巨大的子网络们并不是相互独立的网络之间参数共享)。在推理阶段不使用随機失活可以理解为是对数量巨大的子网络们做了模型集成(model ensemble),以此来计算出一个平均的预测
这个原理称为"如无必要,勿增实体", 即"简單有效原理"
奥卡姆剃刀原理是指,在科学研究任务中应该优先使用较为简单的公式或者原理,而不是复杂的应用到机器学习任务中,可以通过减小模型的复杂度来降低过拟合的风险即模型在能够较好拟合训练集(经验风险)的前提下,尽量减小模型的复杂度(结构风险)
夲题参考来源: Michael Yuan:CNN中卷积层的计算细节
输入矩阵格式:四个维度,依次为:样本数(batch size)、图像认证和篡改定位高度、图像认证和篡改定位宽度、图像认证和篡改定位通道数
输出矩阵格式:与输入矩阵的维度顺序和含义相同但是后三个维度(图像认证和篡改定位高度、图像认证囷篡改定位宽度、图像认证和篡改定位通道数)的尺寸发生变化。
权重矩阵(卷积核)格式:同样是四个维度但维度的含义与上面两者嘟不同,为:卷积核高度、卷积核宽度、深度、卷积核个数(输出通道数); 高度和宽度即kernel size, 深度无需指定 默认为上一层特征图的通道数卷积核個数决定卷积后输出特征图的通道个数。
输入矩阵、权重矩阵、输出矩阵这三者之间的相互决定关系 :
卷积核的输入通道数(in depth)由输入矩阵嘚通道数所决定
输出矩阵的通道数(out depth)由卷积核的输出通道数所决定 。
输出矩阵的高度和宽度(height, width)这两个维度的尺寸由输入矩阵、卷积核、stride大小共同决定, 计算公式如下
(227 - 11) / 4 + 1 = 55 ;如果遇到无法整除的情况,则向上取整- 因为有96个卷积核 所以输出通道数为96
参数计算: 上述过程的参数量计算方式:11*11*3*9611*11是卷积核的大小3是输入通道个数,96是卷积核个数卷积采用参数共享机制,每个通道上卷积参数完全一样不同卷积核以忣不同通道之间参数不同;一个卷积核对应输出特征图的一个通道,具体计算过程可以参考下图:
该图来源于cs231n课程参数大小和上图有差別,但计算方式一样蓝色表示原图共3个通道,红色表示卷积核共2个 绿色表示输出;卷积核的深度d和输入维度一致且d[0],d[1],d[2]的参数是不一样的,每个卷积核对应一个输出特征图且之间的参数也不一样的
因此参数量为:卷积核宽度 * 卷积核高度 * 输入通道数 * 卷积核个数。
本题解析参栲来源:为什么为什么全局平均池化层有用为什么可以替代全连接层?
答案:用全局池化层替换全连接层
在CNN卷积神经网络发展的初期卷积层通过池化层(最大池化/平均池化)后总是要一个或多个全连接层,最后经过SoftMax层进行分类其中FC全连接层的参数超多,使得模型本身变得非常臃肿在Network in Network 论文中提到了使用全局平局池化层代替全连接层的思路,以下是摘录的一部分资料:
答案是肯定的Network in Network工作使用GAP来取代了最后嘚全连接层,直接实现了降维更重要的是极大地减少了网络的参数(CNN网络中占比最大的参数其实后面的全连接层)。
全连接层先将卷积层展開成列向量之后再针对每个feature map进行分类,而GAP的思路就是将上述两个过程合二为一如下图说是
通过两者合二为一的过程我们可以探索到GAP的嫃正意义是:对整个网路在结构上做正则化防止过拟合。其直接剔除了全连接层中黑箱的特征直接赋予了每个channel实际的类别意义。
事实上并鈈是单纯的全局平均池化层替代的全连接层而是这个全局平均池化层以及之前的若干层卷积层共同替代了全连接层。举个例子从一个n維的全连接层降维到m维的全连接层,在计算时的操作是右乘以一个m×n的矩阵W。而换一个角度来看是否可以理解为一层n×1×1的特征图降維到m×1×1的特征图,进行了一次m×n×1×1的卷积呢:
全连接层等价于1×1的卷积
而使用全卷积网络则是使得特征图的边长知道最后一层全局池化层才被降到1。即该放全连接层的位置对特征图降维,从n×a×a的特征图降维到m×b×b(b != 1)的特征图使用的是一次m×n×c×c的卷积:
全卷積网络中,替代全连接层降维功能的卷积
而全卷积网络只需要保证最后一层的特征图,维度是输出向量的维度即可比如手写数字识别任务,我们可以让最后一层的维度是10尽管其长和宽还不确定,但只要经过一次全局平均池化即可转化为10-D的向量输出:
全连接层进行了信息的转化,卷积层进行信息的提取而池化更多的是信息的压缩。但单靠全局平均池化确实不能替代卷积层还需要配合若干层卷积层,对信息进行提取和转化最终整形到期望输出的维度,再通过全局平均池化完成输出
本题参考来源:什么是end-to-end神经网络?_深藏功与名-CSDN博愙
端到端指的是输入是原始数据输出是最终目标; 神经网络输入的原始数据, 输出的是我们希望的最终结果,所以是端到端网络
以前的模型输入端不是直接的原始数据,而是在原始数据中提取的特征这一点在图像认证和篡改定位问题上尤为突出,因为图像认证和篡改定位潒素数太多数据维度高,会产生维度灾难所以原来一个思路是手工提取图像认证和篡改定位的一些关键特征,这实际就是就一个降维嘚过程
那么问题来了,特征怎么提
特征提取的好坏异常关键,甚至比学习算法还重要举个例子,对一系列人的数据分类分类结果昰性别,如果你提取的特征是头发的颜色无论分类算法如何,分类效果都不会好如果你提取的特征是头发的长短,这个特征就会好很哆但是还是会有错误,如果你提取了一个超强特征比如染色体的数据,那你的分类基本就不会错了
这就意味着,特征需要足够的经驗去设计这在数据量越来越大的情况下也越来越困难。于是就出现了端到端网络特征可以自己去学习,所以特征提取这一步也就融入箌算法当中不需要人来干预了。发展过程如下图所示:
经典机器学习方式是以人类的先验知识将RAW原始数据预处理成Feature特征然后对Feature进行分類。分类结果好坏十分取决于Feature的好坏所以过去的机器学习专家将大部分时间花费在设计Feature上。那时的机器学习有个更合适的名字叫特征工程(Feature Engineering)
后来人们发现,利用神经网络让网络自己学习如何提取Feature效果更佳。于是兴起了表征学习(Representation Learning), 这种方式对数据的拟合更加灵活
网络进一步加深,多层次概念的Representation Learning将识别率达到了另一个新高度于是提出了深度学习(Deep Learning)的概念,指多层次的特征提取器与识别器统一训练和预测的网絡
End to End的好处:通过缩减人工预处理和后续处理,尽可能使模型从原始输入到最终输出给模型更多可以根据数据自动调节的空间,增加模型的整体契合度
从目标检测角度对end-to-end的理解:
代表性的算法是RCNN系列目标检测方法,这种方法需要先在图像认证和篡改定位中提取可能含有目标的候选框(Region Proposal) 然后将这些候选框输入到CNN模型,让CNN判断候选框中是否真的有目标以及目标的类别是什么。在我们看到的结果中往往是類似与下图这种,在整幅图中用矩形框标记目标的位置和大小并且告诉我们框中的物体是什么。
这种标记的过程其实是有两部分组成,一是目标所在位置及大小二是目标的类别。在整个算法中目标位置和大小其实是包含在Region Proposal的过程里,而类别的判定则是在CNN中来判定的
end-to-end方法的典型代表就是有名的YOLO系列算法。上面面的方法中CNN本质的作用还是用来分类,定位的功能其并没有做到而YOLO算法就是只通过CNN网络,就能够实现目标的定位和识别也就是原始图像认证和篡改定位输入到CNN网络中,直接输出图像认证和篡改定位中所有目标的位置和目标嘚类别这种方法就是end-to-end(端对端)的方法,一端输入我的原始图像认证和篡改定位一端输出我想得到的结果。只关心输入和输出中间的步驟全部都不管。