基于Yolov5 的红绿灯识别

本文介绍了如何使用YOLO算法对交通图像中的红绿灯进行识别,包括数据集的VOC和YOLO格式标注、训练集和验证集划分、以及yolov5s.pt模型的使用和训练过程。通过实例展示了如何修改代码以识别红绿黄灯状态,适合初学者理解和实践。
摘要由CSDN通过智能技术生成

目录

项目简介

数据集的标注

模型训练

小结


项目简介

基于YOLO的红绿灯识别是一种计算机视觉技术,用于识别交通图像中的红绿灯状态。该技术利用了目标检测算法,特别是YOLO(You Only Look Once)算法,来快速准确地检测图像中的红绿灯区域,并对其状态进行分类。基于YOLO的红绿灯识别在智能交通系统、自动驾驶等领域具有重要的应用价值

数据集的标注

数据集标注可以使用:labelimg 进行标注

labelimg 标注工具可到相关博主或者github去找    也可以采用我网盘存储的标注工具 :
https://pan.baidu.com/s/1BrkiKbjEj0XiK1QMC331mg    提取码:6npe

Labelimg是一款开源的数据标注工具,可以标注三种格式。

  1. VOC标签格式,保存为xml文件。

  2. yolo标签格式,保存为txt文件。

  3. createML标签格式,保存为json格式。

 这里我们采用 Yolo标签进行标注

并创建以下文件 名字可自行修改  这里我命名为 Mydata

images:用于存储图片,里面包含两个子文件夹 trian 和 val

labels:  用于存储标注后产生的标签 (txt格式)同样包含两个子文件夹 trian 和 val  标签与image存储图片需要一 一对应

在机器学习和深度学习中,通常将数据集分为训练集(train)和验证集(val)。以下是关于这两者的简要介绍:

  1. 训练集(Train Set)

    • 用途:主要用于模型训练。

    • 数据量:通常占据整个数据集的大部分,有时甚至达到80-90%。

    • 目的:通过使用训练集,模型可以学习从输入特征到输出目标的映射。

    • 操作:在训练过程中,模型会多次迭代地查看训练数据,并调整其内部参数以最小化某个损失函数。

  2. 验证集(Validation Set)

    • 用途:主要用于模型验证和调整。

    • 数据量:通常比训练集小,占整个数据集的10-20%。

    • 目的:验证集用于评估模型在未见过的数据上的性能,防止过拟合,并帮助调整超参数。

    • 操作:在每个训练周期结束时,模型会使用验证集进行评估,以了解其性能如何。如果模型在验证集上的性能持续下降,这可能意味着它正在过拟合,这时可能需要采取措施,例如调整超参数或早停训练。

模型训练

当数据标注完成后 就可开始模型训练了

 下载解压后打开安装/配置所需要的的环境

下载所需要的模型文件(需要基于这个模型去训练自己的数据集)

这里我们采用的是 yolov5s.pt 的模型文件 如果下载不了可到网盘进行下载

https://pan.baidu.com/s/1BrkiKbjEj0XiK1QMC331mg    提取码:6npe

修改train 程序文件 进行修改 自己的模型训练

根据上面图片进行修改项目文件 names 标签名 nc 标签数量

训练时出现下面错误  在代码前面添加     os.environ['GIT_PYTHON_REFRESH'] = 'quiet'

 训练完成后 会在 runs/train/ 下生成 weights 里面有一个 best.pt 模型文件  将该文件替换 detect.py 里的权重文件即可开始推理

推理结果

修改代码识别红灯、绿灯、黄灯

数学公式:

代码如下 可适当修改判断条件的 数值 以便提高识别的准确性

# ---- 自己添加部分 ----

                    # im0 为当前推理图片或者视频帧 转换为灰度图
                    gray = cv2.cvtColor(im0,cv2.COLOR_BGRA2GRAY)

                    # 将红绿灯分成三等分 用于识别 红灯、绿灯、黄灯 的状态
                    # xyxy 中存储了 推理结果的矩形框坐标 分别为左上 右下
                    # 每一个灯的距离
                    width = int((xyxy[2] - xyxy[0])) // 3

                    # 使用 ROI 获取 红灯、绿灯、黄灯 区域的灰度值
                    red = gray[int(xyxy[1]):int(xyxy[3]), int(xyxy[0]):int(xyxy[0]) + width]
                    yellow = gray[int(xyxy[1]):int(xyxy[3]), int(xyxy[0]) + width:int(xyxy[0]) + width * 2]
                    green = gray[int(xyxy[1]):int(xyxy[3]), int(xyxy[0]) + width * 3:int(xyxy[2])]

                    # 计算区域的灰度值的平均值
                    red_mean = np.mean(red)
                    yellow_mean = np.mean(yellow)
                    green_mean = np.mean(green)

                    # 红灯、绿灯、黄灯 的状态判断
                    if red_mean > 40:
                        cv2.putText(im0, 'red', (50, 50), 1, 5, (0, 0, 255), 3)
                    elif yellow_mean > 40:
                        cv2.putText(im0, 'yellow', (50, 50), 1, 5, (0, 255, 255), 3)
                    elif green_mean > 40:
                        cv2.putText(im0, 'yellow', (50, 50), 1, 5, (0, 128, 0), 3)
                    else:
                        cv2.putText(im0, 'wait', (50, 50), 1, 5, (255, 255, 255), 3)
                    # ---- 自己添加部分 ----

 最终推理结果

小结

基于YOLOV5 v7.0 红绿灯的代码 已基本完成 后续可根据自己的需求进行修改。 第一次编写,了能用些许不足望理解

  • 17
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是基于 YOLOv5 和 OpenCV 的红绿灯检测和识别Python 代码示例: ``` import cv2 import torch import numpy as np from pathlib import Path from models.experimental import attempt_load from utils.general import non_max_suppression # 加载模型 model = attempt_load(Path('path/to/yolov5s.pt'), map_location=torch.device('cpu')) model.eval() # 定义类别 classes = ['red', 'yellow', 'green'] # 定义颜色 colors = [(0, 0, 255), (0, 255, 255), (0, 255, 0)] # 加载输入图像 img_path = 'path/to/image.jpg' img = cv2.imread(img_path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 图像预处理 img = cv2.resize(img, (640, 640)) img = img.astype(np.float32) / 255.0 img = np.transpose(img, (2, 0, 1)) img = np.expand_dims(img, axis=0) # 模型预测 with torch.no_grad(): pred = model(torch.from_numpy(img)) pred = non_max_suppression(pred, conf_thres=0.5, iou_thres=0.5) # 遍历预测结果 for i, det in enumerate(pred): if len(det): for *xyxy, conf, cls in reversed(det): # 提取坐标和类别 x1, y1, x2, y2 = map(int, xyxy) cls_name = classes[int(cls)] # 绘制边框和类别 cv2.rectangle(img, (x1, y1), (x2, y2), colors[int(cls)], 2) cv2.putText(img, cls_name, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[int(cls)], 2) # 显示结果 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先加载了 YOLOv5 模型并定义了类别和颜色。然后,我们加载输入图像并进行预处理。接下来,我们使用模型对图像进行预测,并使用非最大抑制(NMS)来过滤预测结果。最后,我们遍历预测结果并绘制边框和类别。最终,我们显示结果。 请注意,这个示例只是一个简单的演示,你需要根据实际情况来调整参数和代码。同时,由于 YOLOv5 和 OpenCV 的版本可能会不同,你需要根据实际情况来调整代码和模型。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值