基于YOLOv10算法的交通信号灯检测与识别

为了实现基于 YOLOv10 算法的交通信号灯检测与识别,我们可以将整个过程分为以下几个步骤,并在每个步骤中提供相应的代码示例。假设我们使用 PyTorch 框架来训练 YOLOv10 模型,下面是一个完整的实现流程。


1. 数据准备与标注

首先,收集一个交通信号灯数据集并进行标注。假设我们有一个名为 traffic_light_dataset 的文件夹,其中包含了多个交通信号灯的图片。你可以使用工具如 LabelImg 来标注图像,并生成 .xml.txt 格式的标注文件。

对于 YOLO 格式的标注文件,文件内容大致如下:

xml 复制代码
<class_id> <x_center> <y_center> <width> <height>
php
49 Bytes
© 菜鸟-创作你的创作

其中:

  • <class_id>:类别 ID,红灯、绿灯、黄灯。
  • <x_center><y_center>:标注框中心点的相对坐标(归一化到 [0, 1] 区间)。
  • <width><height>:标注框的宽度和高度,归一化到 [0, 1] 区间。

2. YOLOv10 模型训练

我们使用 YOLOv5 的 PyTorch 实现训练 YOLOv10 模型(YOLOv10 通常为 YOLOv5 的升级版),主要步骤如下:

2.1. 安装必要的依赖

bash 复制代码
# 克隆 YOLOv5 仓库并安装依赖
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -U -r requirements.txt
php
112 Bytes
© 菜鸟-创作你的创作

2.2. 数据集结构

确保你的数据集符合 YOLO 的要求,数据集目录结构应如下:

kotlin 复制代码
traffic_light_dataset/
├── images/
│   ├── train/
│   │   ├── img1.jpg
│   │   ├── img2.jpg
│   ├── val/
│   │   ├── img1.jpg
│   │   ├── img2.jpg
├── labels/
│   ├── train/
│   │   ├── img1.txt
│   │   ├── img2.txt
│   ├── val/
│   │   ├── img1.txt
│   │   ├── img2.txt
php
270 Bytes
© 菜鸟-创作你的创作

2.3. 配置 data.yaml 文件

在 YOLOv5 中,需要一个 data.yaml 配置文件,指定训练数据集的位置和类别信息。

bash 复制代码
# traffic_light.yaml
train: ./traffic_light_dataset/images/train
val: ./traffic_light_dataset/images/val
nc: 3  # 类别数目:红灯、绿灯、黄灯
names: ['red', 'green', 'yellow']  # 类别标签
php
170 Bytes
© 菜鸟-创作你的创作

2.4. 训练 YOLOv10 模型

使用 YOLOv5 提供的训练脚本进行模型训练。

css 复制代码
# 开始训练模型
python train.py --img 640 --batch 16 --epochs 50 --data traffic_light.yaml --weights yolov5s.pt --cache
php
112 Bytes
© 菜鸟-创作你的创作
  • --img:图像大小,YOLOv10 默认 640×640。
  • --batch:批处理大小。
  • --epochs:训练轮数。
  • --data:指向数据配置文件。
  • --weights:预训练模型权重,yolov5s.pt 是一个小型的 YOLOv5 模型,适用于快速训练。

2.5. 模型评估

训练完成后,你可以使用 test.py 脚本评估模型的表现,检查模型在验证集上的 mAP(mean Average Precision) 等指标。

css 复制代码
python val.py --data traffic_light.yaml --weights runs/train/exp/weights/best.pt --img 640
php
90 Bytes
© 菜鸟-创作你的创作

3. 交通信号灯状态分类

虽然 YOLOv10 会检测出交通信号灯的位置和类别(如:红灯、绿灯、黄灯),但是如果需要对交通信号灯的状态进行进一步分类(如,判断红灯是否亮起),可以通过以下方式:

  1. 使用色彩分析:基于图像中的颜色,判断信号灯的状态。
  2. 训练额外的分类模型:使用 YOLOv10 检测出的交通信号灯区域作为输入,训练一个分类模型来进一步确认信号灯的状态。

这里我们展示一种使用颜色识别的方法:

ini 复制代码
import cv2
import numpy as np
# 颜色范围(H, S, V)
COLOR_RANGES = {
    "red": [(0, 150, 50), (10, 255, 255)],    # 红色
    "green": [(35, 150, 50), (85, 255, 255)], # 绿色
    "yellow": [(20, 150, 50), (40, 255, 255)] # 黄色
}
def detect_light_color(roi):
    # 转换到 HSV 色彩空间
    hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
    # 按照颜色范围过滤
    for color, (lower, upper) in COLOR_RANGES.items():
        mask = cv2.inRange(hsv, np.array(lower), np.array(upper))
        if np.any(mask):  # 如果有颜色区域
            return color
    return "unknown"
# 示例:对 YOLOv10 检测到的信号灯区域进行颜色分类
image = cv2.imread('traffic_light.jpg')
roi = image[100:200, 150:250]  # 假设这是 YOLOv10 检测到的红灯区域
light_color = detect_light_color(roi)
print(f"Detected Light Color: {light_color}")
php
744 Bytes
© 菜鸟-创作你的创作

4. 实时推理与部署

对于实时推理,我们将 YOLOv10 模型部署到边缘设备(如 Raspberry Pi、Jetson Nano)上,或者将其部署到云端服务中。这里演示如何在本地进行推理:

4.1. 加载 YOLOv10 模型进行推理

ini 复制代码
import torch
import cv2
# 加载训练好的模型
model = torch.hub.load('ultralytics/yolov5', 'custom', path='runs/train/exp/weights/best.pt')
# 加载图片并进行推理
img = cv2.imread('test_image.jpg')
results = model(img)
# 显示检测结果
results.show()
# 获取检测结果
detections = results.pandas().xywh[0]
print(detections)
php
289 Bytes
© 菜鸟-创作你的创作

4.2. 可视化与结果展示

在检测到交通信号灯后,我们可以通过 OpenCV 进行结果可视化,并标注红灯、绿灯和黄灯的区域。

sql 复制代码
# 使用 OpenCV 显示带有标注的图像
for index, row in detections.iterrows():
    x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
    color = (0, 0, 255) if row['name'] == 'red' else (0, 255, 0) if row['name'] == 'green' else (0, 255, 255)
    cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)  # 绘制框
    cv2.putText(img, row['name'], (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2, cv2.LINE_AA)
cv2.imshow('Traffic Light Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
php
506 Bytes
© 菜鸟-创作你的创作

5. 总结

基于 YOLOv10 算法的交通信号灯检测与识别系统可以有效地检测交通信号灯的状态,并通过颜色分析等方法进一步识别信号灯的颜色。整个流程包括数据准备、模型训练、状态分类、实时推理与部署等步骤。通过优化和定制化,YOLOv10 能够满足自动驾驶和智能交通系统中的需求。

  • YOLOv10 提供了高效的目标检测能力,适合用于实时任务。
  • 颜色分析分类模型 有助于提高交通信号灯状态识别的准确性。
  • www.52runoob.com/archives/41...
相关推荐
大学生资源网11 分钟前
基于springboot的万亩助农网站的设计与实现源代码(源码+文档)
java·spring boot·后端·mysql·毕业设计·源码
苏三的开发日记20 分钟前
linux端进行kafka集群服务的搭建
后端
苏三的开发日记38 分钟前
windows系统搭建kafka环境
后端
爬山算法1 小时前
Netty(19)Netty的性能优化手段有哪些?
java·后端
Tony Bai1 小时前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
想用offer打牌1 小时前
虚拟内存与寻址方式解析(面试版)
java·后端·面试·系统架构
無量1 小时前
AQS抽象队列同步器原理与应用
后端
9号达人2 小时前
支付成功订单却没了?MyBatis连接池的坑我踩了
java·后端·面试
用户497357337982 小时前
【轻松掌握通信协议】C#的通信过程与协议实操 | 2024全新
后端
草莓熊Lotso2 小时前
C++11 核心精髓:类新功能、lambda与包装器实战
开发语言·c++·人工智能·经验分享·后端·nginx·asp.net