视觉算法工程师面试问题集锦,从基础到进阶,会介绍细节,持续更新中......

引言

简历上写项目的流程:

项目背景是什么?应用场景在什么地方?目的是什么?创造了什么价值?你做了什么事情?遇到困难时,又是怎么解决的?

面试需要准备的内容:

一.项目描述与项目细节提问

主要描述项目背景,项目实现的功能与方法流程等,面试官会针对细节进行提问,所以项目是要反复打磨的

二.深度学习的八股

说是八股,但除了一些目标检测模型的发展,原理,各种问题的出现原因与处置方式以外,还有很多东西可以称得上是经验之谈,所以这部分对于算法工程师来说依然是很重要的

三.视觉上的图像处理技能

例如Halcon与OpenCV,实际上我只会OpenCV,但是差不多的,会一个就行,然后要搞懂图像相关的很多知识,最好懂一些相机,结构光之类的东西

三.模型部署相关

模型格式转化,框架转化,浮点数在计算机中的存储问题,知识蒸馏问题,模型量化,GEMM优化,边缘端部署这些等等

四.编程语言相关

C++语言的了解深度,python语言与Pytorch等的了解深度与使用情况等

五.数据结构与算法

手撕代码没什么可说的

六.科研比赛

如果你有拿得出手的paper(B会/二区及以上)或者好的奖项(kaggle/icpc区域赛银牌及以上)这些的话当然是很好的,这部分根据自己情况准备即可

作为一个历经了外包,国企,互联网,传统行业上市公司的视觉算法应用从业者,至于底层的研究我做的还远远不够,但是如果从应用上来说,我对视觉的理解就是,视觉的精髓就在于对图像处理的把握与对深度学习的巧妙应用相结合,重点要掌握的就是opencv与pytorch(当然像是tf,paddle等框架那也是一样要用的),掌握的语言就是py和cpp,要会部署,加分的技能有,模型int8量化或者别的精度的量化,模型剪枝和重训练,继续的加分项,边缘端的部署,分布式训练等

深度学习框架介绍

深度学习框架最常见的就是Tensorflow和Pytorch,其中torch和tf2是基于动态图的,而tf1是基于静态图的,所谓的动态图和静态图的介绍如下:

未完待续

Tensorflow

  • tensorflow2将Keras api作为核心,Keras就是将tensorflow中的很多方法进行了封装,更方便了,可以跨平台,由各种现成的模型。
  • Tensor就是多维的矩阵,tensorflow就是对矩阵进行处理的框架,可以通过GPU加速的矩阵。
  • 视觉任务中,遮蔽现象是一种常见的问题,现在已经被攻克了,比人类的识别能力还强。
  • 善于查阅Tensorflow的api文档,比如Tensorflow中的tf.keras模块中的layers模块,里面就有很多层的对象可以直接使用;
  • Keras的常规操作,可以选择激活函数,比如relu,可以对权重和bias进行初始化,初始化很神奇,有时候怎么都不收敛,换个初始化就收敛了,还可以加入正则化等
  • Sequential就是用来按顺序添加网络结构的,比如keras里的Sequential,可以直接add对应的层,不过一般我们也都是根据论文里的思想,用人家现成的网络结构,自己最多调调参
  • compile就是对网络进行配置,指定优化器比如随机梯度下降SGD、Adam等和损失函数比如回归就用mse,分类可以用交叉熵
  • 训练集效果好,验证集不好,就是过拟合了,准备正则化吧,在全连接层可以添加l1,l2范数,或者在全连接层加dropout也可以,keras中都可以实现
  • 神经网络其实就是一个特征提取器,中间的层就是在提前特征,最后用激活函数来实现分类或者回归
  • tf.data模块,比如Dataset可以将numpy转换成Tensor格式
  • 对于Dataset,可以用batch操作把它转化成对应batch大小的Tensor,shuffle可以进行洗牌a
  • 模型的保存,训练完的模型,直接save成h5文件就行,下次就不用训练了,直接加载就行,load_model就是加载模型,这都是keras的强大功能
  • to_json可以单独保存网络的结构,model_from_json就是读取网络的结构,save_weights和load_weights就是单独保存权重和读取权重
  • 读数据一般就是os.path.join
  • 影响运行速度的,batch_size,图像的size,常见的224*224*3
  • 对于输入为h*h*c的图像,选择F个卷积核,边缘填充Padding为P,步长为s,那么卷积完了输出的图像的宽h’ = (h-F+2P)/s +1,也就是输出的feature map是h’*h’*F的,这就是每次卷积的输出
  • 那还有个问题,权重参数怎么算,比如某个卷积层共有32个卷积核,卷积核是3*3的,图像是3通道的,那么每个卷积核实际上应该是3*3*3的,这就是27个参数,32个卷积核就是27*32,也就是864个参数,那还要每个feature map都有一个bias,也就是32个偏置参数,也就是864+32,就是896个参数,这就是一个卷积层的参数个数的算法,参数个数很大程度上影响了训练的速度
  • 那还想知道,池化层的参数有多少,记住,池化层没有参数,压根不需要参数啊,直接池化运算了
  • 还要全连接层,这个参数就比较大了,你最后拉直有多少个值,那就要有多少个参数哦。
  • Conv1D就是对向量做卷积,2D就是对矩阵也就是图像做卷积,3D一般用来处理视频,参数filters选取卷积核数量,其实就是要输出多少个feature map,kernel_size就是卷积核大小,还要步长,卷积网络的流程就是卷积-relu-池化-卷积-relu-池化-…-拉直-全连接层
  • ImageDataGenerator数据生成器,就是用来数据预处理的模块,它可以动态产生一个batch一个batch的数据进入内存中,进行处理,所以要指定batch_size,这里还要指定steps,也就是有多少个batch。。。就很无语,这还要指定,然后还要指定epoch,就是迭代次数,每个epoch都要跑完所有batch才行
  • 对于one-hot编码,就选择categorical,对于二分类,就选择binary就行
  • 数据增强,就是翻转,平移,对称,通道变换等操作,扩大样本量,解决过拟合问题,然后keras.preprocessing.image包中有这些方法
  • Keras中的Callback,相当于监视器,可以用来提前停止callbacks.EarlyStopping早停法,可以设置成连续几次epoch,loss没有下降就停止,动态改变学习率LearningRateScheduler
  • TFRecords是一种常用的二进制序列存储方法,tf.Examples可以用来读取、写入TFRecords数据,首先这比cpu读取数据要快,它可以把数据先直接处理成TFRecords格式,这样就不用一下一下处理了,直接统一处理完然后再直接一次次读取就行了
  • tf.Examples其实会把数据转化成类似于字典的格式,它可以存很多特征,比如对于一张图像来说,可以存它的长宽,通道数,已经像素点矩阵本身,都可以通过tf.io写入到文件中,类似于java中io流,读取该文件也可以tf.data中的函数读取就行
  • RNN就是先将第一个时刻的数据输入一个节点,然后将输出与下一时刻的数据一起在下一个节点进行处理,它体现了前后数据之间是有依赖的意义,它只能处理短期的依赖,但不能处理长期依赖,因为当序列太长时,梯度很难反向传播到前面,这就出现了梯度消失,但是LSTM可以解决这一问题。
  • LSTM有之前的隐层输出的状态h,之前的细胞状态c,这个细胞状态其实就是携带了对之前的记忆的,当然还有新时刻加入的数据x,首先将之前的隐层输出和新数据进行concate,得到[h,x],然后sigmoid成0-1的数据,越小越接近0呗,再与细胞状态进行对应位置相乘,这就叫遗忘门,什么是遗忘门,就是让不重要的部分(为0的)忘掉,记住重要的部分;下一步,让遗忘门数据再去与tanh激活函数归一化后的[h,x]对应位置相乘,啥意思,就是把tanh归一化过的[h,x]再选择性遗忘一部分数据;再然后,就叫遗忘门处理过的细胞状态c与遗忘门处理过的归一化[h,x]相加,就变成了新的细胞状态啦,它携带了以往的记忆,但也在这次数据加入后进行了新的更新;后面竟然还要用更新后的细胞状态进行tanh放缩再与遗忘门数据再相乘一次,才是隐层的输出。。。但是细胞状态就不变了。

Pytorch

  • Caffe不更新了,而且配置文件非常麻烦,安装非常困难,不推荐。。。然后是Tensorflow1.x,这玩意说明书特别长,用起来要读好多文档,不方便。。。它定义比较严格,用起来就显得比较冗长。再然后是keras,因为tensorflow1.x的api太混乱了,keras在它的基础上进行了再封装,这下就方便了很多,keras的api就简洁了很多,大家都喜欢用,再然后谷歌把Keras收购了,推出了Tensorflow2.x,啥2.x,其实就是keras,但是好景不长,torch的python版本Pytorch推出了,这东西学习成本极低,又方便又好用,Tensorflow那一套接口,属实是不好用,所以推荐Pytorch,用的人多,达到90%都不为过,大家选择的就是好的,不过呢,如果做谷歌的开源项目,那可能还是要用Tensorflow。。。
  • 面向开源项目编程,Pytorch好用,也用得多,它更新后也变化比较少
  • torch.tensor将numpy格式转换成tensor格式

OpenCV数字图像处理

1.opencv的基本图像处理知识

这部分可以直接看我的另一篇专门总结数字图像处理的文章

2.opencv的运算包

除了常用的数字图像处理以外,opencv还提供了一系列可以开盒即用的函数包,算法模型等

  • OpenCV已经实现了一些目标追踪算法,如KCF,叫自相关滤波,先解释相关滤波,其实就是对于视频中的第一帧来说,先框一个框,然后padding一下,扩出去的背景部分也是用来学习的,这就形成了一个滤波器,可以用来训练得到框的响应,但这不是一个简单的二分类问题,而是一个响应大小问题,框出来的框距离正样本(物体)越远,响应越低,根据当前帧训练出来的响应最小的框,就可以认为是下一帧要框的地方,但是下一次还要重新训练,重新寻找响应,以此类推,追踪下去

目标检测

Yolo-v1介绍

Yolo-v1算法相对RCNN算法是实现了端到端的算法,它只经过卷积神经网络就实现了目标检测,其原理如下:

首先对输入的图像Image进行Resize,论文用了GoogLeNet 作为神经网络主干,24层卷积层加上两层全连接层,Resize之后的图像传入GoogLeNet,输出时已经相当于进行了下采样,图像大小变小了很多,然后把输出的feature map切分成s*s的网格单元,每个网格单元关联着2个大小不一致的候选框,每个网格单元会计算出多个条件类别概率,数量就是类别数,但是最后只会预测一个类别。

当物体的中心在网格单元中时,才会去绘制该网格单元的边界框,那怎么判断物体的中心在网格单元上呢?这里是用confidence来衡量的,这个confidence如下:

confidence=Pr(obj)*IOU^{_{pred}^{truth}}

其中IOU称为交并比,其含义如下:

IOU^{_{truth}^{pred}}=\frac{truth\cap pred}{truth\cup pred}

意思就是物体的真实位置与候选框的位置的交集,比上它们的并集,这个指标会在候选框接近物体真实位置时变得越来越大,而Pr(object)在该网格单元中包含物体中心时为1,否则为0,所以confidence就需要在网格单元中包含物体中心的条件下,且候选框最接近真实物体时最大,最后选择confidence最大的候选框作为检测框即可。

Transformer在CV上的介绍

对于Transformer来说,它与卷积神经网络不同,它是以向量作为处理主体的,这就是Encoder层,Encoder层中的核心思想就是Self-Attention,所谓自注意力,其实就是与自己本身找相似性,在进入Encoder层之前需要先对图像Img进行划分,比如一个4*4*3的图像,可以划分成4个2*2*3的token,所谓token其实就是平均切分得来的,接着将token拉直成一个向量,通道也拉直,这就是4个向量,然后分别传进Encoder层,对向量进行三种线性变换,可以得到Q,K,V三个向量,注意,QKV的向量形状没有变化,利用当前token的Q向量分别与4个token(包括当前token)的K向量求内积,这里就是自注意力的体现了,因为它与自己也求了内积,再然后就得到了4个内积,再分别除以根号下的向量长度,这就是4个常数,然后进行softmax激活,得到的还是4个数值,与对应的V向量进行数乘,并相加得到输出向量,显然这个向量应该和一个token向量的长度一致,又因为有4个token向量输入,所以也有4个输出向量,输出向量与输入时的向量数量和向量大小都一样,这便完成了一次Encoder,可以进行多次Encoder,但是最终输出的就是最开始输入时一样的向量。

下一步,要随机生成一个与token向量一样长的向量,这就是随机生成就可以,将这个向量输入Encoder层,一样进行QKV变换,但是从前面输出的4个向量就不进行Self-Attention处理了,它们也进行QKV变换,但是仅仅是为了提供给随机生成的token向量使用,最后只输出该向量的Encoder结果即可,这就是相当于综合了前面4个token的整个信息,然后可以再进行一次MLP,也就是加深层数的处理,就采用全连接层的加深就行,最后通过softmax进行给出各个类别的概率,实现分类。

还有一个位置编码部分还在研究。。。

从Vision-Transformer到Axial-Transformer

将图像通过卷积进行划分,比如说,一张224*224*3的图像,通过768个16*16的卷积核进行卷积,最后输出的特征图就是14*14*768,那划分成多少个token呢,将14*14一下就是196,那就变成了196*768了,每个点都有768个通道,每个点都可以看出一个token了,token向量的元素数就是768,这就划分出了196个token向量了,然后传入Transformer中时,还分为Self-Attention1D和Self-Attention2D  ,所谓1D就是每个token只和其所在行的token进行Encoder运算,而2D就是和所有的Encoder进行运算,那其实2D就会运算速度慢,但是信息结合的就会比较全面,现在有论文提出Axial-Attention,让某个token先与其所在行的token进行Encoder操作,以结合该行的信息,以此类推,该token所在列的token们都会与其所在行的token进行Encoder操作,然后再让该token与其所在列的token进行Encoder操作,这样就可以结合到全局上的所有token的信息了,这样既可以结合所有token的信息,相比于2D又可以减少很多计算量。

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV(开源计算机视觉库)是一种广泛应用的计算机视觉图像处理库。在OpenCV算法面试面试官可能问及以下几个方面的问题: 1. OpenCV库的基本概念和特点:应聘者需要明确说明OpenCV是一个开源库,具有跨平台性、包含众多算法模块、支持多种编程语言等特点。 2. 图像处理基础知识:应聘者需要了解图像处理的基础知识,如图像的表示、颜色空间转换、滤波等内容,并能够解释图像处理算法在OpenCV如何实现。 3. 特征提取与描述:面试官可能询问关于特征提取与描述算法问题,如SIFT、SURF、ORB等算法的原理和应用场景,以及在OpenCV如何使用这些算法进行特征匹配。 4. 物体检测与识别:面试官可能问及物体检测与识别的相关算法,如Haar分类器、HOG+SVM等算法,应聘者需要知道这些算法的基本原理和使用方法。 5. 目标跟踪和运动估计:应聘者需要了解目标跟踪和运动估计的常见算法,如KCF、Meanshift等,并能够解释这些算法的原理与应用。 6. 图像分割:面试官可能问关于图像分割的问题,如常见的分割算法有哪些,如何使用这些算法实现图像分割等。 总之,OpenCV算法面试需要应聘者具备扎实的图像处理和计算机视觉基础知识,并能够熟练运用OpenCV库的各种算法解决实际问题。最好能够结合具体的项目经验进行回答,展示自己的实际操作能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会抓鼠鼠的阿猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值