这是一套工业视觉缺陷检测专用代码,核心逻辑:先检测定位零件 → 再对每个零件做缺陷分割 → 自动判断是否合格 → 可视化输出结果,专门解决工业质检场景

整体功能一句话总结

输入一张工业零件图片 → 自动框出所有零件 → 识别每个零件是什么(瓶子 / 螺丝 / 线缆等)→ 检测是否有缺陷(破损 / 划痕 / 变形等)→ 输出标注好的图片(合格绿框,缺陷黑框 + 红色轮廓)。

效果对比图

(关注私我领取源码和model模型)


一、核心模块总览

  1. 配置区:模型路径、类别名称、阈值参数
  2. 工具函数:IoU 计算 + NMS 去重框(解决重复检测)
  3. 主流程
    • 加载检测 + 分割双模型
    • 全局检测:找到所有零件位置
    • 局部分割:对每个零件单独做缺陷检测
    • 后处理:去重框 + 缺陷优先逻辑
    • 画图保存结果

二、逐段代码解析

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)

输出一张完整标注好的质检图片。


三、代码运行完整流程

  1. 读取图片
  2. 用检测模型找到所有零件位置 + 类型
  3. 逐个截取零件图片
  4. 用分割模型检查是否有缺陷 + 缺陷类型
  5. 去掉重复框
  6. 缺陷优先:重叠区域只保留缺陷
  7. 画图:合格绿框,缺陷黑框 + 红轮廓
  8. 保存质检结果

四、代码亮点

  1. 先检测后分割:精度极高,专门针对小目标缺陷
  2. NMS 去重:解决工业检测常见的重复框问题
  3. 缺陷优先逻辑:保证不漏检(工业质检生命线)
  4. 局部裁剪推理:比整张图分割更快更准
  5. 缺陷轮廓可视化:直观看到缺陷位置
  6. GPU 加速:速度快,适合产线使用
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐