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

文章详情

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

C# + AI 视觉检测:工业零件缺陷识别系统完整实现

C# + AI 视觉检测:工业零件缺陷识别系统完整实现 工业产品外观缺陷检测是质量管控的核心环节传统人工目检存在效率低、易疲劳、标准不一致等问题而商用视觉软件Halcon/VisionPro授权成本高、定制化弱Python推理方案又面临跨语言部署难、运维复杂、边缘适配差等痛点。基于 C# ONNX ML.NET 的落地方案可以直接将 AI 视觉能力嵌入现有 C# 上位机系统全程在本地工控机完成采集、推理、控制全闭环无需额外服务器、无需跨语言调用、无需专业视觉软件授权是中小批量产线智能化改造的高性价比路径。本文从系统架构、模型制备、核心推理、产线联动到工程化加固完整拆解可直接落地的工业缺陷检测系统所有逻辑均经过产线验证。一、系统整体架构边缘侧全闭环设计工业视觉系统的核心原则是不影响生产、最小侵入现有产线所有计算在本地工控机完成断网也能正常运行AI 故障可一键旁路。1.1 四层解耦架构展示交互层业务控制层推理层 工控机本地感知层光电传感器PLC IO触发工业相机环形光源图像预处理模块ML.NETONNX推理引擎后处理与缺陷分级状态机管控剔除信号输出PLC质量数据本地存储多级降级兜底实时检测画面缺陷统计报表参数配置界面1.2 核心设计原则边缘优先所有推理、控制全部在本地工控机完成不依赖云端、不依赖内网服务器断网不影响生产。最小侵入AI 模块以插件形式接入现有上位机原有 PLC 控制逻辑不动出问题可一键切回人工/纯机器视觉模式。多级兜底AI 检测异常时自动降级为传统阈值算法再异常则旁路 AI产线保持纯人工模式绝对不能因为 AI 故障停线。数据可溯每个产品的原图、检测结果、缺陷位置、工艺参数、时间戳全部关联存档支持按条码追溯。二、算法选型与模型制备工业场景的视觉模型精度和速度重要CPU 友好性、小样本泛化能力更重要——绝大多数工厂没有 GPU 工控机也没有几万张标注样本。2.1 模型选型轻量优先CPU 也能跑工业缺陷检测首选 YOLO 系列轻量模型平衡精度、速度、部署成本首选 YOLOv8n / YOLOv11n参数量小、推理速度快i5 工控机 CPU 单帧推理 30~80ms完全满足产线节拍。备选 MobileNetSSD算力极弱的嵌入式工控机可选用速度更快适合简单缺陷。不建议用大模型工业场景缺陷类别少、背景简单大模型不仅跑不动还容易过拟合。2.2 训练侧Python 训练 针对性优化算法侧用 Python 完成训练.NET 侧只负责推理分工协作兼顾算法丰富度与部署便捷性数据增强工业缺陷样本少必须做增强——旋转、翻转、亮度扰动、高斯噪声、随机遮挡小样本下泛化性提升 30% 以上。负样本训练加入大量合格但有干扰划痕、脏污、反光的负样本大幅降低现场误检率。导出 ONNX训练完成后导出 ONNX 格式设置 opset12兼容所有版本 ONNX Runtime。2.3 模型轻量化INT8 量化必做工控机无显卡的场景INT8 量化是性能倍增器模型体积减少 75%内存占用大幅降低CPU 推理速度提升 2~4 倍640×640 输入可做到 50ms 以内工业场景精度损失通常 1%完全可接受工具使用 ONNX Runtime Quantization 工具完成量化推理侧无需改代码三、核心实现C# 端推理全流程基于 OpenCvSharp 做图像处理ML.NET ONNX Runtime 做推理全程 C# 实现零 Python 依赖可直接嵌入 WinForms/WPF 上位机。3.1 图像预处理工业场景的关键工业现场光照波动、背景干扰多预处理质量直接决定检测效果不能直接把原图扔给模型。publicclassImagePreprocessor{privatereadonlyint_inputSize640;/// summary/// 工业图像预处理ROI裁剪光照归一化缩放填充/// /summarypublicMatPreprocess(MatsourceImage,Rectangleroi){// 1. 裁剪ROI只保留产品区域排除背景干扰同时减小推理尺寸usingvarroiMatnewMat(sourceImage,roi);// 2. 灰度化CLAHE自适应直方图均衡抵消光照波动、光源老化usingvargrayMatnewMat();Cv2.CvtColor(roiMat,grayMat,ColorConversionCodes.BGR2GRAY);varclaheCv2.CreateCLAHE(2.0,newSize(8,8));clahe.Apply(grayMat,grayMat);Cv2.CvtColor(grayMat,roiMat,ColorConversionCodes.GRAY2BGR);// 3. 等比例缩放灰边填充避免变形floatratioMath.Min((float)_inputSize/roiMat.Width,(float)_inputSize/roiMat.Height);intnewW(int)(roiMat.Width*ratio);intnewH(int)(roiMat.Height*ratio);varresizednewMat();Cv2.Resize(roiMat,resized,newSize(newW,newH),0,0,InterpolationFlags.Linear);varpaddednewMat(_inputSize,_inputSize,MatType.CV_8UC3,Scalar.Gray);resized.CopyTo(newMat(padded,newRect((_inputSize-newW)/2,(_inputSize-newH)/2,newW,newH)));returnpadded;}}现场经验ROI 裁剪是性价比最高的优化既能减少背景误检又能让实际推理区域变小速度提升一倍以上。3.2 推理引擎封装ML.NET ONNX定义输入输出实体构建 ONNX 推理管线封装成可复用的检测服务。publicclassYoloDetector:IDisposable{privatereadonlyMLContext_mlContext;privatereadonlyITransformer_model;privatereadonlyThreadLocalPredictionEngineImageInput,DetOutput_enginePool;privatereadonlyint_inputSize640;privatereadonlyfloat_confThreshold0.5f;privatereadonlyfloat_iouThreshold0.45f;privatereadonlystring[]_classNames;publicYoloDetector(stringonnxPath,string[]classNames){_mlContextnewMLContext();_classNamesclassNames;// 构建ONNX推理管线varpipeline_mlContext.Transforms.ResizeImages(outputColumnName:images,imageWidth:_inputSize,imageHeight:_inputSize,inputColumnName:nameof(ImageInput.Image)).Append(_mlContext.Transforms.ExtractPixels(images,scaleImage:1f/255f)).Append(_mlContext.Transforms.ApplyOnnxModel(modelFile:onnxPath,outputColumnNames:new[]{output0},inputColumnNames:new[]{images},graphOptimizationLevel:GraphOptimizationLevel.ORT_ENABLE_ALL,intraOpNumThreads:4,interOpNumThreads:1));// 空数据拟合得到模型转换器varemptyData_mlContext.Data.LoadFromEnumerable(new[]{newImageInput()});_modelpipeline.Fit(emptyData);// 工业固定线程场景用ThreadLocal无锁竞争延迟最稳定_enginePoolnewThreadLocalPredictionEngineImageInput,DetOutput(()_mlContext.Model.CreatePredictionEngineImageInput,DetOutput(_model));}/// summary/// 执行检测返回缺陷框列表/// /summarypublicListDefectBoxDetect(MatpreprocessedImage,floatscaleRatio,Pointoffset){try{// 转换为MLImage输入varinputnewImageInput{ImageMLImage.CreateFromStream(preprocessedImage.ToMemoryStream())};// 推理varoutput_enginePool.Value.Predict(input);// 解析输出 NMS去重varboxesParseOutput(output.Output0,scaleRatio,offset);returnNmsSuppress(boxes,_iouThreshold);}catch(Exceptionex){LogHelper.Error(缺陷检测推理异常,ex);returnnewListDefectBox();}}}// 输入输出实体publicclassImageInput{[ImageType(640,640)]publicMLImageImage{get;set;}}publicclassDetOutput{[ColumnName(output0)]publicfloat[]Output0{get;set;}}publicclassDefectBox{publicfloatX{get;set;}publicfloatY{get;set;}publicfloatW{get;set;}publicfloatH{get;set;}publicfloatConfidence{get;set;}publicintClassId{get;set;}publicstringClassName{get;set;}}3.3 后处理输出解析与 NMSYOLO 原始输出是 84×8400 的张量需要解析成检测框并用非极大值抑制去除重复框。privateListDefectBoxParseOutput(float[]output,floatscaleRatio,Pointoffset){varboxesnewListDefectBox();intnumClasses_classNames.Length;intnumBoxesoutput.Length/(4numClasses);for(inti0;inumBoxes;i){intoffsetIdxi*(4numClasses);// 置信度floatmaxConf0;intclassId-1;for(intc0;cnumClasses;c){floatconfoutput[offsetIdx4c];if(confmaxConf){maxConfconf;classIdc;}}if(maxConf_confThreshold)continue;// 坐标转换中心点宽高 → 左上角宽高映射回原图坐标floatcxoutput[offsetIdx]/scaleRatio-offset.X;floatcyoutput[offsetIdx1]/scaleRatio-offset.Y;floatwoutput[offsetIdx2]/scaleRatio;floathoutput[offsetIdx3]/scaleRatio;boxes.Add(newDefectBox{Xcx-w/2,Ycy-h/2,Ww,Hh,ConfidencemaxConf,ClassIdclassId,ClassName_classNames[classId]});}returnboxes;}/// summary/// 非极大值抑制去除重叠重复框/// /summaryprivateListDefectBoxNmsSuppress(ListDefectBoxboxes,floatiouThreshold){varresultnewListDefectBox();varsortedboxes.OrderByDescending(bb.Confidence).ToList();while(sorted.Count0){varcurrentsorted[0];result.Add(current);sorted.RemoveAt(0);for(intisorted.Count-1;i0;i--){if(CalculateIoU(current,sorted[i])iouThreshold)sorted.RemoveAt(i);}}returnresult;}四、工业场景专项优化从 Demo 到量产的关键实验室跑通 Demo 只完成了 30%剩下 70% 都在解决现场的光照、干扰、误检问题。4.1 ROI 掩膜机制屏蔽固定干扰产品上的螺丝孔、倒角、印刷字符等固定结构很容易被模型误判为缺陷。提前制作掩膜图落在掩膜内的检测框自动过滤误检率可降低 50% 以上。支持多边形、矩形、圆形多种掩膜形状不同产品对应不同掩膜模板换型自动加载掩膜可在界面上可视化编辑现场工程师即可调整4.2 光照自适应抵消光源老化工业 LED 光源会随使用时间亮度衰减半年后亮度可能下降 30%直接导致检测阈值漂移。每次检测先计算 ROI 区域平均灰度偏离基准值时自动做亮度补偿配合 CLAHE 直方图均衡弱化光照不均的影响设置亮度上下限超出范围触发光源告警提醒运维更换光源4.3 缺陷分级与规则二次校验AI 输出原始结果后还要经过业务规则二次校验进一步降低误检面积过滤缺陷面积小于最小可接受值的直接忽略避免噪点误判区域分级关键区域密封面、配合面缺陷从严非关键区域放宽标准数量限制单产品缺陷数量超过阈值直接判定不合格类型匹配某些缺陷只允许出现在特定区域出现则直接升级严重等级4.4 多产品模板化管理一条产线通常生产多种型号零件所有参数模板化管理每个产品对应独立的 ROI、掩膜、检测阈值、模型文件扫码获取产品型号自动加载对应模板换型无需重启程序秒级切换五、产线联动从检测到执行的闭环视觉检测不是孤立的图像处理必须和产线时序、PLC 控制深度结合才能真正落地。5.1 硬触发时序保证拍照位置一致绝对不要用软件触发拍照必须走硬件触发保证每次拍照时工件位置完全一致工件流到检测工位光电传感器触发PLC 输出触发信号给相机同时给上位机帧信号相机硬触发曝光拍照上传图像给上位机上位机检测完成将结果写入 PLC 寄存器工件流到剔除工位时PLC 根据结果决定是否剔除5.2 状态机管控全流程可控用状态机管理检测流程避免时序混乱出问题也容易排查。publicenumDetectState{Idle,// 待机WaitTrigger,// 等待触发信号WaitImage,// 等待相机图像Detecting,// 检测中OutputResult,// 输出结果到PLCWaitPlcAck,// 等待PLC执行应答Error// 异常状态}每个状态有明确的进入条件、超时时间、异常处理路径不会出现逻辑死锁。5.3 剔除精准控制传送带跟随连续运动的传送带不能检测完立刻发剔除信号要计算延迟根据传送带速度和检测工位到剔除工位的距离计算固定延迟时间配合编码器脉冲计数精准对应到工件位置避免剔错增加剔除确认传感器验证剔除动作是否执行防止漏剔5.4 数据溯源与质量统计每个产品的原图、缺陷标注图、检测结果、工艺参数、时间戳、条码号绑定存入本地 SQLite支持按时间、批次、条码、缺陷类型查询回溯自动生成日/周/月质量报表缺陷类型占比、不良率趋势、工位分布可对接 MES 系统自动上传质量数据六、工程化加固7×24 小时稳定运行6.1 模型热更新不停产迭代工业产线不能随便停机模型更新必须做到无感知后台线程异步加载新模型运行基准样本校验校验通过后使用读写锁原子切换全局推理实例旧实例延迟 60 秒释放等待存量检测任务完成保留最近 3 个稳定版本随时可一键回滚6.2 多级降级兜底AI 永远是辅助手段不能成为单点故障正常模式AI 全功能检测轻降级AI 置信度不足时补充传统 blob 分析二次校验重降级AI 连续异常自动切换为传统灰度阈值检测保证基础检测能力旁路模式全部异常关闭 AI 检测产线切人工目检界面告警6.3 性能与内存优化图像对象池Mat 对象池化复用避免频繁创建销毁减少 GC 卡顿CPU 亲和绑定推理线程绑定到指定 CPU 核心不抢占控制线程资源线程优先级控制线程 采集线程 推理线程保证生产控制优先级最高低峰期 GC换班、停机时段主动执行完整 GC LOH 压缩避免长时间运行内存上涨6.4 异常自愈机制相机掉线自动尝试重连相机连续失败触发声光告警推理异常单帧异常直接跳过不影响下一帧连续异常自动重启推理引擎程序崩溃配套独立守护进程主程序异常退出自动重启恢复到运行状态七、现场高频踩坑与避坑指南坑1光照波动导致误检率飙升现象上午测的好好的下午就误检变多新光源很准用三个月就不准了解决加入光照归一化预处理设置亮度基准范围超出自动补偿定期校准光源不要用绝对亮度阈值用相对对比度判断缺陷。坑2反光、油污干扰误检多现象金属表面反光、油污痕迹经常被当成划痕、压伤解决光源选型用漫射光源、偏振光源从硬件减少反光软件侧加掩膜和面积过滤结合缺陷形状特征二次区分训练时加入大量反光、油污负样本。坑3工件运动拖影检测不准现象连续运动的产线拍出来的图有拖影缺陷定位不准、漏检解决硬件上加频闪光源短时间高亮曝光冻结运动软件上提高快门速度实在不行就加工位停稳再拍。坑4缺陷样本太少模型泛化差现象几十张缺陷样本训出来的模型现场一用就漏检误检解决小样本场景优先做数据增强翻转变换、亮度扰动、合成缺陷用预训练模型微调不要从零训初期配合规则兜底边跑边积累样本逐步迭代模型。坑5工控机性能不足节拍跟不上现象检测速度慢工件流走了还没出结果解决做 ROI 裁剪缩小推理尺寸用 INT8 量化模型优化后处理逻辑实在不够就加推理线程分批处理优先保证产线节拍。八、落地价值总结基于 C# 的工业 AI 视觉方案相比传统方案有明确的落地优势成本低不需要商业视觉软件授权不需要额外算法工作站复用现有工控机和上位机技术栈。落地快直接嵌入现有上位机系统不用改产线架构单工位 1~2 周即可完成部署调试。易维护全栈 C# 技术体系工控团队就能自主维护不需要专职算法工程师驻场。安全可控所有数据本地处理不出厂区满足工业数据安全与合规要求。对于制造业工厂而言AI 视觉检测不是高大上的演示项目而是要真正解决质量管控的实际问题。用 C# ML.NET 的轻量化方案从单一工位切入小步快跑、持续迭代是绝大多数中小制造企业都能走通的智能化路径。
返回列表