
1. 先聊清楚为什么机器视觉开始绕不开深度学习几年前我调过一条产线工件表面划痕检测用传统机器视觉那套来做灰度化、中值滤波、形态学顶帽变换、阈值分割然后连通域分析再按面积和长宽比过滤。调试的时候什么问题都没有一换班、光源老化、来料变成另一种批次误检率直接飙到让人怀疑人生。后来我把这套流程换成了深度学习模型白天黑夜、不同光照、不同批次鲁棒性上来了现场伺候设备的兄弟也终于不用半夜打电话喊我调阈值了。“机器视觉、图像处理、深度学习”这三个词放一起今天已经不算新鲜但真正把深度学习落进产线视觉的人都知道这件事的难度不在“训练一个模型”而在数据、部署、集成、性能这四座大山。这篇文章我就按自己实际做项目的顺序从选型讲起到数据标注、环境配置、训练调参、模型转换、工业部署再到现场运维踩坑把整个链路摊开讲一遍。不管你是刚入行的视觉工程师还是研究生阶段要做图像处理项目或者是在工控行业想给现有设备加AI能力的这篇内容应该都能帮你少走不少弯路。说白了深度学习在视觉里解决的核心问题就一个字稳。传统算法靠人手工设计特征遇到“缺陷长什么样说不清”的场合就很难办深度学习靠数据自己学特征只要数据覆盖到位它能学会你描述不出来的细节规律。但它在工业现场的缺点也很明显结果不可解释、对数据敏感、部署链路长。所以真正靠谱的做法是清楚什么时候该上深度学习、什么时候守住传统算法两条腿走路。2. 方案选型不是所有视觉问题都该用深度学习2.1 传统算法解决不了的场景才是深度学习的舞台传统机器视觉的经典流程我再熟悉不过采集图像、预处理、阈值分割、找边、Blob分析、模板匹配。这套组合拳在场景稳定、特征明确、环境受控的情况下速度和精度都非常能打。比如手机中框的尺寸测量、螺丝孔位判定、二维码读码这些任务传统算法能做到亚像素级定位和微秒级处理完全没必要上深度学习硬上反而给自己找麻烦。深度学习真正不可替代的场景是那些“你描述不清楚规则”的任务。拿零件缺陷检测来说划痕的深浅、方向、粗细千变万化拉丝金属表面的纹理本身和划痕在灰度上几乎一样阈值分割根本分不开。再比如电子秤屏幕的数值识别不同品牌字体不一样、数字倾斜、反光遮挡你用OCR模板匹配做一套就崩一套这种情况交给检测模型反而不需要考虑字体差异。还有产品分类比如判断牛肉的脂肪纹理等级老师傅凭经验看一眼就知道但你没法把“经验”写成规则深度学习却能通过大量样本把这种“只可意会”的标准学到模型里。我习惯用一个判断清单来决策特征是否能写成明确规则能先用传统算法。缺陷/目标是否有清晰的边界可定义有传统算法。样本形态是否多变、特征是否模糊是考虑深度学习。是否要求毫秒级实时响应且没有GPU/NPU是慎用深度学习。是否要求结果可解释、可追溯高要求时慎用端到端深度学习。2.2 深度学习在机器视觉里的三个价值维度从技术路径上看深度学习给视觉带来的核心优势可以拆成三点。第一个是表征学习。传统算法里的特征比如SIFT、HOG、LBP都是人设计好的描述子设计者绞尽脑汁把“角点”“纹理”“边缘”这些概念形式化。而CNN里的卷积核是训练自动学出来的第一层可能还在学边缘和颜色到中间层开始学纹理和局部结构深层学到的是语义级的概念。这相当于把“人工设计特征”换成了“从数据中学习特征”面对复杂表面纹理时明显更稳。第二个是端到端。传统视觉做缺陷检测要拆成预处理、分割、特征提取、分类、判定好几段每一段都有参数误差层层叠加。深度学习可以直接输入图像、输出“OK/NG”中间所有环节由网络自己协同优化省掉了大量调参工作。第三个是分布统摄。传统算法隐含假设“目标和背景在某个特征空间里可分”一旦来料批次变化这个假设就破了。深度学习训练时见过大量分布内变化不同光照、角度、形态它对“同类但细节不同”的容忍度远高于手工阈值。这也是为什么同一个缺陷检测项目从算法切换到模型后最明显的感受是误检率直线下降。2.3 但技术也有边界深度学习的“坑”要先知道客观说深度学习在视觉里也有三个绕不开的问题。第一结果不可解释这是工业界最头疼的事。质量体系审核时问“你这个缺陷为什么判定为NG”你没法指着一堆权重说“它这么认为的”。现在很多厂要求保留原图、置信度、热力图算是一种折中。第二数据饥渴。模型虽然比人擅长学特征但没有数据它也白搭后面我会重点讲数据这块。第三部署复杂度。PC端的Halcon、OpenCV很容易跑但要塞进嵌入式或现有LabVIEW流程里模型转换、推理框架、硬件选型一套组合拳下来工作量不比训练小。所以我的观点一直是深度学习在工业视觉里不是替代者而是解决传统方法搞不定场景的补充者。两者经常是并用的——传统算法做快速定位和测量深度学习做缺陷分类判断最后再投票融合这种方式在产线上特别常见。3. 算法选型与任务拆解检测、分类、分割、异常检测怎么选3.1 图像分类最朴素的“合格/不合格”如果你的产线只需要判断“这个区域有无缺陷”不需要知道缺陷在哪、属于哪一类图像分类是最轻量的选择。输入端是一张裁切好的图输出是类别标签网络结构用ResNet、EfficientNet这类CNN就够。分类任务在视觉里的典型场景是零件表面纹理分级比如判断喷砂面的粗糙度等级是否达标或者看焊接点的颜色是否异常。这类任务的难点不是网络选型而是“输入图怎么裁”。缺陷的位置是随机的你需要先用传统视觉做定位把可疑区域裁出来再送进分类网络。这样分类模型的输入很干净准确率也容易做到很高。有一个参数容易被新人忽略分类模型输入尺寸。工业现场拍到的图经常是500万像素甚至1200万像素你不可能整张图直接塞进网络。常见的做法是先定位裁剪再缩放到模型输入尺寸比如224×224、256×256。缩放会损失细节所以对细小缺陷宁可裁小块让缺陷在图中占比大也不要用大图把缺陷缩没了。3.2 目标检测缺陷定位、计数、读数的通用解法目标检测要解决的问题是“图里有什么、在哪、有多大”用检测框把目标框出来。这是工业视觉里用得最多的一类算法因为大部分缺陷检测不仅要判NG还要告诉机械臂“缺陷在哪个坐标”。模型选型上我通常分成两档。精度优先、算力充足用Faster R-CNN或者Cascade R-CNN这类两阶段检测器对小目标更友好但速度慢。速度优先、要求实时用YOLO系v5/v8/v11或者RT-DETR一阶段模型在GPU上跑起来非常快纯CPU也不是不能跑只是帧率感人。我在做零件计数的时候也用过检测模型比如要统计一排针脚是否缺针、数量是否对这其实就是一个典型的目标检测任务。传统Blob分析里要做“忽略点数”这类后处理把面积过小的噪点过滤掉参数设不好容易把真实小目标也滤掉。YOLO这类检测模型输出的是“有没有”的语义判断不会因为面积阈值就把真实缺针漏掉鲁棒性好很多。电子秤屏幕数值识别也是检测模型的常见应用。流程上先训练一个检测模型把数字区域框出来再用OCR识别每块数字。难点在于不同电子秤的字体差异大纯模板匹配做一套崩一套而检测OCR的方案对“长得不完全一样但语义相同”的数字有天然容忍。3.3 图像分割像素级缺陷的精细化处理分割比检测更进一步它要求把缺陷的每个像素都标出来输出的是掩膜。为什么有时候必须用分割而不是检测因为有些缺陷本身就极不规则一条细长划痕检测框画出来要么是长方形套住一大片好区域要么框太紧导致训练时信息丢失。分割模型可以精确到像素级边界适合裂痕、毛刺、边缘缺损这类形状不规则的缺陷。语义分割用U-Net、DeepLabV3是比较常规的选择U-Net在工业小数据集上表现一直很稳它的编码-解码结构和跳跃连接特别适合边界精细的任务。实例分割用Mask R-CNN可以在分割的同时区分“这是第几个缺陷”适合做多个缺陷的独立分析。分割的代价是标注成本最高。画一个检测框只要几秒用多边形把一个不规则缺陷描出来可能要好几分钟。所以我的做法是能用检测解决的不用分割只有在检测框套不住缺陷、或者需要精确缺陷边界做后续尺寸计算时才上分割。3.4 无监督异常检测当“缺陷样本”根本收集不齐工业场景里有一个残酷现实很多缺陷出现的概率极低你可能开机跑三个月都拍不到几张真正的缺陷图而正常的良品图倒是存了一大堆。这种极端不平衡情况下分类、检测、分割全都难搞因为模型根本没机会学“缺陷长什么样”。无监督异常检测就是为这种场景设计的。思路是只拿正常图像训练让模型学会“正常长什么样”推理时遇到和正常情况差异大的区域就判定为异常。经典方案有PatchCore、PaDiM这类基于特征嵌入的方法在工业异常检测数据集上表现很好。Halcon 20.11之后加入的Anomaly Detection模块底层也接近这个思路工业现场可以直接用。实测下来无监督异常检测适合“缺陷形态完全未知”的早期预警比如设备刚出现异常磨损时拍到的陌生纹理。但它的问题也很实际对噪声特别敏感轻微的灰尘、飞溅油渍都可能报异常需要做好图像预处理和结果过滤。真正做精确判定时我一般会把无监督异常检测当“粗筛”先捞可疑区域再送给有监督分类模型做确认。4. 数据是真正的护城河标注、增强与样本策略4.1 工业现场的数据集从来都小先别慌很多做学术课题的同学习惯在公开数据集上训练一来就是几万张图。但工业视觉项目的现实是一种零件、一种缺陷能凑齐几千张就算不错很多项目初始可用数据就几十到几百张。数据量小不等于不能做关键是策略。我的经验三步走第一步先拍够覆盖度把不同光源、不同角度、不同来料批次、不同相机参数下的图像都拍进来宁可每类数量少也要覆盖广。第二步做专家标注请产线上最能识别缺陷的老师傅参与标注边界、类别都得有统一标准。第三步先训练一个初版模型拿到现场跑把模型“觉得可疑但不确定”的图像收回来人工复核后加入训练集形成数据飞轮。这一步非常有效因为模型暴露出来的模糊样本往往比你自己想象出来的困难样本更有价值。4.2 标注标准不统一模型学的是“标注者的分歧”标注这件事看着简单实际坑很深。我第一次做缺陷标注时三个人标同一个批次的图回来一查同一个缺陷有人标成“划伤”有人标成“碰伤”还有人觉得“太小不用标”。最后模型训出来精度上不去查来查去问题出在标注本身。后来我们把标注规则写成了文档什么样的形态算哪类缺陷、最小标注尺寸是多少、边界延伸到什么程度算结束、模糊样本怎么记录。每条规则附参考图。每次开始标注前先跑一遍一致性校验——抽几张图让不同标注员标用IoU算标注重叠率低于阈值的重新对齐标准。这个投入看起来慢但后面模型训起来会非常顺。小目标缺陷的标注尤其要当心。一个指甲盖大小的划痕标注时框稍微松一点训练时IoU本来就只有零点几再一松直接变成负样本了。我的习惯是检测框必须紧贴缺陷边界宁可紧一点不可松分割标注要用贴近边缘的多边形不用矩形框代替。4.3 数据增强别“为了增强而增强”数据增强是缓解小样本最有效的手段之一但用不好反而污染模型。工业图像里最有价值的增强是亮度/对比度扰动模拟光照波动。高斯噪声/椒盐噪声模拟传感器噪声和灰尘。轻微旋转、平移、尺度变化模拟工件摆放偏差。随机擦除模拟局部遮挡。不建议一开始就上Mixup、CutMix那种太“激进”的增强尤其缺陷检测这类任务缺陷本身可能就很小CutMix直接把缺陷和背景混在一起模型很容易学糊涂。增强的目标是让模型学会“本质不变、细节变化”的鲁棒性不是教它看花眼。另外合成数据在工业视觉里也越来越实用。用仿真引擎渲染零件模型自动生成标注再配合GAN风格迁移把渲染图“变成”真实相机拍出来的效果。对于电子秤这种屏幕数字识别场景合成数字加真实背景能快速把训练集翻几倍。不过合成数据始终要和真实数据混用纯合成数据训练出来的模型到了现场会因为域差异掉点。5. 环境搭建与训练实战从Miniconda到模型收敛5.1 环境配置别再被CUDA、cuDNN、PyTorch版本折磨进入训练环节第一步是把环境搭好。我强烈建议用Miniconda而不是AnacondaMiniconda体积小、启动快按需创建独立环境一个项目一个环境切换起来干净利落。# 创建独立环境并指定Python版本 conda create -n vision_dl python3.10 -y conda activate vision_dl # 安装PyTorch这里以CUDA 11.8为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118PyTorch和CUDA版本对应关系是新人最容易踩的坑。我的建议是先确认显卡驱动支持的CUDA版本命令行nvidia-smi看右上角再安装对应版本的PyTorchtorch和torchvision版本必须匹配否则API会报错。推荐直接用PyTorch官方命令不要自己猜版本。如果你部署的电脑是NPU比如昇腾设备环境配置又是另一套思路。昇腾社区提供了torch_npu插件PyTorch训练好的模型可以迁移到NPU上推理关键是安装对应版本的驱动、固件、CANN工具包。最先要确认的是Python版本和torch版本是否在官方支持列表里不匹配的话后面跑模型会各种莫名其妙报错。5.2 数据划分和Loss设计训练细节决定模型上限数据划分不是随机切分那么简单。工业数据集类别极不平衡比如划痕500张气泡只有50张如果随机划分可能训练集里气泡只有30张验证集里来了20张模型学了个寂寞。我的做法是按类别分层划分每类缺陷都按相同比例分到train/val/test。如果某类样本太少单独把这部分样本全部放train测试集用另一批同类图像来验证或者干脆做K折交叉验证。Loss设计也要跟着任务走。分类用交叉熵目标检测默认CIoU Loss对框回归更友好分割任务里类别不平衡严重时用Dice Loss加Focal Loss的加权组合比单纯交叉熵收敛更稳。我在做微小缺陷分割时Dice Loss的占比会调高因为小缺陷的像素占比太小纯交叉熵几乎全被背景主导。训练过程里有一个新手特别容易忽视的参数batch size。GPU显存不够时大部分人第一反应是调小batch size但batch size太小比如1、2BN层的统计量不稳定模型收敛很慢。解决办法可以试试梯度累积先用小batch前向累积几个batch再更新一次梯度相当于模拟了大batch的效果。# 梯度累积示例 accumulation_steps 4 loss loss / accumulation_steps loss.backward() if (step 1) % accumulation_steps 0: optimizer.step() optimizer.zero_grad()5.3 看Loss曲线而不是只会等训练结束模型训练时我每跑一个epoch都会记录train loss、val loss、准确率/召回率/漏检率不是只看着终端发呆。判断训练状态的核心是看loss曲线形态train loss和val loss一起降正常。train loss降、val loss不降甚至升过拟合加数据增强、加正则化、减小模型容量。两个loss都不降欠拟合加大模型容量、调学习率、检查数据标注质量。loss反复横跳不收敛学习率太大或者数据里有大量噪声标注。学习率的设置我习惯用余弦退火加warm-up。前几个epoch用小学习率“热身”让模型先稳定下来再逐步加大到设定值后面再按余弦曲线衰减。这个策略比固定学习率更容易收敛到好的局部最优。5.4 精度验收不能只看mAP要看产线的漏检和过杀训练结束后的模型评估学术上爱看mAP、F1但这些指标和产线实际指标不是一回事。产线最关心两个数漏检率和过检率也叫误检率。漏检是把NG当OK放走了这是客户投诉的事过检是把OK当NG拦截了重工返检浪费产能。所以拿到模型后第一步是拉着现场负责人一起看置信度阈值怎么定。阈值调高漏检低但过检多阈值调低过检少但漏检风险上去。正确做法是先统计当前阈值下的漏检率和过检率再结合产线节拍、人工复检能力、客户容忍度倒推阈值。如果缺陷流出代价很高阈值宁可调高一点如果后段有人工复检兜底阈值可以适当放宽减少拦截量。6. 工业部署与性能优化把模型稳稳跑在产线上6.1 模型转换PyTorch到ONNX再到推理引擎模型训练完只是第一步工业现场真正跑起来还需要经过部署链路的转换。我现在的标准流程是PyTorch训练权重导出ONNXONNX作为中间格式再转到具体的推理引擎。import torch model.eval() dummy_input torch.randn(1, 3, 640, 640, devicecuda) torch.onnx.export( model, dummy_input, model.onnx, opset_version11, input_names[input], output_names[output], dynamic_axes{input: {0: batch}, output: {0: batch}} )ONNX导出时有几个细节决定成败。第一固定输入尺寸还是动态尺寸我一般固定尺寸动态尺寸在部分推理引擎上支持不完整还会拖慢性能。第二导出前检查模型里的预处理是否已经固化归一化参数、通道顺序导出后推理端要严格对齐否则图像输入和训练时数据分布不一致效果直接崩。第三有些自定义算子导出不了ONNX比如部分检测头的后处理需要拆出来单独写。ONNX之后怎么选推理引擎看硬件GPU平台用TensorRTIntel CPU平台用OpenVINO瑞芯微NPU用RKNN昇腾NPU用CANN自带的推理工具Halcon用户就用Halcon自带的深度学习推理模块。TensorRT的加速效果很明显在保留原始图像预处理的情况下一般能让YOLO模型在不损失精度的情况下快两到三倍但转换过程有个难受的点它会对模型做层融合和精度优化转换前后输出会有一点点数值差异需要在测试集上确认精度没有掉。6.2 推理加速三板斧输入尺寸、半精度、计算图优化工业视觉对性能的要求从来都是苛刻的。产线节拍2秒一件你单张图像推理就要0.8秒整个工站根本来不及。第一板斧是输入尺寸剪裁。很多模型为了召回小目标用了很大的输入尺寸但推理图越大越慢。我的做法是先用传统算法定位到感兴趣区域把ROI裁出来再送进模型输入尺寸从原始大图缩到几百像素见方推理时间瞬间降一个量级。这个“传统AI”的组合拳在工业现场非常实用。第二板斧是半精度FP16。GPU用TensorRT跑FP16量化推理速度立竿见影。FP16在这类任务上精度损失很小尤其检测、分类这类输出离散的任务几乎无感。CPU平台可以用INT8量化但量化是个细活稍微没调好掉点严重建议先试FP16。第三板斧是计算图优化。ONNX导出时已经做了不少折叠优化TensorRT还会再做一次层融合。如果还想压榨性能可以考虑模型结构层面的改动比如把backbone换成更轻量的结构EfficientNet-Lite、MobileNetV3或者用模型蒸馏让大模型当老师、小模型当学生把精度传承到推理速度更快的轻量模型上。6.3 硬件选型GPU、NPU、FPGA各回各家部署硬件的选择完全取决于现场环境和预算。独立GPU是主流选择。工控机插一张消费级显卡如RTX 3060/4060或者Jetson嵌入式平台开发调试方便生态成熟。Jetson是工业视觉里很常见的部署平台功耗低、体积小适合做边缘智能盒子。但要注意散热产线车间温度高Jetson满载长时间跑容易过热降频选型时留好散热余量。NPU是最近几年越来越热的选项。像瑞芯微RK3588、算能BM1684、昇腾310这些推理典型CNN模型的速度和功耗比表现都很好适合对功耗和成本敏感的嵌入式设备。缺点是工具链成熟度参差不齐模型算子支持不完全部分层需要算子替换或重写部署周期会长一些。FPGA倒是另一个路子传统FPGA加DSP做图像处理在工业领域很成熟比如做实时预处理、加速传统算法。但用FPGA跑深度学习开发周期长、灵活性差除非产量极大、性能要求极其苛刻否则我不太推荐NPU在这类任务上性价比更高。现在更常见的形态是FPGA负责图像采集和预处理GPU/NPU负责AI推理各司其职。6.4 与现有视觉生态集成LabVIEW、Halcon、OpenCV如何共存工业项目的现实是你很少能“推倒重来”更多是在现有视觉系统里加一个AI推理模块。我在一个LabVIEW做的检测工站里接过深度学习上位机用LabVIEW采集图像和控制流程检测算法用C写好封装成DLL内部调用ONNX Runtime加载模型推理LabVIEW再通过调用DLL拿到结果。这套方案的好处是LabVIEW的界面、数据管理、PLC通信逻辑都不用动只在检测环节替换了算法内核。注意两点一是DLL的输入输出接口要定义得足够简单图像指针、宽、高、结果数组二是每个DLL进程的资源释放要处理好不然工业电脑跑几天内存就爆了。Halcon用户就更顺了。Halcon从新版开始支持深度学习训练可以用深度学习工具标注和训练导出后直接read_dl_model在HDevelop里就能集成。如果你已经买了Halcon的授权和深度学习推理能力这可能是集成成本最低的路径不需要自己写ONNX Runtime的代码。但Halcon深度学习的模型结构相对固定复杂任务的支持不如PyTorch灵活所以我会先确认需求匹不匹配。OpenCV则是所有人都绕不开的基础工具。图像读取、颜色空间转换、几何校正、形态学预处理这些操作在深度学习推理前后都大量使用。OpenCV自带的DNN模块也能直接读ONNX模型推理适合快速验证但性能和功能比专业推理引擎差一些我一般只用来做原型验证。6.5 AI ISP与传统图像处理的边界问题顺带提一句热词里经常有人搜“ISP图像处理”和“AI降噪超分”。相机端的ISP图像信号处理负责RAW域到RGB域的转换包含去马赛克、白平衡、降噪、锐化等环节传统ISP的每个模块都是固定算法或可调参数。AI ISP的思路是用神经网络替代其中部分模块实现超分辨率、低光照降噪、HDR融合。这类技术在手机摄影里已经很常见但工业视觉里落地还不算多主要原因是实时性和可解释性产线相机要求实时输出AI ISP的计算量往往顶不住而且ISP参数影响图像一致性换成不可解释的神经网络后工程师很难排查“图像为什么长这样”。不过在离线图像增强场景比如低照度监控回放、文档图像清洗AI超分降噪已经能用起来。7. 现场踩坑记录常见问题排查与避坑指南7.1 训练时F1挺好看一到现场就崩这是工业视觉项目里最常见的现象。模型在测试集上F1高达0.98部署到现场却频繁漏检或误检。排查思路按优先级来第一确认训练数据的图像与现场图像分布是否一致。相机换了镜头焦距变了光源色温变了图像分辨率变了都可能让模型“没见过这种图”。数据采集阶段就要把现场的光源、相机、镜头参数固定下来训练时把这套参数写进文档后面现场有任何硬件更换都要重新评估。第二确认推理端的前处理是否和训练端完全一致。归一化是除以255还是除以均值方差通道顺序是RGB还是BGR尺寸缩放用线性插值还是最近邻OpenCV读图像默认BGRPyTorch训练默认RGB这个低级错误我见过不止一次模型效果直接断崖下跌。第三看置信度阈值是否合理。训练时挑了一个让F1最高的阈值但现场要求的是漏检率低于某个值两者可能差很多。现场的阈值要按现场指标重新调。7.2 光照一变就漏检光源是最大的变量工业现场打光方式的微小变化都能让图像分布偏移。如果项目的光照条件不稳定建议有两条路。第一条路是在数据采集阶段刻意拍摄多组光照条件的图像把亮度变化、反光角度变化都录进来模型学会了“光照变化不影响判断”这个本质。第二条路是加预处理白化步骤比如先做灰度归一化、直方图匹配、或者固定参考白板做色彩校正把输入图像拉到一个更稳定的状态再进模型。这两种方法可以叠加使用实测下来效果最好的是后者尤其当现场光源老化无法及时更换时归一化能兜住一半以上的掉点。7.3 微小缺陷总是检测不到小目标检测是深度学习视觉里的老大难。工业现场尤其明显几毫米的划痕在一张1200万像素图像里只占几个像素下采样几次就直接消失了。我的处理方案优先保证输入分辨率足够。既然模型输入尺寸不能无限大那就让缺陷在模型输入里的占比尽量大方法就是先定位ROI再裁图。如果缺陷在整幅图里位置随机且尺寸极小可以考虑平铺切图把大图切成若干小块分别推理但推理时间会成倍增加。也可以使用注意力机制或者超分辨率前置网络但工程上复杂度和收益不成正比我一般先试ROI裁图方案。7.4 缺陷类别分不清张冠李戴怎么办两类缺陷长得太像比如压伤和碰伤人眼都经常分不清模型会混淆也正常。这类问题要做两件事第一合并相似类别。既然人眼都分不清把两个类别合并成“缺陷”或“表面损伤”检测任务变成“有没有缺陷”准确率立刻上去了。第二如果是生产上必须区分缺陷类型来指导返修那只能靠更清晰的判据——有些缺陷在特定光源角度下才能分辨比如侧光下压伤和碰伤的反光特征完全不同这时需要在图像采集端多增加一组光源和相机。7.5 模型推理速度不达标先别急着换硬件推理速度不达标时大家的第一反应往往是换更贵的显卡。但多数情况加快速度的收益来自软件层面。先看输入图像是不是整幅大图直接进模型这是最典型的性能杀手再看有没有用半精度推理再看模型有没有可能剪枝蒸馏成轻量版最后才考虑硬件升级。硬件的成本是线性的而软件优化经常能带来倍数的提升优先级应该完全反过来。7.6 模型文件和工程文件一多就乱版本管理不能省最后这个不算技术问题但实际项目里坑了很多人。深度学习项目的产物非常多数据版本、标注版本、训练脚本、权重文件、ONNX模型、TensorRT引擎、部署代码再加上各种回退需求如果没有版本管理模型一出问题根本不知道用的是哪次训练的权重。我现在每个项目都强制用一套相对规范的结构管理版本。数据集目录按日期和类别组织标注文件跟着数据集一起归档权重文件按“模型名称_数据版本_训练时间_指标”命名ONNX、TensorRT引擎文件单独存放并登记转换环境和命令参数。训练好的模型在部署前跑一次完整的回归测试结果存档。这套习惯看起来繁琐但在项目上线后、几个月内要排查问题时能节省大量时间。8. 一点个人体会做了这么多年视觉项目我的体会是深度学习给机器视觉带来的不是“银弹”而是一种更灵活、更鲁棒的工具。它把“人怎么描述规则”这个问题变成了“人如何提供数据”降低了复杂视觉任务的实现门槛但同时也把项目的重心从调参转移到了数据管理、部署工程和系统集成上。如果让我给刚开始接触这个方向的人一个建议不要一上来就追着最新的模型结构跑先用一个成熟稳定的检测模型比如YOLOv8把一个完整项目从头到尾走一遍——数据采集、标注、训练、转换、部署、集成、调优。这个闭环走完了你对深度学习和机器视觉的认知会完全不一样。别问我为什么知道我就是这么过来的。