简介:围绕百度工业智能质检方案展开的PDF文档,面向关注人工智能在制造场景落地的技术人员、企业数字化负责人及工业视觉从业者,重点回应传统人工质检效率、精度与成本难以兼顾的问题。文档结合百度智能云与英特尔等伙伴的实践,先梳理工业质检在严苛碎片化标准、边缘部署、未知缺陷识别、少样本冷启动、语义分割鲁棒性和推理性能等方面的落地瓶颈,再说明云边端一体化架构如何借助工业视觉智能平台完成数据标注、模型训练、测试、分发与迭代闭环,并介绍酷睿处理器和OpenVINO工具套件在边缘推理优化中的作用。文中还以小仙炖燕窝原料杂质智能挑拣等场景展示质检精度、效率与良品率提升思路。资源包为1个PDF文件,约1.42MB,已有118人学习下载,适合用于方案调研、技术选型与项目申报时快速建立整体认知。
1. 从 0.1 毫米杂质说起:一套工业质检 AI 方案到底要解决什么
产线上一个 0.1 毫米的杂质,决定一批原料能不能出厂。这类工作过去靠老师傅的眼睛,一个班下来眼睛发花,判定标准还随人浮动;现在越来越多的工厂把它交给一套工业质检 AI 方案。要交一份能落地的「AI 质检员」毕设或课程设计,难点从来不是调通一个分类模型,而是让模型在产线节拍里稳定跑上几个月,还能自己学会新冒出来的缺陷。这套云边端一体化的工业智能质检方案围绕的就是这件事:云端做训练与迭代,边缘端做毫秒级推理,一体机做算控合一,最后把挑拣精度、拣出率、损耗率、节拍这几个互相冲突的指标同时压进验收线,把降本增效落到可测量的数字上。它适合两类读者:要交一份完整方案的在校同学,以及被要求两周内出一版可行方案的产线工程师。
2. 需求拆解与技术选型:五类瓶颈分别对应哪一层能力
2.1 把「要准」翻译成可验收的量化指标
工业质检和通用机器视觉最大的差别是不许含糊。泛在视觉任务只要框出来「这是猫那是狗」,工业质检要回答的是「这个缺陷算不算致命、在哪、要不要剔除、剔除后要不要复判」。所以项目启动的第一件事不是选模型,是把客户嘴里的「要准一点」翻译成能写进验收单的量。
我一般会先拉一张对照表,把业务语言、技术指标、测量方法、翻车点四列并排放。这张表定下来,后面的模型选型、算力预算、工期才有依据,否则做到一半必然因为「这算不算漏检」吵起来。
| 业务描述 | 可量化指标 | 怎么测 | 容易翻车的地方 |
|---|---|---|---|
| 致命缺陷不能漏 | 致命类召回 100%,一般类 ≥ 99.5% | 独立留出集 + 产线灰度抽样 | 留出集与现场批次分布不一致 |
| 别乱杀良品 | 过杀率 ≤ 2% | 连续 8 小时全量统计 | 只拿标准良品测,没测边界样本 |
| 不能拖慢产线 | 单帧推理 P99 ≤ 40ms,整机 CT ≤ 2s | 打点日志取 P99,不看平均值 | 用平均耗时冒充 P99 |
| 小杂质要看得见 | 最小检出 0.05mm | 标准片 + 显微标定板 | 光源衰减后精度悄悄漂移 |
| 换物料不重训 | 新物料 3 天内上线 | 从采图到下发计时 | 标注做完忘了做视觉对齐 |
这里面最需要提前和甲方对齐的是召回与过杀这一对矛盾。绝大多数产线对过杀的容忍度远低于漏检,因为漏检是流出事故,过杀只是多几个人工复判工位。所以我的顺序永远是先锁死过杀上限,再往上顶召回,顶不动就加光源、加角度、加数据,而不是在阈值上做玄学调参。把这条讲清楚,评审时对方基本不会再问「能不能做到 100% 准确」这种没法回答的问题。
节拍指标同样容易被低估。质检系统的推理时间只是整机 CT 的一部分,取图、传输、推理、合并、路径规划、执行机构动作,每一段都要打点。只报推理耗时是个典型的包装手法,真上线时机械结构一个往返就把预算吃光了。
2.2 云边端三层选型:训练在云、推理在边、控制在一体机
部署形态通常有三种走法,各自的适用边界差别很大,选错了后面补不回来。
| 形态 | 训练位置 | 推理位置 | 适用场景 | 主要问题 |
|---|---|---|---|---|
| 纯云端 | 云 | 云 | 离线抽检、小批量、非实时 | 上传带宽与延迟不可控,产线断网即停 |
| 纯边缘 | 边缘工控机 | 边缘 | 单一稳定物料、模型几乎不变 | 换型困难,标注和训练靠人扛 |
| 云边端一体 | 云 | 边缘 | 多批次、换型频繁、要求实时 | 架构复杂,版本一致性要专门设计 |
工业现场普遍存在网络覆盖不佳、设备体积和成本受限的情况,云端推理这条路在节拍面前基本走不通;但纯边缘又解决不了「新缺陷怎么快速进模型」的问题。这也是为什么这类方案最终都收敛到云边端:训练侧要的是弹性和算力,推理侧要的是确定性和低延迟,控制侧要的是算控合一不打架。
边缘盒子除了跑推理,往往还要承担运动控制、气路控制、相机触发这些任务。传统做法是推理一台机器、控制一台 PLC,中间走通信,时延抖动不可控。把两者塞进同一台设备,链路短了、抖动小了、备件也少一套,代价是资源竞争,必须靠绑核和优先级调度来压。这个取舍后面 4.3 会展开。
2.3 为什么不配独立显卡:算力预算与运维成本的实际账
学生做方案时最容易写的一句话是「部署一张 GPU 做推理」。放到真实产线,这句话会引出散热、风扇积灰、粉尘环境故障率、备件周期、功耗上限、机柜空间六七个问题,每一个都要人回答。
我的做法是把账算清楚再选型。质检场景跑的通常是中小分辨率的分割或检测模型,输入在 608×912 这个量级,模型本身不重,瓶颈在预处理和后处理而不在矩阵乘。边缘端用 CPU 加上集成显卡、配合 FP16 或 INT8 量化,单模型推理速度已经能做到接近同价位嵌入式 NPU 计算盒的水平,同时还能把控制负载一起吃掉。省下的不是一张卡的钱,是整套散热与备件的运维成本。
要提醒的是,这个结论有前提:模型必须是针对场景裁剪过的专用结构,量化必须做精度回归,预处理必须走硬件加速路径。拿一个通用大模型直接怼上去,CPU 一定打不过独显,这不是选型问题而是模型没做工程化。答辩时如果被问到这一点,把量化前后的精度对比表和推理耗时分布一起放出来,比讲十句「性价比高」都有用。
3. 总体架构设计:一主两翼与四个模块的职责划分
3.1 云端训练平台的五个功能模块
云端是整个方案的主干,它的价值不在于「能训练模型」,而在于把训练这件事变成不需要写代码的流程。我把它拆成五块,每块职责单一,出问题时能快速定位在哪一环。
数据管理负责上传、视觉对齐、标注、审核、共享与回流。视觉对齐是这一步里最容易被跳过的动作:实物图要和盲标图、光学方案记录一一对应,否则不同批次、不同光源下采的图混在一起训练,模型学到的其实是光照差异而不是缺陷差异。
模型生产负责训练、测试、发布。训练任务要能配置数据版本、超参、增强策略;测试要能固定测试集做回归;发布要卡一道「指标未回退才能进模型仓」的闸门,这道闸门是防止后来者用一次随手的训练把线上模型搞坏的关键。
模型服务负责格式转换、自加密、版本管理、性能监测和下发。设备管理负责注册、服务部署、关联模型、项目测试。项目管理负责模型编排与整体进度。五块合起来,产线技术员不用懂 Python,也能完成一次从采图到上线的完整迭代。
提示:零代码平台不等于零设计。数据版本、标签体系、阈值策略这三件事必须在项目启动时定死并写进规范文档,否则平台用得越顺,数据烂得越快。
3.2 边缘侧推理与算控一体的部署形态
边缘端跑三个组件:模型服务组件、控制驱动组件、用户客户端组件。模型服务对外提供推理接口,控制驱动负责相机触发、光源同步、运动模组和气路动作,客户端是现场操作面板。
模型下发走单独通道,图片回传走单独通道,两者互不阻塞。现场网络通常不稳,回传要做断点续传和本地缓存,缓存满了按重要度丢弃——被判为 NG 的图保留,判为 OK 的图按比例抽样,这个比例一般设 5% 到 10%,既能反哺模型又不至于把带宽占满。
算控一体的代价是实时性互相干扰。推理线程抢满 CPU 时,运动控制会出现几十毫秒的抖动,表现为机械手到位不稳。处理办法是给控制线程绑核并设实时优先级,推理走剩余核,同时限制推理线程的并发数不超过物理核数减一。
3.3 数据回流闭环:从产线图片到新模型的完整链路
闭环是这套方案里最值钱的部分,也是最容易做成 PPT 的部分。真正的闭环要能回答三个问题:哪些图该回流、回流之后谁标、新模型什么时候能下发。
哪些图该回流靠置信度分层。推理置信度落在灰区间的样本自动进待标注队列,高置信 NG 按比例抽样,高置信 OK 基本不回流。这样能把标注量压到全量的百分之几,人力才扛得住。
新模型能不能下发要靠版本与摘要做硬约束。下面这张表是我用过的模型发布记录结构,字段不多,但每个都对应一次事故。
-- 模型发布记录表:边缘端只认 version + checksum,不认文件名 CREATE TABLE model_release ( id BIGINT PRIMARY KEY COMMENT '主键', model_name VARCHAR(64) NOT NULL COMMENT '模型名,如 segment_v3', version VARCHAR(32) NOT NULL COMMENT '语义化版本,回滚只认这个字段', precision VARCHAR(8) NOT NULL COMMENT 'FP32 / FP16 / INT8,量化等级要留痕', threshold DECIMAL(5,4) NOT NULL COMMENT '异常分数阈值,必须跟版本绑定,不能全局配', checksum CHAR(64) NOT NULL COMMENT '模型文件摘要,边缘端下发后校验,防传输损坏', trained_at DATETIME NOT NULL COMMENT '训练完成时间', recall DECIMAL(5,4) NOT NULL COMMENT '发布时留出集召回,未达基线不允许上线', overkill DECIMAL(5,4) NOT NULL COMMENT '发布时留出集过杀率', status TINYINT NOT NULL COMMENT '0草稿 1灰度 2全量 3已回滚' );这张表在项目里的作用是防止「模型换了但阈值没换」这类血泪事故。阈值必须跟着版本走,因为量化之后分数分布会整体偏移,沿用旧阈值会直接导致过杀率翻倍。灰度阶段先下发到一台设备跑 24 小时,指标正常再全量,回滚就是把 status 改成 3 并重新下发上一版。
3.4 模型仓与行业预训练模型的复用边界
跨行业复用的说法很容易被放大。化纤、纺织、钢铁、3C、汽车这些场景共用的是骨干网络、数据增强策略、切图与后处理框架、训练调度代码,不共用的是阈值、缺陷定义和光学参数。
我的经验是把可复用和不可复用划成两层:结构层复用,参数层绝对不复用。新场景接入时,从模型仓拿一个同族任务的预训练权重做初始化,训练轮次能压到原来的三分之一,但阈值必须重新用该场景的良品留出集标定。把这两层混在一起讲,评审会觉得方案不严谨;分清楚,反而显得有工程判断。
4. 关键模块实现:零样本冷启动、分割后处理与推理加速
4.1 少样本冷启动:良品建模加缺陷回流的两段式
工业质检的缺陷分布极度不均衡,致命缺陷的出现频次往往低到产线正常出货时根本攒不够样本。这种情况下有监督训练直接废掉,必须走无监督的路子:只用良品训练,把「偏离良品有多远」当作异常分数。
import numpy as np PATCH = 64 # 切块边长,按最小缺陷 0.05mm 换算成像素后取 2 倍余量 STRIDE = 32 # 50% 重叠,避免缺陷正好跨在块边界被切断 TOPK = 8 # 每个 patch 取最近的 K 个良品特征做距离均值,抗噪声 THRESH = 0.42 # 异常阈值,由良品留出集的 P99 分位确定,禁止手工试出来 def anomaly_score(feat, memory, k=TOPK): """feat: (D,) 单个 patch 特征; memory: (N, D) 良品特征库""" # 余弦距离比欧氏距离更稳,对光照整体变化不敏感 f = feat / (np.linalg.norm(feat) + 1e-8) m = memory / (np.linalg.norm(memory, axis=1, keepdims=True) + 1e-8) dist = 1.0 - m @ f idx = np.argpartition(dist, k)[:k] # 只取最近的 K 个,避免被离群特征带偏 return float(dist[idx].mean()) def is_ng(score, thresh=THRESH): return score > thresh这段代码的关键不在算法,在三个参数的来路。切块边长由最小缺陷尺寸反推,0.05mm 在 5μm 像素精度下约 10 像素,取 64 是留了足够上下文;重叠率给 50%,是因为长条形缺陷跨块断裂会直接导致定级错误;阈值取良品留出集的 P99,意思是允许 1% 的良品被判异常,这个比例跟过杀率预算对得上。用人工试阈值,换一批物料就崩。
冷启动的第二段是回流。上线初期模型只会说「这块不像良品」,不会说「这是划痕还是毛刺」。灰区样本进标注队列,标完积累到一定数量(一般单类 200 张起),切到有监督微调,召回和过杀都会有明显改善。两段式的好处是产线第一天就能跑,不必等数据攒够。
4.2 大图切分与小目标合并:0.05mm 精度怎么落到坐标
工业相机拍一张原图动辄四五千像素,直接缩放会把小杂质缩没,直接推理又爆显存和算力预算。标准做法是切图分批推理再按序合并,但合并这一步写不好,前面全白搭。
def sliding_windows(w, h, size=(608, 912), stride=(456, 608)): """按 (stride, size) 生成切图窗口,stride < size 保证重叠""" sw, sh = stride tw, th = size xs = list(range(0, max(w - tw, 0) + 1, sw)) ys = list(range(0, max(h - th, 0) + 1, sh)) # 补上右边界和下边界,避免最后一列/行被裁掉 if xs[-1] + tw < w: xs.append(w - tw) if ys[-1] + th < h: ys.append(h - th) return [(x, y, tw, th) for y in ys for x in xs] def merge_masks(windows, masks, orig_shape): """masks 与 windows 一一对应,重叠区按权重累加,避免硬拼接产生接缝""" acc = np.zeros(orig_shape, dtype=np.float32) cnt = np.zeros(orig_shape, dtype=np.float32) for (x, y, tw, th), m in zip(windows, masks): # 汉宁窗加权,重叠区取平均,边缘处权重趋零,接缝自然消失 wy = np.hanning(th)[:, None] wx = np.hanning(tw)[None, :] weight = (wy * wx).astype(np.float32) acc[y:y+th, x:x+tw] += m * weight cnt[y:y+th, x:x+tw] += weight return acc / np.maximum(cnt, 1e-6)这里的两个设计点值得单独说。窗口步长比窗口尺寸小,重叠区用汉宁窗加权而不是简单平均,原因是硬拼接在重叠边界会产生一条「假边缘」,后处理找连通域时会被识别成细长缺陷,白白抬高空判。加权融合之后,同一块缺陷在不同窗口里的响应平滑叠加,长条缺陷不会断成几截,定级才有依据。
合并完成再走一遍连通域分析,按面积、长宽比、灰度均值做特征筛选,输出每个杂质的坐标、形态和分布密度。这几个量直接喂给后面的挑拣决策:面积小的走气流吹除,面积大且附着紧的走机械夹取,位置靠近边缘的走低速路径防飞溅。
4.3 推理加速:量化配置与多负载并行的落地做法
模型从训练框架导出来之后,中间要过一道推理优化,这一步决定了边缘端能不能达标。通用流程是导出 ONNX、做形状固化、转成推理引擎的中间表示、再根据硬件选精度。
# 模型优化器命令:不同版本参数名略有差异,以实际帮助输出为准 # 输入是固定 shape 的 onnx,输出是可直接加载的 IR 目录 mo --input_model ./export/quality_seg.onnx \ --input_shape [1,3,608,912] \ --data_type FP16 \ --mean_values "[123.675,116.28,103.53]" \ --scale_values "[58.395,57.12,57.375]" \ --output_dir ./ir_fp16参数里最容易被忽略的是 mean 和 scale。训练时的归一化如果没写进推理图,模型输出会整体偏移,表现出来就是「训练集好好的,上线全在乱判」,而且这种偏移不看单张可视化根本发现不了。我一般会在转换完成后固定 50 张图跑一遍端到端对齐,逐像素比对训练侧和推理侧的输出差异,超过千分之一就回去查预处理。
精度选择上,FP16 基本无损,可以直接用;INT8 要配校准集,校准集必须覆盖不同光照、不同批次的真实产线图,不能只拿几十张标准样本凑数。量化完必须跑精度回归:召回掉超过 0.3 个点就不接受,宁可退回 FP16 多花几毫秒。
多负载并行是边缘端特有的问题。同一颗处理器既跑推理又跑控制,做法是给推理线程限定核数、让控制线程独占一个核,并把模型推理拆成「预处理在集成显卡上跑、主体推理在 CPU 上跑」,把两类硬件都用上。这样做的收益不是峰值算力变高,而是延迟分布变窄,P99 从一百多毫秒压到几十毫秒,产线才不会偶发卡顿。
4.4 挑拣路径规划与执行机构对接
识别出杂质坐标只是前半程,后半程是让机械结构在节拍内把它们清掉。点数不多时最近邻贪心够用,点数上去之后必须换策略,否则机械臂在台面上来回跑,时间全花在空行程。
def plan_path(points, start=(0, 0), band=50): """points: [(x, y, area)],按分带扫描排序,减少跨带往返""" if len(points) <= 60: # 点少时最近邻贪心,实现简单且路径长度接近最优 cur, rest, path = start, list(points), [] while rest: nxt = min(rest, key=lambda p: (p[0]-cur[0])**2 + (p[1]-cur[1])**2) path.append(nxt); rest.remove(nxt); cur = nxt return path # 点多时按 y 分带,带内按 x 排序,形成蛇形扫描,空行程显著下降 bands = {} for p in points: bands.setdefault(p[1] // band, []).append(p) path = [] for i, key in enumerate(sorted(bands)): row = sorted(bands[key], key=lambda p: p[0], reverse=(i % 2 == 1)) path.extend(row) return path def pick_action(p): """按面积与位置决定执行方式:吹 / 夹 / 吸""" x, y, area = p if area < 200: return "blow" # 微小颗粒,气流吹除最快 if area < 1500: return "suck" # 中等杂质,负压吸走不易飞溅 return "grab" # 大块附着物,机械夹取路径规划后面接的是执行指令下发,这里有个必须做的适配:视觉坐标要乘上标定矩阵转到机械坐标,标定误差超过 0.1mm 就会挑偏。产线振动会让标定慢慢漂,通常每周做一次标定复核,或者用固定标定片在每班开机时自动校一次。
执行端的动作时序也要跟视觉对齐。相机曝光期间不能让气路动作,否则气流扰动会让图像发虚,模型判出来全是异常。这类时序问题在实验室复现不了,只有到现场蹲两班才能发现,属于典型的踩坑项。
5. 避坑与常见问题排查:六条现场最容易翻车的经验
5.1 留出集太干净,上线过杀率翻倍
现象:离线测试过杀率 1.2%,上线第一天冲到 6%,产线直接要求停机。
原因:留出集是从同一批标准样本里随机切的,分布和现场真实来料差太远,边界样本、脏污、反光件一个都没覆盖。
解决:留出集按批次、按光照条件分层抽样,强制包含至少 15% 的边界样本。上线前先做一轮小批量灰度,用真实来料统计过杀率,达标再全量。
5.2 切图重叠不够,长条缺陷断成几截
现象:训练集里明明标成一整条划痕,线上判出来是三段,定级从「致命」降成「轻微」,漏放。
原因:重叠率给得太小,缺陷跨在窗口边界处被切断,合并时又用了硬拼接。
解决:重叠率不低于窗口短边的 40%,合并走加权融合;后处理再加一道跨窗口的连通域合并,距离小于 8 像素的两段自动接上。
5.3 光源衰减导致精度漂移,被误判成模型退化
现象:模型上线三周后一致率从 97% 掉到 91%,重训一版也不见好。
原因:光源亮度衰减、镜头积灰,图像整体对比度下降,模型输入分布偏移,跟模型本身没关系。
解决:每班开机跑一次标准片自检,记录亮度均值和对比度,超出阈值就报警;把光源使用时长纳入维护计划,到期更换而不是等坏了再换。这类问题不查硬件,重训多少次都是白费。
5.4 量化之后小目标召回掉点
现象:FP16 版本召回 99.6%,转 INT8 之后掉到 98.1%,掉的几乎全是小面积杂质。
原因:校准集里小目标占比太低,量化尺度被大目标主导,小响应的量化误差被放大。
解决:校准集按缺陷面积分层采样,小目标样本占比不低于 30%;量化后固定测试集跑回归,召回掉超过 0.3 个点就退回 FP16,不要为了几毫秒的延迟牺牲检出。
5.5 模型下发了但版本对不上,数据回流全是脏的
现象:回传的图片和标注在新模型上跑出来的结果对不上号,复核时完全无法判断是谁的锅。
原因:边缘设备时钟不同步、模型文件名被现场人员改过、阈值还留在配置文件里没跟版本走。
解决:下发时强制校验文件摘要,校验不过拒绝加载并告警;阈值写进模型包而不是单独配置;设备每 10 分钟对一次时,回传数据带上模型版本号。这套约束做完,回溯任何一个判错样本都能定位到具体版本。
5.6 推理线程抢满 CPU,运动控制出现抖动
现象:机械手偶发到位不准,一停推理就正常。
原因:推理线程和运动控制线程抢同一批核,推理负载高时控制指令被延迟调度。
解决:控制线程绑核并设实时优先级,推理并发数不超过物理核数减一;把预处理挪到集成显卡上,减轻 CPU 压力;用打点日志记录控制指令的实际间隔,抖动超过 5ms 就告警。
6. 验收与答辩:用一组可复现的指标撑住整场汇报
验收这关最容易被问倒的不是算法细节,而是「你怎么证明这个数字是真的」。我的做法是把验收拆成可复现的三段,每段都留下原始记录,答辩时按记录讲,不按 PPT 讲。
第一段是离线验收。固定留出集,冻结模型版本和阈值,输出混淆矩阵、各类别召回、过杀率、单帧耗时分布(P50/P95/P99)。留出集必须写清楚来源批次和比例,评审只要问一句「这批数据跟训练集有没有重叠」,答不上来整场就崩。所以我在项目里会强制留一份数据清单,记录每张图的采集时间、设备编号和批次号。
第二段是灰度验收。挑一台设备、一条产线、连续跑 72 小时,统计真实过杀率和漏检率,同时记录人工复判的工作量变化。这段数据的说服力远高于离线指标,因为它包含了来料波动、光照漂移、操作误差。
第三段是闭环验收。人为注入一类新缺陷,看从采图、回流、标注、训练到下发用了多久,目标通常定在 3 天内。这一段能证明系统不是一次性交付,而是能自己长大。
| 验收项 | 判定标准 | 证据材料 |
|---|---|---|
| 致命缺陷召回 | 100%,零漏放 | 留出集混淆矩阵 + 灰度抽检记录 |
| 一般缺陷召回 | ≥ 99.5% | 同上 |
| 过杀率 | ≤ 2%(连续 72 小时) | 产线全量统计报表 |
| 单帧推理 P99 | ≤ 40ms | 打点日志原始数据 |
| 整机节拍 | ≤ 2s,满足产线 CT | 现场计时视频 |
| 新缺陷上线周期 | ≤ 3 天 | 闭环流程时间戳记录 |
| 模型回滚 | 5 分钟内完成 | 灰度环境演练录像 |
答辩时的讲述顺序也有讲究。我一般先讲指标之间的矛盾,讲清楚为什么先压过杀再顶召回,这一段最能体现工程判断;再讲闭环,把一次真实的模型迭代过程摊开,从灰区样本到新版本下发;最后讲成本账,为什么不用独立显卡、算控一体省了什么。把这三段讲完,剩下十分钟基本是对方在问实施细节,主动权在你手上。
从那以后我每次交付质检方案,都会强制先走一遍灰度三阶段——离线指标好看不重要,指标在第三周还好看才重要。希望帮到你。
本文还有配套的精品资源,点击获取