计算机视觉岗面经(进阶版)

视觉算法岗面经

面试的岗位大部分是计算机视觉算法工程师,少部分算法优化、部署岗。总的来说,大部分公司的技术面试都分为这几个部分:项目描述和细节提问、深度学习+目标检测算法、数据结构和算法代码及编程语言相关。下面是我面试当中问到的一些问题。

一,项目

主要是描述项目背景、项目实现的功能及使用的方法和流程,面试官会针对他感兴趣的点问一些技术细节,基本上只要能把项目流利的描述出来就问题不大。

二,深度学习、模型部署

2.1,目标检测相关

1,两阶段检测网络(Faster RCNN 系列)和一阶段检测网络(YOLO 系列)有什么区别?以及为什么两阶段比一阶段精度高?

  • 双阶段网络算法更精细,把任务分成了正负样本分类、bbox 初次回归以及类别分类和 bbox 二次回归。
  • YOLO 算法更简单粗暴,使用 backbone 对输入图像提取特征后,将特征图划分成 S×SS\times S 的网格,物体的中心坐标落在哪个网络内,该网格(grid)就负责预测目标的置信度、类别和 bboxYOLOv2-v5 通过 1×11 \times 1 卷积输出特定通道数的特征图来,特征图有 N 个通道,对应的每个 grid 都会有 N 个值,分别对应置信度、类别和 bbox 坐标。

个人感觉这种问题不好回答,也没有标准答案,可能会出现你答的点不是面试官想要的。

可参考 你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (上)一文读懂Faster RCNN 文章,理解典型的双阶段检测网络和单阶段检测网络。

2,说说你对 Focal Loss 的理解,为什么能解决分类问题中的类别不平衡问题?

作者认为一阶段检测网络的精度不高的原因主要在于:极度不平衡的正负样本比例,从而导致梯度(gradient)被容易样本(easy example)的损失主导

作者通过 Focal Loss 公式让置信度高(即容易样本)的样本的损失衰减的更厉害,从而降低容易样本的 Loss 权重,从而让模型在后期尽量去学习那些 hard 的样本。

3,如何在模型训练的时候判断是否过拟合,及模型过拟合问题如何解决?

将训练数据划分为训练集和验证集,80% 用于训练集,20% 用于验证集(训练集和验证集一定不能相交);训练的时候每隔一定 Epoch 比较验证集但指标和训练集是否一致,如果不一致,并且验证集指标变差了,即意味着过拟合。

  • 数据增强, 增加数据多样性;
  • 正则化策略:如 Parameter Norm Penalties (参数范数惩罚), L1, L2 正则化;
  • 模型融合, 比如 Bagging 和其他集成方法;
  • 添加 BN(batch normalization)层或者 dropout 层(现在基本不用);
  • Early Stopping (提前终止训练)。

4,如何在模型训练的时候判断是否欠拟合,及模型欠拟合问题如何解决?

underfitting 欠拟合的表现就是模型不收敛,即训练过程中验证集的指标比较差,Loss 不收敛。欠拟合的原因有很多种,这里以神经网络拟合能力不足问题给出以下参考解决方法:

  • 寻找最优的权重初始化方案:如 He 正态分布初始化 he_normal,深度学习框架都内置了很多权重初始化方法;
  • 使用适当的激活函数:卷积层的输出使用的激活函数一般为 ReLu,循环神经网络中的循环层使用的激活函数一般为 tanh,或者 ReLu
  • 选择合适的优化器和学习速率:SGD 优化器速度慢但是会达到最优.

5,描述以下 YOLOv3 算法及 YOLOv4、YOLOv5 的改进点,及为什么 CIoU LossIoU Loss 效果好?

YOLOv3 相比前代主要的改进点如下:

  1. BackboneDarkNet19 升级为 DarkNet53
  2. 添加了类似 FPN 的多尺度检测网络,解决小目标检测精度低的问题。
  3. 分类预测使用多标签进行类别分类,不再使用 softmax 函数。
  4. 每个 ground truth 对象只分配一个边界框。

6,描述下 RoI Pooling 过程和作用,以及 RoI Align 的改进点。

参考这篇文章 Understanding Region of Interest — (RoI Align and RoI Warp)

7,YOLOv3 的标签编码解码过程,以及正负样本采样策略。

YOLOv2 一样,YOLOv3 依然使用 K-means 聚类的方法来挑选 anchor boxes 作为边界框预测的先验框。每个边界框都会预测 44 个偏移坐标 (tx,ty,tw,th)(t_x,t_y,t_w,t_h)。假设 (cx,cy)(c_x, c_y)grid 的左上角坐标,pwp_wphp_h 是先验框(anchors)的宽度与高度,那么网络预测值和边界框真实位置的关系如下所示:

假设某一层的 feature map 的大小为 13×1313 \times 13, 那么 grid cell 就有 13×1313 \times 13 个,则第 nn 行第 nn 列的 grid cell 的坐标 (xx,cy)(x_x, c_y) 就是 (n1,n)(n-1,n)

alt

alt

正负样本的确定

  • 正样本:与 GTIOU 最大的框。
  • 负样本:与 GTIOU<0.5 的框。
  • 忽略的样本:与 GTIOU>0.5 但不是最大的框。
  • 使用 txt_xtyt_y (而不是 bxb_xbyb_y )来计算损失。

8,详细讲解下 Faster RCNNMask RCNN 算法过程。

参考以下两篇文章理解 Faster RCNNMask RCNN 模型:

9,最新的目标检测算法有哪些?

YOLOv4-v5Scaled YOLOv4Anchor-free 的算法:CenterNet

10,手写 Soft NMSFocal Loss

2.2,深度学习相关

1,BN 的作用及 BN 工作流程,以及训练和推理的区别?

2,普通卷积层、分组卷积、深度可分离卷积的 FLOPs 计算公式。

3,普通卷积层、分组卷积、深度可分离卷积的 MAC 计算公式。

4,详细描述下你知道的轻量级网络:MobileNetV1、ShuffleNetv1-v2。

5,何谓正则化?

通过给模型的代价函数(损失函数)添加被称为正则化项(regularizer)的惩罚,这称为将模型(学习函数为 f(x;θ)f(x; θ))正则化。正则化是一种思想(策略),给代价函数添加惩罚只是其中一种方法。

6,L2 正则化(权重衰减)原理,为什么它能防止模型过拟合?系数 λ\lambda 如何取值?

L2 正则化(权重衰减)是另外一种正则化技术,通过加入的正则项对参数数值进行衰减,得到更小的权值。λ\lambda 较大时,会使得一些权重几乎衰减到零,相当于去掉了这一项特征,类似于减少特征维度。假设待正则的网络参数为 wwL2 正则化为各个元素平方和的 1/21/2 次方,其形式为:

L2=12λw22L2 = \frac{1}{2}\lambda ||w||^{2}_{2}

实际使用时,一般将正则项加入目标函数,通过整体目标函数的误差反向传播,从而实现正则化影响和指导模型训练的目的。

7,L1 正则化原理,系数 λ\lambda 如何取值?

L1 范数: 为向量 x 各个元素绝对值之和。L1 正则化可以使权值参数稀疏,方便特征提取。

8,Pytorchconv2d 函数的参数有哪些?以及模型输出大小计算公式,并解释为什么公式是这样。

9,PytorchDataLoader 原理。

10,普通卷积过程描述下。

2.3,模型部署相关

1,浮点数在计算机中的表示方式?

2,描述下你知道的模型量化知识。

3,知识蒸馏原理,及温度系数如何取值?

4,通用矩阵乘(GEMM)优化算法有哪些?

二维矩阵相乘的 C++ 代码如下;

vector<vector<int>> matrix_mul(vector<vector<int>> A, vector<vector<int>> B){
    /*二维矩阵相乘函数,时间复杂度 O(n^3)
    */
    // vector<vector<int>> A_T = matrix_transpose(A);
    assert((*A.begin()).size()==B.size()); //断言,第一个矩阵的列必须等于第二个矩阵的行
    int new_rows = A.size();
    int new_cols = (*B.begin()).size();
    int L = B.size();
    vector<vector<int>> C(new_rows, vector<int>(new_cols,0));

    for(int i=0; i<new_rows; i++){
        for(int j=0; j<new_cols;j++){
            for(int k=0; k<L; k++){
                C[i][j] += A[i][k]*B[k][j];
            }
            // C[i][j] = vector_mul(A[i], get_col(B, j));
        }
    }
    return C;
}

对这样的矩阵乘的算法优化可分为两类:

  • 基于算法分析的方法:根据矩阵乘计算特性,从数学角度优化,典型的算法包括 Strassen 算法和 Coppersmith–Winograd 算法。
  • 基于软件优化的方法:根据计算机存储系统的层次结构特性,选择性地调整计算顺序,主要有循环拆分向量化、内存重排等。

2.4,编程语言相关

1,虚函数原理及作用?

2,C++ 构造函数和析构函数的初始化顺序。

3,智能指针描述下?

4,static 关键字作用?

5,STL 库的容器有哪些,讲下你最熟悉的一种及常用函数。

6,vector 和 数组的区别?vector 扩容在内存中是怎么操作的?

7,引用和指针的区别?

8,C++ 中定义 int a = 2,; int b = 2 和 Python 中定义 a = 2 b=3 有什么区别?

9,OpenCV 读取图像返回后的矩阵在内存中是怎么保存的?

10,内存对齐原理描述,为什么需要内存对齐?

11,散列表的实现原理?

12,虚拟地址和物理内存的关系?

三,数据结构与算法 coding

1,二分查找算法 + 可运行代码。

2,白板写链表反转。

3,包含 min 函数的栈 + 可运行代码(剑指 Offer 30. 包含min函数的栈)

4,最长回文子串 + 时间复杂度

5,TOP k 问题-最小的 K 个数 + 说下你知道哪几种解法,及各自时间复杂度

6,返回转置后的矩阵(逆时针)

7,冒泡排序及优化

8,求数组中比左边元素都大同时比右边元素都小的元素,返回这些元素的索引

9,手写快速排序

10,手写 softmax 算子 + 解释代码及衍生问题

12,无重复字符的最长子串

13,N 皇后问题

14,求最大的第 k 个数

其他

更多内容,请参考 github 仓库-CV 算法工程师成长之路。 或者关注我的公众号,阅读更多干货文章。 alt

#面经分享##算法开发实习##计算机视觉##深度学习##算法优化#
全部评论

相关推荐

日期:2026.3.26时长:约40mins面试官:算法工程师(也许是)面试岗位:算法工程师&nbsp;实习岗工作地:上海内容1&nbsp;面试官自我介绍2&nbsp;(我)自我介绍(追问)实习时长?视实习jd而定,对于……,实习期大概在4-5个月3&nbsp;简历询问a&nbsp;学生期间的学习经历有什么?i&nbsp;&nbsp;本科还是硕士?——》都介绍一下ii&nbsp;本科期间学校对我们专业的培养目标是……,所以我们会学数学、化学、英语、机械、力学、……。在研究生期间,主要学习的课程可以自行选择,我的主修课程主要包括环境感知、智能导航、传感器、ai及深度学习、数学等课程,研究生的主要研究方向就是……。b&nbsp;我看你的实习经历有一段……,当时就已经在做agent开发了吧?i&nbsp;&nbsp;我认为严格意义上那不算agent,当时agent也没有现在这么火,更多的还是一个对内的ai助手demo开发,在功能上基本可用。b(追问)那你对ai了解多少,与llm和agent相关的这些。ii&nbsp;对于llm还有agent的一些基本原理的概念性东西还是有一定程度了解,比如loRA微调、RLHF(是这个吗?其实我不太记得住这个词,可能当时说错了)、数据集、无监督学习、rag、a2a、skills、tool,Transformer等等。但是如果您问我我具体了解程度,那我只能说基本不了解。因为在我的预估和前期规划中,我的实习期从五月开始,这些东西的学习计划是放在四月的(确实是这样规划的)。那么在这之前,我主要做的是我的毕设和一些基础的学习,比如说强化学习的数学原理、经典强化学习算法、Attention、深度学习底层原理等等。之所以这样规划是因为这些东西是介于我毕设和预估中的实习涉及到的技术落地间的重要知识,需要有层次的递进学习,其次是我需要毕设做到一定程度导师才放实习,因此我的毕设进度大概是……。c&nbsp;介绍一下你最了解的项目。i&nbsp;&nbsp;我最了解的是我的毕设……。其中我这也是结合prompt&nbsp;engine做的,其中用于项目开发的skill也开源了。c(追问)你为什么选择PPO而不是其他的模型?你有做过对比吗?ii&nbsp;我选PPO的原因很简单,首先是PPO相对来说非常成熟,其次是它对超参数不是那么敏感,这样我可以不太用耗费很多时间去调参,此外,ppo的代码实现相对来说也比较简洁,能有效减轻我的工作量,最重要的一点是ppo的鲁棒性相对较强,这个是我比较看中的,因为……。对于其他模型而言,比如TRPO,没记错的话TRPO的一大优点在于其理论上能保证策略性能的严格递增,这点也是很重要的,但是没记错的话,TRPO中有个温度系数还是什么超参数,这个超参数对最终的策略提升有重大影响,如果这个参数没调好,容易让策略走向在最优解附近大幅震荡或无法学习的两个极端,这其实是我不希望出现的。毕竟计算机计算精度始终有限,因此我选用一个算法的目的之一在于在有限的计算时间和计算资源的限制之内能最逼近和无线逼近最优解,因此尽管PPO在理论上的收敛性不如TRPO严谨,但是从实际表现来看ppo反而好不少,他就是我需要的算法。c(追问)你的项目不使用数据集来训练对吧?比如那种生成的数据是无法应用到你的项目中的?iii我的项目可以用数据集,强化学习有通过数据集预训练或者需要采样数据的算法,但是,但是,如果使用数据集,我怎么保证我采集到的数据比强化学习自己的策略更好呢?换句话说,这些数据集需要我再环境中自己去采集,人具有主观性,我不能保证我采集到的数据是没有偏差和人的主观偏好在其中,如果基于有偏差的数据进行训练,那么如何保证最终训练出来的策略是最优策略呢?当然我不是在否定这种方法,现在有很多基于数据集驱动的强化学习,若我采用了这种方法,我就需要考虑……系列问题,这会让我毕设的体量爆炸……。因此,在实际中应该结合现有条件进行选择,最适合的才是最好的。4&nbsp;手撕一个字符串中包含空格和数字,要求不产生额外存储空间的情况,把所有的数字换到左边,同时字符串长度不变(空格放到末尾保留)。忘了这是力扣哪个题,用了双指针的思路,思路对的但是跑不过用例不知道为什么。5&nbsp;反问a&nbsp;算力资源?i&nbsp;(面试官所在的团队)有几张gpub&nbsp;ai&nbsp;coding额度资源?i&nbsp;这些问问llm就行,实习生估计是没有的(我其实无所谓,常年开的有自己的coding账户)c&nbsp;组织架构?或者团队的主要工作内容是?i&nbsp;(估计是组织架构不便透露)工作内容:i)基于cv的……检测ii)基于ai的……检测iii)基于ai&nbsp;llm的知识图谱构建(听到这眼前一亮)---------分界线---------大约面试结束30-40分钟左右接到hr电话电话内容总结:1&nbsp;面试官那边总体满意2&nbsp;jd是……(听到这觉得jd可以去)3&nbsp;入职时间及实习期(算了一下,可以去)4&nbsp;薪资5&nbsp;手头offer确认(表明0&nbsp;offer,给了就去,期间也会面其他公司,毕竟我知道这个实习岗没有hc,但打包票的是期间我不会跳走)
查看9道真题和解析
点赞 评论 收藏
分享
评论
38
368
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务