2026/2/21 2:43:14
网站建设
项目流程
婚纱销售网站,家在深圳光明论坛,网站建设方案说明,网页设计的素材深度学习框架基于YOLOv8➕pyqt5的汽车表面损伤检测系统#xff0c;内含3072张汽车表面损伤数据集
包括[‘车身面板凹陷’, ‘前挡风玻璃损坏’, ‘前照灯损坏’, ‘后挡风玻璃损坏’, ‘踏板凹陷’, ‘侧后视镜损坏’, ‘指示灯损坏’, ‘尾灯损坏’, ‘发动机罩凹陷’, ‘后备…深度学习框架基于YOLOv8➕pyqt5的汽车表面损伤检测系统内含3072张汽车表面损伤数据集包括[‘车身面板凹陷’, ‘前挡风玻璃损坏’, ‘前照灯损坏’, ‘后挡风玻璃损坏’, ‘踏板凹陷’, ‘侧后视镜损坏’, ‘指示灯损坏’, ‘尾灯损坏’, ‘发动机罩凹陷’, ‘后备箱凹陷’, ‘车门外板凹陷’, ‘翼子板凹陷’, ‘前保险杠凹陷’, ‘立柱凹陷’, ‘后侧围板凹陷’, ‘后保险杠凹陷’, ‘车顶凹陷’]17类以下是完整的基于 YOLOv8 PyQt5 的汽车表面损伤检测系统代码支持加载本地图像/视频实时摄像头检测检测结果可视化含类别、置信度、坐标可更换任意 YOLOv8 模型如yolov8n.pt,best.pt等支持中文标签显示保存检测结果✅ 一、环境准备安装依赖pipinstallultralytics pyqt5 opencv-python numpyultralytics是官方 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.modelNoneself.load_model()# UI 组件self.init_ui()# 摄像头状态self.capNoneself.timerQTimer()self.timer.timeout.connect(self.update_frame)defload_model(self):加载预训练或自定义 YOLOv8 模型try:# 使用默认模型可替换为 best.ptself.modelYOLO(yolov8n.pt)# 替换为你的 best.ptprint(✅ 模型加载成功)exceptExceptionase:print(f❌ 模型加载失败:{e})definit_ui(self):初始化界面central_widgetQWidget()self.setCentralWidget(central_widget)layoutQVBoxLayout()# 标题title_labelQLabel(h1 stylecolor:#000;基于深度学习的汽车表面损伤检测系统/h1)title_label.setAlignment(Qt.AlignCenter)layout.addWidget(title_label)# 主体布局main_layoutQHBoxLayout()# 左侧图像显示区self.image_labelQLabel(点击“打开图片”上传图像)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet(border: 2px solid #ccc; background-color: #f9f9f9;)main_layout.addWidget(self.image_label)# 右侧控制面板right_panelQVBoxLayout()# 检测参数设置param_groupQVBoxLayout()param_group.addWidget(QLabel(检测参数设置))self.conf_spinboxQSpinBox()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_spinboxQSpinBox()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_checkboxQPushButton(显示标签名称与置信度)self.show_labels_checkbox.setChecked(True)param_group.addWidget(self.show_labels_checkbox)right_panel.addLayout(param_group)# 检测结果显示result_groupQVBoxLayout()result_group.addWidget(QLabel(检测结果))self.result_textQTextEdit()self.result_text.setReadOnly(True)result_group.addWidget(self.result_text)right_panel.addLayout(result_group)# 操作按钮button_layoutQHBoxLayout()self.open_image_btnQPushButton(打开图片)self.open_image_btn.clicked.connect(self.open_image)button_layout.addWidget(self.open_image_btn)self.open_video_btnQPushButton(打开视频)self.open_video_btn.clicked.connect(self.open_video)button_layout.addWidget(self.open_video_btn)self.open_camera_btnQPushButton(打开摄像头)self.open_camera_btn.clicked.connect(self.open_camera)button_layout.addWidget(self.open_camera_btn)self.save_btnQPushButton(保存)self.save_btn.clicked.connect(self.save_results)button_layout.addWidget(self.save_btn)self.exit_btnQPushButton(退出)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_layoutQHBoxLayout()self.table_labelQLabel(检测结果与位置信息)table_layout.addWidget(self.table_label)self.result_tableQTextEdit()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.capcv2.VideoCapture(file_name)self.timer.start(30)# 30ms 更新一次self.result_text.setText(正在播放视频...)defopen_camera(self):打开摄像头ifself.capisnotNone:self.cap.release()self.capcv2.VideoCapture(0)self.timer.start(30)self.result_text.setText(正在使用摄像头...)defdetect_image(self,image_path):对单张图像进行检测ifself.modelisNone:self.result_text.setText(❌ 请先加载模型)returnimgcv2.imread(image_path)ifimgisNone:self.result_text.setText(❌ 图像读取失败)return# 设置参数conf_thresholdself.conf_spinbox.value()/100.0iou_thresholdself.iou_spinbox.value()/10以0.0# 推理resultsself.model(img,confconf_threshold,iouiou_threshold)# 获取检测结果annotated_imgresults[0].plot()# 自动绘制框和标签# 显示图像self.display_image(annotated_img)# 显示结果文本self.show_detection_results(results[0],image_path)defupdate_frame(self):更新摄像头或视频帧ifself.capisNone:returnret,frameself.cap.read()ifnotret:self.timer.stop()self.result_text.setText(❌ 视频/摄像头结束)return# 设置参数conf_thresholdself.conf_spinbox.value()/100.0iou_thresholdself.iou_spinbox.value()/100.0# 推理resultsself.model(frame,confconf_threshold,iouiou_threshold)# 绘制结果annotated_imgresults[0].plot()# 显示图像self.display_image(annotated_img)# 显示结果文本仅显示最新一帧self.show_detection_results(results[0],实时检测)defdisplay_image(self,img):将 OpenCV 图像显示在 QLabel 上h,wimg.shape[:2]qimageQImage(img.data,w,h,img.strides[0],QImage.Format_BGR888)pixmapQPixmap.fromImage(qimage)self.image_label.setPixmap(pixmap.scaled(600,400,Qt.KeepAspectRatio))defshow_detection_results(self,result,image_path):显示检测结果detectionsresult.boxes.cpu().numpy()classesresult.namesiflen(detections)0:self.result_text.setText( 未检测到目标。)self.result_table.setText()return# 构建结果文本textf 检测完成\ntextf⏱️ 用时:{result.boxes.speed[inference]:.3f}ms\ntextf 目标数目:{len(detections)}\n# 详细结果details[]fori,detinenumerate(detections):class_idint(det.cls[0])conffloat(det.conf[0])bboxdet.xyxy[0]x_min,y_min,x_max,y_maxmap(int,bbox)labelclasses[class_id]confidencef{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_idint(det.cls[0])conffloat(det.conf[0])bboxdet.xyxy[0]x_min,y_min,x_max,y_maxmap(int,bbox)labelclasses[class_id]confidencef{conf*100:.2f}%table_lines.append(f{i1}\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,encodingutf-8)asf:f.write(self.result_text.toPlainText())f.write(\n\nself.result_table.toPlainText())self.result_text.setText(✅ 结果已保存)defcloseEvent(self,event):关闭窗口时释放资源ifself.capisnotNone:self.cap.release()self.timer.stop()event.accept()defmain():appQApplication(sys.argv)windowCarDamageDetectionApp()window.show()sys.exit(app.exec_())if__name____main__:main()✅ 四、如何使用该系统1. 替换模型推荐使用你自己训练的best.pt# 在 load_model() 中修改self.modelYOLO(path/to/best.pt)# 你的训练好的模型2. 添加中文类别名确保.pt模型包含中文标签若模型是英文的可在detect_image()中手动映射# 在 show_detection_results 中添加chinese_names{body-panel-dent:车身面板凹陷,front-windshield-damage:前挡风玻璃损坏,# ... 其他类别的映射}labelchinese_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即可直接使用此界面