去年带一个新人做项目评审他PPT第一页写着基于深度学习的目标检测方案。我问了他三个问题检测什么目标、现场光照是什么条件、节拍要求多少秒他一个都答不上来。这个场景我见过太多回了——做计算机视觉和机器视觉这行最不缺的就是算法名词最缺的是把知识点按项目链路串起来的能力。我写这篇知识点整理不想按学术目录把名词一个个罗列出来。那样的文章看着挺全但拿到实际项目里一点用都没有。真正好用的知识结构是你拿到一个具体问题的时候——比如检测手机壳表面的划痕或者给机械臂做视觉定位——能快速判断这属于哪类任务、该走什么算法路线、要配什么样的成像条件、精度能做到多少、坑大概在哪里。所以我这篇文章会按一条视觉项目从需求到落地的真实顺序来组织概念、成像、预处理、算法、任务、部署一路串下来构成一张可以照着走的知识地图。文章里的经验都来自我做过的项目和踩过的坑涉及参数的地方我会给参考值但先提醒一句视觉项目几乎没有直接抄就能用的参数每个数值都要按自己的现场条件重新调。下面开始正文。1. 先分清三件事计算机视觉、机器视觉与图像处理1.1 它们不是同义词很多人以为计算机视觉机器视觉图像处理是同一个东西的不同叫法这是第一个需要纠正的知识点。三个概念差很多搞混了会直接影响你看资料的方式。计算机视觉是学术概念研究的是让机器从图像里理解世界。它的目标是构建数学模型让算法像人一样感知颜色、形状、运动、深度乃至语义。人脸识别、自动驾驶感知、医学影像分析都属于这个范畴。这个方向追的是算法上限评价标准是准确率、鲁棒性、泛化能力这些学术指标。机器视觉是工程概念特指在工业生产和自动化场景里用视觉技术完成检测、测量、定位、识别等任务。它关心的重点完全不同能不能稳定跑在生产线上、节拍跟不跟得上、漏检率允许多高、现场维护方不方便。手机屏幕划痕检测、PCB板缺陷检查、机械臂抓取定位都是机器视觉的典型场景。这里评价的不是算法多先进而是产线综合表现。图像处理则更底层输入是图像输出通常还是图像。去噪、增强、锐化、几何校正都属于图像处理。它不产生理解只负责改善图像的表达质量。三者的关系可以这样理解图像处理是地基计算机视觉是学术上层机器视觉是把上层技术工程化、落到生产环节的应用层。很多论文里看起来炫酷的视觉算法到产线上根本跑不起来而产线里大量使用的土办法教科书里反而不会写。如果你做的是机器视觉方向看论文时要有意识地做筛选别被学术指标带偏。1.2 为什么这个区分在实际项目里很重要我见过不少团队把问题搞反了。有个真实案例某工厂要做产品表面的脏污检测项目组一上来就上深度学习花了大批人力标注数据效果还是不理想。后来排查发现根本问题出在光源角度上——现场用了高角度正光反光把浅色脏污完全盖住了。换成低角度侧光源之后一个简单的阈值分割就把缺陷干净利落地挑了出来。这个案例揭示了一个关键顺序在任何视觉项目里成像方案永远先于算法方案。光源、镜头、相机这些硬件知识点决定了下游算法的上限算法只是在有限的输入质量里尽量逼近这个上限。很多深度学习模型在现场表现不稳定问题常常不在模型本身而在成像条件不可控。所以在建知识结构的时候我建议把视觉相关的知识点分成三条线成像链路怎么把物理世界变成数字图像、算法链路怎么从图像里提取信息和语义、工程链路怎么把算法稳定地跑在产线上。三条线缺一不可。只懂算法的工程师做不了项目只懂硬件又很难判断算法的边界在哪里。我见过最稳的视觉工程师往往是三条线都通个七七八八的那种。1.3 一份可对照的知识地图下面这张表是我自己整理知识点时用的框架也是后面几个章节展开的脉络知识层主要知识点典型输出工程关注点成像层光源类型、镜头焦距、相机传感器、曝光参数数字图像稳定性、一致性、可重复性预处理层滤波、增强、几何校正、色彩空间处理后的图像计算耗时、失真控制特征层边缘、角点、纹理、颜色直方图特征描述鲁棒性、计算量语义层分类、检测、分割、跟踪、OCR标签、框、掩膜精度、召回、泛化工程层标定、部署、指标、数据集管理产线系统节拍、稳定性、可维护性对照这张表你可以给自己做个诊断目前卡在哪一层就去补哪一层的知识点。大部分人一上来就钻进语义层成像层和工程层几乎是空白这是最典型的入门误区。后面我会从成像层开始把每一层的关键知识点逐个讲明白。2. 成像链路知识点光源、镜头、相机与标定2.1 光源被低估的第一块拼图在机器视觉所有知识点里光源的投入产出比最高。做过项目的人都知道一句话打光打好了算法就成功了一半。这句话不是夸张是无数项目真金白银换来的教训。常见的光源类型各有各的脾气环形光源高角度均匀照射适合表面字符、划痕检测通用性最强条形光源从侧面打光适合容易反光的金属、薄膜表面同轴光源光线垂直射向物体再沿原路反射回相机适合镜面高反光物体背光源从物体背后打光形成清晰轮廓剪影适合外形尺寸测量和引脚检测穹顶光源光线经内壁多次反射形成漫射适合弧形或凹凸不平表面上的缺陷检测。选光源不能靠感觉要看三件事物体表面是镜面还是漫反射、目标和背景之间的颜色与灰度反差、现场有没有外界环境光干扰。最实用的方法是用一个包含多种光源的测试灯箱把被测样品放进去逐个试拍出来的图哪张目标与背景反差最大、缺陷最清楚就用哪种方案。这个试光过程叫打光测试是每个视觉项目立项后必做的第一步跳过它后面全是坑。为什么算法工程师要花好几天调光因为数字图像的本质就是光的记录。光源决定了目标和背景在灰度上的差值如果两者灰度只差十几个等级再强的算法也救不回来如果打光能让差值拉到一百以上有时候一个固定阈值就能解决问题。这个道理越早想通你在项目里走弯路就越少。2.2 镜头与相机的关键参数镜头的核心参数是焦距、光圈、畸变和工作距离。焦距决定视场大小同一距离下焦距越长看得越近越细。选镜头的基本流程是先根据被测物体尺寸和安装距离算需要的视场大小再用视场除以传感器靶面尺寸得出放大倍率最后反推焦距和相机搭配。这里有个高频踩坑点镜头畸变。广角镜头边缘变形明显做尺寸测量时误差会非常大。所以测量类项目必须用低畸变镜头或者通过标定做畸变校正。检测类项目如果只关心有没有缺陷畸变影响相对小但你得知道它的存在否则换镜头之后结果对不上号就懵了。相机端核心参数是分辨率、帧率、芯片类型和曝光方式。分辨率不是越高越好——分辨率高意味着数据量大、处理慢、价格贵只要满足最小缺陷的像素要求就够了。工程经验上要稳定检测的最小特征至少要占3x3像素以上否则算法就算能识别精度和稳定性也堪忧。按照这个标准倒推相机选型比盲目上高分辨率相机靠谱得多。芯片类型还有个面阵和线阵的方向要区分。面阵相机一次拍一张完整图像适合大多数场景线阵相机一次拍一行像素配合运动机构扫描适合大幅面和连续运动的物体比如卷材表面检测。如果你的被测物是传送带上快速移动的宽幅产品面阵相机会遇到视野和分辨率打架的问题线阵方案往往才是正解。2.3 相机标定把像素换算成物理尺寸标定是测量类项目绝对绕不开的知识点。相机拍到的只是像素坐标要得到毫米甚至微米级别的物理尺寸必须建立像素坐标和世界坐标之间的映射关系。最常用的方法是棋盘格标定法打印一张棋盘格标定板在相机视野里拍多张不同姿态的图片通过检测棋盘格角点计算相机的内外参数。内参描述相机自身的焦距、主点、畸变系数外参描述相机相对标定板或者世界坐标系的位置姿态。拿到内外参之后就可以把图像上的任意像素点反投影到物理平面从而测出物体的长宽、孔径、间距。标定有两个容易被忽略的点。第一标定板必须平整打印后最好贴在刚性平面上否则标定结果会漂。第二标定精度和图片数量、姿态丰富度直接相关一般建议拍15到20张覆盖画面各个区域和多种倾斜角度只拍一张正面图是标定不出可靠结果的。我这边有个参考数据用500万像素相机、12mm焦距镜头、工作距离300mm左右的测量系统标定后重复测量精度能做到大概±0.05mm。如果你发现系统测量值每天都在漂先检查是不是温度变化引起结构变形、标定板受潮变形别急着怀疑算法——大部分测量漂移问题出在这类物理环节上。3. 图像预处理知识点输入质量的下限管理3.1 预处理解决什么问题预处理处在成像和算法之间目标只有一个让下游算法更好做。它不会凭空创造信息能做的是把有用的信息凸显出来把无用的干扰压下去。要理解这个环节可以类比做饭前的洗菜切菜——食材质量不好大厨也没办法但洗菜切菜做到位了后面炒起来就顺手得多。常见的预处理可以分成四类几何类解决图像的旋转、缩放、畸变问题灰度类解决亮度、对比度问题频域类解决噪声和纹理问题形态学类解决二值图像里的小干扰问题。记住一个原则预处理是修复输入质量不是创造信息抱着这个心态去调参就不会做无用功。3.2 几何变换与图像增强几何变换里最常用的是仿射变换和透视变换。仿射变换处理平移、旋转、缩放透视变换可以校正拍摄角度造成的梯形变形。一个典型场景是OCR字符识别相机未必正对着标牌拍出来文字是斜的直接送去识别准确率很惨先把图像透视校正成正面视角再识别结果会明显改善。图像增强方面直方图均衡化是入门必学的操作。思路是把像素灰度分布拉得更开让原本集中在很小区间的图像对比度变大。它对低对比度图像很有用但注意它会同步放大噪声所以使用前后通常要配合去噪步骤。另一个实用操作是Gamma校正。有些相机拍出的图像整体偏暗或者高光过曝通过调整Gamma值可以让中间调更符合人眼感知也方便后续阈值分割把目标分离出来。别小看这些土操作在产线环境里大量实际问题就是靠它们解决的而不是靠深度学习。3.3 滤波去噪与形态学操作滤波的核心知识点在于在去噪和保留细节之间找平衡。高斯滤波是最大众的选择它的核函数服从高斯分布对高斯噪声效果不错但会模糊边缘。中值滤波对椒盐噪声——图像里随机出现的黑白斑点——效果特别好因为它取邻域像素的中值能直接把孤立的异常点干掉同时保留边缘信息。形态学操作则是二值图像处理的利器。腐蚀和膨胀是两种基础操作腐蚀缩小前景区域的边界可以去除小的白点噪声膨胀扩大前景边界可以填补小孔和断裂。先腐蚀后膨胀叫开运算用于去小噪点先膨胀后腐蚀叫闭运算用于补小洞。配合轮廓检测就能把二值图里真正想要的区域筛选出来。预处理这里有一条经验准则每一步操作都要记录参数而且只在必要的时候才用。产线环境跟实验室不同图像质量会有波动预处理步骤越多系统对参数越敏感长期稳定性越差。能用一步滤波解决的就不要叠三步——这是我在一线项目里用教训换来的底线思维。4. 特征与算法路线知识点从传统特征到深度学习4.1 传统特征工程师手写的规则在深度学习大规模应用之前视觉工程师的主要工作就是设计特征。这里的特征指图像里能用数学描述出来的规律比如角点、边缘、纹理、颜色分布。几个必须知道的名字边缘检测算子用于提取图像里灰度突变的位置是很多后续处理的基础角点检测用于找图像中两条边相交的点适合做图像匹配和拼接SIFT和SURF是尺度不变的特征描述算法图像无论怎么缩放旋转都能找到对应特征点适合物体识别和图像拼接HOG统计梯度方向的分布早期主要用于行人检测这类任务。这些传统特征的共同点是人肉设计工程师根据对目标的认识把什么样的特征算目标用数学表达式写出来。优点是计算快、可解释性强、不需要大量标注数据缺点是泛化能力有限换一个光照、换一个角度特征就可能失效。但不要因此就轻视它们——在很多固定工位的视觉项目里传统方法到今天依然是最经济、最稳定的选择。4.2 深度学习让网络自己找特征深度学习的核心思想是端到端学习给大量标注好的图像卷积神经网络自动从像素出发逐层抽象出边缘、纹理、局部部件、整体目标这些不同层级的特征最后用这些特征完成分类、检测等任务。卷积神经网络里几个必须搞懂的知识点卷积核在图像上滑动提取局部特征相当于在每个位置做小模板匹配同一套卷积核在整张图上共享所以参数数量远小于全连接方式池化层对特征图降采样保留主要信息、降低计算量同时带来一定的平移不变性激活函数给网络引入非线性让网络能拟合复杂函数感受野描述某个输出位置对应到输入图像上的多大区域感受野越大网络越能看全局。深度学习能在视觉任务上全面超越传统方法根本原因在于特征不是人写的而是数据驱动的。只要有足够多、足够多样、标注正确的数据网络就能学到人类难以用公式描述的复杂模式。但代价也很明显需要数据、需要算力、需要时间而且输出难以解释——模型为什么认为这个是缺陷往往说不清楚。这个黑盒属性在工业现场是个不小的麻烦因为客户和审核方经常会问凭什么判断它不合格。4.3 两种路线的选型边界很多初学者会陷入什么项目都上深度学习的误区。实际上视觉项目选路线要看五个条件目标是否规则、背景是否复杂、缺陷类型是否已知、数据量是否足够、算力有没有约束。把这五个问题想清楚了路线基本就定了。维度传统方法深度学习方法数据需求几乎不需要标注数据需要大量高质量标注可解释性高参数和规则清楚低黑盒泛化能力差换条件要改参数强能适应条件多样计算成本低CPU就能跑高通常需要GPU最佳场景固定工位、稳定光照、规则目标复杂背景、任意目标、多变条件按我个人的经验正确顺序是先用传统方法把问题想透再决定要不要上深度学习。很多项目用阈值、边缘、轮廓就能解决硬上深度学习既拉长开发周期又给后续维护埋雷。反过来如果目标是复杂背景下多类缺陷检测或者小目标高精度定位传统方法怎么调都达不到要求这时候深度学习才有不可替代的价值。选型不是追新是匹配问题难度。5. 视觉任务家族知识点分类、检测、分割、跟踪与OCR5.1 四个核心任务到底在解什么题视觉算法可以按输出形式分成几类任务。理解每个任务的定义和边界是看懂论文、选对算法的基础。图像分类回答这是什么输入一整张图输出一个类别标签。比如判断图片里是手机还是水杯。分类是最基础的任务也是最早被深度学习攻克的。目标检测回答有什么、在哪儿输入图像输出每个目标的类别和位置框。比如在传送带上找出所有有缺陷的元件并框出缺陷位置。相比分类检测多了一个定位的要求难点在于目标数量不固定、大小不一、还可能相互遮挡。图像分割回答哪些像素属于什么对每个像素做分类。其中语义分割把同一类物体的所有像素归为一类不区分个体实例分割进一步区分同一类里的不同个体全景分割则把背景和前景所有物体完整割开。分割的精细化程度最高但计算量和标注成本也最高在工业项目里要慎用。目标跟踪回答这个目标去哪儿了在多帧图像里持续锁定同一个目标。产线常见场景是配合运动机构对移动中的工件做连续检测和定位比如跟踪输送带上的元件等它到达指定位置时触发拍照或者抓取。5.2 检测算法的演进脉络目标检测是工业视觉里用得最多的任务它的演进脉络值得理一遍因为这代表视觉技术从手工设计到数据驱动的完整路径理解这个脉络能帮你在面对陌生论文时快速定位。早期是滑动窗口加传统特征在不同位置和尺度上切出一堆候选窗口用分类器判断每个窗口里有没有目标。思路直接但计算量巨大、候选窗口质量差准确率有限。深度学习时代分成两条路线。两阶段检测器先由一个区域提议模块生成候选框再对候选框做精细分类和位置回归精度高但速度慢单阶段检测器直接在特征图上预测类别和位置速度快得多精度也在持续改进中逐步追上来逐渐成为工业界的主流选择。再往后基于Transformer架构的检测方法把全局建模能力提升了一大截尤其擅长小目标和密集目标的场景。对做项目的人来说不需要把每篇论文都复现一遍但至少要能判断主流方案的大致性能和适用边界。一个实用的参考是在固定场景下单阶段检测器往往是精度和速度之间最平衡的选择只有目标特别小、特别密集或者对定位精度有极端要求时才需要往两阶段或者分割方向靠。5.3 分割、跟踪和OCR的实际落点分割在工业场景里主要用于形状不规则的检测比如外观缺陷检测需要精确知道缺陷的像素范围来计算面积或者半导体晶圆缺陷分析需要把微小异常从复杂背景里抠出来。分割模型部署成本高能用检测框解决的就不要上分割——这是工程上的克制也是成本意识。跟踪在机器视觉里更多是辅助角色。典型应用是先用检测算法找到目标再用跟踪算法在连续帧之间维持目标身份从而减少重复检测的计算量。但要注意跟踪解决不了目标被完全遮挡后重新出现的问题设计系统时要评估场景里物体会不会长时间互相遮挡否则跟踪跟丢了后面流程全乱。OCR光学字符识别是看起来简单、做起来坑最多的任务。产线上常做工业字符识别比如产品序列号、生产日期、批次号。关键知识点有两个识别前成像必须达标字符与背景要有足够反差视野里不要混入无关文字识别后必须做字符校验比如按编码规则检查长度和校验位防止8被识别成3这种局部错误溜过去。很多OCR项目翻车不是模型不行而是压根没做校验逻辑。6. 落地部署与避坑知识点从Demo到产线的最后一公里6.1 指标先把话说清楚一个视觉项目做得好不好不是算法工程师说了算是指标说了算。立项阶段就要把指标定清楚否则后面全程扯皮。最基础的是准确率、精确率、召回率三个概念。准确率是所有判断里正确判断的比例精确率是你判为缺陷的里面真缺陷占多少召回率是所有真缺陷里面你找出来多少。对缺陷检测来说召回率往往比精确率更重要——漏掉一个缺陷可能让整批产品出问题而误报最多是多打一个标记让人复查一遍。绕不开的还有误检率和漏检率。误检率是合格品被误判为不合格的比例漏检率是不合格品被放过去的比例。产线项目还要把节拍时间写进指标一个算法再好单张图跑两秒产线每分钟只能过三十个产品那就是不合格方案。所以任何视觉算法在设计时都要考虑单次处理耗时工业经验是至少留出三成余量给传输、通信、剔除动作留时间。6.2 数据集与标注的工程细节深度学习项目里数据集是地基。地基歪了房子肯定斜。这里分享几个我踩出来的数据集经验。第一数据集要覆盖真实分布的多样性而不是单纯追求数量。采集时要尽量覆盖不同光照时段、不同批次产品、不同工位的差异。很多人只在一个下午把数据采完模型训练出来看着挺好换一批产品就崩原因就是数据没有覆盖变化。第二标注规范要先定清楚再动手。比如缺陷的边界画到什么位置、模糊样本算不算缺陷、重叠目标怎么处理都要有明确标准。一个项目四个人标注标准不统一模型学到的就是标注人员各自的风格而不是目标本身。第三正负样本要做平衡。缺陷样本通常是少数类别正负样本悬殊的话模型会倾向把所有东西都判为正常精度虚高、召回率很低。做法是采集时尽量均衡或者用数据增强扩充少数类样本再配合针对性的训练策略调整。关于数据增强有一条要特别注意它不能替代真实数据的采集。平移翻转改变的是图像的几何形态但产线的光照差异、灰尘颗粒、震动模糊这些现场噪声是增强不出来真实效果的。增强只能做锦上添花做不了雪中送炭。6.3 部署端的算力、并发与稳定性从训练到部署是整个项目里最容易被忽视的阶段。很多模型在开发机上跑得飞快部署到工控机上帧率掉一半问题就出在部署规划没做。部署要考虑几件事。算力上模型推理常用GPU加速但工控机未必有独立显卡所以要提前评估是走CPU推理还是GPU推理模型大小和推理速度要提前实测常用的优化手段包括量化、剪枝和蒸馏可以在精度损失很小的情况下明显加快速度。并发上如果一条产线多台相机同时触发要考虑任务排队问题避免多路信号同时到达导致处理延迟相机触发、结果回传、剔除信号这些环节都要设超时和重试。稳定性上程序要能处理图像异常——相机断流、图像全黑、被遮挡比较好的做法是在软件里加图像质量判断异常图像直接跳过或报警别把坏图送进模型否则模型会输出一个荒谬但自信的结果。还有一个容易被低估的点存储和日志。产线长期运行结果图片、缺陷样本、模型版本、参数配置都要留痕迹。没有日志的视觉系统就像没有黑匣子的飞机出了故障只能干瞪眼靠回忆排查是非常痛苦的。我见过太多现场问题最后翻旧日志才能定位这个习惯越早养成越好。6.4 高频坑清单与调试路线最后给一份我在项目里反复撞见的高频坑清单你可以当成排查手册用。先检查成像再检查算法。现场效果变差第一个想到的应该是光源有没有衰减、镜头有没有脏、环境光有没有变化。十个视觉故障里至少六个出在成像端不是算法端。做单一变量实验。调参时每次只改一个变量——改了光源就不要动阈值改了阈值就不要动光源。一次同时改三个变量出了问题你根本不知道是哪个引起的。固定复现依托现场图。算法在开发机上看一切正常到现场效果差先把现场图拿回开发机复现对比两边数据的差异而不是在现场凭感觉改参数。最后一定记录版本。模型文件、参数配置、标定数据、软件版本全部留档。这个习惯看起来麻烦但项目出问题时能帮你省下好几天排查时间。写到这里这份知识点的整理基本完整了。要说我最大的体会其实就一句话机器视觉的知识点数量并不算多难的是把它们按正确顺序用起来。先成像、再算法、后工程这个顺序一旦乱掉项目就会一直在补窟窿。如果你刚入门我的建议是别急着追最新的模型先拿一个简单的检测任务把光源、预处理、阈值分割、轮廓分析这条传统链路完整走一遍——等你能徒手把这条路走通再回头看深度学习很多概念都是水到渠成的事。