news 2026/9/3 0:11:12

深度学习框架基于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/9/2 23:02:32

C#实现稳定TCP通信的10个关键步骤(数据丢包与粘包解决方案)

第一章&#xff1a;C#中TCP通信的核心机制与挑战在C#开发中&#xff0c;TCP通信是实现网络数据传输的重要手段&#xff0c;依赖于.NET框架提供的System.Net.Sockets命名空间。通过TcpClient和TcpListener类&#xff0c;开发者能够快速构建客户端-服务器通信模型。然而&#xff…

作者头像 李华
网站建设 2026/9/2 18:10:08

【C#跨平台拦截器实战指南】:5个核心示例助你掌握高效AOP编程

第一章&#xff1a;C#跨平台拦截器概述在现代软件开发中&#xff0c;跨平台能力已成为衡量语言与框架成熟度的重要标准。C# 依托 .NET 平台的持续演进&#xff0c;已实现对 Windows、Linux 和 macOS 的深度支持&#xff0c;使得开发者能够在不同操作系统上构建统一行为的应用程…

作者头像 李华
网站建设 2026/9/2 18:41:57

FLV直播回放可用:HeyGem拓展应用场景至流媒体领域

HeyGem 拓展应用场景至流媒体领域&#xff1a;FLV 支持与批量处理的工程实践 在直播内容爆炸式增长的今天&#xff0c;一场带货直播结束之后&#xff0c;回放视频往往沉寂于平台角落&#xff0c;等待被少数用户偶然点开。而品牌方却希望这段高价值内容能反复触达更多人群——但…

作者头像 李华
网站建设 2026/8/23 20:17:23

ue 文本转语音 Text-to-Speech

搜素TexttoSpeechzh-CN 中文(中国) zh-CN-Huihui 晓晓&#xff08;微软&#xff0c;推荐&#xff09; zh-CN-Yaoyao 瑶瑶 zh-CN-Kangkang 康康 zh-TW 中文(台湾) zh-HK 中文(香港)

作者头像 李华
网站建设 2026/8/27 5:47:41

HeyGem数字人系统推荐使用Chrome、Edge浏览器访问WebUI界面

HeyGem数字人系统为何推荐使用Chrome与Edge浏览器 在AI视频生成技术快速普及的今天&#xff0c;越来越多企业开始部署像HeyGem这样的数字人系统&#xff0c;用于虚拟主播、在线课程录制或品牌宣传。这类系统通常通过Web界面操作——用户只需打开浏览器&#xff0c;上传音频、选…

作者头像 李华
网站建设 2026/9/2 23:20:18

HeyGem输出目录揭秘:生成的视频保存在outputs文件夹中可下载

HeyGem输出目录揭秘&#xff1a;生成的视频保存在outputs文件夹中可下载 在AI数字人技术日益普及的今天&#xff0c;越来越多的内容创作者、企业宣传团队甚至教育机构开始尝试用虚拟人物替代真人出镜。然而&#xff0c;一个常见的痛点始终存在&#xff1a;视频生成之后&#xf…

作者头像 李华