小企业智能化
小微企业机器视觉质检实战:用 OpenCV + YOLOv8 在边缘盒子部署工业缺陷检测
2026年11月13日
从标注到边缘部署,用 YOLOv8 在国产盒子跑通工业缺陷检测。
小微企业机器视觉质检实战:用 OpenCV + YOLOv8 在边缘盒子部署工业缺陷检测
摘要:人工目检成本高、夜班易漏检,机器视觉正从小厂"用不起"变成"用得上"。本文给出一条可落地的路径:用工业相机采集样本、labelImg 标注、YOLOv8 训练缺陷模型,再导出 ONNX 部署到国产 NPU 边缘盒子,最后用 MQTT 把不良率上报看板,全程不依赖云端。
一、为什么小厂也该上机器视觉质检
螺丝漏装、瓶盖歪斜、PCB 虚焊、布料破洞——这类"看得见"的缺陷,人工每小时看上千件就会疲劳,漏检率随之上升。一台几千元的边缘盒子 + 一个 USB/网口工业相机,就能 7×24 守住关键工位,单件判定只要几十毫秒。对订单量刚起来的小厂,这是投入产出比很高的改造。
二、整体方案:采集—训练—部署—上报四段式
架构分四层:
- 采集层:工业相机(推荐全局快门,避免运动模糊)通过 USB3 或 GigE 取流,配环形光源压低反光。
- 训练层:在开发机用 YOLOv8 训练,产出
.pt权重。 - 边缘层:把模型转 ONNX,跑在国产 NPU 盒子(瑞芯微 RK3588、昇腾 Atlas、飞腾等)上做实时推理。
- 上报层:推理结果经 MQTT 发到 Grafana 看板,超阈值触发声光报警或停线。
整套不连公网也能跑,数据不出厂,符合小厂对工艺保密的要求。
三、数据采集与标注:样本比算法更关键
先拍够样本。缺陷类任务最忌"正常多、缺陷少",建议正常与缺陷样本比例不低于 3:1,且缺陷要覆盖各种形态(位置、大小、光照)。用 labelImg 框出缺陷并保存为 YOLO 格式的 .txt(每行 class x_center y_center width height,坐标归一化)。
标注三条铁律:
- 框要贴边,别留大块背景,否则模型学偏
- 同一类缺陷用同一个 class id,别按"大破洞/小破洞"分两类
- 留出 20% 样本做验证集,训练时模型没见过,才能真实评估
四、YOLOv8 训练:环境、数据与命令
开发机装 ultralytics:
pip install ultralytics
数据描述文件 data.yaml:
path: /dataset
train: images/train
val: images/val
names: ['defect']
训练命令(小厂样本通常几百到几千张,用 n 或 s 模型足够):
yolo detect train model=yolov8n.pt data=data.yaml epochs=100 imgsz=640 batch=16
imgsz=640 平衡精度与速度;batch 视显存定,8G 显存用 16 基本稳。训练完看 results.png 里的 mAP50 和 precision/recall,缺陷检测 mAP50 能到 0.9 以上才算可用。
五、导出与边缘部署:ONNX + 国产 NPU 盒子
训练出的 .pt 先转 ONNX,跨平台兼容性好:
yolo export model=best.pt format=onnx imgsz=640
RK3588 这类盒子用官方 rknn-toolkit2 把 ONNX 再量化成 .rknn,NPU 算力能跑满;昇腾用 atc 转 .om。这一步的坑是输入尺寸必须和训练一致(640),且预处理(除以 255、BGR→RGB)要和训练时完全对齐,否则精度断崖下跌。
六、推理代码:OpenCV 取流 + 模型推理
边缘盒子上用 OpenCV 拉流并推理(示意):
import cv2
from ultralytics import YOLO # 或各 NPU 的推理 SDK
cap = cv2.VideoCapture("rtsp://相机地址/stream")
model = YOLO("best.onnx")
while True:
ok, frame = cap.read()
if not ok: break
res = model(frame, imgsz=640, conf=0.5)
for b in res[0].boxes:
x1,y1,x2,y2 = map(int, b.xyxy[0])
cv2.rectangle(frame, (x1,y1), (x2,y2), (0,0,255), 2)
cv2.imshow("qa", frame)
if cv2.waitKey(1) == 27: break
conf=0.5 是置信度阈值,缺陷漏检多就调低,误报多就调高。产线建议设双阈值:高于高阈值直接判废,介于之间的人工复检。
七、与 MES/看板对接:MQTT 上报不良率
每批次统计不良数,用 MQTT 上报:
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("内网broker", 1883)
client.publish("factory/line1/defect",
json.dumps({"batch": "B20261113", "total": 200, "bad": 3}))
Grafana 订阅该主题画不良率趋势,连续超阈值自动弹报警。这样管理层手机上就能看到每条线质量,不必等班后报表。
八、踩坑清单与落地建议
- 光照是第一变量:换光源或调亮度后模型精度会掉,把"固定光源 + 遮光罩"当成设备一部分,别靠自然光。
- 样本要持续补:新出现的缺陷形态要回流标注、增量训练,模型才不过期。
- 帧率与判定解耦:相机 30fps,但判定可每 3 帧一次,留出 IO 余量。
- 误检兜底:高价值件保留"模型判废 + 人工确认"双保险,避免误杀良品。
- 先单点后推广:选一个最痛的工位跑通闭环,再复制到其他线,别一上来全线铺开。
九、小结
机器视觉质检对小厂不是"大厂专利"。从几百张标注样本、一个 YOLOv8 小模型、一台国产 NPU 盒子起步,用 OpenCV 取流、MQTT 上报,就能把关键工位的质量数据实时化。先把一个点跑通、看到不良率下降,再谈规模化,是风险最低的路径。