视觉算法工程师面试必备

以下内容是我根据自己的理解以及网上搜索所整理的,如果有错误请指正。大部分内容是我面试过程中被问到的,在此做出整理,希望能对求职的同学能有帮助。有些内容还需要配合其他专业的博文来理解。

YOLOv1

卷积网络+2个全连接,输入图像直接预测出目标框的x,y,w,h,及置信度(是否存在目标的置信度以及分类置信度),输入一张图片,将图片划分为77的网格,每个网格负责预测落该网格中的物体,每个网格预测2(或多)个bbox,每个bbox包括x,y,w,h,以及目标的置信度以及分类置信度。输出尺寸是77*(2*5+class+1).yolo的loss由3部分组成,框位置loss,置信度loss,和分类loss,框位置loss由中心点偏差和高宽偏差组成,置信度loss由存在目标+不存在目标的误差组成,分类loss就指存在目标时类别loss.

在预测时,会将目标置信度与分类置信度相乘,设置阈值过滤掉分值低的框,再通过nms获得最终预测结果。nms先将得分最高的框拿出来,计算所有框和它的IOU,大于一定阈值择删掉(说明他们可能是预测同一个目标),重复上述过程,直到无框为止。

缺点:1.只能预测与训练图像相同分辨率的图片
2.每个网格只能预测一个目标

YOLOv2

改进:1.对每一个卷积层添加BN(加快收敛)
2.去掉了全连接层,使用anchor box来预测bounding box,原来只能预测98个bbox,现在可以2000个,提高召回率
3.使用k_means聚类在训练集跑一下获得生成anchor大小
4.多尺度训练,每训练10个batch,图片尺寸会发生改变,相应的网络参数也发生改变。
5. Direct location prediction,使用逻辑回归激活函数将结果限定在0-1之间。
6. Draknet19 19 个卷积层和 5 个 maxpooling

YOLOv3

多尺度预测,类似FPN
darknet53
9种尺度的先验框 (10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)大特征图用小的先验框检测检测小物体,小的用大先验框检测大物体。
使用逻辑回归替代softmax进行类别预测,可预测多标签对象

FPN

自底向上下采样,自顶向下上采样,采用方法是最近邻插值(把该点的像素值赋给邻近像素,可以在上采样的过程中最大程度地保留特征图的语义信息),进行3次上采样,每上采样一次和原金字塔中的对应大小的特征concat在一起,concat之前原金字塔中的特征会先做个 1*1的卷积以适配维度,总共4个输出,采用倍数相对于输入图片为4,8,16,32

RCNN

步骤:
使用selective search生成大概2k个候选区域,更改候选区域大小以适应CNN的输入
训练svm分类器预测每个区域所包含的物体类别,得到2000*class的矩阵,使用NMS。
通过边界回归(bounding-box regression) 得到精确的目标区域,SGD(随机梯度下降)
存在问题:1.在图像提取候选区域会占用大量内存
2.warp导致目标形状发生改变
3.proposal存在大量特征重叠,造成重复计算

SPPNet

取消了warp
(ROI 映射方式:通过把ROI的左上,右下映射到feature map上两个对应点。)

spatial pyramid pooling空间金字塔池化,网络名字就是由此而来。它放在所有的卷积层之后,有效解决了卷积层的重复计算问题,。spp将任意大小feature map都映射成(16+4+1)256(比如输出1313256,将其划分为44,22,11的网格,再做maxpooling,拉伸之后concat一下就成了(16+4+1)*256,之后的操作就是设计一下全连接层的输出就行)

Fast RCNN

改进:
1、卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算。原来RCNN是对每个region proposal分别做卷积,因为一张图像中有2000左右的region proposal,肯定相互之间的重叠率很高,因此产生重复计算。2、用ROI pooling(向下取整,max pooling)进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能直接把region proposal作为输入。3、将regressor放进网络一起训练,每个类别对应一个regressor,同时用softmax代替原来的SVM分类器,SmoothL1Loss取代Bouding box回归。

Faster RCNN

改进:1. 使用RPN(region proposal network)区域生成网络替代Selective Search,对每个像素生成9个锚框,因为这样生成的锚框在大部分情况下只是背景,所以 利用一个二分类的Softmax,判断锚框内是否为感兴趣物体,如果不是则抛弃,如果是则放入ROI Pooling内。(RPN的输入是经过骨干网路提取的feature map (NHw),使用33的卷积来卷积这个feature map,获得了与公共特征图相同尺寸,输出通道数为256维的特征图,相当于HW个256维向量,对每个向量进行两次全连接操作,输出通道分别为2k和4k,则获得Hw2k和Hw4k(k=9,因为每个anchor产生k个anchor box)的结果,在现在看来,就相当于做了两个11的卷积(卷积核数量分别为2k和4k),2指两个分数[框是前景和背景的概率],4是指anchor针对原图坐标的偏移)
注意:特征图上每一个点,对应原图就是一个框,每一个点产生k个anchor box(原文k=9)
网络步骤:
经过卷积网络产生的feature map分成两条路,一条进入RPN进行proposal的提取,另一条直接进入Bbox head,RPN只负责proposal提取,输出的是偏移量和置信度[框是前景和背景的概率],bbox head需要对得到的feature map进行roi pooling,最后通过两个分类层和回归层来分别判断物体属于哪个类别以及精细调整候选区域的位置,以获取最终目标检测的结果(分类分支输出512
class,回归分支输出512*4calss)。

bounding box regression:

目的是为了回归出偏移量(预测框相对于gt的平移量和缩放倍数),输入的是卷积特征和gt,输出偏移量。使用的是线性回归,Y=WX,梯度下降。

损失函数:

L1 loss(平均绝对误差MAE) ,误差绝对值求平均
L2 loss(均方误差MSE) ,绝对误差平方求平均
smooth L1 loss: , x=f(xi)−yi 为真实值和预测值的差值
fast rcnn使用smooth L1 loss 主要是为了限制梯度,当预测框与 ground truth 差别过大时,梯度值不至于过大,当预测框与 ground truth 差别很小时,梯度值足够小。

resnet-n

有n-1个卷积层,1个全连接层和4组block
残差模块的理解:从模型角度,使用短路连接相当于简化了模型。从其功能的角度,解决网络退化问题(网络层数加深,效果反而变差,与过拟合不大一样),网络加深容易梯度爆炸或梯度消失,短路模块导数为1. ,小括号中的1说明可以无损地传播梯度,有1的存在也不会导致梯度消失。

inception_v1模块:

增加网络的宽度,增加了网络对尺度的适应性,不同的支路的感受野是不同的,所以有多尺度的信息在里面。多次使用1*1卷积,与其他卷积合并使用目的是减少参数.
inception_v2模块:加入了BN层,使每一层都规范化到一个N(0,1)的高斯,另一方面学习VGG使用2个3x3cobv代替inception模块中的5x5,降参,加速计算。
inception_v3: 将 7x7分解成1x7和7x1,加速计算,加深网络,增加网络非线性。
Inception V4:Inception和Resnet的结合。

手部关键点检测:

Hand Keypoint Detection in Single Images using Multiview Bootstrapping cvpr2017
本质上还是个cpm神经网络,作者先使用训练好的cpm网络检测不同视角的手的关键点,再将这些关键点根据摄像机的位姿构建三角,得到手部关键点的3D位置,再将3D位置投影到2D图像上。
原论文中提出的模型可生成22个关键点,其中21个点是人手部的,第22个点代表着背景。下图展示了人手部的21个关键点位置。
pose machine
stage t=1 时,分类器 g1 输出的关节点置信值
stage t>1 时,分类器基于两种输入来预测图片关节点位置的置信:1.图片特征2.上一个stage输出的空间内容信息
使用的是手工设计的特征。
convolutional pose machine
结合了卷积神经网络和 pose machine的方法:
stage t=1时,CPM 根据图片局部信息(local image evidence)预测关节点. 输入图片经过全卷积网络,输出关节点的预测结果. 网络包括 5 个卷积层和 2 个 1×1 卷积层,输入368368的图片,输出4646,通道数为P+1的置信度图。(P为关键点数21)
stage t>1时,输入的是CNN的卷积特征以及上一层的置信度图。前四层卷积之后的特征图与置信度图concat之后再经过后面三层卷积。
CPM 每个 stage 都会输出关节点的预测结果,重复地输出每个关节点位置的 belief maps,以渐进精细化的方式估计关节点. 故,在每个 stage 输出后均计算 loss,作为中间监督 loss,避免梯度消失问题.

BSN:

BSN包含3个主要模块:时序评估模块,提名生成模块和提名评估模块。
时序评估模块:采用3层时序卷积层来对视频序列中每个位置上动作开始的概率、动作结束的概率和动作进行的概率同时进行建模,从而生成 动作开始概率序列,动作结束概率序列和动作概率序列。
提名生成模块:(1)概率高于一个阈值 或(2)该时间节点的概率高于前一时刻以及后一时刻的概率(即一个概率峰值)。然后我们将候选开始时间节点和候选结束时间节点两两结合,保留时长符合要求的开始节点-结束节点组合作为候选时序动作提名。动作描述:接下来要为每个候选时序动作提名生成对应的特征描述Boundary-Sensitive
Proposal (BSP) feature,每个提名取其本身作为中心区域,再取开始点以及结束点附近一段区间作为开始区域和结束区域,采样N个点之后拼接一下就得到了提名特征。
提名评估模块:使用一个多层感知机进行评估,置信度越高,说明IOU越高。(多层感知机就是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过激活函数进行变换。)

结果处理soft_nms:不会直接将与当前最大分数proposal的IOU大于某个阈值的删掉,而是iou越大其分数越低。
我们可以认为nms计算分数,IOU大于某个阈值设为0,把si=0的去掉, ,而soft_nms则是当大于阈值时,使用线性加权si=si*(1-IOU)

BMN:

改进点:提名评估时使用BM layer,BSN中每一个置信度都是单独计算的,有些计算式重复的,BMN使用矩阵方式计算。论文的核心是生成一张confidence map,横坐标为start dim,纵坐标为duration dim(最大长度为认为确定的一段视频的最大时长), 横坐标代表着起始点,纵坐标代表着持续的时长,map上的值就代表着起点到该点时的时序片段存在动作的置信度。
Feature Encoding
使用的是双流网路,开源的代码只使用RGB。

激活函数:

sigmoid:优:1.(0,1)之间单调,优化稳定 2.求导容易 3.作为概率解释模型
缺:1.幂运算复杂. 2.均值非0,收敛慢 3.导数值小于1,梯度消失
tanh:优:1.均值0,收敛快 缺:1.幂运算 2.梯度消失
relu:优:1.防止梯度消失2.网络具有稀疏性,3.求导容易 缺:神经元坏死,非0均值
softmax: Softmax鼓励不同类别的特征分开,但并不鼓励特征分离很多

variance 与 bias

偏差bias描述的是预测值与真实值的偏离程度,刻画的是模型拟合能力。
方差variance描述的是预测值的离散程度,也就是期望的距离。刻画的是数据扰动所造成的影响,即稳定性。

降维:1*1卷积,k-means,池化,PCA主成分分析,SVD线性判别法

正则化:把约束项或惩罚项加入到已有的模型或损失函数上,以防止过拟合和提高模型泛化能力。
常见正则化方法:L1正则,L2正则,dropout, BN

attention机制:

就是一些列注意力分配系数,把序列各个元素分配一个权重。1.求输入输出相似度2.对相似度归一化3.对归一化的结果与输入加权求和作为下一次的输入

selective search:

一种区域合并算法,输入一张图片,输出候选的目标位置集合。
切分法获得候选区域集合R
计算R中每个相邻区域相似度,S
合并相似度最高的两个区域为新集,添加进R,S中移除这两个区域
计算新集与所有子集相似度
重复上述步骤直至S为空

优化器:

Batch Gradient Descent (BGD)批梯度下降:更新一次参数使用所有样本进行梯度更新,迭代次数少但训练慢, 凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
Stochastic Gradient Descent (SGD)随机梯度下降:随机采样一个样本来更新参数,计算开销从O(n)->O(1),更新频繁造成损失函数震荡。
Mini-Batch Gradient Descent (MBGD):每次更新参数使用B个样本,减少计算开销 。
Momentum:可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。

LSTM:

首先传统RNN:每个RNN得输入是这一时刻的输入x以及上一时刻h,输出y和h’, h’=σ(wh h+w^i x) y=σ(wh^’)
y是h’放入线性层之后的输出,主要是进行维度映射,通常将所有的输出y送入softmax中。

LSTM则是对RNN的改进,主要是为了解决RNN的梯度消失和梯度爆炸问题。
三个门(遗忘门,输入门,输出门)作用都是控制输入的大小,都是基于当前输入x以及上一个lstm单元的隐含层输出h_(t-1),每一个都有自己的权重偏执参数。最终目的为了获得内部记忆单元输出c以及隐藏层h,
内部记忆单元c等于遗忘门f上一层记忆c_(t-1)+输入门i当前记忆c_t^’,
隐含层h_t=输出门o_t*tanh(记忆单元c)

3个门的激活函数都是sigmoid,因为sigmoid函数输出0-1,输出接近0或1符合物理意义上的关与开。
获得隐含层输出以及记忆单元状态是使用tanh激活(其他也行),主要是0均值加快收敛。

lstm通过梯度裁剪技术避免梯度爆炸(设定阈值,梯度范数超过给定值,等比收缩),状态S通过累加,避免梯度消失。
sigmoid:3个门,决定哪一部分输出。
tanh:状态和输出

Linux:

cd 进入主目录cd –返回上次所在目录
ls查看目录中的文件
tree 显示文件和目录由根目录开始的树形结构 lstree 显示文件和目录由根目录开始的树形结构
mkdir dir1 创建一个叫做 ‘dir1’ 的目录’ mkdir dir1 dir2 同时创建两个目录
rm -f file1 删除一个叫做 ‘file1’ 的文件’ rmdir dir1 删除一个叫做 ‘dir1’ 的目录’
mv dir1 new_dir 重命名/移动 一个目录 cp file1 file2 复制一个文件 cp dir/* . 复制一个目录下的所有文件到当前工作目录
touch a.py创建文件a.py vim a.py

Docker:

docker pull +镜像源 拉取镜像源
cd yourfile
vi Dockerfile
vim +文件修改文件 ESC+:wq退出
docker built –t +版本创建版本
docker run+版本 本地运行版本
docker push +版本 版本推送到镜像仓库
docker images查看镜像
docker rmi删除镜像
docker ps –a查看容器
docker rm –f 删除容器

Git:

1.create a new repository on the command line
echo “# test” >> README.md
git init
git add README.md
git commit -m “first commit”
git branch -M main
git remote add origin git@github.com:liu824/test.git
git push -u origin main
2.push an existing repository from the command line与远程仓库建立连接,origin 是个代号,叫什么无所谓
git remote add origin git@github.com:liu824/test.git
git branch -M main
git push -u origin main 本地仓库推送到远程

python全局变量

在整个.py文件中都能用到,局部变量只能在某个函数中使用到。
修改全局变量的值需要使用global关键字

K-means聚类:

一种无监督分类算法,该算法的任务是将无标签数据集聚类成k个簇。
损失函数: ,x是数据,不是一个x坐标,μi为簇Ci的中心。
算法流程如下:
(随机)选择K个聚类的初始中心。
对每一个样本点计算它与聚类中心的距离,将其归到离他最近的聚类中心。
计算新的簇聚类中心,利用上述均值计算。
重复2,3步骤直到聚类中心点变化小于设置阈值。
k-means++:由于k-means比较依赖中心点的选择,k-means对其改进。
随机选取一个点作为中心。
计算其他样本点与所有中心的距离,取其最小值,则该点为新聚类中心的概率为该最小值的平方比上其他所有点最小值之和的平方 。(可以看出最小距离最大的更容易成为下一个聚类中心)
重复2直到宣传k个聚类中心。

小目标检测:

将图片放大之后再做检测。如FPN多尺度。
图像增广:对小目标进行过采样,通过多次复制粘贴小物体来增强每个图像。
在anchor上做文章,需考虑anchor的密度,形状,范围。目标越小anchor应该越多越密集,才能覆盖所有的候选区域,目标越大anchor应该越少越稀疏,否则互相高度重叠造成冗余计算量。尺度和比例必须要覆盖相应任务的可能出现的所有目标。
模型:增加检测层Pn的数量:RetinaNet中是P3~P7共5个检测层,如需检测更小的目标,可以考虑加入P2检测层。

处理类别不均衡的方法:

下采样大样本,
过采样小样本,
小样本标签增加损失函数的权值,加权之后可以理解为一个数据顶多个用。
采用对类别不敏感的算法 树模型。
softloss

P(precious)R(Recall)曲线是怎么来的:

分类时,一般都会通过置信度划分样本,置信度大于某个阈值将其划分为正类,小于为负类。这样每一个阈值都对应PR曲线上一个点。阈值可以自己设置数量以及大小。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值