多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

传统CV与深度学习对比:优势区间与混合方案解析

传统CV与深度学习对比:优势区间与混合方案解析 写论文笔记最怕的就是把别人的工作复述一遍然后自己什么也没留下。这篇笔记是我在啃了几篇对比类文章和综述之后结合自己跑实验的体验沉淀下来的一份思考。核心就是回答一个问题深度学习来了之后传统CV真的就“死”了吗答案显然不是。这篇笔记能帮你梳理清楚哪些场景还得老老实实用传统方法哪些场景上深度学习就是降维打击以及两者之间那条不太明显的“灰区”到底该怎么走。1. 整体设计与思路拆解——为什么我们总是习惯性低估传统方法先说一个我自己的偏见。刚接触深度学习那会儿总觉得SIFT、HOG、光流这些都是“老一辈”的东西像是博物馆里的展品可以放进教科书的“历史贡献”章节了。直到有一次我接到一个工业检测的落地需求现场是打光条件恶劣、样本量极少、缺陷形态极度不规则的生产线我才意识到在深度学习模型的强力吸光下传统CV并没有消失它只是换了一种身份变成了深度学习方法论里的“前处理工具箱”和“弱数据的救火队员”。1.1 论文笔记的定位与对比框架这篇笔记不是对某篇具体论文的逐字翻译更像是我对一类研究思路的总结。最近我把几篇比较传统CV和深度学习方法的观点性文章放在一起横着读发现它们的叙事套路几乎一致先用MNIST、ImageNet之类的基准数据说明深度学习在识别精度上碾压了手工特征再笔锋一转谈数据不足、算力受限、可解释性差的问题最后提出一个“两者结合”的改良方案。但真正有价值的信息隐藏在框架背后。这些论文想做的不是分出胜负而是画出一条“任务复杂度—数据规模—算力预算”的三维决策曲线。曲线左端是平面检测、OCR预处理、胶片划痕去除传统方法效率极高曲线右端是万事万物皆可分类的开放世界识别非深度学习不可。比较的价值不在“谁取代谁”而在“在哪个区间里哪种方法性价比最高”。1.2 为什么仍要把传统CV当作必学基础我见过一种奇怪的论调“现在都是端到端谁还学特征提取”这种说法害人不浅。假如你连高斯金字塔和拉普拉斯金字塔的差别都不清楚那ResNet里那个残差捷径连接到底做了什么你永远只能打比方解释假如你不理解非极大值抑制去掉的是什么那你在调YOLO的NMS阈值时只能靠玄学改数。传统CV的可贵之处不只是给你一堆“已经写好的函数”而是一套思维方式它要求你先把问题拆成“边缘、纹理、颜色、形状”这些可操作的分量表再去思考如何将它们组合成一个决策。深度学习把这个过程压缩成了一个黑盒但当你需要为黑盒设计数据增强策略、挑选适合的骨干网络时恰恰需要先有“特征视图”的想象力。论文里反复出现的多尺度、金字塔、特征融合底层的直觉其实全部来自传统图像处理。所以这篇笔记的整体设计就是沿着“经典图像处理边角点特征—机器学习中间层特征分类—深度学习端到端表征学习”这条线索走每一步都标出“为什么这里需要升级”以及“升完之后损失了什么”。2. 传统CV的核心方法与底层原理传统CV的技术底座说穿了是把图像里的像素阵列变成“人可理解、机器可计算”的量。这个“变”的过程就是特征工程。做笔记时我重新梳理了一遍最重要的几个特征家族发现它们各自的适用场景和数学本质其实非常清晰。2.1 特征工程从SIFT到HOG的特征视角SIFT是传统特征里的天花板它的全称是尺度不变特征变换核心思想是把一个关键点的邻域信息编码成一个128维的向量并且对这个关键点的尺度、旋转、光照变化保持“睁一只眼闭一只眼”。SIFT为什么能扛住尺度变化因为它先构建了一个高斯金字塔在不同尺度空间里寻找极值点再用主方向来描述局部梯度的朝向分布。用生活里的类比来说SIFT就像一个人在远处认出了你先是看到轮廓再走近确认眉眼五官匹配上了才敢喊你的名字。HOG则是另一个思路它统计图像局部区域的梯度方向直方图本质上抓住的是“轮廓像素的朝向分布”。行人检测是它的经典主场因为人体站姿虽然轮廓各不相同但整体的梯度方向分布有强烈统计规律。笔记里我给自己画了一张速查表方便以后选型时对照特征家族核心思想适合场景典型任务SIFT/ORB关键点邻域梯度统计纹理丰富的刚性物体图像拼接、视觉定位HOG局部梯度方向直方图刚性或半刚性轮廓行人检测、车辆检测LBP局部二值模式纹理编码纹理均匀的材质面纹理分类、人脸识别早期Haar矩形特征快速响应结构简单且对比明显人脸检测VJ框架这个表不是要背的是要用的。比如说你面对的任务是“检测传送带上的砖块是否缺角”砖块的纹理信息几乎没有那就别迷信LBP关键信息全在外轮廓上HOG和Canny边缘提取才是正确方向。2.2 经典机器学习方法在CV中的角色特征提取完成之后传统CV并没有自己长眼睛需要一个决策器来“看”这些特征向量这一步通常交给机器学习分类器。SVM是这里的王牌选手。SVM的思想是找一个超平面把不同类别的特征点尽量分开并且让离这个平面最近的样本之间的距离最大化。在线性不可分的情况下它通过核函数把数据映射到高维空间再在高维里寻找线性分界。当年HOGSVM的组合称霸行人检测领域靠的正是这种“强特征强分类器”的配合。与SVM并列的是随机森林它更适合特征维度高、彼此相关性弱的场景。随机森林用一套“众人投票”的机制每棵决策树都随机选样本、随机选特征构建最后把几百棵树的结果汇总。用论文笔记的话说这叫做对“方差”的压制——单棵树容易过拟合但几百棵树的集体预测能把过拟合的抖动平滑掉。AdaBoost则代表着另一个思想串行地学习每一轮都把上一轮分类错误的样本加大权重。我在笔记中特意标注了一句了解了AdaBoost你就能理解为什么现在很多深度学习的样本采样策略是“难例挖掘”它们两个是同一个祖宗。2.3 传统方法的优势区间数据利用率与可解释性传统方法能在深度学习时代活下来的核心理由是它在“极少样本”和“透明推理”这两件事上几乎不可替代。我们之前做过一个项目要识别某特种零部件表面的铸造缺陷次品样本总共只有60多张而正常品有几千张。如果直接硬上深度学习分类网络连拆分训练集、验证集都捉襟见肘更别提什么迁移学习了。换成HOG特征SVM之后60个缺陷样本就够训练出一个在产线上准确率93%的模型。这个准确率不高但它有一个至关重要的优点决策过程是可见的。SVM判别一个样本属于异常类依据的是它与支持向量之间的几何距离你可以把那些“踩线”的样本挑出来逐个看看是不是特征提取环节出了问题。这种可解释性在医疗影像、工业质检、安防取证等涉及责任判定的领域极其有价值。论文里也提到深度学习模型的可解释性研究至今还没有形成统一理论框架所谓的“概率解释”也只是模型输出后验不确定度的一种近似并不是真正的因果推演。3. 深度学习方法的演进逻辑与核心机制既然传统CV这么有优势那深度学习凭什么在过去的十年里席卷一切答案可以浓缩成一句话当数据量和算力足够时深度学习不再需要人为预设“什么样的特征重要”而是让网络在梯度更新的过程中自己“长出”那些高层语义特征。这种端到端的学习范式把“任务分解”这件事也一起自动化了。3.1 CNN的局部连接与权值共享卷积神经网络能成为图像深度学习的基石靠的是两个精妙的设计局部连接和权值共享。全局连接层关注的是全局关系参数量巨大而且对二维图像的平移不变性毫无感觉卷积层则是用一个固定大小的窗口在整幅图像上滑动每个位置的过滤圆心都是同一个这就把“同样的特征不管出现在哪都被识别”的先验知识直接编码进了网络结构。可以这样理解传统CV里的Sobel算子就是一个手写的3x3卷积核它有明确的物理含义——提取纵向边缘而CNN训练出来的卷积核虽然在数值上可能已经面目全非但其功能本质就是在自动寻找“合适尺度的边缘、纹理、图案基元”。笔记中我认为最精彩的一张图是第一层卷积核的可视化结果它们竟然真的收敛到了类似Gabor滤波器的形态。这就像人类花了几十年手工设计了一套滤波器组深度网络只花了几轮梯度下降就重新发明了它们。3.2 从ResNet到Vision Transformer表征能力的跃迁ResNet的提出是为了解决一个反直觉的现象网络越深训练误差反而越大。这个现象的本质是在深层网络里梯度回传经过多层连乘时容易消失或爆炸导致浅层的权重更新量几乎为零。ResNet引入一个跳跃连接让某一层的输入直接加到输出上网络此时只需要学习“残差”而不是完整的映射。用大白话说它让信息有了一条“高速公路”不用层层挤过非线性变换的窄门。到了Vision Transformer深度学习又换了一种姿态。它把图像切成一串Patch像处理文本一样用自注意力机制去建模任意两个Patch之间的关系。对CV工程师来说最大的感受是感受野“一下子变大了”。CNN需要靠堆叠卷积层来逐步扩大感受野而Transformer在第一层就能看到全景图。但这种全局视野也有代价它比CNN更吃数据在小数据集上很容易欠拟合。笔记里我在旁边批注了一句ViT的火爆某种程度上是“大数据大算力时代”的特权不是每个项目都请得起它的架子。3.3 端到端学习范式带来的工程范式革命深度学习的真正颠覆性不在某一个网络结构上而在整个开发范式上。传统CV的pipeline是“图像预处理—特征提取—特征选择—分类器训练—后处理”每一步都可以单独调优但每一步的错误会累积到下一步深度学习的pipeline则简单粗暴“原始图像进标签出”。网络内部的层与层之间虽然各自提取不同抽象级别的特征但它们是在一个整体的损失函数约束下联合优化的。这种“全局最优”的诱惑力实在太强了。做传统CV时你费尽心思调了一个很漂亮的滤波器能提取出清晰的纹理但最后分类器就是不吃这一套那种无力感非常折磨人。深度学习把这种痛苦从“人工拆解问题”转移到了“准备数据和调超参”上。一个负责任的笔记必须把这个代价也写清楚端到端不代表万事大吉当你发现模型学歪了的时候调试手段反而更少因为中间特征没有直观的物理含义。这也是我坚持在笔记中强调“两者结合”的原因。4. 传统CV与深度学习的各维度硬核对比既然文章标题是“比较”那就要有一张硬核的对照表。我尽量抛开论文里那些漂亮的措辞从工程落地的角度逐项掰开揉碎了讲。4.1 数据依赖、算力消耗与性能天花板深度学习是“数据饥饿型”选手。在ImageNet上训练的模型动辄用上百万张标注图片即便用迁移学习下游任务通常也需要几千张样本才能微调出稳定效果。传统CV则谦逊得多几十张样本就能开工。数据依赖还会影响项目的全周期成本标注一张工业缺陷图像可能需要老师傅花半小时这种成本在小规模生产线场景中根本无法接受。算力方面CNN训练阶段需要高端GPU推理阶段如果想跑高分辨率视频流也得专门部署推理卡。传统CV的很多算法在普通工控机的CPU上就能实时运行。SIFT在1080P图像上的特征提取耗时一般是几十毫秒HOGSVM的行人检测在老式CPU上也能跑到实时。这意味着传统方法的部署边界极其宽松从ARM嵌入式板子到PLC工控机几乎没有它跑不动的设备。性能天花板则要看任务。在受限场景里比如固定角度、固定光照的表计读数识别传统方法可以达到相当高的精度甚至接近100%但一旦任务变得开放比如“识别任意自然场景里的猫”传统方法的上限肉眼可见因为“猫”这个概念的视觉变体实在太多了手工特征根本列举不完。深度学习在开放任务上可以靠数据堆出一个更高的上限只不过这个上限是用海量算力和样本堆出来的。4.2 鲁棒性与泛化能力各自最舒服的姿势深度学习有一个“致命”的软肋对分布外样本的泛化能力极差。你拿工业场景训练的模型换一条光学环境略有差异的产线性能就明显下降这叫做“域漂移”。传统CV方法反而更“头铁”因为其特征定义是物理驱动的。SIFT提取的是梯度分布光照变化经过归一化之后影响较小你换一条产线只要边缘特征还是清晰的HOG照样能干活。这就是为什么很多传统工业视觉公司的交付物过了三五年还在稳定运行。深度学习的优势则体现在大样本、高层语义的泛化上。一个在ImageNet上预训练过的模型经过微调可以去识别医学图像里的病灶或者遥感图像里的舰船目标。这种跨任务的泛化能力传统CV完全做不到。但这里面有一个容易被人忽略的细节深度模型的鲁棒性依赖于训练数据的覆盖度。如果你只收集了白天场景的数据那模型在夜晚场景的表现就是“薛定谔的猫”——不测不知道一测吓一跳。传统CV的物理先验则决定了它“知道”边缘在黑暗中也存在只是对比度降低了所以可以通过预处理把对比度拉伸回来。4.3 可解释性、调试难度与项目交付的隐性成本论文里最常被美化的是可解释性。深度学习模型本质是一张巨大的参数网谁也没法精确指出某个预测“为什么”是对的。现在有Grad-CAM这类可视化工具能标出网络在关注图像哪个区域但它只能说明“注意力”不能证明“因果”。在医疗、自动驾驶、安防这些需要事后追责的领域这种不可解释性往往是致命的。传统CV的可解释性是内建属性。HOG特征告诉你“这个目标有竖直方向的梯度集中分布”SVM告诉你“该样本到分离超平面的距离是0.82置信度中等”。每一层推理都能用图像佐证这给调试和验收带来了巨大的便利。我还记得一个交付场景客户说不明白为什么系统把某个字符识别错了传统CV的做法是把中间特征图导出来一帧一帧指给客户看“你看这一笔的对比度太弱被阈值抹掉了”客户点头接受换成深度学习你只能挠着头说“模型学到的模式可能更倾向于把圆弧当成直线”客户很难买账。隐性成本还包括团队的技术栈积累。传统CV的调试工具——OpenCV、scikit-image、matplotlib——轻量且成熟深度学习的调试则依赖TensorBoard、WB、各种可视化和实验管理平台学习和运维成本都不低。在人力有限的小团队里这些隐性成本往往比GPU采购费用更值得仔细掂量。4.4 混合方案两个工具箱配合干活的经验心得真正的高级玩法不是押注某一边而是把两边放到一个pipeline里各司其职。我在多个项目里验证过下面几种套路笔记里整理成方法论。空间定位用传统识别分类用深度学习。比如要识别仪表盘上的数字区域可以用传统的定位算法先框出数字区排除背景干扰然后再把裁剪后的小图扔给一个轻量级CNN识别。这个方案的好处是大幅度减少了检测网络的输入尺寸和搜索范围模型更小、速度更快生活化一点说就是“你不需要让一个人满屋子找钥匙直接把钥匙放在他面前的桌子上”。数据增强用传统模型训练用深度学习。几何变换、颜色抖动、模糊、噪声叠加这些工作用OpenCV写脚本比用深度学习库方便得多。我习惯在训练pipeline里插入传统的形态学操作生成一些带有光照变化和微小畸变的样本这能显著提升模型的泛化能力。理解这一点的前提是你能识别出“传统数据增强模拟的是物理世界中的哪些干扰因素”。后处理用传统检测用深度学习。目标检测模型输出的一堆框精度再高也可能存在多检和漏检这个场景下NMS和各类跟踪算法反而是传统CV的强项。我在一个视频车辆计数项目中用深度学习YOLO检测车辆再用传统的IOU匹配和卡尔曼滤波对检测结果做时序平滑帧间闪烁立刻减少计数准确率提高了近8%。这两个工具箱不是竞争关系而是互补关系观念的转变比技术的转变更重要。5. 读论文与复现实验时的实战要点最后一部分聊聊读这类对比论文时我自己的操作习惯。很多人读论文只是从头到尾看一遍合上以后脑子里只剩几个术语这是效率最低的读法。我给自己定的规矩是“带着比较意识读带着复现目的看”。5.1 两套评估指标体系的翻译对照传统CV论文里常见的指标是准确率、精确率、召回率、F1分数偶尔还有ROC曲线和AUC。深度学习论文近几年更加偏爱mAP、AP50、AP75等检测指标。读论文时别被这些指标的名字绕晕核心是要弄清楚它们各自惩罚什么样的错误。mAP对“边界框定位不准”非常敏感一个框即使类别对了但中心偏移超过阈值照样算错误而分类准确率完全不关心目标位置只关心类别是否判断正确。如果你在比较一篇传统检测器和一篇深度学习检测器务必先统一评估口径。我见过不少论文笔记翻车就是把论文A的“分类准确率98%”和论文B的“检测mAP 0.87”放在一起比得出毫无意义的结论。更合理的做法是找到两篇文章在同一数据集、同一指标下的结果再下判断。5.2 复现过程中环境、数据的常见坑位复现传统CV算法相对轻松OpenCV的版本差异是个经典大坑。OpenCV 3和OpenCV 4之间部分API的命名空间和参数顺序发生了变化老的代码直接升级会出现很多离奇的报错。我建议在项目刚启动时就把OpenCV版本固定用conda创建一个独立环境并把详细版本号写进requirements.txt而不是只写“opencv-python”这种模糊条目。深度学习复现的坑位更多。PyTorch和CUDA版本之间有一个微妙的配对关系版本配错了就会在import torch时直接报错那个“terminate called after throwing an instance of ‘cv::exception’”就是典型的OpenCV与PyTorch图像读取格式不一致引起的崩溃。我踩过这个坑之后就养成一个习惯模型输入前的数据预处理统一封装成一个函数所有读取图像都走同一个入口统一缩放到目标尺寸、转成RGB、归一化不允许在脚本里东一榔头西一棒子地改尺寸。数据划分是另一个高频坑。传统CV论文经常会在整个数据集上训练而深度学习要求严格的训练、验证、测试三集划分。复现时如果忘记设置随机种子或者测试集和训练集之间存在数据泄露最终结果会好得离谱但这种“好”毫无意义。我现在做实验时第一步就是把划分后的数据分布可视化一下看看每个类别的样本数量、图像尺寸分布是否合理。只有这一步过了关后面跑出来的指标才有参考价值。5.3 不同任务场景下的方案选型速查笔记的收尾我给自己的工作流画了一张决策速查表。它不是论文里的什么高深公式就是这些年踩坑经验的浓缩。任务特征推荐方案理由样本少于100、类别固定、环境可控传统特征SVM/随机森林数据利用率高可解释性强样本充足、类别多、背景复杂深度学习CNN特征自学习性能上限高大范围搜索 细粒度识别传统定位 深度学习分类分工明确速度和精度兼顾高帧率视频、嵌入式设备传统算法为主CPU即可实时推理高端GPU且样本充足、追求极致精度深度学习模型算力换精度性价比集中在数据量上这张表不是什么金科玉律但它能帮助你在项目启动的第一周就把技术路线定下来。技术选型最忌的就是“手里拿着锤子看什么都是钉子”。传统CV和深度学习的比较说到底不是一场分野而是一次认识工具箱全貌的机会。我个人在实际项目里最大的体会是不要带着“升级”的心态去淘汰传统方法而要带着“补充”的心态去引入深度学习。每一次算法选型其实都是在“数据的规模、算力的预算、业务对可解释性的要求”这三个维度之间找平衡点。理解了这个平衡再看论文里的对比实验你就能读出那些表格数字背后的潜台词。祝阅读和复现顺利。
返回列表