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

如何训练使用——焊接焊缝缺陷检测数据集,5类,1400张。

如何训练使用——焊接焊缝缺陷检测数据集,5类,1400张。

5种类型:
相邻缺陷:凝固的小液滴,局部熔化
完整性缺陷:异物,小孔,焊穿,凸起,焊接产生废料
几何缺陷:凹陷,熔合不够
处理后缺陷:加工后损伤,加工后留下异物
未焊接好缺陷:未焊透,未熔合大面积

已经标注好的,带yolo格式txt标签,yolo可以直接用。
好的,我们将详细地实现一个基于 YOLOv8 的焊接焊缝缺陷检测系统。以下是详细的步骤:

  1. 数据准备:确保数据集格式正确。
  2. 环境部署:安装必要的库。
  3. 模型训练:使用 YOLOv8 训练目标检测模型。
  4. 评估模型:评估训练好的模型性能。
  5. PyQt5 GUI 开发:创建一个简单的 GUI 来加载和运行模型进行实时预测。

备注:文章内代码仅供参考!

数据准备

假设你已经有一个包含 1400 张截图的数据集,并且标注格式为 YOLO 格式的 TXT 文件。

数据集结构示例
dataset/ ├── images/ │ ├── train/ │ │ ├── image1.jpg │ │ ├── image2.jpg │ │ └── ... │ ├── test/ │ │ ├── image3.jpg │ │ ├── image4.jpg │ │ └── ... │ └── valid/ │ ├── image5.jpg │ ├── image6.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── image1.txt │ │ ├── image2.txt │ │ └── ... │ ├── test/ │ │ ├── image3.txt │ │ ├── image4.txt │ │ └── ... │ └── valid/ │ ├── image5.txt │ ├── image6.txt │ └── ... └── dataset.yaml

dataset.yaml内容如下:

train:./images/trainval:./images/validtest:./images/testnc:5names:['adjacent_defect','integrity_defect','geometric_defect','processed_defect','unwelded_defect']

每个图像对应的标签文件是一个文本文件,每行表示一个边界框,格式为:

<class_id> <x_center> <y_center> <width> <height>

环境部署说明

确保你已经安装了必要的库,如上所述。

安装依赖
# 创建虚拟环境(可选)conda create-nweld_defect_detection_envpython=3.8conda activate weld_defect_detection_env# 安装PyTorchpipinstalltorch==1.9torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu111# 安装其他依赖pipinstallopencv-python pyqt5 ultralytics scikit-learn pandas matplotlib seaborn onnxruntime xml.etree.ElementTree

模型训练权重和指标可视化展示

我们将使用 YOLOv8 进行目标检测任务。

下载 YOLOv8 仓库
gitclone https://github.com/ultralytics/ultralytics.gitcdultralytics pipinstall-rrequirements.txt
训练 YOLOv8
[<title="Training YOLOv8 for Weld Defect Detection">]importosfrompathlibimportPath# Define pathsdataset_path='path/to/dataset'weights_path='runs/detect/exp/weights/best.pt'# Create dataset.yamlyaml_content=f""" train:{Path(dataset_path)/'images/train'}val:{Path(dataset_path)/'images/valid'}test:{Path(dataset_path)/'images/test'}nc: 5 names: ['adjacent_defect', 'integrity_defect', 'geometric_defect', 'processed_defect', 'unwelded_defect'] """withopen(Path(dataset_path)/'dataset.yaml','w')asf:f.write(yaml_content)# Train YOLOv8!yolo task=detect mode=train data={Path(dataset_path)/'dataset.yaml'}model=yolov8n.pt imgsz=256epochs=100batch=16name=weld_exp

请将path/to/dataset替换为实际的数据集路径。

模型评估

我们将使用 YOLOv8 提供的评估功能来评估训练好的模型性能。

评估 YOLOv8 模型
[<title="Evaluating YOLOv8 Model for Weld Defect Detection">]fromultralyticsimportYOLO# Load the trained modelmodel_path='runs/detect/weld_exp/weights/best.pt'# Evaluate the modelmodel=YOLO(model_path)results=model.val()# Print evaluation resultsmetrics=results.metricsprint(metrics)

请将path/to/dataset替换为实际的数据集路径。

使用说明

  1. 配置路径

    • path/to/dataset设置为存放数据集的目录路径。
    • 确保runs/detect/weld_exp/weights/best.pt是训练好的 YOLOv8 模型权重路径。
  2. 运行脚本

    • 在终端中运行train_yolov8.py脚本来训练模型。
    • 在终端中运行evaluate_yolov8.py来评估模型性能。
  3. 注意事项

    • 确保所有必要的工具箱已安装,特别是 PyTorch 和 ultralytics。
    • 根据需要调整参数,如epochsimgsz

PyQt5 GUI 开发

我们将使用 PyQt5 创建一个简单的 GUI 来加载和运行 YOLOv8 模型进行实时预测。

主窗口代码main_window.py
[<title="PyQt5 Main Window for Weld Defect Detection">]importsysimportcv2importnumpyasnpfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QLabel,QPushButton,QVBoxLayout,QWidget,QFileDialogfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQt,QTimerfromultralyticsimportYOLOclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("Weld Defect Detection System")self.setGeometry(100,100,800,600)self.model=YOLO('runs/detect/weld_exp/weights/best.pt')self.initUI()definitUI(self):self.central_widget=QWidget()self.setCentralWidget(self.central_widget)self.layout=QVBoxLayout()self.image_label=QLabel(self)self.image_label.setAlignment(Qt.AlignCenter)self.layout.addWidget(self.image_label)self.load_image_button=QPushButton("Load Image",self)self.load_image_button.clicked.connect(self.load_image)self.layout.addWidget(self.load_image_button)self.load_video_button=QPushButton("Load Video",self)self.load_video_button.clicked.connect(self.load_video)self.layout.addWidget(self.load_video_button)self.start_detection_button=QPushButton("Start Detection",self)self.start_detection_button.clicked.connect(self.start_detection)self.layout.addWidget(self.start_detection_button)self.stop_detection_button=QPushButton("Stop Detection",self)self.stop_detection_button.clicked.connect(self.stop_detection)self.layout.addWidget(self.stop_detection_button)self.central_widget.setLayout(self.layout)self.cap=Noneself.timer=QTimer()self.timer.timeout.connect(self.update_frame)defload_image(self):options=QFileDialog.Options()file_name,_=QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()","","Images (*.png *.xpm *.jpg *.jpeg);;All Files (*)",options=options)iffile_name:self.image_path=file_name self.display_image(file_name)defdisplay_image(self,path):pixmap=QPixmap(path)scaled_pixmap=pixmap.scaled(self.image_label.width(),self.image_label.height(),Qt.KeepAspectRatio)self.image_label.setPixmap(scaled_pixmap)defload_video(self):options=QFileDialog.Options()file_name,_=QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()","","Videos (*.mp4 *.avi);;All Files (*)",options=options)iffile_name:self.video_path=file_name self.cap=cv2.VideoCapture(self.video_path)self.start_detection()defstart_detection(self):ifself.capisnotNoneandnotself.timer.isActive():self.timer.start(30)# Update frame every 30 msdefstop_detection(self):ifself.timer.isActive():self.timer.stop()self.cap.release()self.image_label.clear()defupdate_frame(self):ret,frame=self.cap.read()ifret:processed_frame=self.process_frame(frame)rgb_image=cv2.cvtColor(processed_frame,cv2.COLOR_BGR2RGB)h,w,ch=rgb_image.shape bytes_per_line=ch*w qt_image=QImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pixmap=QPixmap.fromImage(qt_image)scaled_pixmap=pixmap.scaled(self.image_label.width(),self.image_label.height(),Qt.KeepAspectRatio)self.image_label.setPixmap(scaled_pixmap)else:self.stop_detection()defprocess_frame(self,frame):results=self.model(frame)forresultinresults:boxes=result.boxes.cpu().numpy()forboxinboxes:r=box.xyxy[0].astype(int)cls=int(box.cls[0])conf=box.conf[0]label=self.model.names[cls]text=f'{label}:{conf:.2f}'color=(0,255,0)# Green color for bounding boxcv2.rectangle(frame,(r[0],r[1]),(r[2],r[3]),color,2)cv2.putText(frame,text,(r[0],r[1]-10),cv2.FONT_HERSHEY_SIMPLEX,0.9,color,2)returnframeif__name__=="__main__":app=QApplication(sys.argv)window=MainWindow()window.show()sys.exit(app.exec_())

使用说明

  1. 配置路径

    • path/to/dataset设置为存放数据集的目录路径。
    • 确保runs/detect/weld_exp/weights/best.pt是训练好的 YOLOv8 模型权重路径。
  2. 运行脚本

    • 在终端中运行train_yolov8.py脚本来训练模型。
    • 在终端中运行evaluate_yolov8.py来评估模型性能。
    • 在终端中运行main_window.py来启动 GUI 应用程序。
    • 点击“Load Image”按钮加载图像。
    • 点击“Load Video”按钮加载视频。
    • 点击“Start Detection”按钮开始检测。
    • 点击“Stop Detection”按钮停止检测。
  3. 注意事项

    • 确保所有必要的工具箱已安装,特别是 PyTorch 和 PyQt5。
    • 根据需要调整参数,如epochsimgsz

示例

假设你的数据文件夹结构如下:

dataset/ ├── images/ │ ├── train/ │ │ ├── image1.jpg │ │ ├── image2.jpg │ │ └── ... │ ├── test/ │ │ ├── image3.jpg │ │ ├── image4.jpg │ │ └── ... │ └── valid/ │ ├── image5.jpg │ ├── image6.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── image1.txt │ │ ├── image2.txt │ │ └── ... │ ├── test/ │ │ ├── image3.txt │ │ ├── image4.txt │ │ └── ... │ └── valid/ │ ├── image5.txt │ ├── image6.txt │ └── ... └── dataset.yaml

并且每个.txt文件中都有正确的 YOLO 标签。运行main_window.py后,你可以通过点击按钮来加载图像或视频并进行焊接焊缝缺陷检测。

总结

构建一个完整的基于 YOLOv8 的焊接焊缝缺陷检测系统,包括数据集准备、环境部署、模型训练、指标可视化展示、评估和 PyQt5 GUI 开发。以下是所有相关的代码文件:

  1. 训练 YOLOv8 脚本(train_yolov8.py)
  2. 评估 YOLOv8 模型脚本(evaluate_yolov8.py)
  3. PyQt5 主窗口代码(main_window.py)
http://www.zskr.cn/news/1513907.html

相关文章:

  • 68HC908LJ12深度解析:8位MCU的Flash管理与低功耗设计实战
  • 嵌入式安全实践:基于IEC 60730标准的MCU硬件特性与软件自检设计
  • 南京日语培训班哪家强 2026年实力机构选择参考 - 品牌排行榜
  • LanzouAPI:一键获取蓝奏云直链的智能解析工具
  • 影刀RPA完全指南_团队共用RPA平台搭建流程管理监控与任务调度
  • Rust 异步 TCP 与自定义协议解析:从字节流到结构化消息
  • 【小白也能轻松用】保姆级零基础教学,OpenClaw 零代码一键部署全解析(含最新安装包)
  • 光伏风电并网逆变器在电网电压不平衡跌落时的正负序电流协同控制方法
  • 深入解析ARM7TDMI-S经典MCU:MAC71x6架构、外设实战与低功耗设计
  • 113、【Agent】【OpenCode】项目配置(package.json)
  • 基于MPC5748G的汽车以太网网关设计:硬件架构、安全实现与开发实践
  • 2026年PE给水管供应厂家:市政供水、农村饮水、DN300大口径、食品级耐低温热熔对接管品牌实力解析 - 品牌发掘
  • 2026年滤油机选购全维度分析:从技术路线到应用场景的调研报告 - 优质品牌商家
  • 腰肌劳损总睡不舒服,亲测好用的0干扰无弹簧床垫品牌整理 - 深圳市民HLL
  • 利用深度学习目标检测算法通用Yolov5训练电动车进电梯数据集 建立基于YOLOv5的电动车入梯识别系统 识别检测电梯进电动车的预警识别
  • 售前获客新玩法:AI售前智能体如何依托知识库提升转化
  • VC6平台MFC写的排序算法动态演示工具(冒泡/插入/希尔/堆排)
  • 前端微前端架构选型:Module Federation 与 qiankun 的对比实践
  • LLM 驱动的前端组件文档生成:从代码到 API 文档的自动化
  • 魔都购宠避雷王!浦东/闵行/徐汇三店直营,专治上海星期宠、皮肤病两大噩梦 - 萌宠俱乐部
  • 3步解锁原神帧率限制:免费提升游戏流畅度的完整指南
  • 解锁群晖Photos人脸识别:无需GPU的智能照片管理方案
  • 贝叶斯推断中的MNAR偏差:当缺失数据悄悄扭曲后验分布
  • 星露谷物语模组加载器SMAPI:让你的农场冒险无限扩展
  • 2026整体卫浴供应厂家专业实力考察:江苏上海山东源头企业,集成卫浴/酒店卫生间/旧改无障碍卫浴品牌精析 - 品牌发掘
  • 手把手实战CANN catlass算子模板库:从模板实例化到NPU性能调优
  • 【2026年7~8月学术会议大合集】 名校主办/高知名度/快速完成检索/多学科主题,建议收藏!
  • 计算机毕业设计之停车场管理系统
  • 2026年GEO服务商选型全景指南:全意图GEO如何成为企业AI搜索优化的新标准? - GEO优化
  • 数据科学实习生存指南:23家高价值机会的技术穿透清单