当前位置: 首页 > news >正文

基于深度学习YOLOv11的晶圆体缺陷检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍

本文提出了一种基于深度学习目标检测模型YOLOv11的晶圆体缺陷检测系统,旨在实现高效、精准的晶圆制造缺陷分类与定位。该系统针对9类典型晶圆缺陷(Center、Donut、Edge-Loc、Edge-Ring、Loc、Near-full、None、Random、Scratch)进行检测,采用包含13,000张标注图像的数据集(训练集10,400张,验证集与测试集各1,300张)进行模型训练与评估。系统整合了用户友好的UI界面与登录注册功能,并通过Python实现完整的项目部署。实验表明,YOLOv11在晶圆缺陷检测任务中表现出较高的准确率与实时性,为半导体制造领域的自动化质检提供了可靠的解决方案。


引言
晶圆作为半导体制造的核心基材,其表面缺陷直接影响芯片性能与良率。传统人工检测方法效率低且易受主观因素影响,而基于机器视觉的自动化检测技术逐渐成为行业趋势。近年来,深度学习模型(如YOLO系列)在目标检测任务中展现出显著优势,但其在晶圆缺陷检测领域的应用仍面临小目标检测、复杂缺陷分类等挑战。

本文基于YOLOv11模型构建了一套端到端的晶圆缺陷检测系统,针对9类缺陷进行优化,并采用大规模标注数据集提升模型泛化能力。实现了从数据输入到结果可视化的全流程自动化。

目录

一、项目介绍

二、项目功能展示

2.1 用户登录系统

2.2 检测功能

2.3 检测结果显示

2.4 参数配置

2.5 其他功能

3. 技术特点

4. 系统流程

三、数据集介绍

数据集划分

数据集配置文件

四、项目环境配置

创建虚拟环境

安装所需要库

五、模型训练

训练代码

训练结果

六、核心代码

🔐登录注册验证

🎯 多重检测模式

🖼️ 沉浸式可视化

⚙️ 参数配置系统

✨ UI美学设计

🔄 智能工作流

七、项目源码(视频简介)


基于深度学习YOLOv11的晶圆体缺陷检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习YOLOv11的晶圆体缺陷检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

二、项目功能展示

✅ 用户登录注册:支持密码检测和安全性验证。

✅ 三种检测模式:基于YOLOv11模型,支持图片、视频和实时摄像头三种检测,精准识别目标。

✅ 双画面对比:同屏显示原始画面与检测结果。

✅ 数据可视化:实时表格展示检测目标的类别、置信度及坐标。

✅智能参数调节:提供置信度滑块,动态优化检测精度,适应不同场景需求。

✅科幻风交互界面:深色主题搭配动态光效,减少视觉疲劳,提升操作体验。

✅多线程高性能架构:独立检测线程保障流畅运行,实时状态提示,响应迅速无卡顿。

2.1 用户登录系统

  • 提供用户登录和注册功能

  • 用户名和密码验证

  • 账户信息本地存储(accounts.json)

  • 密码长度至少6位的安全要求

2.2 检测功能

  • 图片检测:支持JPG/JPEG/PNG/BMP格式图片的火焰烟雾检测

  • 视频检测:支持MP4/AVI/MOV格式视频的逐帧检测

  • 摄像头检测:实时摄像头流检测(默认摄像头0)

  • 检测结果保存到"results"目录

2.3 检测结果显示

  • 显示原始图像和检测结果图像

  • 检测结果表格展示,包含:

    • 检测到的类别

    • 置信度分数

    • 物体位置坐标(x,y)、

2.4 参数配置

  • 模型选择

  • 置信度阈值调节(0-1.0)

  • IoU(交并比)阈值调节(0-1.0)

  • 实时同步滑块和数值输入框

2.5 其他功能

  • 检测结果保存功能

  • 视频检测时自动保存结果视频

  • 状态栏显示系统状态和最后更新时间

  • 无边框窗口设计,可拖动和调整大小

3. 技术特点

  • 采用多线程处理检测任务,避免界面卡顿

  • 精美的UI设计,具有科技感的视觉效果:

    • 发光边框和按钮

    • 悬停和按下状态效果

    • 自定义滑块、表格和下拉框样式

  • 检测结果保存机制

  • 响应式布局,适应不同窗口大小

4. 系统流程

  1. 用户登录/注册

  2. 选择检测模式(图片/视频/摄像头)

  3. 调整检测参数(可选)

  4. 开始检测并查看结果

  5. 可选择保存检测结果

  6. 停止检测或切换其他模式

三、数据集介绍

本系统采用的晶圆缺陷检测数据集共包含13,000 张高分辨率图像,涵盖9 类典型晶圆缺陷,具体类别如下:

类别名称缺陷描述
Center位于晶圆中心的缺陷,通常由制造过程中的不均匀沉积或蚀刻导致。
Donut环形缺陷,中间有空洞,形似甜甜圈,可能由微粒污染或光刻异常引起。
Edge-Loc靠近晶圆边缘的局部缺陷,通常由机械应力或切割工艺问题造成。
Edge-Ring晶圆边缘的环形缺陷,可能由化学机械抛光(CMP)不均匀或污染导致。
Loc随机分布的局部缺陷,可能由微粒污染、光刻胶残留或蚀刻不均引起。
Near-full几乎覆盖整个晶圆的大面积缺陷,通常由严重的工艺异常(如气体泄漏或温度失控)导致。
None无缺陷的晶圆样本,用于模型学习区分正常与异常情况。
Random随机分布的小缺陷,可能由微粒污染或工艺波动引起。
Scratch线性划痕缺陷,通常由机械操作(如搬运或清洗)不当导致。
数据集划分
  • 训练集(Training Set):10,400 张(80%)

  • 验证集(Validation Set):1,300 张(10%)

  • 测试集(Test Set):1,300 张(10%)

数据集配置文件

数据集采用标准化YOLO格式组织:

train: F:\晶圆体缺陷数据集\train\images val: F:\晶圆体缺陷数据集\valid\images test: ../test/images nc: 9 names: ['Center', 'Donut', 'Edge-Loc', 'Edge-Ring', 'Loc', 'Near-full', 'None', 'Random', 'Scratch']

四、项目环境配置

创建虚拟环境

首先新建一个Anaconda环境,每个项目用不同的环境,这样项目中所用的依赖包互不干扰。

终端输入

conda create -n yolov11 python==3.9

激活虚拟环境

conda activate yolov11

安装cpu版本pytorch

pip install torch torchvision torchaudio

安装所需要库

pip install -r requirements.txt

pycharm中配置anaconda

五、模型训练

训练代码

from ultralytics import YOLO model_path = 'yolo11s.pt' data_path = 'data.yaml' if __name__ == '__main__': model = YOLO(model_path) results = model.train(data=data_path, epochs=100, batch=8, device='0', workers=0, project='runs', name='exp', )
根据实际情况更换模型 # yolov11n.yaml (nano):轻量化模型,适合嵌入式设备,速度快但精度略低。 # yolov11s.yaml (small):小模型,适合实时任务。 # yolov11m.yaml (medium):中等大小模型,兼顾速度和精度。 # yolov11b.yaml (base):基本版模型,适合大部分应用场景。 # yolov11l.yaml (large):大型模型,适合对精度要求高的任务。
  • --batch 8:每批次8张图像。
  • --epochs 100:训练100轮。
  • --datasets/data.yaml:数据集配置文件。
  • --weights yolov11s.pt:初始化模型权重,yolov11s.pt是预训练的轻量级YOLO模型。

训练结果

六、核心代码

import sys import cv2 import numpy as np from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog from PyQt5.QtCore import QThread, pyqtSignal from ultralytics import YOLO from UiMain import UiMainWindow import time import os from PyQt5.QtWidgets import QDialog from LoginWindow import LoginWindow class DetectionThread(QThread): frame_received = pyqtSignal(np.ndarray, np.ndarray, list) # 原始帧, 检测帧, 检测结果 finished_signal = pyqtSignal() # 线程完成信号 def __init__(self, model, source, conf, iou, parent=None): super().__init__(parent) self.model = model self.source = source self.conf = conf self.iou = iou self.running = True def run(self): try: if isinstance(self.source, int) or self.source.endswith(('.mp4', '.avi', '.mov')): # 视频或摄像头 cap = cv2.VideoCapture(self.source) while self.running and cap.isOpened(): ret, frame = cap.read() if not ret: break # 保存原始帧 original_frame = frame.copy() # 检测 results = self.model(frame, conf=self.conf, iou=self.iou) annotated_frame = results[0].plot() # 提取检测结果 detections = [] for result in results: for box in result.boxes: class_id = int(box.cls) class_name = self.model.names[class_id] confidence = float(box.conf) x, y, w, h = box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) # 发送信号 self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) # 控制帧率 time.sleep(0.03) # 约30fps cap.release() else: # 图片 frame = cv2.imread(self.source) if frame is not None: original_frame = frame.copy() results = self.model(frame, conf=self.conf, iou=self.iou) annotated_frame = results[0].plot() # 提取检测结果 detections = [] for result in results: for box in result.boxes: class_id = int(box.cls) class_name = self.model.names[class_id] confidence = float(box.conf) x, y, w, h = box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) except Exception as e: print(f"Detection error: {e}") finally: self.finished_signal.emit() def stop(self): self.running = False class MainWindow(UiMainWindow): def __init__(self): super().__init__() # 初始化模型 self.model = None self.detection_thread = None self.current_image = None self.current_result = None self.video_writer = None self.is_camera_running = False self.is_video_running = False self.last_detection_result = None # 新增:保存最后一次检测结果 # 连接按钮信号 self.image_btn.clicked.connect(self.detect_image) self.video_btn.clicked.connect(self.detect_video) self.camera_btn.clicked.connect(self.detect_camera) self.stop_btn.clicked.connect(self.stop_detection) self.save_btn.clicked.connect(self.save_result) # 初始化模型 self.load_model() def load_model(self): try: model_name = self.model_combo.currentText() self.model = YOLO(f"{model_name}.pt") # 自动下载或加载本地模型 self.update_status(f"模型 {model_name} 加载成功") except Exception as e: QMessageBox.critical(self, "错误", f"模型加载失败: {str(e)}") self.update_status("模型加载失败") def detect_image(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, "警告", "请先停止当前检测任务") return file_path, _ = QFileDialog.getOpenFileName( self, "选择图片", "", "图片文件 (*.jpg *.jpeg *.png *.bmp)") if file_path: self.clear_results() self.current_image = cv2.imread(file_path) self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_BGR2RGB) self.display_image(self.original_image_label, self.current_image) # 创建检测线程 conf = self.confidence_spinbox.value() iou = self.iou_spinbox.value() self.detection_thread = DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f"正在检测图片: {os.path.basename(file_path)}") def detect_video(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, "警告", "请先停止当前检测任务") return file_path, _ = QFileDialog.getOpenFileName( self, "选择视频", "", "视频文件 (*.mp4 *.avi *.mov)") if file_path: self.clear_results() self.is_video_running = True # 初始化视频写入器 cap = cv2.VideoCapture(file_path) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) cap.release() # 创建保存路径 save_dir = "results" os.makedirs(save_dir, exist_ok=True) timestamp = time.strftime("%Y%m%d_%H%M%S") save_path = os.path.join(save_dir, f"result_{timestamp}.mp4") fourcc = cv2.VideoWriter_fourcc(*'mp4v') self.video_writer = cv2.VideoWriter(save_path, fourcc, fps, (frame_width, frame_height)) # 创建检测线程 conf = self.confidence_spinbox.value() iou = self.iou_spinbox.value() self.detection_thread = DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f"正在检测视频: {os.path.basename(file_path)}") def detect_camera(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, "警告", "请先停止当前检测任务") return self.clear_results() self.is_camera_running = True # 创建检测线程 (默认使用摄像头0) conf = self.confidence_spinbox.value() iou = self.iou_spinbox.value() self.detection_thread = DetectionThread(self.model, 0, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status("正在从摄像头检测...")

🔐登录注册验证

对应文件:LoginWindow.py

# 账户验证核心逻辑 def handle_login(self): username = self.username_input.text().strip() password = self.password_input.text().strip() if not username or not password: QMessageBox.warning(self, "警告", "用户名和密码不能为空!") return if username in self.accounts and self.accounts[username] == password: self.accept() # 验证通过 else: QMessageBox.warning(self, "错误", "用户名或密码错误!") # 密码强度检查(注册时) def handle_register(self): if len(password) < 6: # 密码长度≥6位 QMessageBox.warning(self, "警告", "密码长度至少为6位!")

🎯多重检测模式

对应文件:main.py

图片检测

def detect_image(self): file_path, _ = QFileDialog.getOpenFileName( self, "选择图片", "", "图片文件 (*.jpg *.jpeg *.png *.bmp)") if file_path: self.detection_thread = DetectionThread(self.model, file_path, conf, iou) self.detection_thread.start() # 启动检测线程

视频检测

def detect_video(self): file_path, _ = QFileDialog.getOpenFileName( self, "选择视频", "", "视频文件 (*.mp4 *.avi *.mov)") if file_path: self.video_writer = cv2.VideoWriter() # 初始化视频写入器 self.detection_thread = DetectionThread(self.model, file_path, conf, iou)

实时摄像头

def detect_camera(self): self.detection_thread = DetectionThread(self.model, 0, conf, iou) # 摄像头设备号0 self.detection_thread.start()

🖼️沉浸式可视化

对应文件:UiMain.py

双画面显示

def display_image(self, label, image): q_img = QImage(image.data, w, h, bytes_per_line, QImage.Format_RGB888) pixmap = QPixmap.fromImage(q_img) label.setPixmap(pixmap.scaled(label.size(), Qt.KeepAspectRatio)) # 自适应缩放

结果表格

def add_detection_result(self, class_name, confidence, x, y): self.results_table.insertRow(row) items = [ QTableWidgetItem(class_name), # 类别列 QTableWidgetItem(f"{confidence:.2f}"), # 置信度 QTableWidgetItem(f"{x:.1f}"), # X坐标 QTableWidgetItem(f"{y:.1f}") # Y坐标 ]

⚙️参数配置系统

对应文件:UiMain.py

双阈值联动控制

# 置信度阈值同步 def update_confidence(self, value): confidence = value / 100.0 self.confidence_spinbox.setValue(confidence) # 滑块→数值框 self.confidence_label.setText(f"置信度阈值: {confidence:.2f}") # IoU阈值同步 def update_iou(self, value): iou = value / 100.0 self.iou_spinbox.setValue(iou)

UI美学设计

对应文件:UiMain.py

科幻风格按钮

def create_button(self, text, color): return f""" QPushButton {{ border: 1px solid {color}; color: {color}; border-radius: 6px; }} QPushButton:hover {{ background-color: {self.lighten_color(color, 10)}; box-shadow: 0 0 10px {color}; # 悬停发光效果 }} """

动态状态栏

def update_status(self, message): self.status_bar.showMessage( f"状态: {message} | 最后更新: {time.strftime('%H:%M:%S')}" # 实时时间戳 )

🔄智能工作流

对应文件:main.py

线程管理

class DetectionThread(QThread): frame_received = pyqtSignal(np.ndarray, np.ndarray, list) # 信号量通信 def run(self): while self.running: # 多线程检测循环 results = self.model(frame, conf=self.conf, iou=self.iou) self.frame_received.emit(original_frame, result_frame, detections)

七、项目源码(视频简介)

基于深度学习YOLOv11的晶圆体缺陷检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习YOLOv11的晶圆体缺陷检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

http://www.jsqmd.com/news/349342/

相关文章:

  • 电路设计软件解惑篇,这些电路设计软件难题你都知道吗
  • AI写教材必备!掌握低查重技巧,让教材生成又快又好
  • 科研绘图“卡壳”72小时?虎贲等考AI:5分钟生成期刊级图表,数据可视化直接见刊
  • AI专著生成没烦恼!实用工具推荐,写专著也能事半功倍
  • [STM32L5] STM32L562E-DK开发板的BSP学习
  • AI专著写作新玩法:精选工具解析,开启高效专著创作新体验!
  • 2026年AI Agent爆发元年:为何“实在Agent”能成为企业落地的首选数字员工?
  • [STM32L5] 【STM32L562 DK试用】基础外设体验
  • 充电桩品牌哪个更可靠?2026年充电桩推荐与排名,解决耐用性与智能管理核心痛点 - 品牌推荐
  • java+vue基于springboot旅游攻略 克州旅游网站的景区酒店门票预订系统_y36e99h1-Pycharm vue django项目源码
  • 问卷设计还在 “凭感觉”?虎贲等考 AI:告别无效提问,让数据采集精准到 “秒出结论”
  • [STM32L5] 【STM32L562 DK试用】GUI移植并测试(五)
  • 测试本地服务是否通
  • 横评后发现,AI论文工具千笔·专业学术智能体 VS 锐智 AI 更适合专科生
  • 流延机加工厂哪家合作案例多,诺达机械值得关注 - 工业设备
  • 2026年了,你的AI多智能体Agent还在“裸奔”?实测揭秘为何90%的Agent死在落地前夜
  • 交稿前一晚!降AIGC平台千笔 VS Checkjie,专科生专属高效降重神器!
  • 栅格多智能体协同爆发:2026年实在Agent如何以“屏幕语义”定义数字员工新标准
  • 宏海机器人客户认可吗?工业自动化设备选购要点大揭秘 - 工业推荐榜
  • 拖延症福音!自考必备降AI网站 —— 千笔·专业降AIGC智能体
  • java+vue基于springboot忘忧传媒直播管理系统 热门主播推荐系统oeuq4630-Pycharm vue django项目源码
  • 充电桩品牌哪个更可靠?2026年充电桩推荐与排名,解决网络覆盖与支付体验核心痛点 - 品牌推荐
  • java+vue基于springboot宠物店活动报名系统 宠物领养管理系统_nz2f939x
  • 好写作AI:外文论文写作的AI帮手——你的专属“语言与文化双重新手村”通关向导
  • 新手也能看懂的SMT避坑指南!
  • java+vue基于springboot宠物美容医院预约管理系统的设计与实现_g97vcb5w
  • 分析包头一次成型河渠滑膜衬砌机选购要点,费用怎么算? - 工业品网
  • 好写作AI:本科论文:AI辅助全攻略——你的“第一次学术长征”智能补给站
  • SG-CAN (FD) Fiber-120特点与功能介绍
  • java+vue基于springboot农产品溯源系统_AI问答 农产品销售网上商城系统 w01c2pa0-Pycharm vue django项目源码