免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

YOLO系列融合DeepSeek/千问的电子元器件智能检测平台实践

YOLO系列融合DeepSeek/千问的电子元器件智能检测平台实践 搞电子元器件检测这一行几乎每年都要把目标检测方案从头梳理一遍。今年这个项目尤其折腾因为它不只是做检测框还要让系统看懂元器件上的丝印、判断缺件偏位和桥连等缺陷最后生成可读的质检报告。我基于YOLOv8/v10/v11/v12、还有新出的YOLO26逐一做了对比实验最终把DeepSeek和千问大模型接入到检测结果后面搭了一个检测语义理解的智能识别平台。整体跑下来最大的感受是单纯的目标检测网络只能告诉我们目标在哪、大概是什么类别但面对这个丝印是不是印错了、这个电容位置偏差算不算超差这类需要业务知识的问题必须有一个懂上下文的模型来兜底这时候大模型的价值就非常明显了。这篇文章会把项目从数据标注、模型选型、训练调参到推理服务封装、大模型接入、边缘端部署的完整过程拆开讲包含我自己的踩坑记录和最终能直接落地的配置。适合正在做工业视觉检测、想尝试把大模型和YOLO检测器结合起来的小伙伴参考。1. 项目整体设计与技术选型思路1.1 任务边界与预期输出电子元器件检测这个场景最容易被外行误判成只是一个目标检测任务。实际上产线上的电子元器件检测尤其是SMT贴片后的品质检查需求比想象中要复杂很多。检测目标包括贴片电阻、电容、电感、IC芯片、连接器插座等常见物料既要有准确的包围框又要有细粒度属性识别比如元件是否存在、是否缺失或漏贴元件是否偏移、旋转角度是否超差极性元件是否放反芯片引脚是否桥连丝印是否完整、方向是否正确色环电阻的色环序列是否能自动读出数值如果全部用传统的YOLO分类头去做就得把每个缺陷类型和每种型号当成独立类别来训练。结果是类别爆炸、样本不均衡严重还容易在相似外观之间互相混淆。这个项目从一开始就把任务拆成两层第一层是YOLO负责的快速定位和粗分类只输出元件类别和位置第二层是大模型负责的细粒度语义分析根据检测结果、裁切图像和业务知识给出缺陷判断、原因分析和处理建议。最终输出是一份结构化结果包含坐标、类别、置信度、缺陷描述和建议动作方便与MES系统或者质检工单对接。这个拆分思路还有个好处检测模型可以保持闭集稳定新增型号或新增缺陷描述时不需要重新训练模型只需要改大模型的提示词或知识库。对于频繁切换产品线的产线来说这个灵活性非常重要。1.2 为什么选中YOLO系列作为检测底座目标检测框架选择上我没有考虑用Faster R-CNN这类两阶段模型也没有冲动上最新的Transformer方案而是把YOLO系作为主力。原因很直接产线实时需求决定了推理延迟必须控制在一个比较低的水平YOLO系列的工程生态又非常成熟从训练到ONNX导出再到部署都有官方工具链兜底能省掉不少造轮子的时间。YOLOv8的C2f结构、YOLOv10的端到端无NMS设计、YOLOv11的C3k2改进、YOLOv12的注意力机制以及YO26这个新版本本质上都在做同一件事在不过分增加计算量的前提下把特征提取和融合做得更好。电子元器件的检测难点是小目标密集、金属表面反光、背景纹理杂这些版本各自的改进点都能在不同程度上缓解问题。我用一个比喻来解释这个选型逻辑YOLO相当于工厂里的高速分拣员眼神好、手速快能在传送带上一秒内扫出几十个元件的大致位置和品类但分拣员不负责判断这个物料批次是否有导致焊点虚焊的锡膏问题那个需要一位经验丰富的质量工程师来看也就是大模型。1.3 大模型为什么不是检测模型很多人会问既然从YOLOv8到YO26都接上了大模型那为什么不干脆让大模型直接输出检测框这里必须说清楚DeepSeek、千问这类大模型本质上是语言模型它们擅长对结构化的文本、检测结果做推理和生成而不是直接做像素级定位。如果用Qwen-VL这类多模态视觉模型来检测能识别语义但框的精度通常不如专用检测器推理成本也远高于YOLO。所以架构上我采用的是检测器出框大模型出含义。YOLO先把每个元器件的位置和粗分类拿出来系统按坐标裁出局部区域再把裁切图连同检测信息一起交给大模型。DeepSeek负责根据文本化的检测结果做缺陷分析、报告生成和对话问答千问Qwen系列则承担了本地知识库问答和更细粒度的视觉语言理解比如读色环电阻数值、判断丝印字符是否有误等。两个大模型在这个平台里各管一段互补性比较强。2. 数据集构建与标注预处理2.1 数据采集与清洗电子元器件检测项目的数据质量直接决定后面所有工作的上限。我在项目开始时专门花了两周时间跟产线工艺人员沟通确定相机安装位置、光源类型、拍摄角度和被测物品种范围。最终采用了一个工业面阵相机搭配远心镜头在高角度环形光下拍摄这样能大幅减少金属引脚的反光干扰。但即便如此不同类型的电容、电阻表面材质差异依然很大有些是磨砂哑光有些是高光镜面曝光参数不能一套走天下。所以采集策略是按料号分批采每批至少覆盖以下变化不同批次物料的颜色偏差、角度在正负10度内摆动、光照亮度在正常值的上下20%内变化、元件表面有轻微灰尘或油污的情况。这里有个容易忽视的问题如果只在标准光源和固定视角下采集训练出来的模型一到现场换线就会精度崩盘因为线体抖动、料盘批次换了、光源老化图像分布早就变了。清洗阶段我去掉了三类图片严重过曝或模糊的元件占全图比例小于1%且已经看不到细节的以及复制粘贴生成的重复样本。清洗后的有效图片数量大概在1.2万张左右其中包含约8万个标注实例。这个量级对电子元器件来说够用但前提是类别分布相对均衡。我把数量较少的缺件类样本单列出来通过人工模拟缺件场景补了几百张正样本避免模型把这个关键缺陷遗忘掉。2.2 标注规范与格式转换标注工具我用了CVAT和LabelImg两套流程上是先用CVAT做多人协作初标再用LabelImg做单人复核。电子元器件的边界不像人、车那么明确特别是贴片电阻和电容外观几乎都是矩形深色小块标注框稍微偏一点IoU差异就会很大。因此标注规范必须写死框必须紧贴元件本体不包括引脚和焊盘对于倾斜元件采用旋转框还是水平框要提前定项目里因为要兼容检测器我统一用了水平框倾斜角度交给大模型去判断。最终导出格式需要转成YOLO格式也就是每张图片对应一个同名txt文件每一行是类别ID 中心点x 中心点y 框宽 框高所有坐标都基于图片宽高归一化。这里有个实用的Python片段用于将CVAT导出的COCO格式转成YOLO格式:import json import os def coco_to_yolo(coco_json, save_dir): with open(coco_json, r) as f: data json.load(f) images {img[id]: img for img in data[images]} categories {cat[id]: idx for idx, cat in enumerate(data[categories])} for ann in data[annotations]: img images[ann[image_id]] w, h img[width], img[height] x, y, bw, bh ann[bbox] cx, cy (x bw / 2) / w, (y bh / 2) / h nw, nh bw / w, bh / h cat_id categories[ann[category_id]] txt_path os.path.join(save_dir, img[file_name].replace(.jpg, .txt)) with open(txt_path, a) as out: out.write(f{cat_id} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}\n)转格式时最容易踩坑的是坐标越界。有些标注框的左上角或右下角超出图像边界YOLO训练时会报错或者产生NaN loss必须用脚本把越界坐标裁到图像范围内同时过滤掉面积过小的框。我自己会在转格式后补一遍可视化检查把每张图的检测框画出来拼成大图看一遍这一步虽然土但能救回大量原始标注错误。2.3 数据增强与电子元器件小目标策略电子元器件在图像里普遍是小目标单个电容可能只有20x30像素占整张图的0.02%。直接用YOLO默认的640x640输入小目标的特征可能在下采样过程中就丢了。针对这个问题我做了三层处理第一层是训练尺寸调整。数据集原图分辨率是2000x1500训练时设置imgsz1280虽然显存压力大但小目标的检测精度提升非常明显。如果显存只有8GB可以用imgsz960配合较小batch或者干脆用SAHI切片推理把大图切成若干小图分别检测再合并结果。第二层是数据增强。Ultralytics默认会开启mosaic、mixup、HSV扰动等增强但在电子元器件场景里mosaic把四张图拼起来之后元件密度过高模型容易误学成图像到处都是黑乎乎元器件所以我训练时把mosaic概率调低到0.5mixup直接关掉。保留的增强以轻微仿射、随机亮度和对比度扰动为主模拟不同批次物料的颜色差异。第三层是针对小目标的超参数。YOLO系列在head部分已经有多尺度特征融合但如果你想进一步提升小目标召回率可以增加一个更浅层的检测头或者使用P2特征层。这个改动在Ultralytics里属于自定义模型结构需要直接改yaml我建议团队里有PyTorch基础的人尝试否则优先用imgsz调整和SAHI见效更快且不容易出bug。3. YOLO版本对比与训练调优实战3.1 各版本核心差异与选型结论我在同一批数据集上分别用YOLOv8n、YOLOv10n、YOLOv11n、YOLOv12n和YO26n做了对比。需要说明的是YO26版本迭代很快当时我拿到的是某个候选版本的源码配置和官方后续发布可能有差异但大方向不变。版本核心改进在元器件数据上的表现推理速度GPU备注YOLOv8C2f结构、anchor-free头稳定mAP as baseline较快生态最成熟部署资料最多YOLOv10端到端无NMS、双标签分配推理稍快精度略有下降最快少掉NMS后密集场景误检更少YOLOv11C3k2模块、训练策略优化mAP比v8小涨约1%与v8接近作为小升级较合适YOLOv12区域注意力机制小目标召回有改善略慢对反光元件效果不错YOLO26新结构、多分支融合最有用但训练成本高中等适合资源和时间充足的场景最终线上我使用的是YOLOv11m因为它在mAP和推理延迟之间最平衡部署到GPU服务器上可以达到单张图15毫秒以内的检测耗时。YOLOv10的速度确实诱人但为了省一点推理时间牺牲掉密集元件的召回率在质检场景不值得。YO26则作为新项目的预研对象等它稳定后再考虑切换。3.2 环境配置与依赖说明这里给一套经过验证的配置流程。操作系统是Ubuntu 20.04显卡是RTX 3090显存24GBPython版本用的3.10。如果手头只有GTX 1660Ti也不用担心用yolov8n或yolov10n加上imgsz640、batch8就可以跑起来只是训练时间会多几倍。conda create -n yolodetect python3.10 -y conda activate yolodetect pip install torch2.1.2 torchvision0.16.2 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics训练前建议先跑一次官方预训练模型的验证命令确认环境没问题。我第一次不小心装成了纯CPU版的PyTorch训练时才发现设备一直显示cpu白跑了一个小时。现在会习惯性在训练前先执行python -c import torch; print(torch.cuda.is_available())输出True才继续。如果你需要修改YOLO模型结构比如换backbone、加检测头建议直接从GitHub拉源码用源码模式安装而不是只pip装ultralytics这样改起来不用每次重装。源码版本和pip版本最好锁定一个具体commit避免升级带来行为变化。3.3 训练参数调节与损失曲线观察我用的训练命令大概长这样yolo detect train \ datapcb.yaml \ modelyolov11m.pt \ epochs120 \ imgsz1280 \ batch16 \ optimizerAdamW \ lr00.001 \ warmup_epochs3 \ close_mosaic10 \ device0数据配置文件pcb.yaml里指定了训练集、验证集路径和类别名。这里强调一个小细节类别名如果是中文在结果可视化时没有问题但导出ONNX或转模型时容易乱码建议统一用英文。项目里我就是用resistor、capacitor、inductor、ic、connector等作为类别名缺陷类型放在大模型侧判断不占用检测类别。观察损失曲线时重点不是总loss降到多低而是验证集上mAP和召回率是否持续增长。我习惯把训练日志存成csv然后用matplotlib画loss和PR曲线。如果发现训练loss下降但val loss不降大概率是过拟合可以增加数据增强、加dropout或者缩小模型。如果loss直接震荡不收敛先检查学习率是否太高其次检查数据标注是否有错。这里分享一个项目中实际遇到的案例某个类别connector的AP一直是0排查后发现标注文件里该类别的ID映射写错了和capacitor混在一起。这类问题在训练前用混淆矩阵可视化就能暴露出来不要等到训练完才去看指标。3.4 评估指标与质检场景的特殊关注点通用目标检测项目爱看mAP但电子元器件质检场景更关键的是Recall。缺件、偏位这类缺陷漏检意味着不良品流出比误检的代价大得多。所以我把验证集上各类别的Recall单独拉出来看任何一个类别低于95%都要重视。如果模型在缺件类别上召回率低说明数据不够或者特征不够明显需要重新采该类别的样本。除了mAP和Recall我还会统计一个每图平均误检数。产线图里元器件多如果每张图误检5个框下游大模型处理时就会收到大量噪音导致报告乱七八糟。通过NMS阈值和置信度阈值的调整可以在保持Recall的前提下把误检控制到每图1个以内。这种调优经验常规指标里看不出来但实测对系统整体体验影响很大。4. 融合大模型实现智能识别平台4.1 整体平台架构这个大模型融合平台的调用流程是用户上传图片或视频帧先经过YOLO检测服务得到一组boxes和labels系统把这些框对应的局部图裁出来并按坐标顺序拼成一个检测结果列表转成JSON然后分别送入两条链路一条是DeepSeek API用于生成缺陷描述和处理建议另一条是本地部署的千问模型用于做知识库问答和更细粒度的视觉语言理解。两条链路的结果统一封装成标准JSON返回给前端展示。前端页面上既有原图上叠加的检测框也有大模型生成的检测结论和建议动作。这样产线作业员不需要懂技术只要看结论就能知道当前板子是否需要返修。之所以把大模型拆成DeepSeek和千问两路而不是只用一家是因为不同模型在不同任务上的表现差异还挺大。DeepSeek的上下文推理和报告生成比较强尤其在中长文本的因果分析上条理清晰千问的本地部署生态好配合bge-m3做向量检索时很顺手而且多模态版本Qwen-VL可以直接理解图像内容。4.2 DeepSeek接入与提示词工程DeepSeek接入方式与OpenAI接口完全兼容所以我直接用openai的Python包来做请求。代码大致如下from openai import OpenAI client OpenAI( api_keyyour_api_key, base_urlhttps://api.deepseek.com ) detections [ {name: capacitor, bbox: [120, 340, 45, 28], score: 0.98}, {name: resistor, bbox: [210, 350, 32, 20], score: 0.95} ] prompt f 你是电子元器件质检专家。请根据以下检测框信息判断是否存在缺件、偏移、极性反、桥连等异常。 检测结果JSON{json.dumps(detections, ensure_asciiFalse)} 请以JSON格式返回{是否存在异常: 是/否, 异常类型: ..., 建议: ...} resp client.chat.completions.create( modeldeepseek-chat, messages[{role: user, content: prompt}], temperature0.1 )提示词工程在这里至关重要。我踩过的坑是让大模型自由发挥结果同一批检测结果每次生成的结论都不一样工业上没法接受。后来把输出格式固定成JSON并且在prompt里强调只根据提供的信息分析不要推测不存在的缺陷同时把temperature调到0.1输出的稳定性才上来。还有一点如果想让大模型真的看到元件图像就不能只用文本检测框信息必须配合视觉语言模型。项目里把裁切图直接传给Qwen-VL让它对局部区域做视觉描述再把视觉描述和DeepSeek的文本分析融合这样得到的结果比单一模型可靠很多。比如电容表面有一道划痕纯文本框信息永远看不出来但Qwen-VL可以。4.3 千问本地部署与RAG知识库检索千问的本地部署我用的是一套基于transformers的推理服务加载了Qwen2.5系列模型同时用bge-m3做embedding模型构建了一个元器件缺陷知识库。知识库里的内容包括常见元器件的规格书摘要、过往缺陷案例库、IPC-A-610标准中关于焊接和贴装工艺的判定标准等。每次检测结果出来之后系统先生成检索向量从知识库取Top3相关片段拼到prompt里再交给千问。这样做的核心目的是减少大模型幻觉。直接问大模型这个电容偏移多少算超差它可能会一本正经地给你一个错误数字但给它检索到的标准片段之后它能基于资料给出合理判断。RAG的调用链路是bge-m3将用户问题编码成向量 → 在向量库召回相关内容 → 构建增强prompt → 千问生成回答。显存不够时千问可以选择GPTQ/AWQ量化版本4bit量化后模型体积小很多推理速度也能接受。本地部署比API调用多了运维成本但数据不出厂区对质检数据敏感的企业来说更有吸引力。4.4 多模态视觉理解中的位置编码问题如果直接用Qwen-VL这类视觉语言模型做目标计数或者位置判断会发现它们对第几个引脚左上角第三个元件这类空间关系理解不稳定。这是因为视觉语言模型对位置的编码方式与目标检测器不同检测器靠回归头精确回归坐标而视觉模型主要靠视觉token间的注意力间接建模位置。我的处理方式是把YOLO检测到的坐标信息显式地写进prompt比如检测框A位于图像坐标(x120, y340, w45, h28)框内是一个电容它的左侧2像素处有一个疑似焊点。这样大模型不需要自己从图像里精确推断位置只需要结合文本坐标和视觉内容做判断。这个方法也解释了为什么系统架构里要保留一个坐标文本化模块——没有它大模型在位置类问题上会明显掉链子。5. 系统实现与部署优化5.1 推理服务封装与性能瓶颈我把YOLO推理服务封装成了FastAPI接口输入是base64图片输出是检测框列表。为了提升吞吐量服务内部做一个简单的动态batch同时到达的多个请求会合并成一个大tensor一起推理。这个在PyTorch里实现不难但要注意不同图片的尺寸不一致我统一缩放到训练尺寸并padding到同一分辨率记录每个batch的缩放比例返回结果时再映射回原图坐标。真正吃性能的不只是检测还有大模型调用。DeepSeek API的响应时间在1到3秒Qwen-VL本地推理单张图可能要2秒左右如果每张板子都去调大模型整个系统根本扛不住产线节拍。我的优化策略是加一个结果缓存层如果连续多张图片的检测框结果几乎一致就不重复调用大模型直接复用上一次生成的报告只更新时间戳。另外检测结果里只有出现低置信度框或者疑似异常框时才触发大模型详细分析全板正常的情况下只输出一个简化版结论这样大模型的调用量可以下降七八成。5.2 从GPU到RK3588的边缘端部署实践除了在GPU服务器上跑检测服务项目里还需要在RK3588设备上做边缘端推理。RK3588的NPU算力对YOLOv8n这种小模型足够但直接把PyTorch模型放上去跑肯定不行需要转成RKNN格式。我的转换流程是先用YOLO官方导出命令把模型转成ONNX再用RKNN-Toolkit2加载ONNX做量化校准最后生成rknn文件。yolo export modelyolov8n.pt formatonnx imgsz640转RKNN时最需要留意的是算子的兼容性。YOLO中的一些自定义层比如某些版本里的注意力模块可能在RKNN转换时报unsupported op。遇到这种情况可以先尝试用ONNX简化工具重构图或者换一个结构更常规的YOLOv8版本毕竟边缘端更追求稳定和适配而不是一味追新。RK3588上部署时我用了板载NPU跑检测把裁剪后的元件图片通过局域网传给GPU服务器或者同设备的CPU上跑Qwen-VL小模型。如果边缘端只需要输出检测框不需要报告那么整个过程可以完全离线延迟可以控制在30毫秒以内。要是把大模型也放在板端那只能选择4bit量化的小模型并且每批次处理的图片数要控制得很低毕竟板子的内存带宽有限。5.3 模型版本管理与监控系统上线后我搭了一个很轻量的模型版本管理目录每次训练结果都保留对应的yaml、权重文件和评估指标表格。这么做是因为工业现场不能随随便便刷模型一旦新版模型效果不符合预期必须能秒级回滚到旧版本。同时推理服务会记录每次检测的置信度分布和框数量。如果某一天置信度分布突然整体下降说明光源或相机参数可能漂了可以及时提醒现场同事检查。这个监控逻辑看起来简单但真能避免很多模型怎么变笨了的争论。6. 常见问题与排查记录6.1 训练损失不下降甚至直接爆炸损失爆炸最常见的原因是学习率太大尤其是用AdamW但初始学习率还沿用SGD习惯时很容易在前几个step直接NaN。我一般先用0.001作为默认值如果发现loss在最初50步就开始乱跳立刻降到0.0005。另一个原因是标签文件里出现了负坐标或超过1的坐标这个在之前coco转yolo脚本里需要做边界检查。还有一类情况是类别名和类别数量不一致导致模型在计算分类损失时维度出错。这个问题在Ultralytics的新版本里通常会在启动时报错但旧版本可能不会所以我会在训练前打印一下训练和验证集的目标类别数确认两边一致。6.2 小目标漏检严重尤其是密集排列的电阻小目标漏检的缓解思路按优先级排序先提高输入分辨率imgsz从640调到960或1280再用SAHI切片推理或者把大图切块并行检测最后才考虑修改网络结构增加P2检测头。我实测在电子元器件数据上imgsz从640调到1280之后小目标mAP能提升4到5个点代价是训练时间和显存翻倍。密集排列场景下NMS阈值也要适当调低。默认的NMS IoU阈值是0.5如果两个元件挨得很近就会因为框重叠太大被删除一个。我调成0.6到0.65保留更多候选框再用置信度阈值过滤能把漏检率压下去但相应的误检也会抬头需要同步调高置信度阈值到0.3以上。6.3 大模型对话长度上限与输出不稳定用DeepSeek做长上下文分析时最容易遇到的问题就是达到对话长度上限请开启新对话。这个提示我一开始很头疼检测结果一多、历史对话一长系统就断掉。后来我改成单轮独立请求模式每次调用大模型前只拼接当前图片的检测结果和最新的用户指令不携带历史对话。如果需要连续分析多张图就先把前一张图的结论压缩成摘要再作为文本前缀传给下一轮请求。输出不稳定问题主要靠prompt模板和JSON mode解决。DeepSeek和千问都支持设定返回格式我会要求模型必须返回合法JSON并且在解析失败时重试一次重试还是失败就降级成只返回检测框信息的简易报告。这个降级机制很重要工业系统不能因为大模型偶发抽风就完全不可用。6.4 环境配置中遇到的几个幺蛾子换新机器部署时最容易踩的坑是PyTorch版本和CUDA版本不匹配。我有一台机器装的是CUDA 12但PyTorch却装的是cu118版本虽然能跑CPU推理但GPU一直调不起来。后来统一用conda创建独立环境按显卡驱动先查nvidia-smi支持的CUDA版本再安装对应的PyTorch才彻底解决。如果只有CPU跑推理建议不要直接用YOLO原生大模型太慢。可以先转成ONNX再用ONNXRuntime的CPU版本跑配合FP16转FP32的优化能把速度提上来一些。Windows环境下还会遇到路径分隔符问题训练配置里的数据路径尽量用绝对路径basename不要带中文和空格我从一开始就按这个习惯来后面省去很多麻烦。7. 项目复盘与实用心得整套系统从数据处理到上线前后花了一个多月。回头再看有几点心得值得记录。第一个体会是不要把大模型神化也不要把它当成花架子。它在电子元器件检测平台里真正发挥价值的点是质检报告生成缺陷原因推理知识库问答这些检测模型完全不擅长的环节但它替代不了检测器去完成像素级定位。架构上让YOLO和大模型各司其职系统才既快又聪明。第二个体会是YOLO版本追新要克制。项目过程中我把v8到YO26挨个试了一遍发现对于产线固定场景来说稳定性和可部署性远比刷几个点的mAP重要。除非你有大量的时间和GPU资源去验证新版本的自定义算子、导出工具链和边缘端兼容性否则就用生态成熟的版本保底把新模型放在预研环境里观察。最后分享一个实用小技巧检测服务和大模型服务之间加一层MQTT或者Redis队列让检测结果先落库再异步调大模型。这样即使大模型响应慢检测模块也不会被阻塞产线实时性指标不会受影响。根据我的实测这个改动让系统在高并发情况下依然能稳定输出检测框报告生成延后1到2秒用户基本无感。如果你也在做类似的检测大模型结合项目建议优先把这个解耦逻辑做好比任何模型调参带来的体验提升都明显。
返回列表