计算机视觉面试准备
1.项目准备(重要)
项目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