1.L0、L1、L2正则化?
L0范数:计算向量中非0元素的个数。
L1范数:计算向量中各元素绝对值之和。
L2范数:计算向量中各元素平方和的开方。
L0范数和L1范数目的是使参数稀疏化。L1范数比L0范数容易优化求解。
L2范数是防止过拟合,提高模型的泛化性能。
2.无监督学习方法有哪些?
强化学习、K-means 聚类、自编码、受限波尔兹曼机
3. 空洞卷积(dilated convolution)的理解?
基于FCN的语义分割问题中,需保持输入图像与输出特征图的size相同。
若使用池化层,则降低了特征图size,需在高层阶段使用上采样,由于池化会损失信息,所以此方法会影响导致精度降低;
若使用较小的卷积核尺寸,虽可以实现输入输出特征图的size相同,但输出特征图的各个节点感受野小;
若使用较大的卷积核尺寸,由于需增加特征图通道数,此方法会导致计算量较大;
所以,引入空洞卷积(dilatedconvolution),在卷积后的特征图上进行0填充扩大特征图size,这样既因为有卷积核增大感受野,也因为0填充保持计算点不变。
4.增大感受野的方法?
空洞卷积、池化操作、较大卷积核尺寸的卷积操作
5. 卷积层中感受野大小的计算?
卷积层的感受野大小与其之前层的卷积核尺寸和步长有关,与padding无关。基于从深层向浅层递归计算的方式。计算公式为:Fj-1 = Kj + (Fj - 1)*Sj(最后一层特征图的感受野大小是其计算卷积核大小)
6. 梯度下降法和牛顿法的优缺点?
优点:梯度下降法:可用于数据量较大的情况;
牛顿法:收敛速度更快;
缺点:梯度下降法:每一步可能不是向着最优解的方向;
牛顿法:每次迭代的时间长;需要计算一阶和二阶导数;
梯度下降法:梯度法思想的三要素:出发点、下降方向、下降步长
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度
缺点:就对整个数据集计算梯度,所以计算起来非常慢
每次更新时对每个样本进行梯度更新,速度快,可以随时增加新的样本,但是会造成剧烈震荡
每一次利用一小批样本,即 n 个样本进行计算, 这样它可以降低参数更新时的方差,收敛更稳定
以上三种的区别仅仅是训练样本大小的不同,但是没有增加其他权重,会遇到如同SGD的问题
Tensorflow实现函数:tf.train.GradientDescentOptimizer
随机梯度下降法(SGD )存在的问题
1.当存在两个或更多个权值矩阵时,某个方向的的权值改变对Loss影响很大,而另外的方向影响比较小,这就会造成权值矩阵在影响大的方向上震荡,然后缓慢的沿着影响小的方向前进;
2.存在局部最小值(鞍点),在局部最小值时,会停止更新,但是在局部最小值附近,由于梯度非常小,会使得更新非常慢
3. 我们经常用小批量的数据对Loss和梯度进行估计,这意味着我们每一步并不是去计算真实的梯度,而是在当前点对梯度进行噪声估计,所以优化的方向会比较曲折,也就是需要更多的时间
改进的梯度下降法
1、Momentum
在梯度改变时增加惯性因素,在下一次的梯度时,会继续沿着上一次的梯度方向前进
2、Nesterov momentum
比普通带动量的方式更加更加柔和,相当于提前知道梯度的变化方向,然后做出改变
NAG(Nesterov Accelerated Gradient)不仅仅把SGD梯度下降以前的方向考虑,还将Momentum梯度变化的幅度也考虑了进来
3、AdaGrad
缺点:因为grad_squared是单调递增的,这会导致学习步长会越来越小,越来越慢。在凸函数的情况下比较适用,但是在凹函数的情况下,会卡在局部最优值附近
4、RMSProp
是对AdaGrad的一个变体
RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的,Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001。
7. 解决训练样本类别不平衡问题?
现象:训练样本中,正负样本数量的比例较大。
1. 过采样。增加正例样本数量,使得正负样本数量接近,然后再进行学习。
2. 欠采样。去除反例样本数量,使得正负样本数量接近,然后再进行学习。
3. 设置阈值。基于原始数据集学习,当使用已训练好的分类器进行预测时,将正负样本数量的比例作为阈值嵌入到决策过程中
8. 各个激活函数的优缺点?
Sigmoid激活函数 缺点:1. 不是关于原点对称;2. 需要计算exp
Tanh 激活函数 优点:1. 关于原点对称2. 比sigmoid梯度更新更快
ReLU激活函数 优点:1. 神经元输出为正时,没有饱和区2. 计算复杂度低,效率高3. 在实际应用中,比sigmoid、tanh更新更快4. 相比于sigmoid更加符合生物特性
ReLU激活函数 缺点:1. 神经元输出为负时,进入了饱和区2. 神经元的输出在非0中心
3. 使得数据存在Active ReLU、Dead ReLU(当wx+b<0时,将永远无法进行权值更新,此时的神经元将死掉)的问题
Leaky ReLU激活函数 优点:1. 解决了ReLU激活函数Dead ReLU问题;
Maxout激活函数max(w1*x+b1,w2*x+b2) 缺点:
2. 参数较多;
9. 神经网络的正则化方法?/过拟合的解决方法?
数据增强(镜像对称、随机裁剪、旋转图像、剪切图像、局部弯曲图像、色彩转换)
early stopping(比较训练损失和验证损失曲线,验证损失最小即为最优迭代次数)
L2正则化(权重参数的平方和)
L1正则化(权重参数的绝对值之和)
dropout 正则化(设置keep_pro参数随机让当前层神经元失活)
过拟合
如果一味的去提高训练数据的预测能力,所选模型的复杂度往往会很高,这种现象称为过拟合。所表现的就是模型训练时候的误差很小,但在测试的时候误差很大。
产生的原因
因为(特征)参数太多,会导致我们的模型复杂度上升,容易过拟合
权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征.
解决方法
10. 目标检测领域的常见算法?
两阶段检测器:R-CNN、Fast R-CNN、Faster R-CNN
单阶段检测器:YOLO、YOLO9000、SSD、DSSD、RetinaNet
11. 梯度消失和梯度爆炸?
原因:激活函数的选择。
梯度消失:令bias=0,则神经网络的输出结果等于各层权重参数的积再与输入数据集相乘,若参数值较小时,则权重参数呈指数级减小。
梯度爆炸:令bias=0,则神经网络的输出结果等于各层权重参数的积再与输入数据集相乘,若参数值较大时,则权重参数呈指数级增长。
12. 生成模型和判别模型
生成方法是首先基于数据学习联合概率分布P(X,Y),然后获得条件概率分布P(Y|X)作为预测模型。
常用模型:隐马尔可夫模型(HMM)、朴素贝叶斯
判别方法是直接基于数据学习到决策函数F或条件概率分布P(Y|X)作为预测模型。
常用模型:支持向量机、K近邻算法、决策树、逻辑回归、感知机、最大熵等
13. 从贝叶斯的角度来看,正则化等价于对模型参数引入先验分布,谈谈你对正则化的理解,并且阐述引入L2和L1分别对应什么分布。
正则化的理解:正则化是在损失函数中加入对模型参数的惩罚项,以平衡因子lamda控制惩罚力度,其通过在训练过程中降低参数的数量级,从而降低模型的过拟合现象。
从贝叶斯的角度来看,正则化等价于对模型参数引入先验分布:对参数引入高斯先验分布等价于L2正则化,对参数引入拉普拉斯分布等价于L1正则化。
14.简述回归,分类,聚类方法的区别和联系并分别举出一个例子,简要介绍算法思路
回归:对连续随机变量建模预测的监督学习算法;经典案例:房价预测;算法举例:线性回归,建立数据的拟合曲线作为预测模型(y = wx + b);
分类:对离散随机变量建模预测的监督学习算法;经典案例:垃圾邮件分类;算法举例:支持向量机,寻找二类支持向量的最大切分超平面;
聚类:基于数据的内部规律,寻找其属于不同族群的无监督学习算法;算法举例:k-means;
15. 列举至少三种损失函数,写出数学表达式并简述各自优点
0-1损失 感知机损失 绝对值损失
平方误差损失(线性回归)
对数损失(逻辑回归)
指数损失(Adaboost)
铰链损失(SVM)
16.分类问题的评价标准
Precision & Recall & mAP
一般来说,Precision就是检索出来的条目(比如:文档、网页等)有多少是准确的,Recall就是所有准确的条目有多少被检索出来了。
正确率 = 提取出的正确信息条数 / 提取出的信息条数
召回率 = 提取出的正确信息条数 / 样本中的信息条数
准确率和召回率都是针对同一类别来说的,并且只有当检索到当前类别时才进行计算,比如在person re-id中,一个人的label为m1,在测试集中包含3张此人的图像,检索出来的图像按照得分从高到低顺序为m1、m2、m1、m3、m4、m1….,此时
第一次检索到m1,提取出的正确信息条数=1,提取出的信息条数=1,样本中的信息条数=3,正确率=1/1=100%,召回率=1/3=33.33%;
第二次检索到m1,提取出的正确信息条数=2,提取出的信息条数=3,样本中的信息条数=3,正确率=2/3=66.66%,召回率=2/3=66.66%;
第三次检索到m1,提取出的正确信息条数=3,提取出的信息条数=6,样本中的信息条数=3,正确率=3/6=50%,召回率=3/3=100%;
平均正确率AP=(100%+66.66%+50%)/3=72.22%
而当需要检索的不止一个人时,此时正确率则取所有人的平均mAP。
准确率 = (TP+TN)/总样本数
精确率 = TP/(TP+FP) = 所有预测为正类样本中正类的概率
召回率 = TP/(TP+FN) = 所有真正类样本中正类的概率
2/调和平均值 = 1/精确率+1/召回率
P-R曲线:纵轴为精确率,横轴为召回率,基于平衡点(P=R)度量各个基分类器的优劣;
ROC曲线:纵轴为TPR,横轴为FPR
TPR = TP/(TP+FN) FPR = FP/(FP+TN)
AUC:ROC曲线下的面积
mAP = 所有类别的AP之和/类别数量
P = (一张图片类别C识别正确数量)/(一张图片类别C的总数量)
AP = 每张图片的P之和/图片数量
回归问题的评价指标
平均绝对值误差(MAE)
均方差(MSE)
1*1卷积核的作用?
1.跨通道信息的融合;2.通过对通道数的降维和升维,减少计算量;
k-means
k-means与kNN虽然都是以k打头,但却是两类算法——kNN为监督学习中的分类算法,而k-means则是非监督学习中的聚类算法;二者相同之处:均利用近邻信息来标注类别。
在k-means算法中,用质心来表示cluster;且容易证明k-means算法收敛等同于所有质心不再发生变化
对于欧式空间的样本数据,以平方误差和(sum of the squared error, SSE)作为聚类的目标函数,同时也可以衡量不同聚类结果好坏的指标:(最小化)
k-means存在缺点:
k-means是局部最优的,容易受到初始质心的影响;因选择初始质心不恰当而造成次优的聚类结果(SSE较大)
同时,k值的选取也会直接影响聚类结果,最优聚类的k值应与样本数据本身的结构信息相吻合,而这种结构信息是很难去掌握,因此选取最优k值是非常困难的。
AdaBoost
AdaBoost能够自适应(addaptive)地调整样本的权值分布,将分错的样本的权重设高、分对的样本的权重设低
朴素贝叶斯分类器的主要思路:通过联合概率建模,运用贝叶斯定理求解后验概率;将后验概率最大者对应的的类别作为预测类别。
朴素贝叶斯将分类问题转化成了求条件概率与先验概率的最大乘积问题
在朴素贝叶斯学习中,需要估计先验概率与条件概率,一般时采用极大似然估计。先验概率的极大似然估计
. 卷积层和全连接层的区别?
1.卷积层是局部连接,所以提取的是局部信息;全连接层是全局连接,所以提取的是全局信息;
2.当卷积层的局部连接是全局连接时,全连接层是卷积层的特例;
卡尔曼滤波器是基于在时域中离散的线性动力系统(在此我们考虑离散 的系统)。卡尔曼滤波器是基于马尔科夫链的模型,其建立在线性运算符的 基础上,过程噪声和观测噪声符合高斯分布,且过程噪声和观测噪声不相关。
首先滤波分为线性和非线性两种,Kalman filter 是在满足五个假设条件(推荐 estimation with application to tracking and navigation)下才成立的,且动态方程和量测方程都是线性的。KF在MMSE条件下是最优的,由于它是线性的,所以也是LMMSE最优。五个公式主要分为两部分:预测和更新。抓住这两个公式即可。 KF 假设状态服从高斯分布,状态方程(动态和量测)为线性,过程噪声和量测噪声为高斯白噪声;得到在MMSE(最小化均方误差)下的最优解;
需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的。
1.mean pooling
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变
2.max pooling
max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到
现在所用的优化方法大多都是min-batch SGD,所以我们的归一化操作就成为Batch Normalization。
我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。
机器学习领域有个很重要的假设:IID(独立同分布)假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
如上图所示,BN步骤主要分为4步:
一个标准的归一化步骤就是减均值除方差
BN在深层神经网络的作用非常明显:若神经网络训练时遇到收敛速度较慢,或者“梯度爆炸”等无法训练的情况发生时都可以尝试用BN来解决。同时,常规使用情况下同样可以加入BN来加速模型训练,甚至提升模型精度
好处
不仅仅极大提升了训练速度,收敛过程大大加快;②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。
在目标检测中,常会利用非极大值抑制算法(NMS,non maximum suppression)对生成的大量候选框进行后处理,去除冗余的候选框,得到最佳检测框,以加快目标检测的效率。其本质思想是其思想是搜素局部最大值,抑制非极大值。
NMS主要就是通过迭代的形式,不断的以最大得分的框去与其他框做IoU操作,并过滤那些IoU较大(即交集较大)的框。如图 3图 所示NMS的计算过程。
1、根据候选框的类别分类概率做排序,假如有4个 BBox ,其置信度A>B>C>D。
2、先标记最大概率矩形框A是算法要保留的BBox;
3、从最大概率矩形框A开始,分别判断ABC与D的重叠度IOU(两框的交并比)是否大于某个设定的阈值(0.5),假设D与A的重叠度超过阈值,那么就舍弃D;
4、从剩下的矩形框BC中,选择概率最大的B,标记为保留,然后判读C与B的重叠度,扔掉重叠度超过设定阈值的矩形框;
5、一直重复进行,标记完所有要保留下来的矩形框。
猫和狗两类目标检测如果是two stage算法,通常在选出BBox有BBox位置(x,y,h,w)和confidence score,没有类别的概率。因为程序是生成BBox,再将选择的BBox的feature map做rescale (一般用ROI pooling),然后再用分类器分类。NMS一般只能在CPU计算,这也是two stage相对耗时的原因。
但如果是one stage作法,BBox有位置信息(x,y,h,w)、confidence score,以及类别概率,相对于two stage少了后面的rescale和分类程序,所以计算量相对少。
NMS缺点:
1、NMS算法中的最大问题就是它将相邻检测框的分数均强制归零(既将重叠部分大于重叠阈值Nt的检测框移除)。在这种情况下,如果一个真实物体在重叠区域出现,则将导致对该物体的检测失败并降低了算法的平均检测率(average precision, AP)。
2、NMS的阈值也不太容易确定,设置过小会出现误删,设置过高又容易增大误检。
3、NMS一般只能使用CPU计算,无法使用GPU计算。
解决办法详见:这里
基于soft-NMS,对预测标注方差范围内的候选框加权平均,使得高定位置信度的bounding box具有较高的分类置信度。
YOLOv1
针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式,yolo可实现45帧每秒的运算速度,完全能满足实时性要求(达到24帧每秒,人眼就认为是连续的)
结构:主要分为三个部分:卷积层,目标检测层,NMS筛选层
我们的网络架构受到GoogLeNet图像分类模型的启发[34]。我们的网络共有24个卷积层,后面是2个全连接层。我们只使用1×11×1降维层,后面是3×33×3卷积层,这与Lin等人[22]类似,而不是GoogLeNet使用的Inception模块。完整的网络如图所示。
交替1×1卷积层减少了前面层的特征空间。我们在ImageNet分类任务上以一半的分辨率(224×224的输入图像)预训练卷积层,然后将分辨率加倍来进行检测。
采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力,没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)
先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。网络的最终输出是7×7×307×7×30的预测张量。
筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。
预训练,我们使用图中的前20个卷积层,接着是平均池化层和全连接层
为了在Pascal VOC上评估YOLO,我们使用S=7,B=2。Pascal VOC有20个标注类,所以C=20。我们最终的预测是7×7×30的张量。
它将图像分成S×S的网格,并且每个网格单元预测B个边界框,这些边界框的置信度以及C个类别概率。这些预测被编码为S×S×(B∗5+C)的张量
损失函数:
Yolo的损失函数包含三部分:位置误差,confidence误差,分类误差
误差均采用了均方差算法
yolo算法开创了one-stage检测的先河,它将物体分类和物体检测网络合二为一,都在全连接层完成。故它大大降低了目标检测的耗时,提高了实时性。但它的缺点也十分明显
每个网格单元只预测两个盒子,只能有一个类别,这个空间约束限制了我们的模型可以预测的邻近目标的数量。
SSD
和yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层
SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。
这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下
多尺寸feature map上进行目标检测
多个anchors,每个anchor对应4个位置参数和21个类别参数
和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。
针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了yoloV2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下
YOLO v2主要改进是提高召回率和定位能力。下面是改进之处:
卷积层:网络采用DarkNet-19:19层,它有19个卷积层和5个最大池化层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核 全局平均池化层
2.Batch Normalization: v1中也大量用了Batch Normalization,同时在定位层后边用了dropout,v2中取消了dropout,在卷积层全部使用Batch Normalization。Batch Normilazation 来让训练更稳定,加速收敛,使模型规范化
3.高分辨率分类器(High resolution classifier):v1中使用224 × 224训练分类器网络,扩大到448用于检测网络。v2将ImageNet以448×448 的分辨率微调最初的分类网络,迭代10 epochs。
4. 使用Anchor Boxes
借鉴faster R-CNN和SSD,对于一个中心点,使用多个anchor,得到多个bounding box,每个bounding box包含4个位置坐标参数(x y w h)和21个类别概率信息。而在yolo中,每个grid(对应anchor),仅预测一次类别,而且只有两个bounding box来进行坐标预测。
5. Multi-Scale Training:输入不同尺寸的图片,迭代10次,就改变输入图片尺寸。由于模型中去掉了全连接层,故可以输入不同尺寸的图片了。从320x320,到608x608
6.pass through layer :yolo原本最终特征图为13x13x256。yoloV2还利用了之前的26x26的特征图进行目标检测。26x26x256的feature map分别按行和列隔点采样,得到4幅13x13x256的feature map,将他们组织成一幅13x13x2048的feature map。这样做的目的是提高小物体的识别率。因为越靠前的卷积,其感受野越小,越有利于小物体的识别。
yolo和yoloV2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。
算法细节见 深度学习算法之yolov2
YOLO3主要的改进有:调整了网络结构;利用多尺度特征进行对象检测;对象分类用Logistic (binary cross-entropy loss)取代了softmax。YOLO3借鉴了残差网络结构,形成更深的网络层次,以及多尺度检测,提升了mAP及小物体检测效果.
YOLOv3是到目前为止,速度和精度最均衡的目标检测网络。
1.多尺度预测 (类FPN)
2.更好的基础分类网络(类ResNet)和分类器 darknet-53,见下图
3.分类器-类别预测:
YOLOv3 不使用 Softmax 对每个框进行分类,主要考虑因素有:
在YOLO9000[1]之后,我们的系统使用维度聚类(dimension clusters )作为anchor boxes来预测边界框,网络为每个边界框预测4个坐标。
在YOLOv3[2]中使用逻辑回归预测每个边界框(bounding box)的对象分数。 如果先前的边界框比之前的任何其他边界框重叠ground truth对象,则该值应该为1。如果以前的边界框不是最好的,但是确实将ground truth对象重叠了一定的阈值以上,我们会忽略这个预测,按照进行。我们使用阈值0.5。与YOLOv2不同,我们的系统只为每个ground truth对象分配一个边界框。如果先前的边界框未分配给grounding box对象,则不会对坐标或类别预测造成损失。
在YOLOv3中,每个框使用多标签分类来预测边界框可能包含的类。该算法不使用softmax,因为它对于高性能没有必要,因此YOLOv3使用独立的逻辑分类器。在训练过程中,我们使用二元交叉熵损失来进行类别预测。对于重叠的标签,多标签方法可以更好地模拟数据。
YOLO v3从三种不同尺度的特征图谱上进行预测任务.
YOLOv3采用多个尺度融合的方式做预测。原来的YOLO v2有一个层叫:passthrough layer,假设最后提取的feature map的size是13*13,那么这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet。这样的操作也是为了加强YOLO算法对小目标检测的精确度。这个思想在YOLO v3中得到了进一步加强,在YOLO v3中采用类似FPN的上采样(upsample)和融合做法(最后融合了3个scale,其他两个scale的大小分别是26*26和52*52),在多个scale的feature map上做检测,对于小目标的检测效果提升还是比较明显的。虽然在YOLO v3中每个网格预测3个边界框,看起来比YOLO v2中每个grid cell预测5个边界框要少,但因为YOLO v3采用了多个尺度的特征融合,所以边界框的数量要比之前多很多。而在yolov1中,每个grid(对应anchor),仅预测一次类别,而且只有两个bounding box来进行坐标预测。
相比输入图像,这里用于检测的特征图有32倍的下采样。比如输入是416*416的话,这里的特征图就是13*13了。由于下采样倍数高,这里特征图的感受野比较大,因此适合检测图像中尺寸比较大的对象。
为了实现细粒度的检测,第79层的特征图又开始作上采样(从79层往右开始上采样卷积),然后与第61层特征图融合(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。
最后,第91层特征图再次上采样,并与第36层特征图融合(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。
分配上,在最小的13*13特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的26*26特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的52*52特征图上(较小的感受野)应用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。
感受一下9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。
YOLO v3使用新的网络来实现特征提取。在Darknet-19中添加残差网络的混合方式,使用连续的3×3和1×1卷积层,但现在也有一些shortcut连接,YOLO v3将其扩充为53层并称之为Darknet-53。
在基本的图像特征提取方面,YOLO3采用了称之为Darknet-53的网络结构(含有53个卷积层),它借鉴了残差网络residual network的做法,在一些层之间设置了快捷链路(shortcut connections)。
图:Darknet-53网络结构
上图的Darknet-53网络采用256*256*3作为输入,最左侧那一列的1、2、8等数字表示多少个重复的残差组件。每个残差组件有两个卷积层和一个快捷链路,示意图如下:
一个残差组件
整个v3结构里面,是没有池化层和全连接层的
网络输入:原论文中提到的大小320*320,416*416,608*608。这个大小必须是32的整数倍数,yolo_v3有5次下采样,每次采样步长为2,所以网络的最大步幅(步幅指层的输入大小除以输出)为2^5=32。
darknet-53:
从第0层一直到74层,一共有53个卷积层,其余为res层。这就是Joseph Redmon大神提出的darknet-53经典的卷积层了。作为yolov3特征提取的主要网络结构。预训练(以imagenet数据集为训练基础)的权重文件可以通过官网下载。该结构使用一系列的3*3和1*1的卷积的卷积层。
yolo v3输出了3个不同尺度的feature map,如上图所示的y1, y2, y3。这也是v3论文中提到的为数不多的改进点:predictions across scales
这个借鉴了FPN(feature pyramid networks),采用多尺度来对不同size的目标进行检测,越精细的grid cell就可以检测出越精细的物体。
y1,y2和y3的深度都是255,边长的规律是13:26:52
对于COCO类别而言,有80个种类,所以每个box应该对每个种类都输出一个概率。
yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率。所以3*(5 + 80) = 255。这个255就是这么来的。(还记得yolo v1的输出张量吗? 7x7x30,只能识别20类物体,而且每个cell只能预测2个box,一个类别
具有维度先验和位置预测的边界框。我们预测边界框的宽度和高度作为聚类中心的偏移量。我们使用sigmoid函数预测边界框相对于滤波器应用位置的中心坐标。
Direct location prediction(直接位置预测)
直接Anchor Box回归导致模型不稳定,对应公式也可以参考 Faster-RCNN论文,该公式没有任何约束,中心点可能会出现在图像任何位置,这就有可能导致回归过程震荡,甚至无法收敛:
针对这个问题,作者在预测位置参数时采用了强约束方法:
1)对应 Cell 距离左上角的边距为(Cx,Cy),σ定义为sigmoid激活函数,将函数值约束到[0,1],用来预测相对于该Cell 中心的偏移(不会偏离cell);
2)预定Anchor(文中描述为bounding box prior)对应的宽高为(Pw,Ph),预测 Location 是相对于Anchor的宽高 乘以系数得到;
计算得来,v2相当直接predict出了b-box的位置大小和confidence。box宽和高的预测是受prior影响的,对于v2而言,b-box prior数为5,
了解v3输出的输出是至关重要的。
第一点, 9个anchor会被三个输出张量平分的。根据大中小三种size各自取自己的anchor。
第二点,每个输出y在每个自己的网格都会输出3个预测框,这3个框是9除以3得到的,这是作者设置
的,我们可以从输出张量的维度来看,13x13x255。255是怎么来的呢,3*(5+80)。80表示80个种类,5表
示位置信息和置信度,3表示要输出3个prediction。在代码上来看,3*(5+80)中的3是直接由
num_anchors//3得到的。
第三点,作者使用了logistic回归来对每个anchor包围的内容进行了一个目标性评分(objectness score)。
根据目标性评分来选择anchor prior进行predict,而不是所有anchor prior都会有输出。
聚类的目的是anchor boxes和临近的ground truth有更大的IOU值,这和anchor box的尺寸没有直接关系。自定义的距离度量公式:
到聚类中心的距离越小越好,但IOU值是越大越好,所以使用 1 - IOU,这样就保证距离越小,IOU值越大。
使用的聚类原始数据是只有标注框的检测数据集,YOLOv2、v3都会生成一个包含标注框位置和类别的TXT文件,其中每行都包含,即ground truth boxes相对于原图的坐标,是框的中心点,是框的宽和高,N是所有标注框的个数;
首先给定k个聚类中心点,这里的是anchor boxes的宽和高尺寸,由于anchor boxes位置不固定,所以没有(x,y)的坐标,只有宽和高;
计算每个标注框和每个聚类中心点的距离 d=1-IOU(标注框,聚类中心),计算时每个标注框的中心点都与聚类中心重合,这样才能计算IOU值,即。将标注框分配给“距离”最近的聚类中心;
所有标注框分配完毕以后,对每个簇重新计算聚类中心点,计算方式为,是第i个簇的标注框个数,就是求该簇中所有标注框的宽和高的平均值。
重复第3、4步,直到聚类中心改变量很小。
几种主要的激活函数:Sigmond / ReLU /PReLU
激活函数 公式 缺点 优点
Sigmoid 1、会有梯度弥散2、不是关于原点对称3、计算exp比较耗时 -
Tanh 梯度弥散没解决1、解决了原点对称问题2、比sigmoid更快
ReLU 梯度弥散没完全解决,在(-)部分相当于神经元死亡而且不会复活 1、解决了部分梯度弥散问题2、收敛速度更快
Leaky ReLU- 解决了神经死亡问题
Maxout 参数比较多,本质上是在输出结果上又增加了一层 克服了ReLU的缺点,比较提倡使用
LeNet5 –没啥特点-不过是第一个CNN应该要知道
AlexNet 引入了ReLU和dropout,引入数据增强、池化相互之间有覆盖,三个卷积一个最大池化+三个全连接层
VGGNet 采用1*1和3*3的卷积核以及2*2的最大池化使得层数变得更深。常用VGGNet-16和VGGNet19
Google Inception Net
我称为盗梦空间网络 这个在控制了计算量和参数量的同时,获得了比较好的分类性能,和上面相比有几个大的改进:
1、去除了最后的全连接层,而是用一个全局的平均池化来取代它;
2、引入Inception Module,这是一个4个分支结合的结构。所有的分支都用到了1*1的卷积,这是因为1*1性价比很高,可以用很少的参数达到非线性和特征变换。
3、Inception V2第二版将所有的5*5变成2个3*3,而且提出来著名的Batch Normalization;
4、Inception V3第三版就更变态了,把较大的二维卷积拆成了两个较小的一维卷积,加速运算、减少过拟合,同时还更改了Inception Module的结构。
微软ResNet残差神经网络(Residual Neural Network)
1、引入高速公路结构,可以让神经网络变得非常深
2、ResNet第二个版本将ReLU激活函数变成y=x的线性函数
创新点
提出残差学习的思想。传统的卷积网络或者全连接网络在信息传递的时候或多或少会存在信息丢失,损耗等问题,同时还有导致梯度消失或者梯度爆炸,导致很深的网络无法训练。ResNet在一定程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度。VGGNet和ResNet的对比如下图所示。ResNet最大的区别在于有很多的旁路将输入直接连接到后面的层,这种结构也被称为shortcut或者skip connections。
在ResNet网络结构中会用到两种残差模块,一种是以两个3*3的卷积网络串接在一起作为一个残差模块,另外一种是1*1、3*3、1*1的3个卷积网络串接在一起作为一个残差模块。他们如下图所示。
深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。
LSTM防止梯度弥散和爆炸
LSTM用加和的方式取代了乘积,使得很难出现梯度弥散。但是相应的更大的几率会出现梯度爆炸,但是可以通过给梯度加门限解决这一问题。
将 n维特征映射到 k 维上(k
算法思想:最大方差理论、最小平方误差理论、坐标轴相关度理论
OCR系列
文字识别分为两个具体步骤:文字的检测和文字的识别。
现今基于深度学习的端到端OCR技术有两大主流技术:CRNN OCR和attention OCR。其实这两大方法主要区别在于最后的输出层(翻译层),即怎么将网络学习到的序列特征信息转化为最终的识别结果。这两大主流技术在其特征学习阶段都采用了CNN+RNN的网络结构,CRNN OCR在对齐时采取的方式是CTC算法,而attention OCR采取的方式则是attention机制。
网络结构包含三部分,从下到上依次为:
基于联结时序分类(Connectionist Temporal Classification, CTC)训练RNN的算法,在语音识别领域显著超过传统语音识别算法。一些学者尝试把CTC损失函数借鉴到OCR识别中,CRNN 就是其中代表性算法。
CRNN算法输入100*32归一化高度的词条图像,基于7层CNN(普遍使用VGG16)提取特征图,把特征图按列切分(Map-to-Sequence),每一列的512维特征,输入到两层各256单元的双向LSTM进行分类。在训练过程中,通过CTC损失函数的指导,实现字符位置与类标的近似软对齐。
CRNN中需要解决的问题是图像文本长度是不定长的,所以会存在一个对齐解码的问题,所以RNN需要一个额外的搭档来解决这个问题,这个搭档就是著名的CTC解码。
CRNN采取的架构是CNN+RNN+CTC,cnn提取图像像素特征,rnn提取图像时序特征,而ctc归纳字符间的连接特性。
基础网络使用了VGG16用于特征提取 ,BiLSTM(双向LSTM),因为一个小文本框,对于它的预测,我们不仅与其左边的小文本框有关系,而且还与其右边的小文本框有关系!
CTPN这个流行的文本检测框架的三个闪光点:
当然,CTPN也有一个很明显的缺点:对于非水平的文本的检测效果并不好。CTPN论文中给出的文本检测效果图都是文本位于水平方向的,显然CTPN并没有针对多方向的文本检测有深入的探讨。
CVPR2017的一篇spotlight论文《Detecting Oriented Text in Natural Images by Linking Segments》介绍以一种可以检测任意角度文本的检测算法,我们一般称这个算法为SegLink,这篇论文既融入CTPN小尺度候选框的思路又加入了SSD算法的思路,达到了当时自然场景下文本检测state-of-art的效果。针对多方向的文本检测做特定的研究。
思路就是让模型再学习一个参数θ!这个θ表示文本框的旋转角度,也就是我们最终要回归的参数从原来的(x,y,w,h)(x,y,w,h)变成
(x,y,w,h,θ)(x,y,w,h,θ)。SegLink确实也采取了这个思路,除此之外,他还提出了Segment和Linking两个重要概念,这个才是这篇CVPR论文的核心创新点。
对于以上把完整文本行先分割检测再合并的思路,有人提出质疑,觉得这种做法比较麻烦,把文本检测切割成多个阶段来进行,这无疑增大了文本检测精度的损失和时间的消耗,对于文本检测任务上中间处理越多可能效果越差。所以有篇CVPR2017的文章提出,我们有一种方法能优雅且简洁地完成多角度文本检测,这个算法叫做EAST,论文为《EAST: An Efficient and Accurate Scene Text Detector》
EAST网络分为特征提取层+特征融合层+输出层三大部分。
特征提取层: backbone采取PVANet来做特征提取,接下来送入卷积层,而且后面的卷积层的尺寸依次递减(size变为上一层的一半),而且卷积核的数量依次递增(是前一层的2倍)。抽取不同level的feature map,这样可以得到不同尺度的特征图,目的是解决文本行尺度变换剧烈的问题,size大的层可用于预测小的文本行,size小的层可用于预测大的文本行。
特征合并层,将抽取的特征进行merge.这里合并的规则采用了U-net的方法,合并规则:从特征提取网络的顶部特征按照相应的规则向下进行合并,这里描述可能不太好理解,具体参见下述的网络结构图。
网络输出层:网络的最终输出有5大部分,他们分别是:
所以从整体看来,EAST就是借助FCN架构直接回归出文本行的(x,y,w,h,θ)(x,y,w,h,θ)+置信度+四边形的四个坐标!非常简洁
阈值分割
二进制阈值化,反二进制阈值化,截断阈值化,阈值化为0,反阈值化为0 ,大津法OTSU(最大类间方差法)
全局固定阈值二值化和局部自适应阈值二值化
全局固定阈值很容易理解,就是对整幅图像都是用一个统一的阈值来进行二值化;
局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值
OpenCV中提供了4种模糊算法,列举如下:average 均值滤波;median 中值滤;gaussian 高斯滤波;bilateral 双边滤波
图像高频部分代表了图像的细节、纹理信息;低频代表了图像的轮廓信息。
低通-》模糊
高通-》锐化
角点检测
角点通常被定义为两条边的交点。比如,三角形有三个角,矩形有四个角,这些就是角点,是严格意义上的角点,但是从广义来说,
角点指的是拥有特定特征的图像点,这些特征点在图像中有具体的坐标,并具有某些数学特征(比如局部最大或最小的灰度)。
图像特征类型可以被分为三种:
Harris 角点检测
Harris角点检测是一种直接基于灰度图的角点提取算法,稳定性高,尤其对L型角点(也就是直角)检测精度高。缺点也是明显的,就是运算速度慢。cornerHarris
//进行角点检测 //第三个参数表示邻域大小,第四个参数表示Sobel算子孔径大小,第五个参数表示Harris参数 cornerHarris(g_grayImage, dstImage, 2, 3, 0.04, BORDER_DEFAULT);
检测到的点都是一些亮度明显变化的临界点
Shi-Tomasi角点检测
除了上述的Harris角点检测方法,我们还可以采用Shi-Tomasi方法进行角点检测。Shi-Tomsi算法是Harris算法的加强版,性能当然也有相应的提高
边缘检测(canny、sobel、laplacian)
边缘检测的一般步骤:滤波——消除噪声;增强——使边界轮廓更加明显;检测——选出边缘点
Canny算法
Canny边缘检测算法被很多人推崇为当今最优秀的边缘检测算法,会将图像中各个方向、明暗交替位置的边缘都提取出来
sobel的轮廓提取明显有没cnany的那么细致,只是把一些明显轮廓的边缘提取出来,但是可以进行x,y方向上的边缘提取,Sobel相比于Canny的优秀之处在于,它可以选择横向或纵向的边缘进行提取
霍夫线变换
霍夫线变换是一种在图像中寻找直线的方法。OpenCV中支持三种霍夫线变换,分别是标准霍夫线变换、多尺度霍夫线变换、累计概率霍夫线变换。
模板匹配
模板匹配,就是在一幅图像中寻找另一幅模板图像最匹配(也就是最相似)的部分的技术。
就是拿着模板图片(姚明头像)在原图(全明星照)中从左上至右下依次滑动,直到遇到某个区域的相似度低于我们设定的阈值,那么我们就认为该区域与模板匹配了,也就是我们找到了姚明的位置,并把它标记出来。
轮廓查找和多边形包围轮廓
Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体。所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓。
OpenCV中有一个很强大的函数,它可以从二值图像中找到轮廓:findContours函数。
有时我们还需要把找到的轮廓画出来,那就要用到函数drawContours了。
OpenCv这方面的函数总结如下:
矩就是图像的特征信息,比如大小、位置、方向等。
OpenCV提供了一些函数来计算图像的矩:
要进行进行图像矫正,至少有以下几项知识储备:
再详细地总结处理步骤:
1.图片灰度化;2.阈值二值化;3.检测轮廓;4.寻找轮廓的包围矩阵,并且获取角度;5.根据角度进行旋转矫正;6.对旋转后的图像进行轮廓提取; 7.对轮廓内的图像区域抠出来,成为一张独立图像
我把该矫正算法命名为基于轮廓提取的矫正算法,因为其关键技术就是通过轮廓来获取旋转角度。
为了解决车载摄像机图像的畸变问题,摄像机标定技术应运而生
摄像机标定是通过对已知的形状进行拍照,通过计算该形状在真实世界中位置与在图像中位置的偏差量(畸变系数),进而用这个偏差量去修正其他畸变图像的技术。
原则上,可以选用任何的已知形状去校准摄像机,不过业内的标定方法都是基于棋盘格的。因为它具备规则的、高对比度图案,能非常方便地自动化检测各个棋盘格的交点,十分适合标定摄像机的标定工作。
OpenCV库为摄像机标定提供了函数cv2.findChessboardCorners(),它能自动地检测棋盘格内4个棋盘格的交点(2白2黑的交接点)。我们只需要输入摄像机拍摄的完整棋盘格图像和交点在横纵向上的数量即可。随后我们可以使用函数cv2.drawChessboardCorners()绘制出检测的结果
获取交点的检测结果后,使用函数cv2.calibrateCamera()即可得到相机的畸变系数。
我们使用cv2.calibrateCamera()进行标定,这个函数会返回标定结果、相机的内参数矩阵、畸变系数、旋转矩阵和平移向量
Python 使用Opencv实现图像特征检测与匹配
图像识别算法
SURF特征。 SURF全称为“加速稳健特征”(Speeded Up Robust Feature),我们将会看到,它们不仅是尺度不变特征,而且是具有较高计算效率的特征。
SURF算法是SIFT算法的加速版, 而SIFT(尺度不变特征转换, ScaleInvariant Feature Transform) 是另一种著名的尺度不变特征检测法。SIFT算法检测的特征在空间和尺度上定位更加精确,所以在要求匹配极度精准且不考虑匹配速度的场合可以考虑使用SIFT算法。
ORB是ORiented Brief的简称,是brief算法的改进版。ORB算法比SIFT算法快100倍,比SURF算法快10倍。在计算机视觉领域有种说法,ORB算法的综合性能在各种测评里较其他特征提取算法是最好的。ORB算法是brief算法的改进,那么我们先说一下brief算法有什么去缺点。
BRIEF的优点在于其速度,其缺点是:
而ORB算法就是试图解决上述缺点中1和2提出的一种新概念。值得注意的是,ORB没有解决尺度不变性
FAST(加速分割测试获得特征, Features from Accelerated Segment Test) 。 这种算子专门用来快速检测兴趣点, 只需要对比几个像素,就可以判断是否为关键点。
跟Harris检测器的情况一样, FAST算法源于对构成角点的定义。FAST对角点的定义基于候选特征点周围的图像强度值。 以某个点为中心作一个圆, 根据圆上的像素值判断该点是否为关键点。 如果存在这样一段圆弧, 它的连续长度超过周长的3/4, 并且它上面所有像素的强度值都与圆心的强度值明显不同(全部更黑或更亮) , 那么就认定这是一个关键点。
用这个算法检测兴趣点的速度非常快, 因此十分适合需要优先考虑速度的应用。 这些应用包括实时视觉跟踪、 目标识别等, 它们需要在实
时视频流中跟踪或匹配多个点
角点是很容易在图像中定位的局部特征,角点的价值在于它是两条边缘线的接合点, 是一种二维特征,可以被精确地定位(即使是子像素级精度)
很多特征检测的方法,比如HOG、Harr、LBP
对每幅图进行特征点提取;对对特征点进行匹配;进行图像配准;把图像拷贝到另一幅图像的特定位置;对重叠边界进行特殊处理;
第一步就是特征点提取。现在CV领域有很多特征点的定义,比如sift、surf、harris角点、ORB都是很有名的特征因子,都可以用来做图像拼接的工作,他们各有优势
是给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它是能包含点集中的所有点的。理解物体形状或轮廓的一种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷。
OpenCV中提供了函数convesHull()用于对物体轮廓凸包进行检测,对形状凸包缺陷分析时使用convexityDefects()函数,每个缺陷区包含四个特征量:起始点、结束点、距离和最远点。
读取灰度图,视频图,并灰度化
中值滤波,均值滤波,高斯滤波,二值化阈值分割,模板匹配,形态学操作等
形态学
腐蚀和膨胀是最基本的形态学运算。
腐蚀和膨胀是针对白色部分(高亮部分)而言的。
膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;
腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。
膨胀:膨胀就是求局部最大值的操作,从图像直观看来,就是将图像光亮部分放大,黑暗部分缩小
开运算:先腐蚀再膨胀,用来消除小物体
闭运算:先膨胀再腐蚀,用于排除小型黑洞
形态学梯度:就是膨胀图与俯视图之差,用于保留物体的边缘轮廓。
顶帽:原图像与开运算图之差,用于分离比邻近点亮一些的斑块。
黑帽:闭运算与原图像之差,用于分离比邻近点暗一些的斑块。
opencv里有一个很好的函数getStructuringElement,我们只要往这个函数传相应的处理参数,就可以进行相应的操作了,使用起来非常方便。
形状特征,颜色,纹理,概率,描述算子,梯度直方图等
透视变换
cv2.getPerspectiveTransform
1.17个机器学习的常用算法