计算机视觉技术详解:从图像滤波到目标检测的核心知识点

发布时间:2026/10/14 4:57:21
计算机视觉技术详解:从图像滤波到目标检测的核心知识点 简介2024年bjtu计算机视觉课程必考知识点汇总是一份针对北京交通大学计算机视觉课程整理的复习资料面向选课学生、考研备考生以及计算机视觉入门者。资料将课程高频考点以问答形式集中呈现涵盖图像滤波、特征提取、SIFT、Harris算子、CNN结构、目标检测等40个重点问题每题附详细解答与关键推导。完整内容打包为1个PDF文件大小约9.69MB体积精简方便电脑或移动设备阅读。已有665人学习浏览说明其在同类内容中具备一定参考价值。资源具体包括相关/卷积/内积三种滤波定义、高斯核参数设置、Canny双阈值获取细边缘、滤波器组作用、自动尺度选择、SIFT方向与描述子生成、视觉词典与纹理基元构造以及神经网络隐藏层、Dropout、残差模块、R-CNN到Faster R-CNN的演进等能够帮助读者快速建立知识框架、掌握考点答题思路是考前冲刺与查漏补缺的高效材料。1. 计算机视觉课程必考知识点一份能当工程手册用的复习提纲打开这份某高校计算机视觉课程的必考知识点汇总第一反应是“这题库真能背”细看才发现40多道题把图像滤波、特征检测、神经网络、目标检测的完整链路串成了一条技术主线。它不像概念书那样按章节堆定义而是直接用“简述”“论述”逼你把原理说清楚——这对从业者反而是好事能答清楚Canny为什么用双阈值、SIFT双塔到底简化了什么计算的人做起图像预处理和目标检测来心里是有底的。这份资料适合两类人准备考试的学生以及想系统自查视觉基础、准备把理论落进代码的开发者。下文按知识模块拆开讲每部分给出可直接照做的理解路径和参数经验。2. 图像滤波与特征检测从高斯核到角点响应的完整推导2.1 滤波的三种定义方式相关、卷积、内积的本质差异题目第一问是“简述图像滤波的三种定义方式”这是整个视觉课程的地基。相关操作最直观模板在图像上滑动每个位置做逐元素相乘再累加模板中心对准哪里结果就写在哪里。卷积稍微绕一点——把模板旋转180度再做相关。数学上卷积有翻转、平移、积分三步但数字图像里都是离散的落实到代码上就是两重循环。内积视角更抽象把模板和图像覆盖区分别拉成向量做点乘。这三个定义用代码表达差异很清晰import numpy as np from scipy.signal import correlate2d, convolve2d kernel np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]], dtypenp.float32) image np.random.randn(64, 64).astype(np.float32) # 相关模板滑到哪里就算哪里的相似度 corr_result correlate2d(image, kernel, modesame) # 卷积模板旋转180度后再做相关等价于信号处理中的卷积 conv_result convolve2d(image, kernel, modesame) # 内积把kernel拉成向量和图像每个局部块拉成的向量做点乘 vec_kernel kernel.flatten() h, w image.shape inner_result np.zeros_like(image) for i in range(1, h - 1): for j in range(1, w - 1): patch image[i-1:i2, j-1:j2].flatten() inner_result[i, j] np.dot(patch, vec_kernel)这段代码里correlate2d和convolve2d的结果不会相同差别就在卷积对kernel做了180度旋转。实际工程中边缘检测用的Sobel算子是对称的旋转后结果一致但方向性强的滤波器如Gabor相关和卷积会得到截然不同的响应图。一个实用的记忆点卷积满足交换律相关不满足。面试时能讲清楚这一点远比背出公式更有说服力。三种定义对应三种计算视角也对应不同的硬件实现。GPU上的卷积库如cuDNN通常做的是相关运算因为省去旋转可以减少数据搬运PyTorch的nn.Conv2d文档里明确写了“cross-correlation”。这个坑在跨框架迁移模型时特别容易踩到。2.2 高斯核参数设置为什么size不同、σ相同时结果接近题目问“kernel的size不同、σ相同结果类似的原因”这是很多人忽略的细节。高斯核本质是离散化的二维正态分布import math def gaussian_kernel(size, sigma): kernel np.zeros((size, size), dtypenp.float32) center size // 2 for i in range(size): for j in range(size): x, y i - center, j - center kernel[i, j] math.exp(-(x * x y * y) / (2 * sigma * sigma)) kernel / kernel.sum() return kernel k5 gaussian_kernel(5, 1.0) k9 gaussian_kernel(9, 1.0) print(k5) print(k9)高斯分布的3σ原则告诉我们99.7%的权重都落在[−3σ, 3σ]区间内。模板大小取到6σ时外围元素的值已经趋近于0再做归一化后它们对卷积结果的贡献可忽略。所以size7和size9、σ同为1.0的两个核滤波结果差异通常在像素值的小数点后几位。实际设置时我的习惯是σ取1.0时用7×7核σ取2.0时用13×13核核大小取奇数且不小于6σ。另一个隐藏要点σ相同但size不同归一化后中心权重几乎一致这才是结果相似的根本原因。2.3 Canny细边缘与双阈值非极大值抑制的两种实现Canny算子获取细边缘靠的是非极大值抑制NMS思路不复杂每个像素沿梯度方向比较相邻两点的梯度幅值自己是最大的就保留否则置零。但数字图像里梯度方向是连续的像素位置是离散的怎么比较两种解法角度量化法把梯度方向归到0°/45°/90°/135°四个方向线性插值法则在梯度方向两侧插值出两个虚拟点的幅值再比较。后者精度更高是OpenCV默认采用的方式代价是每个像素多两次插值计算。双阈值是Canny的另一精髓。高阈值确定强边缘低阈值用于找回与强边缘相连的弱边缘——这就是滞后阈值的基本思想。一个实验参数高阈值设为梯度幅值直方图的前30%分位点低阈值取高阈值的一半多数自然图像效果不错。但这只适合背景简单的场景背景杂乱时直方图分位点会被大量纹理梯度拉高导致真实边缘被漏掉。此时我会改用自适应阈值先做中值滤波估计背景噪声水平再按噪声标准差乘系数设定阈值。这是一个容易翻车的地方需要反复调参才能找到平衡。2.4 Harris角点特征值分解为什么被响应函数替代Harris算子的数学推导本质上是把灰度变化函数做泰勒展开到二阶得到一个二次型矩阵MM的特征值编码了图像局部在两个正交方向上的变化强度。理论上直接用特征值判断最可靠两个特征值都大是角点一个大一个小是边缘都小是平坦区。但特征值分解的计算代价偏高姿态敏感Harris用角点响应函数Rdet(M)−k·trace(M)²替代了直接分解。这里有个坑R对参数k非常敏感k取0.04~0.06都可能改变角点判定结果。我在工程实践中通常不直接用R的绝对值而是对R做非极大值抑制后按相对排名取前N个角点——用排名替代绝对阈值在不同光照条件下更稳定。Harris的数学推导要能默写出来考试和面试都爱问这一个点特别是“为什么泰勒展开能把x、y和u、v解耦”这句关键叙述。3. SIFT与特征池化双塔结构、投票机制与视觉词典构建3.1 SIFT双塔结构的计算简化逻辑SIFT的双塔结构是这套算法里最值得琢磨的设计。高斯金字塔分octave和layer两个维度octave对应图像缩放layer对应同一尺寸下的连续平滑程度。双塔指高斯金字塔和差分金字塔DoG的配合。要理解它的计算简化先看常规做法每一层都对原图重新用不同σ的高斯核做卷积。SIFT的巧妙之处在于它是层层累积的——kσ层的输出可以由σ层的输出再用一个等效核卷积得到而不是重新对原图卷积。这个等效核的参数有现成公式OpenCV源码里的实现就是按这条路径走的。# 等效核参数的关系σ_total^2 σ1^2 σ2^2 sigma1 2.0 sigma_total 3.0 sigma2 math.sqrt(sigma_total ** 2 - sigma1 ** 2) print(f第二层所需等效核的sigma: {sigma2:.4f})另一处简化是跨octave时的下采样。当尺度大到某一层后直接对图像做2倍下采样再用小σ核继续卷积效果近似于对原图用更大σ核卷积但计算量少一个量级。这是金字塔设计的精髓用尺寸换尺度用降采样换计算量。DoG替代LoG是第三个简化——高斯金字塔相邻层相减结果近似于LoG拉普拉斯高斯滤波但只做减法省去了二阶导卷积。理解了这三处简化SIFT的“双塔结构如何简化计算”就能答到点子上。3.2 关键点方向分配与描述子生成投票细节决定匹配稳定性关键点确定后方向分配靠的是梯度直方图投票。以关键点为中心1.5σ为半径的圆形邻域内每个像素计算梯度幅值和方向方向量化到36个bin每10度一个投票时权重由梯度幅值和距离关键点的远近共同决定——离得近、梯度大的投得多。直方图的峰值方向是主方向达到峰值80%的方向算辅助方向每个辅助方向会生成一个额外的关键点描述子这是SIFT对旋转鲁棒的关键。描述子生成比方向分配更细致关键点邻域旋转到主方向对齐后分成4×4共16个小块每个小块内统计8个方向的梯度直方图最终得到128维向量。这个128维向量是SIFT区分度的核心但有一个容易被忽略的操作——归一化后对大于0.2的维度截断再做一次归一化。这一步处理抑制了光照变化带来的大梯度值是SIFT在光照变化下依然稳定的重要原因。自己实现SIFT描述子时这个“截断二次归一化”很容易漏漏了之后匹配性能会明显下降。3.3 视觉词典与纹理基元把局部特征聚成全局表示BOVW视觉词袋的思路很直接先对训练集所有图像提取SIFT描述子然后用K-means聚成k类每个聚类中心就是一个“视觉单词”所有聚类中心构成词典。查询图像时提取SIFT描述子逐个映射到最近的视觉单词用词频直方图表示整张图。这个直方图就是后续分类器SVM或线性分类器的输入。from sklearn.cluster import KMeans # 假设desc是全部训练图像的SIFT描述子堆叠shape (N, 128) kmeans KMeans(n_clusters200, random_state42, n_init10) kmeans.fit(desc_all) visual_vocab kmeans.cluster_centers_ # shape (200, 128) # 图像级别的词频直方图 def image_bow_hist(desc_img): labels kmeans.predict(desc_img) hist np.bincount(labels, minlength200).astype(np.float32) return hist / hist.sum()K的选择直接影响检索性能经验值在200到1000之间。词典太小不同类别的直方图区分不开词典太大词频稀疏直方图相似度计算不稳定。纹理基元构造也走类似路线每个像素提取多尺度、多方向的滤波器响应拼成一个高维向量例如48维对这些向量聚类得到“纹理基元”字典再用字典对图像分块编码。这块在考试里不算难难的是理解聚类数量K这个超参数带来的连锁影响——不妨把K的选择看成模型性能的“黑匣子”实际工程中要靠交叉验证去试。3.4 朴素贝叶斯与KNN、线性分类器的理论联系题目把朴素贝叶斯、K近邻和线性分类器放在一起论述考的是对生成式和判别式模型的深层理解。朴素贝叶斯是生成式方法先估计联合概率P(X, Y)再推出条件概率P(Y|X)它的决策边界在某些假设下退化成线性判别函数。从“绿脸到红脸”这个经典比喻可以理解生成式方法试图建模“脸为什么是绿的”判别式方法只看“绿的时候是什么类别”。KNN是判别式思维的非参数版本不做概率假设直接找距离最近的训练样本投票其结构风险不超过2倍贝叶斯误差——这个结论在理论上是KNN最漂亮的保证。线性分类器则是显式的判别式模型直接学习权重W用得分函数s Wx做决策。三者关系归纳NB在特定假设下与线性分类器等价KNN是贝叶斯最优决策的非参数逼近。理论上能讲清这条线目标检测里的分类头设计、损失函数选择就有了根基。4. 神经网络与CNN损失函数、参数更新与残差设计中的关键认知4.1 交叉熵与铰链损失的数学解释损失函数是模型的风向标交叉熵损失衡量预测分布与真实分布的距离softmax把得分转换为概率。公式里真正起作用的只有真实标签对应位置的那个值——log(p_y)最小化交叉熵等价于最大化正确类别的log概率。铰链损失SVM损失则不同它关注的是错误类别的得分与正确类别得分之间的差距差距大于设定的边界通常为1则损失为0否则线性惩罚。两者对比softmax对错误分类的惩罚更“软”但对离群点敏感hinge损失更关注边际对已正确分类但余量不足的样本仍会施压。def softmax_loss(scores, label): exp_scores np.exp(scores - np.max(scores)) # 数值稳定性处理 probs exp_scores / np.sum(exp_scores) return -np.log(probs[label]) def hinge_loss(scores, label, margin1.0): correct scores[label] losses np.maximum(0, scores - correct margin) losses[label] 0 return np.sum(losses)实际训练中softmax损失配SGD是最常见的组合但有一个坑softmax对数值稳定性要求极高减去最大值那一行不是可选项而是必选项否则指数运算可能溢出成NaN。在PyTorch中直接用CrossEntropyLoss它内部已经封装了log_softmax和NLLLoss不要再手动对softmax结果取log否则梯度会出问题。4.2 梯度下降的更新方向与批块策略从全量到小批量的演进确定W更新方向的核心结论很简单梯度反方向前提是损失函数的形状固定。问题在“往哪走”之外还有“走多远”——学习率决定了步长而学习率的设置是训练DNN最常翻车的因素之一。动量项Momentum解决的是“惯性”问题延续上一次的更新方向再叠加本次梯度能有效穿过局部极小值和鞍点。Momentum0.9是经典默认值但它需要配合适当降低学习率否则会在陡峭方向上震荡。批块大小是否越小越快这个问题我实测过多次答案是否定的。batch size过小时梯度噪声大更新方向抖动剧烈虽然单次迭代计算快但收敛需要的总迭代数大幅增加整体时间可能反而更长。通常batch size从32开始试显存不够再减到16或8如果batch size减半学习率也建议随之调整否则模型容易不收敛。小批量更新为什么比全量更新更利于训练直觉上的解释是噪声帮助跳出平坦区域更根本的原因在于全量梯度是“平均”了所有样本的梯度一旦某些样本梯度方向相反总体梯度可能为零更新就停滞了。小批量每次采样的组合不同损失面也略有差异这种“抖动”反倒有助于突破梯度为零的停滞点。加上dropout、数据增广这些随机化手段模型不容易在训练早期就钻进局部最优出不来。这一连串“随机性”是深度学习实际训练里最容易被低估的因素。4.3 隐藏层的作用从线性不可分到分布式表示隐藏层的价值分两个层面理解。几何视角隐藏层把输入空间做非线性变换原始空间中线性不可分的点在变换后的空间中可能线性可分——经典例子是异或问题。代数视角隐藏层单元学到的是共享的特征模板每个类别的表示由这些模板组合而成这叫分布式表示。李飞飞的CS231n课件里有个生动的比喻单隐层网络可以学到100个共享模板10个类别各自从这些模板中挑选若干组合成自己的表示而不是每个类别独占一个模板。“线性学习之能与不能”这个提示背后有个关键推论如果网络没有隐藏层、只有输入到输出的线性映射那它本质上只能表达线性决策边界而隐藏层的非线性激活函数是“真正”引入非线性的地方。ReLU、tanh、sigmoid都是可选项但现代CNN几乎都用ReLU或它的变体原因在于sigmoid在反向传播时存在梯度消失的先天缺陷——靠近两端的梯度趋近于0多层连乘后梯度几乎消失。这一点在题目中反复出现是因为它直接验证了隐藏层深度的有效性受限于激活函数的选择。4.4 CNN细节1×1卷积、小卷积核与感受野的工程权衡CNN的考点集中在两个方向显式的计算输出尺寸、参数量和隐式的设计理由感受野、权值共享、1×1卷积。先记住输出尺寸公式(N 2P - F) / S 1其中N是输入边长P是paddingF是卷积核边长S是步长。若N224F7P0S2则输出为(2240-7)/21 109.5向下取整为109而在PyTorch里默认的向下取整行为会导致最后一列的像素不被处理这是写网络结构时容易忽略的维度细节。小尺寸滤波器的好处有三个定量角度3×3是能捕获八邻域信息的最小尺寸堆叠N个3×3的感受野等效于(2N1)×(2N1)的大核但参数少得多3×3×C堆三层是27C²7×7单层是49C²每多一层卷积就多一次ReLU非线性映射判决函数的表达能力更强。1×1卷积的角色更特别它不改变感受野但对通道维度做线性组合配合ReLU引入非线性还能通过控制卷积核数量实现降维或升维。从感受野计算角度看1×1卷积完全不影响感受野大小所以常被用在瓶颈结构中先降通道数再做大卷积节省计算量。4.5 训练DNN通用指南与常见问题排查从这份汇总看某高校课程反复强调的训练要点其实和工业界经验完全对得上数据增广先行、BN要加、dropout按需、学习率用衰减策略。下面这5条是训练DNN时最常见的翻车点其中第3条最容易掉坑值得特别注意。现象原因解决训练loss不降一直原地踏步学习率过大导致loss震荡或学习率过小收敛过慢先打印log检查loss值变化学习率从3e-4起步收敛慢再减半验证集精度上不去但训练集精度高模型过拟合数据集太小或增广不足加数据增广适当调高dropout比例loss出现NaN梯度为NaN输入数据未归一化数值溢出或softmax前的log没有做保护确认输入归一化到(0,1)替换为数值稳定的损失实现一个batch显存溢出OOM输入图像分辨率过高或batch size过大先减半batch size再考虑降低图像分辨率不要一上来就换模型结构每轮迭代时间越来越长数据加载pipeline存在瓶颈GPU在空等检查数据读取是否用了多进程开启pin_memoryTRUE提示训练DNN指南里最关键的一条经验是“确保第一个batch的loss值符合预期”。比如分类任务第一个batch的loss应该在log(类别数)附近偏差过大说明数据加载、标签映射或模型输出维度有问题。5. 目标检测演进路线从R-CNN到Faster R-CNN的工程取舍与NMS实操5.1 R-CNN到Faster R-CNN的三代演进逻辑目标检测的演化史就是一条“去冗余、提共享”的路线。R-CNN是开山之作Selective Search生成约2000个候选框每个框单独缩放、单独过CNN、单独分类。它的缺点是硬伤级别的——2000个框就是2000次前向推理速度慢到不可接受。Fast R-CNN的关键改动是让整张图只过一次CNN得到特征图候选框映射到特征图上经RoI Pooling统一尺寸后共享后续全连接层计算量一次性降了两个量级。但Fast R-CNN的候选框仍由Selective Search生成这部分无法与网络联合优化成为新瓶颈。Faster R-CNN的突破是提出RPN区域建议网络让候选框生成也变成可学习的网络模块锚点anchor覆盖多种尺度和长宽比使得“提议检测”全过程端到端可训练。自此目标检测的主流范式成型骨干网络提取特征→RPN生成候选→RoI Pooling统一尺寸→分类回归。5.2 RPN锚点与多任务损失NMS怎么调参数才靠谱RPN是Faster R-CNN的核心创新。设计思路一句话讲清楚在特征图每个位置放一组预定义的锚点框网络对每个锚点输出两类信息——是否包含目标的二分类得分以及相对锚点的边界框回归偏移量。锚点的默认配置通常是3种尺度128²、256²、512²乘3种长宽比1:1、1:2、2:1共9个锚点。损失函数由分类损失和回归损失两部分组成回归部分用的是平滑L1损失目的是对大误差不敏感防止个别难例把梯度拉爆。NMS非极大值抑制则是检测后处理中必不可少的环节它去除大量重叠检测框的核心逻辑是迭代式的反复选择得分最高的框把与它IoU超阈值默认0.5或0.7的框全部移除继续处理剩下的框。NMS的参数对结果影响很大下面的表格整理了常见设置参数默认值调整建议IoU阈值0.5阈值高保留更多框适合密集场景阈值低框更干净适合稀疏场景得分阈值0.3~0.5过滤低置信度框调低会提高召回但增加误检最大保留框数100~300按类别数和应用场景设置多类别任务按类别独立执行NMS实际工程里我先输出每张图检测框数看一下分布再去调IoU阈值而不是一上来就按默认值跑。NMS在稠密行人场景中特别容易翻车两个重叠的行人IoU通常也在0.6以上IoU阈值设0.5会把其中一个人误删。解决方案是改用Soft-NMS对重叠框的得分做高斯衰减而不是暴力置零。5.3 PR曲线与AP计算NMS之后必须做的一项验证题目问“给定对象类别如何绘制PR图/计算AP”这是目标检测评估的基础操作。流程分四步收集所有检测框与GT的匹配关系按IoU阈值如0.5判定TP/FP按置信度降序排列逐点计算precision和recall绘制PR曲线并求曲线下面积得到AP。AP的插值方式是VOC和COCO的典型差异VOC2010前是11点插值之后是全部Recall点的平均精度COCO则按101点插值并覆盖0.5到0.95多个IoU阈值计算mAP。用Python实现PR曲线计算的核心逻辑也不复杂def compute_pr_ap(detections, ground_truths, iou_threshold0.5): tp np.zeros(len(detections)) fp np.zeros(len(detections)) matched_gt set() for i, det in enumerate(sorted(detections, keylambda x: -x[score])): best_iou 0; best_gt -1 for j, gt in enumerate(ground_truths): if j in matched_gt: continue iou compute_iou(det[bbox], gt[bbox]) if iou best_iou: best_iou iou; best_gt j if best_iou iou_threshold: tp[i] 1; matched_gt.add(best_gt) else: fp[i] 1 cum_tp np.cumsum(tp); cum_fp np.cumsum(fp) recalls cum_tp / len(ground_truths) precisions cum_tp / (cum_tp cum_fp) ap np.sum((recalls[1:] - recalls[:-1]) * precisions[1:]) return precisions, recalls, ap这里的判定逻辑有几个容易被忽视的细节GT和检测框的匹配要按“分数降序”而不是“图像顺序”否则低分框可能先匹配掉GT导致高分局被误判为FP每个GT只能匹配一次同一张图内要先按类逐一执行再做跨类汇总。我做过一个真实项目在模型精度提升不明显的情况下仅靠重写NMS的IoU阈值从0.5调到0.6并用Soft-NMS替换暴力移除mAP就涨了1.8个百分点。可见后处理在检测中的工程权重有多大。后来每做一次目标检测模型的评估我都会强制走一遍NMS参数分析顺手把PR曲线画出来——只看mAP分数而不看PR曲线等于把模型的黑匣子完全交给了评测脚本出了问题根本无从定位。希望这份拆解能帮你把知识点落成实际经验少走弯路。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询