ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CV面试题汇总:OpenCV内存、NMS手写与TensorRT部署

CV面试题汇总:OpenCV内存、NMS手写与TensorRT部署 简历上写着“熟练使用 OpenCV”我让他讲讲cv::Mat的赋值是深拷贝还是浅拷贝对方愣了两秒回了一句“应该是深拷贝吧”。就这一句话后面二十分钟的面试基本变成了走过场。做计算机视觉这一行面试题最容易暴露的从来不是“你知不知道某个模型”而是你对图像数据在内存里怎么流动、在工程里怎么被处理的直觉。这份 CV 面试题整理汇总是我和身边几位同行在 2023 年一整年的面试与被面试过程中攒下来的覆盖图像基础、OpenCV 工程细节、深度学习模型、部署加速、手撕代码和项目追问六个方向适合正在准备跳槽的视觉工程师、从其他方向转视觉的同学也适合带团队的人拿去改造成自己的面试题单。它不保证你背完就能拿 offer但至少能让你在被追问到第二层、第三层的时候不至于断线。1. 一份能用的CV题库先得搞清楚面试官在分层筛什么面试不是知识竞赛是分层筛选。我在组里参与过几十场 CV 岗位的面试慢慢发现一个规律候选人挂掉的位置和他自我感觉最差的位置往往不是同一个地方。绝大多数人把精力砸在模型原理上结果真正拉开差距的是另外两层。搞清楚这个分层你才知道题库该怎么用。1.1 图像基础、模型原理、工程落地这三层挂人比例完全不同我把 CV 面试拆成三层来看。第一层是图像与代码基础包括图像在内存里的表示、颜色空间、位深、通道顺序、常用的 OpenCV 或 numpy 操作以及 C 侧的基本功。第二层是模型原理分类、检测、分割、跟踪这些任务的经典结构和损失函数以及近几年注意力机制带来的变化。第三层是工程落地模型怎么导出、怎么量化、怎么在有限算力上跑出可接受的延迟数据怎么闭环。有意思的是绝大多数候选人在第二层准备得最充分甚至能背出各种结构的公式但第一层和第三层是明显的洼地。我面过的一位候选人能把 DETR 的匈牙利匹配讲得很清楚却说不清imread读进来的图像通道顺序到底是 BGR 还是 RGB也没意识到cv::Mat的 ROI 裁剪会共享底层内存。这两类问题在真实项目里天天遇到答不上来会让人严重怀疑你之前写的代码是不是只在教程数据集上跑过。所以这份题库的排序我刻意把基础层放在最前面。不是因为它简单而是因为它最能区分“跑通过 demo”和“真正交付过系统”。1.2 为什么“背题”这件事在CV岗特别容易翻车CV 面试题有个很明显的特征它是一条追问链而不是一个个孤立的问题。你答完第一问面试官会根据你的答案顺着往下钻。背答案的人最怕这个因为第二问往往就是你背的那段话里没提到的部分。举个例子。问“NMS 是怎么做的”标准答案谁都会说按置信度排序取最高分框计算它和其余框的 IoU超过阈值就抑制掉循环往复。但如果面试官接着问候选框有几万个的时候这个流程慢在哪你怎么优化再往下问同类别的框要抑制不同类别的框呢如果是旋转框IoU 怎么算三个问题下来背答案的人基本就只剩下“这个我没深入过”。我自己的经验是准备 CV 题的正确姿势不是背结论而是把每个高频考点都做一遍“三层自问”这个机制的动机是什么具体怎么实现边界条件在哪。只要这三层你都过了一遍追问链就是你的加分项而不是陷阱。1.3 我整理题库时用的分类维度为了让复习有抓手我给题库定了一个四维分类。下面这张表是我实际在用的版本你可以直接拿去改。维度主要考察点典型问法建议投入占比图像与编程基础内存布局、数据类型、颜色空间、C/Python 基本功cv::Mat拷贝语义、cv::exception定位25%模型原理卷积计算、损失函数、评价指标、结构设计动机感受野手算、mAP 计算过程30%工程与部署模型导出、量化、推理引擎、性能分析ONNX 到 TensorRT 的踩坑点25%项目表达数据、指标、取舍、复盘能力项目瓶颈在哪怎么定位的20%这个配比和很多人的直觉不太一样模型原理只占三成。原因很现实模型原理是公开知识网上一搜一大把面试官很难靠它区分人而基础层和落地层的细节只有在真实项目里被坑过的人才答得出来。提示如果你时间有限优先补第一维和第三维这两块的投入产出比远高于再刷一遍模型结构。2. 图像基础与OpenCV工程题最好拿分也最容易丢分的地方这一层的内容其实不多就是图像在内存里怎么放、类型怎么定、算子怎么调。但恰恰是这些最基础的东西成了面试里最大的分水岭。因为模型可以背内存布局背不了——你要是没在调试器里盯着cv::Mat的 refcount 看过很多细节根本不会有印象。2.1 cv::Mat 的拷贝语义一道题问倒一半候选人cv::Mat是我面试里最爱的开场题因为它能一次性带出内存管理、引用计数、性能意识三个维度。正确答案是cv::Mat由两部分组成一个固定的头部包含 rows、cols、type、step、data 指针、引用计数指针等和一块独立的数据区。直接用赋值或者传值拷贝拷贝的是头部数据区是共享的引用计数加一。这就是所谓的浅拷贝。想真正复制数据得显式调用clone()或者copyTo()。面试里我会顺着问三个问题cv::Mat b a;之后修改b的像素a会不会变答案会变因为底层数据是同一块。cv::Mat roi img(cv::Rect(x, y, w, h));之后在roi上做滤波原图会不会被改答案是会ROI 是共享内存的视图不是副本。什么情况下需要clone()当你需要保留原始数据、或者后续操作会写入这块内存但你又不想污染源图的时候。这里有个很多人不知道的细节step这个字段表示的是每一行占用的字节数它不总是等于cols * elemSize()。因为cv::Mat的数据可能是从更大的图像里切出来的或者做过内存对齐行与行之间可能有填充字节。所以正确的按行遍历写法是ptruchar(row)而不是自己用data row * cols * channels去算偏移。我在代码评审里见过不少这种手算偏移的写法在连续内存的图像上碰巧能跑对一旦换成 ROI 就会出花屏,非常难查。那什么时候step会等于cols * elemSize()当isContinuous()返回 true 的时候。这也是为什么你在写像素遍历循环前可以先判断一下连续性连续的话直接当成一维数组处理速度会快不少。2.2 从 cv::exception 的报错现场倒推基本功terminate called after throwing an instance of cv::exception what(): opencv(...)这一长串报错几乎是每个 CV 工程师都见过的老朋友。面试里我会直接让候选人复述他印象最深的一次 OpenCV 报错以及怎么定位的。能答清楚的人基本功一般不会差。我把常见原因整理成了下面这张表你可以对照自查。报错特征常见根因定位手段读图后所有操作都报错imread路径错误或格式不支持返回空 Mat判断img.empty()检查路径与文件是否存在报通道数相关的断言失败输入通道数与函数要求不符比如对单通道图用了 BGR 转灰度打印img.channels()和img.type()报类型深度相关的断言失败CV_8U 与 CV_32F 混用滤波、加减法要求类型一致用convertTo显式转类型报尺寸不一致两幅图做算术运算但分辨率不同先resize或用带 mask 的版本报模块相关符号找不到用了 contrib 模块但编译时未启用检查编译选项与版本一致性这里我想特别强调empty()这一条。因为imread失败时不会抛异常只是返回一个空 Mat真正的异常会延迟到下一步操作才爆发报错位置和真实原因隔了十万八千里。所以我的习惯是只要涉及外部文件读取第一件事就是判断空并且把路径打印出来。这个习惯帮我省过无数次时间。另一个高频坑是类型深度。比如你从模型输出拿到一个 float 的置信度矩阵直接想和 8 位无符号的掩码做按位操作就会直接抛异常。正确的做法是先统一类型或者用cv::Mat::convertTo转一下。看似麻烦但这比调试一个静默出错的颜色映射要快得多。2.3 像素遍历与常见算子写得出和写得快是两回事手写像素遍历是 CV 面试的经典手撕题。很多人能写出功能正确的版本但写不出性能合理的版本。这两者在面试评分上差距很大。先说反面教材也就是最常见的写法// 慢的写法每次都要做类型检查和通道计算 for (int y 0; y img.rows; y) { for (int x 0; x img.cols; x) { cv::Vec3b px img.atcv::Vec3b(y, x); px[0] cv::saturate_castuchar(px[0] * 0.8); img.atcv::Vec3b(y, x) px; } }atT()在 Debug 模式下带边界检查Release 下虽然会优化掉一部分但每行每列都在重新计算地址偏移效率依然不理想。推荐的写法是用行指针把行地址取一次之后在行内连续访问// 快的写法行指针 一次取址 for (int y 0; y img.rows; y) { uchar* row img.ptruchar(y); for (int x 0; x img.cols * img.channels(); x) { row[x] cv::saturate_castuchar(row[x] * 0.8); } }这里的saturate_cast很关键。图像数据是 8 位的直接做乘法会溢出回绕产生完全错误的颜色。saturate_cast会做饱和处理超出范围的值被夹到边界上。面试官问“为什么不用static_cast”能答出这一点就是加分项。再往上一个层次如果你要做的映射是一个固定的查表关系比如 gamma 校正或者对比度拉伸用cv::LUT会比手写循环快好几倍。原理很简单256 个输入值对应的输出预先算好之后每个像素只做一次查表省掉了浮点运算。这个技巧在图像预处理链路里非常实用很多做过实际产品的人会主动提没做过的人基本想不到。还有一个常被问到的点是遍历顺序。图像数据是按行连续存储的按行优先访问对 CPU 缓存最友好。如果你的算法允许把行作为内层循环通常更慢。这一点在面试里说得出来会让人觉得你真的在乎性能而不仅仅是功能跑通。2.4 颜色空间与位深的细节问答颜色空间这块面试官最爱问的就三个点。第一个是顺序。OpenCV 默认读进来的彩色图是 BGR 顺序不是 RGB。这个差异在和别的库混用时是事故高发区比如你把 OpenCV 读的图直接喂给一个按 RGB 训练的模型通道反了精度会掉得莫名其妙。判断方法很简单看红色物体的通道响应就行了。我在项目里养成了一个习惯所有跨库传递的图像一律显式写清楚当前是什么顺序需要转换就转绝不靠猜。第二个是灰度转换的系数。BGR 转灰度不是简单取平均而是按人眼感知加权亮度通道的系数大致是 0.299、0.587、0.114 分别对应红绿蓝。原因在于人眼对绿色最敏感、对蓝色最不敏感。面试官问“为什么不是(rgb)/3”你能从人眼感光细胞的响应特性说起这个回答的层次就上去了。第三个是位深与取值范围。8 位无符号是 0 到 25532 位浮点通常是 0 到 1 或者 0 到 255 都有可能取决于前面的处理步骤。这个不确定是很多 bug 的根源。我的建议是所有中间结果统一到一个约定上要么全用浮点归一化要么全用整型不要混。混用的代码在半年后自己都看不懂。3. 模型题2023年的追问链已经从“是什么”变成“为什么这么设计”模型这块的变化很明显。三年前面试还停留在“讲一下 YOLO 的结构”现在面试官默认你知道那些问题直接跳到设计动机和取舍上。原因也简单模型结构是公开信息人人都能背区分度不够了。真正能区分人的是你对某个设计选择的理解深度。3.1 卷积、感受野、参数量手算题怎么不出错手算题是 CV 面试的传统艺能而且非常公平会就是会不会就是不会。我把最常考的三个计算整理一下。参数量。对于一个标准卷积层输入通道数 Cin输出通道数 Cout卷积核 k×k参数量是 (k×k×Cin 1) × Cout。注意那个加一是偏置项如果设置了不使用偏置就不加。举个例子Cin256Cout512k3参数量就是 (3×3×2561)×512大约 118 万。面试官经常会接着问“如果换成 3×3 深度可分离卷积能降到多少”答案是深度卷积 3×3×256 加逐点卷积 256×512总共约 13 万差不多是原来的九分之一。这个对比能顺带引出 MobileNet 系列的设计思路。计算量。通常用乘加次数来衡量一个卷积层的乘加次数是 k×k×Cin×Cout×Hout×Wout。面试里如果让你比较两个结构的计算量注意别把输入输出分辨率搞错了。感受野。这是最容易算错的一个。递推公式是当前层的感受野等于上一层的感受野加上 (k−1) 乘以之前所有层步长的累积。三层 3×3 卷积、步长全为 1 的情况下感受野依次是 3、5、7。如果中间有一层步长为 2就要乘进去。我见过很多人凭感觉答“大概二十几”其实算出来是具体数值。我个人的经验是这类题不要口算完就直接说答案先把公式和中间步骤写出来。一方面降低算错概率另一方面面试官看到你的推导过程即使最后数字差一点也能判断你思路是对的。3.2 检测与分割指标和损失的追问重点检测任务这块面试官的问题基本围绕两条线怎么算得分怎么算损失。指标线。IoU 的定义要张口就来交并集的定义和计算方式都要清楚。mAP 的计算流程是重点先按类别分开每个类别内把预测框按置信度从高到低排序逐个计算累计的精确率和召回率画出 P-R 曲线曲线下面积就是这一类别的 AP所有类别取平均就是 mAP。这里有个细节经常被追问插值方式。早期用的是 11 点插值后来改成全点插值而 COCO 标准是在 0.5 到 0.95 之间以 0.05 为步长取十个 IoU 阈值分别计算再平均并且用 101 点插值。这些差异导致同一份结果在不同评测脚本下数值不一样能说清楚的人不多。损失线。分类分支常用的 Focal Loss核心是给难样本加权解决正负样本极度不平衡的问题公式里的 gamma 参数控制对易分样本的抑制程度。回归分支从最早的 L1、L2 到 Smooth L1再到 IoU 系列动机是让损失和最终评价指标对齐。IoU Loss 的问题是预测框和真值框不相交时梯度为零GIoU 引入了最小闭包区域补上这个缺陷DIoU 又加入了中心点距离CIoU 进一步考虑长宽比。这条演进链是高频追问对象最好能一口气讲完。分割任务的重点不太一样。语义分割看 mIoU实例分割看 mask 的 AP两者评测方式差很多。损失函数上交叉熵适合类别均衡的情况Dice Loss 对前景占比很小的场景更友好因为它是基于重叠度而不是逐像素分类。实际项目里常见做法是两者加权组合。RoIAlign 相比 RoI Pooling 用双线性插值代替取整避免了量化误差这个问题在实例分割里几乎必问。3.3 注意力进视觉之后面试官爱问的那几个点注意力机制进了视觉领域之后面试题明显变难了因为这一块的设计选择更多、更依赖直觉。视觉 Transformer 的入门问题通常是 patch 划分和位置编码。图像被切成固定大小的块拉平后当作序列输入。位置编码有两种主流做法可学习的和正弦固定的面试官会问为什么需要它——因为自注意力本身是置换不变的没有位置信息就丢失了空间结构。再往深一层会问到计算复杂度。标准自注意力的复杂度与序列长度的平方成正比图像分辨率一高就吃不消。Swin 的解法是在窗口内做注意力再把窗口移位让相邻窗口之间有信息交换同时把复杂度压到线性。这个问题几乎成了考察是否真读过论文的标准问法。检测方向会问到 DETR 系列。DETR 用匈牙利匹配把预测和真值做一对一二分匹配去掉了锚框和非极大值抑制但收敛慢是出了名的。后续工作大多在解决这个收敛问题有的引入多尺度可变形注意力有的改成混合匹配策略。这个演进逻辑能讲清楚说明你不是只看过摘要。注意这一类问题的回答一定要落到“为什么这么设计”上。只描述结构不解释动机在面试官眼里和背课文没什么区别。3.4 部署侧的问法从ONNX到TensorRT部署这块是分水岭最大的地方。做过端侧或者服务端推理的人和只跑过训练脚本的人在问题面前的反应完全不同。典型的追问链是这样的训练好的模型怎么上线你答导出成 ONNX。接着问导出时踩过什么坑这个问题就是在筛人。实际的坑包括动态维度没设对导致 batch 或分辨率一变就报错某些算子导出后语义变了尤其是带控制流的后处理如果写在模型里导出的图会变得很复杂有些推理引擎支持不好。我的建议一直是把后处理拆出来放在模型外面图更干净调试也方便。再往下会问量化。训练后量化需要一批校准数据统计激活值的分布来确定缩放因子。对称量化和非对称量化的区别在于零点是否为零。逐通道量化比逐张量量化精度更好因为不同通道的数值范围差异可能很大。首尾层通常保持高精度因为输入层直接受原始像素范围影响输出层直接决定结果这两处对量化误差最敏感。最后是性能分析。问“推理慢怎么优化”好的回答应该是一个排查顺序先确认瓶颈在预处理、推理还是后处理再确认是计算密集还是访存密集再考虑算子融合、精度降低、批处理。上来就说“换更小的模型”的人通常没做过真正的性能调优。4. 手撕代码环节三类题目的评分锚点手撕环节是很多人最紧张的但其实它的评分标准比想象中宽松。面试官一般不会因为你写错一个边界就否决你真正看的是你的思路是否清晰、有没有工程意识、代码能不能读。理解了锚点准备起来会轻松很多。4.1 手写NMS加分项藏在边界处理里NMS 是 CV 手撕题的绝对高频。基本流程如下import numpy as np def nms(boxes, scores, iou_thresh): # boxes: (N, 4), 格式为 x1, y1, x2, y2 x1, y1, x2, y2 boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3] areas (x2 - x1) * (y2 - y1) order scores.argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) if order.size 1: break 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) h np.maximum(0.0, yy2 - yy1) inter w * h iou inter / (areas[i] areas[order[1:]] - inter) inds np.where(iou iou_thresh)[0] order order[inds 1] return keep这段代码里有三个容易被扣分的地方也是面试官真正在看的。第一个是np.maximum(0.0, ...)。如果两个框不相交xx2 - xx1会是负数不夹到零的话交面积算出来是负的IoU 就完全错了。这是最常见的漏项。第二个是order[inds 1]里那个加一。因为order[0]是当前被保留的框已经在后面计算时被排除在外了inds是在order[1:]上的索引映射回原数组要偏移一位。这个细节错了的话程序不报错但结果完全不对属于隐蔽 bug。第三个是被问到“框特别多怎么加速”时的回答。思路可以是先按类别分组减少比较次数也可以用更粗的网格预筛掉明显不相交的框或者在工程上用编译好的实现而不是 Python 循环。能说出“先按类别分组”这一条基本就说明你处理过多类别检测的实际输出。4.2 IoU与mAP的手算别在插值方式上翻车手算题里另一类是给你几个框和对应的分数让你算某个阈值下的 AP。这类题不难但步骤多容易漏。完整流程是这样的先按分数从高到低排序逐条累积判断该预测是真正例还是假正例累加得到累计真正例数和累计假正例数然后按累计真正例数除以真实框总数得到召回率按累计真正例数除以已处理的总数得到精确率。得到一个 (召回率, 精确率) 的序列之后做单调化处理让精确率沿着召回率增大的方向取后缀最大值最后算曲线下面积。手动算的时候有两个小陷阱。一个是没有被任何预测框命中的真实框它们的召回率贡献永远不会体现所以曲线最后可能到不了召回率 1.0这时候要显式把召回率补到 1。另一个是重复检测同一个目标的框第二个应该算假正例而不是真正例这个判断依赖 IoU 匹配的贪心策略。面试官如果问“两个模型A 的精确率高B 的召回率高选哪个”这题的答案取决于业务。安防场景漏检代价高选召回优先内容审核误伤代价高选精确优先。能答出“看业务代价”而不是硬选一个是加分项。4.3 开放设计题检测/分割/跟踪系统怎么搭骨架开放设计题通常给一个模糊的需求比如“设计一个工业质检系统”或者“做一个多路视频的人形跟踪”看你有没有全局视角。这类题没有标准答案打分看的是你有没有把每一环的坑都想到。我习惯用的答题框架是四个部分。数据部分数据从哪来标注质量怎么保证长尾类别怎么处理有没有负样本。训练部分选什么骨干网络输入分辨率怎么定数据增强用什么验证集怎么划分保证不泄漏。部署部分目标硬件是什么延迟和吞吐的要求精度容许的下限量化带来的精度损失能不能接受。监控部分上线之后怎么发现性能退化怎么收集线上失败样本回流到训练集。跟踪类的问题会额外追问关联策略。常见的做法是先做检测再用卡尔曼滤波预测轨迹然后用匈牙利算法做匹配匹配不上或者置信度低的框用二次关联处理。面试官可能会问“目标被遮挡几帧再出现怎么办”这就是在考轨迹管理超时未匹配的轨迹要保留一段时间再删除否则目标重新出现时会分配新 ID产生 ID 跳变。我的经验是答这类题时主动说出“我之前的项目里这块踩过什么坑”比单纯讲方案有效得多。面试官想听的是你的判断不是教科书目录。5. 项目追问简历上那两行字能撑多久面试的后半段基本都在聊项目。很多人以为这是水分最大的环节其实相反这是最难糊弄的环节。因为面试官会顺着你写的那两行字一层层往下钻直到钻到你的知识边界为止。你要做的不是无边无际地准备而是提前想清楚自己被钻到哪里会停。5.1 面试官追项目的三层漏斗我把追问拆成三层来看。第一层是事实层。你做了什么用了什么方法数据量多大最终指标多少。这一层只要项目是你自己做的就很好答。第二层是决策层。你为什么选这个方案而不是另一个为什么用这个分辨率为什么用这个损失权重。这一层开始筛人。答不上来的人通常会暴露一个事实方案是抄的参数是默认的。我面过一位候选人被问到输入分辨率为什么定在某个值时回答“教程里就是这么大”这一句减分非常多。第三层是复盘层。哪里做错了怎么定位的如果重来会怎么改。这一层是真正区分人的地方。有经验的人对失败的记忆比对成功的记忆清楚得多因为踩坑的过程才是能力沉淀的地方。我的建议是写简历时每一条项目经历都要能支撑起这三层的追问。如果说不出决策理由和失败复盘那这条经历不如不写或者写得更保守一点。5.2 用数字说话延迟、吞吐、精度、成本项目描述里最有说服力的是数字但要选对数字。视觉项目的核心数字通常是四个精度指标、单帧延迟、吞吐量、资源占用。精度要写清楚是在什么数据集、什么评测标准下的结果脱离标准谈精度没有意义。延迟要区分是端到端还是纯推理是单张还是批量场景下的平均值很多人在这一点上被追问过。吞吐量是多路并发下的实际处理能力和延迟不是一回事。资源占用包括显存、内存和功耗在端侧项目里这一项往往和精度同等重要。下面这张对照表是我在整理项目描述时常用的可以帮你检查数字有没有说清楚。指标常见的模糊说法更可信的说法精度准确率很高在某标准验证集上 mAP 提升若干个百分点延迟实时单帧端到端延迟在一定毫秒内含预处理与后处理吞吐支持多路在某硬件上并发若干路时仍保持目标帧率资源占用低显存占用、模型体积、功耗的具体量级我自己的习惯是准备一份两页的项目速查表把所有关键数字和对应的测试条件写下来面试前过一遍。这样被问到时不会含糊其辞也不会因为记错数字而自相矛盾。5.3 “如果重做一遍”这类问题的答法“这个项目如果让你重做一遍你会怎么改”是我必问的一题。因为它能看出一个人有没有从项目里真正学到东西。糟糕的回答是“整体方案没问题就是把精度再调高一点”。这种回答说明你没有真正复盘过。好的回答通常会指向具体的取舍比如当时为了赶时间用了比较重的骨干网络回头看其实在目标硬件上换个轻量结构精度只掉一点但延迟能降一半或者当时数据标注只做了一个标准导致某些边界情况没有覆盖应该在第一版就制定更细的标注规范又或者当时没有做线上监控模型退化是靠用户反馈发现的太被动。这类回答的共同特征是具体、有代价、有反思。能说出“当时这样做是为了什么代价是什么现在愿意用什么换什么”的人在我这里的评价会明显高出一截。6. 复习节奏与错题对照把题库变成可执行的计划题库整理完了怎么用是个更实际的问题。我见过太多人收藏了几十份题单最后一份都没看完。所以这一节我把自己的复习节奏和错题对照整理出来你可以按自己的时间线裁剪。6.1 八周节奏表如果距离面试还有两个月左右我一般按下面这个节奏推进。每周投入时间按工作之余的两到三个晚上加一个周末上午来估算。阶段时间主要任务检验方式打底第 1 至 2 周图像基础、类型与内存、OpenCV 常用接口能徒手讲清 Mat 拷贝语义与常见报错定位补模型第 3 至 4 周分类检测分割的经典结构、损失与指标能白纸推导感受野、参数量与 mAP 流程补落地第 5 周模型导出、量化、推理引擎、性能分析能说出一条完整的排查优化链路手撕第 6 周NMS、IoU、mAP、简单的图像算子限时十五分钟内写完并自测边界项目打磨第 7 周整理项目速查表模拟三层追问找人扮演面试官连问三层不卡壳冲刺第 8 周回顾错题、口述高频题、休息高频题能在三分钟内讲清楚动机与边界这个节奏里我最看重的是第七周。前面几周都是在补知识第七周才是把知识组织成表达能力。很多人忽略了这一步导致明明会的东西说出来却抓不住重点。打底阶段有个具体建议打开调试器真的去看一次cv::Mat的引用计数怎么变。看一遍胜过背十遍。6.2 高频错题对照表下面这张表是我们在交流中总结出的、答错率最高的几个问题。你可以拿来自测答不上来的优先补。问题常见错误回答正确方向cv::Mat赋值是深拷贝还是浅拷贝直接说深拷贝浅拷贝共享数据需要 clone 才复制BGR 转灰度的系数三通道取平均按人眼感知加权绿色权重最高NMS 中两个框不相交时 IoU直接算出负数交面积要先夹到非负感受野计算凭印象估个数用递推公式逐层累加并考虑步长量化为什么首尾层保留高精度不知道输入受像素范围影响输出直接决定结果项目精度怎么测的记不清了说清数据集、指标定义和测试条件这张表里的每一项我都在真实面试中出现过。它们的共同点是不难但答错会让人觉得你只是“用过”而不是“做过”。6.3 面试当天的一些实操经验最后分享几条我自己和我带过的同学验证过的经验。面试前一晚不要刷新题。新知识在短时间内记不住反而会挤占你已经掌握的内容的回忆路径得不偿失。把错题对照表过一遍就够了。被问到不会的问题时别硬编。可以直接说“这块我没有深入做过我的理解是……如果是我我会先去确认……”把思路讲出来。面试官对诚实加有思路的容忍度远高于对胡编的容忍度。我见过有候选人把没做过的方案讲得头头是道一追问细节就露馅这种减分比直接承认不会严重得多。手撕代码时先把思路说一遍再动手。如果卡住了主动说出当前卡在哪里比闷头沉默要好。面试官很多时候愿意给一点提示前提是他知道你在哪个环节上卡着。还有一点是我自己在被面试时才意识到的面试官问的很多问题答案本身并不唯一他更想看你怎么在不确定的情况下做判断。所以遇到开放性问题时先把约束条件说清楚再给出你的选择和理由这比直接给一个答案要有效得多。这份题库我会继续更新随着模型结构和部署工具的变化有些问题的答案会过时但那些关于内存、指标计算、取舍判断的底层问题几年下来几乎没怎么变过。真正值得花时间的就是这些不变的部分。
返回列表