本文主要是介绍基于Yolov5 的红绿灯识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
项目简介
数据集的标注
模型训练
小结
项目简介
基于YOLO的红绿灯识别是一种计算机视觉技术,用于识别交通图像中的红绿灯状态。该技术利用了目标检测算法,特别是YOLO(You Only Look Once)算法,来快速准确地检测图像中的红绿灯区域,并对其状态进行分类。基于YOLO的红绿灯识别在智能交通系统、自动驾驶等领域具有重要的应用价值
数据集的标注
数据集标注可以使用
:labelimg 进行标注
labelimg 标注工具可到相关博主或者github去找 也可以采用我网盘存储的标注工具 :
https://pan.baidu.com/s/1BrkiKbjEj0XiK1QMC331mg 提取码:6npe
Labelimg是一款开源的数据标注工具,可以标注三种格式。
-
VOC标签格式,保存为xml文件。
-
yolo标签格式,保存为txt文件。
-
createML标签格式,保存为json格式。
这里我们采用 Yolo标签进行标注
并创建以下文件 名字可自行修改 这里我命名为 Mydata
images:用于存储图片,里面包含两个子文件夹 trian 和 val
labels: 用于存储标注后产生的标签 (txt格式)同样包含两个子文件夹 trian 和 val 标签与image存储图片需要一 一对应
在机器学习和深度学习中,通常将数据集分为训练集(train)和验证集(val)。以下是关于这两者的简要介绍:
-
训练集(Train Set):
-
用途:主要用于模型训练。
-
数据量:通常占据整个数据集的大部分,有时甚至达到80-90%。
-
目的:通过使用训练集,模型可以学习从输入特征到输出目标的映射。
-
操作:在训练过程中,模型会多次迭代地查看训练数据,并调整其内部参数以最小化某个损失函数。
-
-
验证集(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 红绿灯的代码 已基本完成 后续可根据自己的需求进行修改。 第一次编写,了能用些许不足望理解
这篇关于基于Yolov5 的红绿灯识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!