目录
[1. 核心算法:YOLOv10](#1. 核心算法:YOLOv10)
[2. 开发工具](#2. 开发工具)
[1. 模型加载与核心检测逻辑](#1. 模型加载与核心检测逻辑)
[2. 基础脚本功能说明](#2. 基础脚本功能说明)
[四、进阶功能实现:PyQt5 可视化检测系统](#四、进阶功能实现:PyQt5 可视化检测系统)
[1. 系统核心设计思路](#1. 系统核心设计思路)
[2. 核心代码实现](#2. 核心代码实现)
[(2)主窗口类(GUI 交互)](#(2)主窗口类(GUI 交互))
[3. GUI 系统功能亮点](#3. GUI 系统功能亮点)
[1. 项目总结](#1. 项目总结)
[2. 拓展方向](#2. 拓展方向)
前言
在工业质检领域,汽车零件的缺陷检测是保障产品质量的关键环节。传统人编辑CSDN同步助手工检测效率低、误检率高,难以满足规模化生产需求。本文将结合YOLOv10 目标检测算法 与PyQt5 GUI 框架,开发一套集图片检测、视频检测、摄像头实时检测于一体的汽车零件缺陷检测系统,实现工业质检的智能化、可视化与高效化。
本项目分为两部分核心实现:基础检测脚本(验证模型效果)+ 可视化 GUI 系统(落地实用工具),零基础也能快速复现,适合工业检测、算法落地等场景学习与应用。
一、技术栈选型
1. 核心算法:YOLOv10
YOLOv10 是 Ultralytics 团队推出的轻量化实时目标检测算法,相比前代模型,在精度和速度上实现双重优化,支持 CPU/GPU 推理,非常适合工业端侧部署,能够快速识别零件的划痕、变形、缺料等缺陷。
2. 开发工具
- Python:核心开发语言
- OpenCV-Python:图像 / 视频读取、预处理、可视化
- PyQt5:构建图形化交互界面,实现可视化操作
- Ultralytics:一键加载、推理 YOLOv10 模型
- OS/Glob:文件路径管理、批量图片处理
二、环境配置
首先搭建项目运行环境,执行以下命令安装依赖库:
python
# 安装YOLOv10依赖
pip install ultralytics
# 安装图像处理库
pip install opencv-python
# 安装GUI框架
pip install pyqt5
三、基础功能实现:检测脚本开发
在开发 GUI 系统前,我们先编写基础检测脚本,验证 YOLOv10 模型在汽车零件缺陷检测上的效果,支持单张图片、批量图片、视频 / 摄像头检测。
1. 模型加载与核心检测逻辑
加载训练好的 YOLOv10 权重文件(best.pt),封装图片、批量图片、视频三大检测函数:
python
import os
import cv2
import glob
from ultralytics import YOLO
# 加载训练好的汽车零件缺陷检测模型
model = YOLO(r'D:\software\Pycharm\yolov10\dataset_part\best.pt')
# 1. 单张图片检测
def image_load(image_path):
frame = cv2.imread(image_path)
# 模型推理
res = model(frame)
# 绘制检测框、标签、置信度
ann = res[0].plot()
cv2.imshow("yolov10_image", ann)
cv2.waitKey(0)
# 解析检测结果:坐标、置信度、类别ID
boxes = res[0].boxes
if boxes is not None:
xyxy = boxes.xyxy.cpu().numpy() # 检测框坐标
conf = boxes.conf.cpu().numpy() # 置信度
cls = boxes.cls.cpu().numpy() # 缺陷类别
print("检测框坐标:", xyxy)
print("置信度:", conf)
print("类别ID:", cls)
# 2. 批量图片检测
def images_load(images_path):
imgs = glob.glob(os.path.join(images_path, '*.jpg'))
for img in imgs:
# 自动保存检测结果
model.predict(img, save=True)
# 3. 视频/摄像头检测
def video_load(video_path):
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
ret, frame = cap.read()
if ret:
res = model(frame)
ann = res[0].plot()
cv2.imshow("yolov10_video", ann)
# 按ESC退出
if cv2.waitKey(1) == 27:
break
cv2.destroyAllWindows()
cap.release()
if __name__ == '__main__':
# 测试单张图片
image_load(r"D:\software\Pycharm\yolov10\dataset_part\images\train\c41.bmp")
# 测试批量图片
# images_load(r'D:\code\lingjianjiance\tu')
# 测试摄像头
# video_load(0)
# 测试视频
# video_load(r"D:\software\Pycharm\yolov10\dataset_part\test_video.mp4")
运行结果:
这张图是训练的 YOLOv10 汽车零件缺陷检测模型的推理结果,核心结论如下:
检测效果优秀:模型成功识别出零件上的4 处固定板破损缺陷,定位精准,无漏检、误检。
置信度高:所有缺陷的置信度在 0.86~0.94 之间,模型对缺陷判断的可信度极高。
具备实用价值:可替代人工实现自动化、多缺陷同时检测,有效避免人工漏检和主观误差,适用于工业质检场景。

2. 基础脚本功能说明
- 单张图片检测:读取图片→模型推理→绘制检测框→展示结果→输出检测数据
- 批量图片检测:遍历文件夹所有图片,自动推理并保存结果
- 视频 / 摄像头检测:实时读取视频流,逐帧检测,实时可视化
运行脚本即可快速验证模型效果,确认无误后,我们基于此逻辑开发可视化 GUI 系统。
四、进阶功能实现:PyQt5 可视化检测系统
基础脚本仅能通过代码调用,不适合非技术人员使用。因此我们基于PyQt5开发图形化界面,结合多线程技术避免界面卡顿,实现一键式检测操作。
1. 系统核心设计思路
多线程检测:将 YOLO 推理放在子线程,防止界面卡死
三大检测模式:图片 / 视频 / 摄像头实时检测
可视化交互:按钮控制、阈值调节、结果展示、数据表格
结果保存:自动保存检测图片、视频、截图到本地
2. 核心代码实现
(1)检测线程类(关键)
继承QThread实现异步检测,通过信号机制将检测结果传递给主线程更新界面:
python
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 # IOU阈值
self.running = True
def run(self):
# 处理视频/摄像头
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
# 模型推理
results = self.model(frame, conf=self.conf, iou=self.iou)
annotated_frame = results[0].plot()
# 解析结果
detections = []
for box in results[0].boxes:
class_name = self.model.names[int(box.cls)]
confidence = float(box.conf)
x, y, _, _ = box.xywh[0].tolist()
detections.append((class_name, confidence, x, y))
# 发送信号更新界面
self.frame_received.emit(
cv2.cvtColor(frame, cv2.COLOR_BGR2RGB),
cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB),
detections
)
time.sleep(0.03)
cap.release()
# 处理图片
else:
frame = cv2.imread(self.source)
results = self.model(frame, conf=self.conf, iou=self.iou)
annotated_frame = results[0].plot()
detections = []
for box in results[0].boxes:
class_name = self.model.names[int(box.cls)]
confidence = float(box.conf)
detections.append((class_name, confidence, 0, 0))
self.frame_received.emit(
cv2.cvtColor(frame, cv2.COLOR_BGR2RGB),
cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB),
detections
)
self.finished_signal.emit()
def stop(self):
self.running = False
(2)主窗口类(GUI 交互)
绑定按钮事件、实现模型加载、检测控制、结果保存等功能:
python
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.ui = UiMainWindow()
self.ui.setupUi(self)
# 绑定按钮事件
self.ui.image_btn.clicked.connect(self.detect_image)
self.ui.video_btn.clicked.connect(self.detect_video)
self.ui.camera_btn.clicked.connect(self.detect_camera)
self.ui.stop_btn.clicked.connect(self.stop_detection)
self.ui.save_btn.clicked.connect(self.save_result)
self.ui.model_btn.clicked.connect(self.select_model_file)
# 初始化变量
self.model = None
self.detection_thread = None
self.last_detection_result = None
# 加载YOLO模型
def load_model(self, model_path):
self.model = YOLO(model_path)
self.ui.update_status("模型加载成功!")
# 图片检测
def detect_image(self):
file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "*.jpg *.png *.bmp")
if file_path:
conf = self.ui.confidence_spinbox.value()
self.detection_thread = DetectionThread(self.model, file_path, conf, 0.5)
self.detection_thread.frame_received.connect(self.on_frame_received)
self.detection_thread.start()
# 帧数据回调:更新界面显示
def on_frame_received(self, original_frame, result_frame, detections):
self.ui.display_image(self.ui.original_image_label, original_frame)
self.ui.display_image(self.ui.result_image_label, result_frame)
self.last_detection_result = result_frame
# 展示检测结果表格
for name, conf, x, y in detections:
self.ui.add_detection_result(name, conf, x, y)
# 停止检测
def stop_detection(self):
if self.detection_thread:
self.detection_thread.stop()
self.ui.update_status("检测已停止")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
3. GUI 系统功能亮点
一键加载模型:支持自定义选择训练好的.pt权重文件
灵活阈值调节:可视化调整置信度、IOU 阈值,适配不同检测场景
实时结果展示:双窗口显示原始图像 + 检测结果,表格展示缺陷类别、置信度
一键保存结果:自动保存检测图片、视频、摄像头截图
安全退出:关闭窗口自动释放摄像头 / 视频资源,无内存泄漏
五、系统运行效果
模型加载:点击「选择模型」加载训练好的 YOLOv10 权重,状态栏提示加载成功
图片检测:选择零件图片,一键推理,界面实时显示缺陷位置与置信度
视频 / 摄像头检测:实时流检测,无界面卡顿,支持随时停止、截图保存
结果管理:所有检测结果自动保存到results文件夹,方便溯源
六、项目总结与拓展方向
1. 项目总结
本文基于YOLOv10实现了汽车零件缺陷的高精度检测,结合PyQt5完成了可视化系统开发,解决了传统工业检测效率低、操作复杂的问题。
优势:轻量化、实时性强、操作简单、支持多场景检测
核心技术:YOLOv10 推理、PyQt5 多线程、OpenCV 图像处理
2. 拓展方向
模型优化:使用更大的零件缺陷数据集训练,提升小缺陷检测精度
功能升级:添加缺陷分类统计、报表导出、异常报警功能
端侧部署:打包为 exe 可执行文件,直接在工业电脑上运行
云端联动:对接云端平台,实现检测数据实时上传、远程监控
七、完整代码说明
本文提供的代码分为基础检测脚本 和GUI 系统两部分:
- 基础脚本:快速验证模型,适合调试使用
- GUI 系统:完整落地工具,适合实际工业场景使用
- 配套 UI 文件
UiMain.py:通过 PyQt5 Designer 设计,自动生成即可
需要完整 UI 文件、数据集、训练好的模型权重的小伙伴可以留言获取,零基础也能快速复现本项目!