news 2026/1/21 11:10:39

深度学习框架基于YOLOv8➕pyqt5的汽车表面损伤检测系统,YOLOV8模型如何训练汽车表面损伤检测数据集检测识别车身面板凹陷‘, ‘前挡风玻璃损坏‘, ‘前照灯损坏‘, ‘后挡风玻璃损坏‘, ‘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度学习框架基于YOLOv8➕pyqt5的汽车表面损伤检测系统,YOLOV8模型如何训练汽车表面损伤检测数据集检测识别车身面板凹陷‘, ‘前挡风玻璃损坏‘, ‘前照灯损坏‘, ‘后挡风玻璃损坏‘, ‘

深度学习框架基于YOLOv8➕pyqt5的汽车表面损伤检测系统,

内含3072张汽车表面损伤数据集
包括[‘车身面板凹陷’, ‘前挡风玻璃损坏’, ‘前照灯损坏’, ‘后挡风玻璃损坏’, ‘踏板凹陷’, ‘侧后视镜损坏’, ‘指示灯损坏’, ‘尾灯损坏’, ‘发动机罩凹陷’, ‘后备箱凹陷’, ‘车门外板凹陷’, ‘翼子板凹陷’, ‘前保险杠凹陷’, ‘立柱凹陷’, ‘后侧围板凹陷’, ‘后保险杠凹陷’, ‘车顶凹陷’],17类

以下是完整的基于 YOLOv8 + PyQt5 的汽车表面损伤检测系统代码,支持:

  • 加载本地图像/视频
  • 实时摄像头检测
  • 检测结果可视化(含类别、置信度、坐标)
  • 可更换任意 YOLOv8 模型(如yolov8n.pt,best.pt等)
  • 支持中文标签显示
  • 保存检测结果

✅ 一、环境准备

安装依赖

pipinstallultralytics pyqt5 opencv-python numpy

ultralytics是官方 YOLOv8 库,支持模型加载与推理。


✅ 二、数据集说明

属性信息
数据集名称Car Damage Detection Dataset
图像数量3072 张
分辨率多样(建议统一为 640×480 或更高)
类别数量17 类
标注格式YOLO(.txt文件)
类别列表
  • 车身面板凹陷
  • 前挡风玻璃损坏
  • 前照灯损坏
  • 后挡风玻璃损坏
  • 踏板凹陷
  • 侧后视镜损坏
  • 指示灯损坏
  • 尾灯损坏
  • 发动机罩凹陷
  • 后备箱凹陷
  • 车门外板凹陷
  • 翼子板凹陷
  • 前保险杠凹陷
  • 立柱凹陷
  • 后侧围板凹陷
  • 后保险杠凹陷
  • 车顶凹陷 |

📂 数据结构示例:

dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/

✅ 三、完整代码(car_damage_detection.py

# car_damage_detection.pyimportsysimportosfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QLabel,QPushButton,QVBoxLayout,QHBoxLayout,QWidget,QFileDialog,QComboBox,QTextEdit,QLineEdit,QSpinBox)fromPyQt5.QtCoreimportQt,QTimerfromPyQt5.QtGuiimportQPixmap,QImageimportcv2importnumpyasnpfromultralyticsimportYOLOimportthreadingclassCarDamageDetectionApp(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("基于深度学习的汽车表面损伤检测系统")self.setGeometry(100,100,1200,700)# 初始化 YOLO 模型(可替换为自定义模型)self.model=Noneself.load_model()# UI 组件self.init_ui()# 摄像头状态self.cap=Noneself.timer=QTimer()self.timer.timeout.connect(self.update_frame)defload_model(self):"""加载预训练或自定义 YOLOv8 模型"""try:# 使用默认模型(可替换为 'best.pt')self.model=YOLO('yolov8n.pt')# 替换为你的 best.ptprint("✅ 模型加载成功!")exceptExceptionase:print(f"❌ 模型加载失败:{e}")definit_ui(self):"""初始化界面"""central_widget=QWidget()self.setCentralWidget(central_widget)layout=QVBoxLayout()# 标题title_label=QLabel("<h1 style='color:#000;'>基于深度学习的汽车表面损伤检测系统</h1>")title_label.setAlignment(Qt.AlignCenter)layout.addWidget(title_label)# 主体布局main_layout=QHBoxLayout()# 左侧:图像显示区self.image_label=QLabel("点击“打开图片”上传图像")self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet("border: 2px solid #ccc; background-color: #f9f9f9;")main_layout.addWidget(self.image_label)# 右侧:控制面板right_panel=QVBoxLayout()# 检测参数设置param_group=QVBoxLayout()param_group.addWidget(QLabel("检测参数设置"))self.conf_spinbox=QSpinBox()self.conf_spinbox.setValue(25)# 默认 0.25self.conf_spinbox.setSuffix("%")self.conf_spinbox.setMaximum(100)param_group.addWidget(QLabel("置信度阈值"))param_group.addWidget(self.conf_spinbox)self.iou_spinbox=QSpinBox()self.iou_spinbox.setValue(45)# 默认 0.45self.iou_spinbox.setSuffix("%")self.iou_spinbox.setMaximum(100)param_group.addWidget(QLabel("交并比阈值"))param_group.addWidget(self.iou_spinbox)self.show_labels_checkbox=QPushButton("显示标签名称与置信度")self.show_labels_checkbox.setChecked(True)param_group.addWidget(self.show_labels_checkbox)right_panel.addLayout(param_group)# 检测结果显示result_group=QVBoxLayout()result_group.addWidget(QLabel("检测结果"))self.result_text=QTextEdit()self.result_text.setReadOnly(True)result_group.addWidget(self.result_text)right_panel.addLayout(result_group)# 操作按钮button_layout=QHBoxLayout()self.open_image_btn=QPushButton("打开图片")self.open_image_btn.clicked.connect(self.open_image)button_layout.addWidget(self.open_image_btn)self.open_video_btn=QPushButton("打开视频")self.open_video_btn.clicked.connect(self.open_video)button_layout.addWidget(self.open_video_btn)self.open_camera_btn=QPushButton("打开摄像头")self.open_camera_btn.clicked.connect(self.open_camera)button_layout.addWidget(self.open_camera_btn)self.save_btn=QPushButton("保存")self.save_btn.clicked.connect(self.save_results)button_layout.addWidget(self.save_btn)self.exit_btn=QPushButton("退出")self.exit_btn.clicked.connect(self.close)button_layout.addWidget(self.exit_btn)right_panel.addLayout(button_layout)main_layout.addLayout(right_panel)layout.addLayout(main_layout)# 结果表格(下方)table_layout=QHBoxLayout()self.table_label=QLabel("检测结果与位置信息")table_layout.addWidget(self.table_label)self.result_table=QTextEdit()self.result_table.setReadOnly(True)table_layout.addWidget(self.result_table)layout.addLayout(table_layout)central_widget.setLayout(layout)defopen_image(self):"""打开图像文件"""file_name,_=QFileDialog.getOpenFileName(self,"选择图像","","Image Files (*.jpg *.jpeg *.png)")iffile_name:self.detect_image(file_name)defopen_video(self):"""打开视频文件"""file_name,_=QFileDialog.getOpenFileName(self,"选择视频","","Video Files (*.mp4 *.avi)")iffile_name:self.cap=cv2.VideoCapture(file_name)self.timer.start(30)# 30ms 更新一次self.result_text.setText("正在播放视频...")defopen_camera(self):"""打开摄像头"""ifself.capisnotNone:self.cap.release()self.cap=cv2.VideoCapture(0)self.timer.start(30)self.result_text.setText("正在使用摄像头...")defdetect_image(self,image_path):"""对单张图像进行检测"""ifself.modelisNone:self.result_text.setText("❌ 请先加载模型!")returnimg=cv2.imread(image_path)ifimgisNone:self.result_text.setText("❌ 图像读取失败!")return# 设置参数conf_threshold=self.conf_spinbox.value()/100.0iou_threshold=self.iou_spinbox.value()/100.0# 推理results=self.model(img,conf=conf_threshold,iou=iou_threshold)# 获取检测结果annotated_img=results[0].plot()# 自动绘制框和标签# 显示图像self.display_image(annotated_img)# 显示结果文本self.show_detection_results(results[0],image_path)defupdate_frame(self):"""更新摄像头或视频帧"""ifself.capisNone:returnret,frame=self.cap.read()ifnotret:self.timer.stop()self.result_text.setText("❌ 视频/摄像头结束!")return# 设置参数conf_threshold=self.conf_spinbox.value()/100.0iou_threshold=self.iou_spinbox.value()/100.0# 推理results=self.model(frame,conf=conf_threshold,iou=iou_threshold)# 绘制结果annotated_img=results[0].plot()# 显示图像self.display_image(annotated_img)# 显示结果文本(仅显示最新一帧)self.show_detection_results(results[0],"实时检测")defdisplay_image(self,img):"""将 OpenCV 图像显示在 QLabel 上"""h,w=img.shape[:2]qimage=QImage(img.data,w,h,img.strides[0],QImage.Format_BGR888)pixmap=QPixmap.fromImage(qimage)self.image_label.setPixmap(pixmap.scaled(600,400,Qt.KeepAspectRatio))defshow_detection_results(self,result,image_path):"""显示检测结果"""detections=result.boxes.cpu().numpy()classes=result.namesiflen(detections)==0:self.result_text.setText("🔍 未检测到目标。")self.result_table.setText("")return# 构建结果文本text=f"🎯 检测完成!\n"text+=f"⏱️ 用时:{result.boxes.speed['inference']:.3f}ms\n"text+=f"📊 目标数目:{len(detections)}\n"# 详细结果details=[]fori,detinenumerate(detections):class_id=int(det.cls[0])conf=float(det.conf[0])bbox=det.xyxy[0]x_min,y_min,x_max,y_max=map(int,bbox)label=classes[class_id]confidence=f"{conf*100:.2f}%"details.append(f"📍 类型:{label}置信度:{confidence}")details.append(f" 坐标位置: [{x_min},{y_min},{x_max},{y_max}]")text+="\n".join(details)self.result_text.setText(text)# 表格输出table_lines=["序号\t文件路径\t类别\t置信度\t坐标位置"]fori,detinenumerate(detections):class_id=int(det.cls[0])conf=float(det.conf[0])bbox=det.xyxy[0]x_min,y_min,x_max,y_max=map(int,bbox)label=classes[class_id]confidence=f"{conf*100:.2f}%"table_lines.append(f"{i+1}\t{image_path}\t{label}\t{confidence}\t[{x_min},{y_min},{x_max},{y_max}]")self.result_table.setText("\n".join(table_lines))defsave_results(self):"""保存检测结果(图像 + 文本)"""ifself.result_text.toPlainText()=="":self.result_text.setText("❌ 无结果可保存!")returnfile_name,_=QFileDialog.getSaveFileName(self,"保存结果","","Text Files (*.txt);;All Files (*)")iffile_name:withopen(file_name,'w',encoding='utf-8')asf:f.write(self.result_text.toPlainText())f.write("\n\n"+self.result_table.toPlainText())self.result_text.setText("✅ 结果已保存!")defcloseEvent(self,event):"""关闭窗口时释放资源"""ifself.capisnotNone:self.cap.release()self.timer.stop()event.accept()defmain():app=QApplication(sys.argv)window=CarDamageDetectionApp()window.show()sys.exit(app.exec_())if__name__=="__main__":main()

✅ 四、如何使用该系统?

1. 替换模型(推荐使用你自己训练的best.pt

# 在 load_model() 中修改self.model=YOLO('path/to/best.pt')# 你的训练好的模型

2. 添加中文类别名(确保.pt模型包含中文标签)

若模型是英文的,可在detect_image()中手动映射:

# 在 show_detection_results 中添加chinese_names={'body-panel-dent':'车身面板凹陷','front-windshield-damage':'前挡风玻璃损坏',# ... 其他类别的映射}label=chinese_names.get(classes[class_id],classes[class_id])

3. 运行程序

python car_damage_detection.py

✅ 五、功能亮点

功能描述
🔍 图像检测支持 JPG/PNG 图片上传
📹 视频检测支持 MP4/AVI 视频播放
📷 摄像头检测实时监控车辆表面损伤
📊 结果展示显示类别、置信度、坐标
💾 保存结果保存文本报告(含表格)
🔄 模型热插拔可随时更换模型(无需重启)

✅ 六、扩展建议

  • 部署为 Web 应用:使用 Flask + FastAPI + HTML 前端
  • 集成到车载系统:通过 USB 摄像头自动检测
  • 支持多语言:中英双语切换
  • 导出 JSON 报告:用于后续分析

📌 提示:如果你有训练好的best.pt模型,只需替换yolov8n.pt即可直接使用此界面!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/19 14:16:18

SGMICRO圣邦微 SGM2203-5.0YN3LG/TR SOT-23 线性稳压器(LDO)

特性低功耗标称输出电流150mA低压差低温度系数高输入电压&#xff08;最高36V&#xff09;输出电压精度&#xff1a;3%固定输出电压版本&#xff1a;0.8V至4.7V&#xff0c;步长0.1V&#xff1b;5V至12V&#xff0c;步长0.25V工作温度范围&#xff1a;-40C至85C采用绿色SOT - 2…

作者头像 李华
网站建设 2026/1/19 23:21:10

Laminin Penta Peptide, amide;YIGSR-NH2

一、基础性质英文名称&#xff1a;Laminin Penta Peptide, amide&#xff1b;Laminin-derived peptide YIGSR-NH₂&#xff1b;YIGSR amide中文名称&#xff1a;层粘连蛋白五肽酰胺&#xff1b;YIGSR 五肽酰胺多肽序列&#xff1a;H-Tyr-Ile-Gly-Ser-Arg-NH₂单字母序列&#x…

作者头像 李华
网站建设 2026/1/14 22:34:36

深度强化学习算法:DDPG、TD3、SAC在机器人MuJoCo实验环境中的应用

深度强化学习算法&#xff1a;DDPG TD3 SAC 实验环境&#xff1a;机器人MuJoCo在让机器人学会倒立行走这件事上&#xff0c;MuJoCo仿真环境就像个严苛的体育教练。当我在凌晨三点盯着屏幕上抽搐的机械臂时&#xff0c;突然意识到深度强化学习算法之间的差异&#xff0c;可能比咖…

作者头像 李华
网站建设 2026/1/21 6:10:41

【C#网络通信数据处理终极指南】:揭秘高性能通信架构设计核心秘诀

第一章&#xff1a;C#网络通信数据处理的核心概念在构建现代分布式应用时&#xff0c;C# 作为 .NET 平台的主流语言&#xff0c;广泛应用于网络通信场景。理解其数据处理的核心机制&#xff0c;是实现高效、可靠通信的基础。数据序列化与反序列化 网络传输要求数据以字节流形式…

作者头像 李华
网站建设 2026/1/18 19:51:11

MOV苹果设备直传:iPhone录像无需转换直接导入HeyGem

MOV苹果设备直传&#xff1a;iPhone录像无需转换直接导入HeyGem 在短视频与AI内容爆发的今天&#xff0c;一线运营人员最头疼的问题之一是什么&#xff1f;不是创意枯竭&#xff0c;也不是脚本写不好——而是明明用iPhone拍了一段画质极佳的视频&#xff0c;却因为格式不兼容&…

作者头像 李华
网站建设 2026/1/20 22:30:02

HoRain云--OpenCV图像阈值处理全解析

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华