使用YOLOv8进行训练道路车道线及路面标识检测数据集 使用权重识别直行右转限速虚线直线右转向左转向禁止直行等 并构建道路路面标识识别系统
以下文字及代码仅供参考。
道路车道线检测数据集 1700张 车道线 带标注 voc yolo
1
构建一个针对道路车道线检测的系统,并使用YOLOv8进行训练,我们需要完成以下几个步骤:数据准备、模型训练、验证和推理,以及构建用户界面。下面将详细介绍每个步骤。
以下是翻译后的内容:
标签 图片编号 边界框编号
虚线 (939,1287) 无
直线 (616,964) 无
右方向 (409,437) 无
左合流线 (252,258) 无
人员安全区 (245,259) 无
直行车道方向 (602,900) 无
右合流线 (146,146) 无
限速 40(Spedini:40) (15,24) 无
左方向 (256,283) 无
左合流箭头 (180,196) 无
中心线 (367,380) 无
限速 80(SpeedlinitB0) (19,40) 无
直行和右转 (139,141) 无
(Caloreone ) (28,83) 无
反向三角形 (92,97) 无
施工区 (5,6) 无
公交专用道 (17,19) 无
限速 50 (25,39) 无
右合流箭头 (56,59) 无
限速 30 (51,77) 无
禁止掉头 (19,20) 无
道路菱形标识 (92,162) 无
禁止直行 (135,152) 无
禁止右转 (36,36) 无
禁止左转 (53,53) 无
限速 70 (9,17) 无
限速 60 (11,21) 无
直行和左转 (116,120) 无
对向车道左转 (26,27) 无
限速 90 (5,9) 无
突发虚线 (17,18) 无
左转和掉头 (36,36) 无
转弯虚线 (46,46) 无
停止线 (185,188) 无
掉头 (42,44) 无
(Croslalk 拼写可能有误,暂无法准确翻译) (172,190) 无
对向车道掉头 (13,13) 无
公交停靠区 (6,7) 无
自行车道 (0,7) 无
施工左合流箭头 (1,1) 无
直行、左转、右转 (1,1) 无
转弯方向 (8,11) 无
左转和右转 (3,3) 无
限速 50 (1,1) 无
总计 (1792,6878) 无
请注意,原文中 “Caloreone” 和 “Croslalk” 可能拼写错误,导致无法准确翻译,你可以根据实际情况进行确认和修正。
数据准备
假设您的数据集已经按照VOC格式标注好,并且您希望将其转换为YOLO格式(如果尚未准备好)。首先,确保数据集按以下结构组织:
dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
└── labels/
├── train/
├── val/
└── test/
同时,提供一个data.yaml
文件,内容如下:
train: ./dataset/images/train
val: ./dataset/images/val
test: ./dataset/images/test
nc: 31 # 类别数量,根据提供的类别计算得出
names: ['DotLine', 'StraightLine', 'RightDirection', 'LeftNergeLine', 'PeopleSafetyZone',
'StraightDirection', 'RightWNergeLine', 'Spedini40', 'LeftDireotion', 'Leftmergarrow',
'CenterLine', 'SpeedlinitB0', 'StraightandRight', 'Caloreone', 'OppositeTrisngle',
'ConstructionZone', 'BusLine', 'Speedlinit50', 'Rightnergearrou', 'Speedlinit30',
'Nouturn', 'Roadianond', 'NoStraight', 'NoRightTurn', 'NoLeftTurn', 'speedlinit70',
'spedlinit60', 'StraightandLoft', 'OppositeideLoft', 'Speedlinit90', 'SuddenlyDotLine',
'LeftandUturn', 'TurnDotLine', 'StopLine', 'Uturn', 'Croslalk', 'OppositeSidelturn',
'Busstopzone', 'bikeroad', 'Constructionleftmergcarrow', 'StraightLeftRight',
'TurnDirection', 'LeftandRight', 'SpeedLinit50']
模型训练
下面是详细的训练代码示例:
from ultralytics import YOLO
import os
def main():
# 加载预训练的YOLOv8模型
model = YOLO('yolov8n.pt') # 根据实际情况选择其他版本如'yolov8s.pt', 'yolov8m.pt'等
# 开始训练
results = model.train(
data='./path/to/data.yaml', # 替换为您的data.yaml路径
epochs=300, # 根据需要调整epoch数量
imgsz=640, # 输入图像尺寸
batch=16, # 批次大小,根据GPU内存调整
project='./runs/detect', # 训练结果保存位置
name='lane_detection', # 实验名称
optimizer='SGD', # 优化器类型
device='0', # 使用第0号GPU,'cpu'表示使用CPU
save=True, # 是否保存模型权重
cache=True, # 是否缓存数据到内存加速训练
)
if __name__ == '__main__':
main()
验证模型
在训练完成后,可以对模型进行验证以评估其性能。
# 加载最佳权重
model = YOLO('./runs/detect/lane_detection/weights/best.pt')
# 对验证集进行评估
results = model.val(
data='./path/to/data.yaml',
split='val', # 或者'test'
)
构建道路车道线检测系统
接下来,我们将构建一个简单的GUI来展示模型的预测结果。这里我们使用tkinter
作为GUI库,结合OpenCV和Pillow处理图像显示。
关键代码
首先,导入必要的库:
from tkinter import Tk, Label, Button, filedialog, Canvas, NW
from PIL import Image, ImageTk
import cv2
from ultralytics import YOLO
import numpy as np
定义加载模型和检测函数:
def load_model():
"""加载预训练的YOLOv8模型"""
model = YOLO('./runs/detect/lane_detection/weights/best.pt')
return model
model = load_model()
def detect_lane(image_path):
"""使用YOLO模型检测车道线"""
results = model.predict(source=image_path)
img = cv2.imread(image_path)
for result in results:
boxes = result.boxes.numpy()
for box in boxes:
r = box.xyxy
x1, y1, x2, y2 = int(r[0]), int(r[1]), int(r[2]), int(r[3])
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
return img
构建GUI界面:
class App:
def __init__(self, window, window_title):
self.window = window
self.window.title(window_title)
self.canvas = Canvas(window, width=640, height=480)
self.canvas.pack()
self.btn_select_image = Button(window, text="选择图片", width=20, command=self.select_image)
self.btn_select_image.pack(anchor='center', expand=True)
self.window.mainloop()
def select_image(self):
path = filedialog.askopenfilename()
if len(path) > 0:
image = detect_lane(path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)
self.image_on_canvas = ImageTk.PhotoImage(image)
self.canvas.create_image(0, 0, anchor=NW, image=self.image_on_canvas)
启动应用程序:
root = Tk()
App(root, "车道线检测系统")
包括训练YOLOv8模型以及创建一个简单的图形用户界面(GUI)用于展示模型的预测结果,下面是完整的主函数代码示例。此示例包含了数据集准备、模型训练、验证和推理,以及构建一个简易的GUI来加载图片并显示车道线检测结果。
主函数代码
from tkinter import Tk, Label, Button, filedialog, Canvas, NW
from PIL import Image, ImageTk
import cv2
from ultralytics import YOLO
import numpy as np
import os
# 加载YOLO模型
def load_model():
"""加载预训练的YOLOv8模型"""
model = YOLO('./runs/detect/lane_detection/weights/best.pt') # 确保路径正确
return model
model = load_model()
# 使用YOLO模型检测车道线
def detect_lane(image_path):
"""使用YOLO模型检测车道线"""
results = model.predict(source=image_path)
img = cv2.imread(image_path)
for result in results:
boxes = result.boxes.numpy()
for box in boxes:
r = box.xyxy
x1, y1, x2, y2 = int(r[0]), int(r[1]), int(r[2]), int(r[3])
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) # 绘制矩形框
return img
class App:
def __init__(self, window, window_title):
self.window = window
self.window.title(window_title)
self.canvas = Canvas(window, width=640, height=480)
self.canvas.pack()
self.btn_select_image = Button(window, text="选择图片", width=20, command=self.select_image)
self.btn_select_image.pack(anchor='center', expand=True)
self.window.mainloop()
def select_image(self):
path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg *.jpeg *.png")])
if len(path) > 0:
image = detect_lane(path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)
self.image_on_canvas = ImageTk.PhotoImage(image)
self.canvas.create_image(0, 0, anchor=NW, image=self.image_on_canvas)
if __name__ == '__main__':
# 训练代码部分可以放在注释中或根据需要运行
"""
from ultralytics import YOLO
def main_train():
model = YOLO('yolov8n.pt') # 根据实际情况选择其他版本
results = model.train(
data='./path/to/data.yaml',
epochs=300,
imgsz=640,
batch=16,
project='./runs/detect',
name='lane_detection',
optimizer='SGD',
device='0',
save=True,
cache=True,
)
main_train()
"""
# GUI启动部分
root = Tk()
App(root, "车道线检测系统")