如何使用Yolov8训练使用 路面标识线识别 交通引导类数据集 道路车道线路面标识检测 2500张 路面标识 voc yolo 11类 并构建一个交通引导路面标识检测

如何使用Yolov8训练使用 交通引导类数据集 道路车道线路面标识检测 2500张 路面标识 voc yolo 11类 并构建一个交通引导线数据集检测在这里插入图片描述在这里插入图片描述
道路车道线路面标识检测 2500张 路面标识 voc yolo在这里插入图片描述

**

声明:文章所有代码仅供参考!

**
分类名: (图片张数,标注个数)
Diamond:(431,772)
Pedestr ian crosswalk: (800, 1114)
Left turn arrow: (151, 172)
Straight ahead ar row:
(878, 1373)
Bus I ane:(211,21 2)
Yellow marking: (150, 154)
Forward-left turn arrow: (225, 229)
Right turn arrow: (291, 346)
Forward-right turn arrow: (74, 76)
Slow: (62, 93)
Bicycle lane:(77,77)
总数: (2584, 4618)
总类(nc): 11类在这里插入图片描述

构建一个基于YOLOv8的道路车道线和路面标识检测系统。以下是详细的步骤和代码示例,并附带数据集中的标签及数量表格。

数据集中的标签及数量表格

分类名图片张数标注个数
Diamond431772
Pedestrian crosswalk8001114
Left turn arrow151172
Straight ahead arrow8781373
Bus lane211212
Yellow marking150154
Forward-left turn arrow225229
Right turn arrow291346
Forward-right turn arrow7476
Slow6293
Bicycle lane7777
总数25844618

环境部署说明

首先,确保你已经安装了必要的库。以下是详细的环境部署步骤:

安装依赖
# 创建虚拟环境(可选)
python -m venv yolov8_env
source yolov8_env/bin/activate  # 在Windows上使用 `yolov8_env\Scripts\activate`

# 安装PyTorch
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117

# 安装YOLOv8
pip install ultralytics

# 安装其他依赖
pip install pyqt5 matplotlib scikit-learn pandas opencv-python

数据集准备

假设你的数据集已经准备好,并且是以VOC和YOLO格式存储的。我们将主要使用YOLO格式进行训练。

数据集结构
dataset/
├── images/
│   ├── train/
│   │   ├── img1.jpg
│   │   ├── img2.jpg
│   │   └── ...
│   └── val/
│       ├── img3.jpg
│       ├── img4.jpg
│       └── ...
├── labels/
│   ├── train/
│       ├── img1.txt
│       ├── img2.txt
│       └── ...
│   └── val/
│       ├── img3.txt
│       ├── img4.txt
│       └── ...
└── classes.txt

classes.txt 内容如下:

Diamond
Pedestrian_crosswalk
Left_turn_arrow
Straight_ahead_arrow
Bus_lane
Yellow_marking
Forward_left_turn_arrow
Right_turn_arrow
Forward_right_turn_arrow
Slow
Bicycle_lane

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

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

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

我们将使用YOLOv8进行训练,并在训练过程中记录各种指标,如F1曲线、准确率、召回率、损失曲线和混淆矩阵。

训练脚本 train_yolov8.py
[<title="Training YOLOv8 on Road Lane and Pavement Markings Detection Dataset">]
from ultralytics import YOLO
import os

# Define paths
dataset_path = 'path/to/dataset'
weights_path = 'best.pt'

# Create dataset.yaml
yaml_content = f"""
train: {os.path.join(dataset_path, 'images/train')}
val: {os.path.join(dataset_path, 'images/val')}

nc: 11
names: ['Diamond', 'Pedestrian_crosswalk', 'Left_turn_arrow', 'Straight_ahead_arrow', 
        'Bus_lane', 'Yellow_marking', 'Forward_left_turn_arrow', 'Right_turn_arrow', 
        'Forward_right_turn_arrow', 'Slow', 'Bicycle_lane']
"""

with open(os.path.join(dataset_path, 'dataset.yaml'), 'w') as f:
    f.write(yaml_content)

# Train YOLOv8
model = YOLO('yolov8n.pt')  # Load a pretrained model (recommended for training)
results = model.train(data=os.path.join(dataset_path, 'dataset.yaml'), epochs=100, imgsz=640, save=True)

# Save the best weights
model.export(format='pt')
os.rename('runs/detect/train/weights/best.pt', weights_path)

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

指标可视化展示

我们将编写代码来可视化训练过程中的各项指标,包括F1曲线、准确率、召回率、损失曲线和混淆矩阵。

可视化脚本 visualize_metrics.py
[<title="Visualizing Training Metrics for YOLOv8">]
import os
import json
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

# Load metrics
metrics_path = 'runs/detect/train/metrics.json'
with open(metrics_path, 'r') as f:
    metrics = json.load(f)

# Extract metrics
loss = [entry['loss'] for entry in metrics if 'loss' in entry]
precision = [entry['metrics/precision(m)'] for entry in metrics if 'metrics/precision(m)' in entry]
recall = [entry['metrics/recall(m)'] for entry in metrics if 'metrics/recall(m)' in entry]
f1 = [entry['metrics/mAP50(m)'] for entry in metrics if 'metrics/mAP50(m)' in entry]

# Plot loss curve
plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
plt.plot(loss, label='Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Training Loss Curve')
plt.legend()

# Plot precision and recall curves
plt.subplot(1, 3, 2)
plt.plot(precision, label='Precision')
plt.plot(recall, label='Recall')
plt.xlabel('Epochs')
plt.ylabel('Score')
plt.title('Precision and Recall Curves')
plt.legend()

# Plot F1 curve
plt.subplot(1, 3, 3)
plt.plot(f1, label='F1 Score')
plt.xlabel('Epochs')
plt.ylabel('F1 Score')
plt.title('F1 Score Curve')
plt.legend()

plt.tight_layout()
plt.show()

# Confusion matrix
# Assuming you have predictions and true labels
# For demonstration, let's create some dummy data
true_labels = np.random.randint(0, 12, size=100)  # 0 to 11 (background or one of the road markings types)
predictions = np.random.randint(0, 12, size=100)  # 0 to 11 (background or one of the road markings types)

cm = confusion_matrix(true_labels, predictions, labels=list(range(12)))
labels = ['Background', 'Diamond', 'Pedestrian_crosswalk', 'Left_turn_arrow', 'Straight_ahead_arrow', 
          'Bus_lane', 'Yellow_marking', 'Forward_left_turn_arrow', 'Right_turn_arrow', 
          'Forward_right_turn_arrow', 'Slow', 'Bicycle_lane']

disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)
disp.plot(cmap=plt.cm.Blues)
plt.title('Confusion Matrix')
plt.show()

PyQt5设计的界面

我们将使用PyQt5设计一个简单的GUI界面来进行模型预测。

GUI代码 gui_app.py
[<title="PyQt5 GUI for YOLOv8 Road Lane and Pavement Markings Detection">]
import sys
import cv2
import numpy as np
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog, QMessageBox
from PyQt5.QtGui import QImage, QPixmap
from ultralytics import YOLO

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Road Lane and Pavement Markings Detection")
        self.setGeometry(100, 100, 800, 600)

        self.image_label = QLabel(self)
        self.image_label.setAlignment(Qt.AlignCenter)

        self.predict_button = QPushButton("Predict", self)
        self.predict_button.clicked.connect(self.predict)

        self.open_button = QPushButton("Open Image", self)
        self.open_button.clicked.connect(self.open_image)

        layout = QVBoxLayout()
        layout.addWidget(self.image_label)
        layout.addWidget(self.open_button)
        layout.addWidget(self.predict_button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

        self.model = YOLO('best.pt')

    def open_image(self):
        options = QFileDialog.Options()
        file_name, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "", "Images (*.png *.xpm *.jpg);;All Files (*)", options=options)
        if file_name:
            self.image_path = file_name
            pixmap = QPixmap(file_name)
            self.image_label.setPixmap(pixmap.scaled(800, 600))

    def predict(self):
        if not hasattr(self, 'image_path'):
            QMessageBox.warning(self, "Warning", "Please open an image first.")
            return

        img0 = cv2.imread(self.image_path)  # BGR
        assert img0 is not None, f'Image Not Found {self.image_path}'

        results = self.model(img0, stream=True)

        for result in results:
            boxes = result.boxes.cpu().numpy()
            for box in boxes:
                r = box.xyxy[0].astype(int)
                cls = int(box.cls[0])
                conf = box.conf[0]
                label = f'{self.model.names[cls]} {conf:.2f}'
                color = (0, 255, 0)  # Green
                cv2.rectangle(img0, r[:2], r[2:], color, 2)
                cv2.putText(img0, label, (r[0], r[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)

        rgb_image = cv2.cvtColor(img0, 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)
        self.image_label.setPixmap(pixmap.scaled(800, 600))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

算法原理介绍

YOLOv8算法原理

YOLOv8(You Only Look Once version 8)是一种实时目标检测算法,其核心思想是在单个神经网络中同时预测边界框的位置和类别概率。YOLOv8相较于之前的版本,在速度和准确性方面都有显著提升。

主要特点:
  1. 统一架构:YOLOv8采用统一的架构,简化了模型的设计。
  2. 高效的特征提取:通过使用先进的卷积层和注意力机制,提高特征提取的效率。
  3. 改进的损失函数:引入新的损失函数来优化边界框回归和分类任务。
  4. 多尺度训练:通过多尺度训练增强模型的泛化能力。
  5. 自动数据增强:集成自动数据增强技术,减少对人工标注数据的依赖。
工作流程:
  1. 输入图像:将输入图像传递给YOLOv8模型。
  2. 特征提取:通过一系列卷积层提取图像特征。
  3. 预测:模型输出每个网格单元的边界框位置、置信度分数和类别概率。
  4. 非极大值抑制(NMS):去除冗余的预测结果,保留最佳的边界框。
  5. 输出结果:返回最终的目标检测结果。

总结

通过以上步骤,我们可以构建一个完整的基于YOLOv8的道路车道线和路面标识检测系统,包括数据集准备、环境部署、模型训练、指标可视化展示和PyQt5界面设计。以下是所有相关的代码文件:

  1. 训练脚本 (train_yolov8.py)
  2. 指标可视化脚本 (visualize_metrics.py)
  3. GUI应用代码 (gui_app.py)
### 车道线检测数据集 对于车道线检测的任务,存在多个公开可用的数据集可以用于YOLO模型的训练。这些数据集中包含了标注有车道线信息的道路图像,适合用来调整和优化基于YOLO的目标检测算法。 #### TuSimple 数据集[^1] TuSimple 是一个广泛使用车道线检测基准测试数据集。该数据集提供了高质量的真实世界驾驶场景下的视频片段以及对应的逐帧标注文件。每图片都带有精确到像素级别的车道线标记,且支持多种不同的天气条件和光照环境。此数据集非常适合于研究者们探索新的车道线识别技术和改进现有方法的效果。 #### CULane 数据集 CULane 数据集由清华大学发布,旨在促进复杂环境下更鲁棒性的车道探测器开发工作。它不仅涵盖了城市街道、高速公路等多种典型路况,而且特别增加了遮挡情况较多的实际案例来增加挑战度。此外,还提供了一套完整的评价标准体系以便更好地衡量不同方案之间的性能差异。 #### BDD100K 数据集[^2] BDD100K 是伯克利大学推出的一个大规模多任务视觉理解数据库,其中也包含了大量的带标签的行车记录仪拍摄画面可用于车道分割学习目的。除了基本的位置坐标外,这里还可以找到有关车辆行驶方向的信息作为辅助特征输入给神经网络以提高泛化能力。 当准备使用上述任何一个数据集来进行YOLO系列框架下特定型的物体(即车道边界)定位时,需要注意将原始格式转换为目标检测所需的YOLO格式: ```bash # 将VOC格式转成YOLO格式 python voc_label.py ``` 以上命令假设有一个名为`voc_label.py`脚本来完成从Pascal VOC XML至YOLO txt文件形式的变化过程;而对于其他非标准结构,则可能需要编写自定义解析逻辑或者利用第三方库如labelImg等图形界面工具手动修正直至满足需求为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值