项目1:基于相关滤波的多目标跟踪
KCF算法原理?为什么要用核方法?公式推导?
参考链接
KCF使用目标周围区域的循环矩阵采集正负样本,利用脊回归训练目标检测器,并利用循环矩阵在傅里叶空间可对角化的性质将矩阵的运算转化为向量的Hadamad积,即元素的点乘,大大降低了运算量,提高了运算速度,使算法满足实时性要求。
KCF的缺点?
对于多尺度的目标跟踪效果并不理想。
难处理高速运动的目标、低帧率中目标。相邻帧间目标位移过大。目标下一帧出现位置不在你的padding内,你怎么也不可能移位找到。
目标一旦被遮挡若干帧之后,可能模型就再也回不去了。
特征选取?
Histogram of Oriented Gridients(HOG) 方向梯度直方图,HOG特征。
HOG特征详细介绍
按照传统的方式,HOG特征一张图像就提取出一个向量,但是这个向量怎么用啊?我们又不能通过该向量的移位来获得采样样本,因为把直方图的一个bin循环移位有什么意义啊?
所以论文中Hog特征的提取是将sample区域划分成若干的区域,然后再每个区域提取特征,代码中是在每个区域提取了32维特征,即3*n+5,其中n=9,就是梯度方向划分的bin个数。每个梯度方向提取了3个特征,2个是对方向bin敏感的,1个是不敏感的,另外4个特征是关于表观纹理的特征还有一个是零,表示阶段特征,具体参见fhog。提取了31个特征(最后一个0不考虑)之后,不是串联起来,而是将每个cell的特征并起来,那么一幅图像得到的结果就是一个立体块。那么就可以通过cell的位移来获得样本,这样对应的就是每一通道对应位置的移位,所有样本的第i通道都是有生成图像的第i通道移位获得的,,所以分开在每一个通道上计算,就可以利用循环矩阵的性质了。
KCF的HOG多少维特征?对于64x128的图像而言,若每8x8的像素组成一个cell,则划分cell的结果是8x16,那么fhog提取的结果是8x16x31=3968个特征。
若划分cell的结果是MxN,那么fhog提取结果就是MxNx31,31个方向为通道。
HOG特征
HOG特征提取方法就是将一个image:
1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);
2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
4)将图像划分成小cells(例如6x6或者8x8像素/cell);
5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的描述子;
6)将每几个cell组成一个block(例如4个cell/block),一个block内所有cell的特征描述子串联起来便得到该block的HOG特征描述子。
7)将图像image内的所有block的HOG特征描述子串联起来就可以得到该image(你要检测的目标)的HOG特征描述子了。这个就是最终的可供分类使用的特征向量了。
HOG特征分为有overlap的和没有overlap的。
HOG特征的优缺点?是局部纹理特征。
正常算的话HOG多少维特征?对于64x128的图像而言,每16x16的像素组成一个cell,每2x2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64x128的图片,总共有36x7x15=3780个特征。
循环卷积推导?
尺度金字塔原理及代码实现?
中值滤波?
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。窗口为奇数,我选取的是3x3?还是5x5?
中值滤波在图像处理中,常用于保护边缘信息,是经典的平滑噪声的方法。因此可以把HOG特征的边缘保护的很好。
减小计算开销怎么做的?
项目2:联合检测与跟踪算法框架
9. 为什么用GoogLeNet网络?
10. 网络参数量有多少?输入多少维?输出多少维?
11. 损失函数怎么选择的?
softmax和triple loss
12. 检测置信度函数怎么推出来的?
13. 级联匹配?
14. 怎么应对遮挡问题
15. NMS代码
参考链接
#coding:utf-8
import numpy as np
def py_cpu_nms(dets, thresh):
"""Pure Python NMS baseline."""
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4] #bbox打分
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
#打分从大到小排列,取index
order = scores.argsort()[::-1]
#keep为最后保留的边框
keep = []
while order.size > 0:
#order[0]是当前分数最大的窗口,肯定保留
i = order[0]
keep.append(i)
#计算窗口i与其他所有窗口的交叠部分的面积
xx1 = np.maximum(x1[i], x1[order[1:]])
yy1 = np.maximum(y1[i], y1[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值
ovr = inter / (areas[i] + areas[order[1:]] - inter)
#inds为所有与窗口i的iou值小于threshold值的窗口的index,其他窗口此次都被窗口i吸收
inds = np.where(ovr <= thresh)[0]
#order里面只保留与窗口i交叠面积小于threshold的那些窗口,由于ovr长度比order长度少1(不包含i),所以inds+1对应到保留的窗口
order = order[inds + 1]
return keep
项目3:驾驶行为识别
说一下k-means
无监督的聚类算法,初始选定k值和k个样本作为中心。计算其他样本与k个中心的距离(欧式、马氏、曼哈顿),将样本分类到距离最小的那个中心簇中。之后将每个簇的样本点均值作为新的中心,再重复以上步骤。结束条件:循环到达一定次数(10)或者中心调整位置小于一定阈值。
k-means的特点:1.事先得给出k 2.对初值敏感 3.对孤立数据点敏感
k-means的改进(改进了2和3):k-means++法选择初始聚类中心的基本原则是:初始的聚类中心之间的相互距离要尽可能的远。首先给定一个样本中心,然后再选出尽可能远的其他样本中心。
精确率,召回率,准确率,F1
精确率:预测为正的样本中有多少是真正的正样本。 P = T P T P + F P P = \frac{TP}{TP+FP} P=TP+FPTP
召回率:样本中的正例有多少被预测正确了。
R = T P T P + F N R= \frac{TP}{TP+FN} R=TP+FNTP
准确率:正确分类的样本数与总样本数之比。
A C C = T P + T N T P + F P + T N + F N ACC= \frac{TP+TN}{TP+FP+TN+FN} ACC=TP+FP+TN+FNTP+TN
在正负样本不平衡的情况下,准确率这个评价指标有很大的缺陷。比如在互联网广告里面,点击的数量是很少的,一般只有千分之几,如果用acc,即使全部预测成负类(不点击)acc 也有 99% 以上,没有意义。
F1:精确率和召回率的调和均值
2 F 1 = 1 P + 1 R = 2 T P 2 T P + F P + F N \frac2{F1}= \frac1P+ \frac1R= \frac{2TP}{2TP+FP+FN} F12=P1+R1=2TP+FP+FN2TP
ROC曲线,PR曲线,AUC等评价指标
ROC曲线和PR(Precision - Recall)曲线皆为类别不平衡问题中常用的评估方法,二者既有相同也有不同点。
ROC曲线:可以用于评价一个分类器好坏。曲线越靠近左上角,意味着越多的正例优先于负例,模型的整体表现也就越好。
TPR 代表能将正例分对的概率
T P R = R = T P T P + F N TPR=R= \frac{TP}{TP+FN} TPR=R=TP+FNTP
FPR 代表将负例错分为正例的概率
F P R = F P T N + F P FPR=\frac{FP}{TN+FP} FPR=TN+FPFP
在 ROC 空间中,每个点的横坐标是 FPR,纵坐标是 TPR,这也就描绘了分类器在 TP(真正率)和 FP(假正率)间的 trade-off。
缺点:ROC曲线是不会随着类别分布的改变而改变,但这在某种程度上也是其缺点。因为负例N增加了很多,而曲线却没变,这等于产生了大量FP。像信息检索中如果主要关心正例的预测准确性的话,这就不可接受了。
在类别不平衡的背景下,负例的数目众多致使FPR的增长不明显,导致ROC曲线呈现一个过分乐观的效果估计。
PR曲线
Precision vs Recall的曲线。越靠近右上角,模型的整体表现也就越好。
PR曲线与ROC曲线的相同点是都采用了TPR (Recall),都可以用AUC来衡量分类器的效果。不同点是ROC曲线使用了FPR,而PR曲线使用了Precision,因此PR曲线的两个指标都聚焦于正例。类别不平衡问题中由于主要关心正例,所以在此情况下PR曲线被广泛认为优于ROC曲线。
防止网络过拟合的方法
网络过拟合的原因往往是:训练数据不足;训练过度 。
因此有以下方法:参考文章1 参考文章2
提前终止(当验证集上的效果已经饱和,开始变差的时候)
数据集扩增(Data augmentation)
正则化(Regularization)L1正则化/L2正则化
正则化化的神经网络往往能够比非正则化化的泛化能力更强。一般来说,我们只需要对w进行规范化,而几乎不对b进行正则化。
在L1正则化中,权重通过一个常量向0进行收缩;
而L2正则化中,权重通过一个和w成比例的量进行收缩。
所以,当一个特定的权重绝对值|w|很大时,L1规范化的权重缩小远比L2小很多;而当|w|很小时,L1规范化的缩小又比L2大很多。
Dropout L1、L2正则化是通过修改代价函数来实现的,而Dropout则是通过修改神经网络本身来实现的,它是在训练网络时用的一种技巧。我们每次使用梯度下降时,只使用随机的一半神经元进行更新权值和偏置,因此我们的神经网络是在一半隐藏神经元被丢弃的情况下学习的。它为什么有助于防止过拟合呢?可以简单地这样解释,运用了dropout的训练过程,相当于训练了很多个只有半数隐层单元的神经网络(后面简称为“半数网络”),每一个这样的半数网络,都可以给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都可以给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成大的影响。
Batch normalization
BN(Batch Normalization)层加速收敛
控制过拟合,可以少用或不用Dropout和正则
降低网络对初始化权重敏感
允许使用较大的学习率
BN学习笔记
梯度消失和梯度爆炸
梯度消失与梯度爆炸其实是一种情况。参考链接?
梯度消失经常出现在深层网络中,或者是采用了不合适的损失函数,比如sigmoid。
梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。
对激活函数进行求导,如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。
因此,梯度消失、爆炸,其根本原因在于反向传播训练的法则。
如何解决?
1.预训练加微调
采取无监督逐层训练方法每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
2.梯度剪切、正则
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
1另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)
3.采用relu、leakrelu、elu等激活函数(导数为1)
L1与L2正则,L1为什么会产生稀疏数据
L1正则化和L2正则化可以看做是损失函数的惩罚项。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。
L1正则化是指权值向量中各个元素的绝对值之和。可以产生稀疏的权值。L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,因此可以用于特征选择。
L2正则化是指权值向量中各个元素的平方和然后再求平方根。可以产生平滑的权值L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合。
L1对wi的导数是1或者-1,是定值,因此一段时间后会变为0。那么若干次迭代之后,权重就有可能减少为0。但是L2每个更新的时候更新的值的大小和wi值是有关系的。当wi趋近与0时,那么对应的导数值也会更新,所以他会不停的接近0,但并不会是0。
而引入L1正则后,代价函数在0处的导数有一个突变。从d0+λ到d0−λ,若d0+λ和d0−λ异号,则在0处会是一个极小值点。因此,优化时,很可能优化到该极小值点上,即w=0处。
参考链接
Lr反向传播公式推导
参考链接
常见损失函数
均方误差、交叉熵
损失函数及区别(公式角度)。
参考链接
relu激活函数
数据增强方式
图像平移。这种方法可以使得网络学习到平移不变的特征。
图像旋转。学习旋转不变的特征。有些任务里,目标可能有多种不同的姿态,旋转正好可以弥补样本中姿态较少的问题。
图像镜像。和旋转的功能类似。
图像亮度变化。甚至可以用直方图均衡化。
裁剪。
缩放。
图像模糊。用不同的模板卷积产生模糊图像。
关于学习率的设置
学习率设置的过小时,收敛过程将变得十分缓慢。而当学习率设置的过大时,梯度可能会在最小值附近来回震荡,甚至可能无法收敛。对于深度学习来说,每 t 轮学习,学习率减半。或者按训练轮数增长指数差值递减。基于经验的手动调整。 通过尝试不同的固定学习率,如0.1, 0.01, 0.001等,观察迭代次数和loss的变化关系,找到loss下降最快关系对应的学习率。
数据不平衡会产生什么问题,如何解决数据不平衡问题
基本思路是让正负样本在训练过程中拥有相同的话语权,比如利用采样、数据合成、加权等方法。采样分为上采样(Oversampling)和下采样(Undersampling),上采样是把小种类复制多份,下采样是从大众类中剔除一些样本,或者说只从大众类中选取部分样本。数据合成方法是利用已有样本生成更多样本。还可以通过加权的方式来解决数据不平衡问题,即对不同类别分错的代价不同。
1*1卷积有什么用
参考链接
1.实现跨通道的交互和信息整合
2.进行卷积核通道数的降维和升维
3.可以在保持feature map 尺寸不变(即不损失分辨率)的前提下大幅增加非线性特性,把网络做得很deep
DW卷积和普通卷积参数量和运行速度
深度可分离卷积:(Depthwise Separable Convolution)分为两个环节。
参数量比较:
DSC:Dk * Dk * M + 1 * 1 * M * N = 656
普通Conv:Dk * Dk * M * N = 4608
可见,DSC使参数减少是因为回避了使用N个M通道的“厚”卷积核,改为使用M个“薄”单通道卷积核 + “厚”的1 * 1 卷积核。
即,回避M * N这个参数主要来源直接与卷积核尺寸相乘。从这个角度上讲,卷积核尺寸越大,DSC的轻量化效果越明显。
普通卷积,概述就是一个filter一次性完整地卷input feature map的所有通道,所以filter本身是由channel dimension的。而每一个filter在卷完之后的输出是单通道的,所以该卷积层最后的输出有多少通道,就需要在该卷积层设置多少个不同的filter(但没一个fitler同样尺寸和channel)。
参考链接
deformable convolution实现原理
focal loss怎么用的等等
Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。参考链接1? 参考链接2核心思想很简单, 就是在优化过程中逐渐减低那些easy example的权重, 这样会使得训练优化过程对更有意义的样本有更高的偏置。
adaboost的原理
是集成学习的。其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
有哪些正则化方法,batch_normal的实现方式
BN层有什么作用?
BN(Batch Normalization)层加速收敛
控制过拟合,可以少用或不用Dropout和正则
降低网络对初始化权重敏感
参考链接1?
参考链接
BN是在此基础上,不仅仅只对输入层的输入数据进行标准化,还对每个隐藏层的输入进行标准化。
Batch Normalization 限制了在前层的参数的更新,减少了输入值改变的问题,使输出值更加稳定,因此有轻微的正则化的效果。
Batch Normalization给隐藏层增加了噪音,有一定的正则化效果。
bn放在激活函数后可以吗?
bn函数一般是在激活函数之前,这样激活函数可以保留本身的含义(非线性)。在一些文章里面会有争议说也可以放在之后,放在之后也是可以的,可以使神经网络的线性部分的输入值归一化,但是会有一个问题,从理论上说,那就是激活函数之后的数据和进行归一化之后的数据分布相差过大,也就是修正得可能过多,这样尽管可能在某些网络下效果还可以,可是在其余的网络上面效果并不好。
BN什么时候会失效?原理。
BN缺点,原理(参数)
loss优化的几个方法(sgd、动量、adam)
动量法的表达式
随机梯度下降相比全局梯度下降好处是什么
推导逻辑回归LR的损失函数和梯度计算
优化方法及区别。
朴素贝叶斯为什么“朴素”?(属性相互独立)
为什么要进行归一化?优点?(量纲,等高线)
说说你自己有什么特别的炼丹技巧嘛,平时有用什么trick?
Pytorch
常见命令
其他了解的目标检测模型:
one-stage
two-stage
小目标检测方法:fpn
提升小目标检测效果的方法
1、fpn结构,fpn解决什么问题
2、输入图像大小,目标物体大小,anhor大小的设置
3、focal loss解决什么问题,如何写,每个参数有什么作用
Re-ID:
目标跟踪:
最近的目标跟踪算法有哪些
目标跟踪里的评价指标都是怎么算的
常见命令
1.判断链表是否有环
2.Top-k问题
从10亿数据里面找出topk,说说最坏最好和平均情况下的时间复杂度;
2.快速排序,冒泡排序,归并排序
3.给定整数n,假设以1-n这n个数字构建一颗BST,有多少种构建方法?
3.合并两个排序数组
4.合并k个长度为n的有序数组
解题思路:最小堆
时间复杂度:O(nklogk)
创建一个大小为nk的数组保存最后的结果。创建一个大小为k的最小堆,堆中元素为k个数组中的每个数组的第一个元素。
重复下列步骤nk次:
每次从堆中取出最小元素(堆顶元素),并将其存入输出数组中;
用堆顶元素所在数组的下一元素将堆顶元素替换掉,
如果数组中元素被取光了,将堆顶元素替换为无穷大。
每次替换堆顶元素后,重新调整堆
7.字符串最长不重复字串(哈希表,思路和买卖股票一样)
介绍常见的数据结构,
散列表优势是什么,如何实现查找复杂度O(1),
参考我的另一篇博客
1.多态
2.静态成员变量函数和普通的成员变量函数有什么区别;
3.const的作用
设计模型了解不?讲讲
c++内存管理
指针和引用的区别
c++多态
软件设计模式
sizeof()
虚函数
多态/类中继承的方式,为什么会有这几种方式,作用是什么
18.C 11新特性。
19.指针和引用区别,什么时候只能用指针或者引用。
函数return vector变量的缺点,一般怎么操作。
20.多线程,线程安全,共享数据如何保证线程安全。如何进行数据共享。
21.cache常用框架。
左值引用和右值引用
指针传递和引用传递
进程和线程
线程间通信
有哪些线程锁(生产消费者模型)
1.list和tuple区别
list 是可变的对象,元组 tuple 是不可变的对象!
2.git有哪些常用操作,gitlab一般有哪些权限(owner,developer,guest之类
3.python2和python3的区别(print, raw_input, xrange, 整除除法)
类的继承和基类
new__和__init(__new__会实例化类,在__init__之前调用,__init__初始化实例)
装饰器,@property
mutable和immutable(后来有详细地问 a=“abc”, a+=“d” / a=[1], a.append(2) 时的内存变化引导我)