基于yolov8的工业零件缺陷检测系统
基于yolov8的工业零件缺陷检测系统
·
这是一套工业视觉缺陷检测专用代码,核心逻辑:先检测定位零件 → 再对每个零件做缺陷分割 → 自动判断是否合格 → 可视化输出结果,专门解决工业质检场景
整体功能一句话总结
输入一张工业零件图片 → 自动框出所有零件 → 识别每个零件是什么(瓶子 / 螺丝 / 线缆等)→ 检测是否有缺陷(破损 / 划痕 / 变形等)→ 输出标注好的图片(合格绿框,缺陷黑框 + 红色轮廓)。
效果对比图

(关注私我领取源码和model模型)
一、核心模块总览
- 配置区:模型路径、类别名称、阈值参数
- 工具函数:IoU 计算 + NMS 去重框(解决重复检测)
- 主流程:
- 加载检测 + 分割双模型
- 全局检测:找到所有零件位置
- 局部分割:对每个零件单独做缺陷检测
- 后处理:去重框 + 缺陷优先逻辑
- 画图保存结果
二、逐段代码解析
1. 导入库
python
运行
import cv2
import numpy as np
from ultralytics import YOLO
cv2:图像处理、画框、画轮廓、保存图片numpy:数组运算(处理掩码 / 坐标)YOLO:目标检测 + 分割模型推理
2. 配置参数
python
运行
# 模型/图片路径
det_model_path = "检测模型路径"
seg_model_path = "分割模型路径"
img_path = "输入图片"
save_path = "输出图片"
# 检测类别(5类零件)
det_class_names = ["bottle", "cable", "metal_nut", "screw", "transistor"]
# 分割缺陷类别(25类缺陷+1类合格)
seg_class_names = [...]
GOOD_CLASS = 0 # 0=合格
IOU_THRESHOLD = 0.5 # 重叠超过50%算重复框
✅ 作用:
- 检测模型:找零件在哪里、是什么零件
- 分割模型:看零件有没有缺陷、缺陷在哪
GOOD_CLASS = 0:你的分割模型里,0 代表合格无缺陷
3. 工具函数:IoU 交并比
python
运行
def box_iou(box1, box2):
# 计算两个框重叠比例
作用:判断两个框是否重叠,重叠比例就是 IoU,用于去重。
4. 工具函数:NMS 非极大值抑制
python
运行
def nms(boxes, iou_threshold=IOU_THRESHOLD):
# 保留置信度最高的框,删除重叠重复框
工业场景必备:解决模型重复框选同一个零件的问题。
5. 加载模型
python
运行
det_model = YOLO(det_model_path) # 检测模型:找零件
seg_model = YOLO(seg_model_path) # 分割模型:找缺陷
img = cv2.imread(img_path) # 读取图片
6. 第一步:全局检测(找到所有零件)
python
运行
det_results = det_model.predict(img, imgsz=640, conf=0.25, device="cuda:0")
- 输出:所有零件的坐标框 + 类别(瓶子 / 螺丝等)+ 置信度
7. 第二步:局部分割
python
运行
# 截取每个零件区域 → 送入分割模型查缺陷
crop = img[y1:y2, x1:x2]
seg_res = seg_model.predict(crop, imgsz=640, conf=0.1, device="cuda:0")
缺陷判断逻辑:
python
运行
if cid != GOOD_CLASS: # 不是0=有缺陷
has_defect = True
defect_name = 缺陷名称
- 分割输出
0→ 合格(good) - 输出 1~25 → 对应缺陷(破损 / 划痕 / 错位等)
同时会拿到缺陷掩码(mask),用于画红色缺陷轮廓。
8. 第三步:NMS 去重(消除重复框)
python
运行
all_boxes = nms(all_boxes)
一张零件只保留一个最准确的框。
9. 第四步:缺陷优先逻辑
python
运行
defect_boxes = 有缺陷的框
good_boxes = 合格框
# 规则:只要和缺陷框重叠,合格框直接删掉
final_boxes = 缺陷框 + 不重叠的合格框
✅ 工业质检核心规则:宁可误报缺陷,不可漏报缺陷只要一个区域检测出缺陷,就不承认它是合格的,保证质检安全性。
10. 第五步:画图可视化
python
运行
# 合格 → 绿色框
cv2.rectangle(..., (0,255,0), 2)
# 缺陷 → 黑色框 + 红色缺陷轮廓
cv2.rectangle(..., (0,0,0), 2)
cv2.drawContours(..., 红色轮廓)
- 合格:绿框 +
零件名: good - 缺陷:黑框 + 缺陷名 + 红色轮廓标出缺陷位置
11. 保存结果
python
运行
cv2.imwrite(save_path, img_show)
输出一张完整标注好的质检图片。
三、代码运行完整流程
- 读取图片
- 用检测模型找到所有零件位置 + 类型
- 逐个截取零件图片
- 用分割模型检查是否有缺陷 + 缺陷类型
- 去掉重复框
- 缺陷优先:重叠区域只保留缺陷
- 画图:合格绿框,缺陷黑框 + 红轮廓
- 保存质检结果
四、代码亮点
- 先检测后分割:精度极高,专门针对小目标缺陷
- NMS 去重:解决工业检测常见的重复框问题
- 缺陷优先逻辑:保证不漏检(工业质检生命线)
- 局部裁剪推理:比整张图分割更快更准
- 缺陷轮廓可视化:直观看到缺陷位置
- GPU 加速:速度快,适合产线使用
更多推荐
所有评论(0)