深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)

news/2024/5/20 9:43:59/文章来源:https://blog.csdn.net/guyuealian/article/details/128240198

深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)


1. 前言

本篇博客,我们将手把手教你搭建一个基于YOLOv5的红绿灯目标检测项目。目前,基于YOLOv5s的红绿灯检测精度平均值mAP_0.5=0.93919,mAP_0.5:0.95=0.63967,基本满足业务的性能需求。另外,为了能部署在手机Android平台上,本人对YOLOv5s进行了模型轻量化,开发了一个轻量级的版本yolov5s05_416和yolov5s05_320,在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。

先展示一下Python版本红绿灯检测Demo效果:

【 整套项目下载地址】:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)

【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/128240198


2. 红绿灯检测数据集说明

(1)红绿灯检测数据集

目前收集了约1W+的红绿灯(交通信号灯)检测数据集:Traffic-Lights-Dataset-Domestic+Traffic-Lights-Dataset-Foreign: 

关于红绿灯检测数据集使用说明和下载,详见另一篇博客说明:《红绿灯(交通信号灯)检测数据集》

(2)自定义数据集

如果需要增/删类别数据进行训练,或者需要自定数据集进行训练,可参考如下步骤:

  1. 采集图片,建议不少于200张图片
  2. 使用Labelme等标注工具,对目标进行拉框标注:labelme工具:GitHub - wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).
  3. 将标注格式转换为VOC数据格式,参考工具:labelme/labelme2voc.py at main · wkentaro/labelme · GitHub
  4. 生成训练集train.txt和验证集val.txt文件列表
  5. 修改engine/configs/voc_local.yaml的train和val的数据路径
  6. 重新开始训练


3. 基于YOLOv5的红绿灯检测模型训练

(1)YOLOv5说明

训练Pipeline采用YOLOv5: https://github.com/ultralytics/yolov5 , 原始官方代码训练需要转换为YOLO的格式,不支持VOC的数据格式。为了适配VOC数据,本人新增了LoadVOCImagesAndLabels用于解析VOC数据集,以便正常训练。另外,为了方便测试,还增加demo.py文件,可支持对图片,视频和摄像头的测试。

Python依赖环境,使用pip安装即可,项目代码都在Ubuntu系统和Windows系统验证正常运行,请放心使用;若出现异常,大概率是相关依赖包版本没有完全对应


matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
Pillow
PyYAML>=5.3.1
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.41.0
tensorboard>=2.4.1
seaborn>=0.11.0
pandas
thop  # FLOPs computation
pybaseutils==0.6.5

(2)准备Train和Test数据

下载红绿灯检测数据集,总共约1W+的图片:Traffic-Lights-Dataset-Domestic+Traffic-Lights-Dataset-Foreign

考虑到这两个数据集的标注格式一样,因此本项目打算将两个数据集一起合并训练,这样可以提高模型红绿灯检测效果。如果你需要增加自己的数据集进行训练,请根据自己环境路径,适当修改即可。

关于红绿灯检测数据集使用说明和下载,详见另一篇博客说明:《红绿灯(交通信号灯)检测数据集》

(3)配置数据文件

  • 修改训练和测试数据的路径:engine/configs/voc_local.yaml
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
# 数据路径
path: ""  # dataset root dir
train:- "path/to/traffic light/Traffic-Lights-Dataset-Domestic/train.txt"- "path/to/traffic light/Traffic-Lights-Dataset-Foreign/train.txt"val:- "path/to/traffic light/Traffic-Lights-Dataset-Domestic/val.txt"test:  # test images (optional)
data_type: voc# 1.设置类别个数,和要训练的类别名称,ID号从0开始递增
nc: 4  # number of classes
names: { 'red': 0, 'green': 1,  'yellow': 2,'off': 3 }
# 2.如果你想合并所有类别为一个大类,进行训练: unique表示合并所有类为单独一个类别
#nc: 1  # number of classes
#names: { "unique": 0 }

(4)配置模型文件

官方YOLOv5给出了YOLOv5l,YOLOv5m,YOLOv5s等模型。考虑到手机端CPU/GPU性能比较弱鸡,直接部署yolov5s运行速度十分慢。所以本人在yolov5s基础上进行模型轻量化处理,即将yolov5s的模型的channels通道数全部都减少一半,并且模型输入由原来的640×640降低到416×416或者320×320,该轻量化的模型我称之为yolov5s05。从性能来看,yolov5s05比yolov5s快5多倍,而mAP下降了16%(0.93→0.77),对于手机端,这精度勉强可以接受。

下面是yolov5s05和yolov5s的参数量和计算量对比:

模型input-sizeparams(M)GFLOPs
yolov5s640×6407.216.5
yolov5s05416×4161.71.8
yolov5s05320×3201.71.1

(5)重新聚类Anchor(可选)

官方yolov5s的Anchor是基于COCO数据集进行聚类获得(详见models/yolov5s.yaml文件)

 ​ 

考虑到红绿灯检测数据集,目标相对较小,并且目标框几乎都是竖状的矩形框;直接复用原始COCO的Anchor效果可能不太好;因此,这里对红绿灯数据集的标注框进行重新聚类获得新的Anchor;下表给出yolov5s,yolov5s05_416和yolov5s05_320重新聚类的Anchor结果:

yolov5s.yamlyolov5s05_416.yamlyolov5s05_320.yaml

一点建议:

  • 官方yolov5s的Anchor是基于COCO数据集进行聚类获得,不同数据集需要做适当的调整,其最优Anchor建议重新进行聚类 。
  • 当然你要是觉得麻烦就跳过,不需要重新聚类Anchor,这个影响不是特别大。如果你需要重新聚类,请参考engine/kmeans_anchor/demo.py文件

(6)开始训练

整套训练代码非常简单操作,用户只需要将相同类别的数据放在同一个目录下,并填写好对应的数据路径,即可开始训练了。

  • 修改训练超参文件: data/hyps/hyp.scratch-v1.yaml (可以修改训练学习率,数据增强等方式,使用默认即可)
  • 编辑train.sh脚本训练,训练yolov5s或轻量化版本yolov5s05_416或者yolov5s05_320 (选择其中一个训练即可)
#!/usr/bin/env bash#--------------训练yolov5s--------------
# 输出项目名称路径
project="runs/yolov5s_640"
# 训练和测试数据的路径
data="engine/configs/voc_local.yaml"
# YOLOv5模型配置文件
cfg="yolov5s.yaml"
# 训练超参数文件
hyp="data/hyps/hyp.scratch-v1.yaml"
# 预训练文件
weights="engine/pretrained/yolov5s.pt"
python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 640 --workers 12 --project $project#--------------训练轻量化版本yolov5s05_416--------------
# 输出项目名称路径
project="runs/yolov5s05_416"
# 训练和测试数据的路径
data="engine/configs/voc_local.yaml"
# YOLOv5模型配置文件
cfg="yolov5s05_416.yaml"
# 训练超参数文件
hyp="data/hyps/hyp.scratch-v1.yaml"
# 预训练文件
weights="engine/pretrained/yolov5s.pt"
python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 64 --imgsz 416 --workers 12 --project $project#--------------训练轻量化版本yolov5s05_320--------------
# 输出项目名称路径
project="runs/yolov5s05_320"
# 训练和测试数据的路径
data="engine/configs/voc_local.yaml"
# YOLOv5模型配置文件
cfg="yolov5s05_320.yaml"
# 训练超参数文件
hyp="data/hyps/hyp.scratch-v1.yaml"
# 预训练文件
weights="engine/pretrained/yolov5s.pt"
python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 64 --imgsz 320 --workers 12 --project $project
  • 开始训练: bash  train.sh

  • 训练数据量比较大,训练时间比较长,请耐心等待哈
  • 训练完成后,在模型输出目录中有个results.csv文件,记录每个epoch测试的结果,如loss,mAP等信息

训练模型收敛后,yolov5s红绿灯检测的mAP指标大约mAP_0.5=0.93919;而,yolov5s05_416 mAP_0.5=0.77174左右;yolov5s05_320 mAP_0.5=0.71944左右;相比而言,yolov5s05比yolov5s差了很多,mAP掉了近20个点,这主要是因为减小输入input-size,不利于小目标检测。 

模型input-sizeparams(M)GFLOPsmAP0.5
yolov5s640×6407.216.50.93919
yolov5s05416×4161.71.80.77174
yolov5s05320×3201.71.10.71944

(7)可视化训练过程

训练过程可视化工具是使用Tensorboard,使用方法:

# 基本方法
tensorboard --logdir=path/to/log/
# 例如
tensorboard --logdir ./data/model/yolov5s_640

当然,在输出目录,也保存很多性能指标的图片

  • 这是训练epoch的可视化图,可以看到mAP随着Epoch训练,逐渐提高

  • 这是每个类别的F1-Score分数

  • 这是模型的PR曲线

  • 这是混淆矩阵:


4. Python版本红绿灯检测效果

demo.py文件用于推理和测试模型的效果,填写好配置文件,模型文件以及测试图片即可运行测试了

  • 测试图片
# 测试图片
image_dir='data/test_image' # 测试图片的目录
weights="data/model/yolov5s_640/weights/best.pt" # 模型文件
out_dir="runs/test-result" # 保存检测结果
python demo.py --image_dir $image_dir --weights $weights --out_dir $out_dir
  • 测试视频文件
# 测试视频文件
video_file="data/test-video.mp4" # path/to/video.mp4 测试视频文件,如*.mp4,*.avi等
weights="data/model/yolov5s_640/weights/best.pt" # 模型文件
out_dir="runs/test-result" # 保存检测结果
python demo.py --video_file $video_file --weights $weights --out_dir $out_dir
  •  测试摄像头
# 测试摄像头
video_file=0 # 测试摄像头ID
weights="data/model/yolov5s_640/weights/best.pt" # 模型文件
out_dir="runs/car-result" # 保存检测结果
python demo.py --video_file $video_file --weights $weights --out_dir $out_dir

如果想进一步提高模型的性能,可以尝试:

  1. ​增加训练的样本数据: 目前只有1W+的数据量,建议根据自己的业务场景,采集相关数据,提高模型泛化能力
  2. 使用参数量更大的模型: 本教程使用的YOLOv5s,其参数量才7.2M,而YOLOv5x的参数量有86.7M,理论上其精度更高,但推理速度也较慢。
  3. 红绿灯目标检测属于小目标检测,可以尝试减小模型下采样次数,增大input-size,来提高小目标检测效果
  4. 尝试不同数据增强的组合进行训练

5. Android版本红绿灯检测效果

已经完成Android版本红绿灯检测模型算法开发,APP在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。详细说明请查看《深度学习目标检测:Android实现红绿灯检测(含Android源码 可实时运行)》https://blog.csdn.net/guyuealian/article/details/128240334

Android Demo体验:Android实现红绿灯检测APP(可实时运行))


6.项目源码下载

整套项目源码内容包含:红绿灯检测数据集 + YOLOv5训练代码和测试代码

整套项目下载地址:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)

(1)红绿灯检测数据集:红绿灯(交通信号灯)检测数据集

  1. Traffic-Lights-Dataset-Domestic红绿灯检测数据集

  2. Traffic-Lights-Dataset-Foreign红绿灯检测数据集

(2)YOLOv5训练代码和测试代码(Pytorch)

  1. 整套YOLOv5项目工程的训练代码和测试代码
  2. 支持高精度版本yolov5s训练和测试
  3. 支持轻量化版本yolov5s05_320和yolov5s05_416训练和测试
  4. 根据本篇博文说明,简单配置即可开始训练

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_236548.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构-JAVA】ArrayList

目录 1. 线性表 2. 顺序表(ArrayList) 2.1 什么是顺序表? 2.2 顺序表的使用 2.2.1 ArrayList 的构造方法 2.2.2 ArrayList 的常规操作 2.2.3 ArrayList 的遍历 2.3 顺序表的优缺点 3. 练习题 3.1 练习1 一道面试题 3.2 练习2 杨辉三角形 3.3 练习3 洗牌算法 3.4 …

PreSTU:一个专门为场景文本理解而设计的简单预训练模型

摘要:在视觉与语言(V&L)模型中,阅读和推理图像中的文本的能力往往是缺乏的。我们如何才能学习出强大的场景文本理解(STU)的V&L模型呢?本文分享自华为云社区《场景文本理解预训练PreSTU》…

如何进行系统设计

文章目录1. 理解需求1.1 功能性需求1.2 非功能性需求2. 系统设计3. Api设计4. 数据模型设计5. 高可用、高性能、可监控等数据密集型应用设计凤凰架构 重点:自己整理的非权威,不具代表性,自己去取舍哈。 1. 理解需求 1.1 功能性需求 解决什么…

深度学习 Day22——利用LSTM实现火灾温度预测

深度学习 Day22——利用LSTM实现火灾温度预测 文章目录深度学习 Day22——利用LSTM实现火灾温度预测一、前言二、我的环境三、LSTM介绍1、长期依赖的问题2、LSTM3、LSTM结构四、前期工作1、设置GPU2、导入数据3、数据可视化五、构建数据集1、设置X、y2、设置归一化3、划分数据集…

宽凳科技完成超亿元B1轮融资 率先突破高精地图量产落地

近日,国内领先的高精地图及其智能应用综合解决方案服务商宽凳科技宣布完成B1轮超亿元融资。本轮融资由聚焦于新能源汽车产业链投资及新兴技术产业投资的紫峰资本与信益资本联合领投,崇业投资跟投,同时本轮资本引入了德清政府战略投资&#xf…

Vue3 —— 使用Vite配置环境变量

文章目录 一、为什么要配置环境变量?二、在Vite中配置环境变量 1.环境变量和模式2.环境变量3.生产环境替换4.env 文件总结一、为什么要配置环境变量? 在一个产品的前端开发过程中,一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境,然…

如何计算香港服务器公网带宽的实际下载速度?

如何计算香港服务器公网带宽的实际下载速度?下面分享香港服务器带宽实际下载速度对照表及计算方法: 香港服务器带宽实际下载速度计算方法 香港服务器以1Mbps公网带宽为例,香港服务器1M带宽实际下载速度峰值128KB/S,为什么不是1M/S&#xff0…

educoder:实验13 算法-穷举法和二分法

第1关:百钱百鸡 任务描述 我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何? 相关知识 为了完成本关任务&#xff…

《纳瓦尔宝典》笔记三——做自己真正感兴趣的事情

你合上书本,留在你脑子里的才真正是你的智慧 目录 一、开始让你兴致盎然,后来又让你觉得索然无味了吗 二、在“成为自己”这件事“上,没有人比你做得好 三、专长无法被教授,但可以被学习 四、上学能带来什么 五、尽量做不需…

OM6621系列国产M4F内核低功耗BLE5.1大内存SoC蓝牙芯片

目录OM6621系列简介OM6621P系列芯片特性应用领域OM6621系列简介 随着5G与物联网时代的到来,智慧城市、电动出行、智能家居、可穿戴设备等应用高速发展,低功耗蓝牙技术在近几年智能化浪潮中的地位也尤为重要。OM6621系列的开发即是为解决国内低功耗蓝牙应…

[整型/浮点型二分算法详解]二分查找算法真的很简单吗

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、二分查找是什么二、二分查找…

Linux操作系统的安全合规性检查和加固

1. 账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险。 操作步骤 使用命令 userdel 删除不必要的账号。 使用命令 passwd -l 锁定不必要的账号。 使用命令 passwd -u 解锁必要的账号。 1.2 检查特殊账号 检查是否存在空口令和root权限的账号…

DSPE-PEG-N3,磷脂-聚乙二醇-叠氮 点击化学PEG试剂,可用于药物传递、基因转染和生物分子修饰

中文名称 叠氮聚乙二醇磷脂、磷脂聚乙二醇叠氮 简称 N3-PEG-DSPE、DSPE-PEG-N3 物理性质:米白色/白色固体或粘性液体取决于分子量。 溶剂: 溶于大部分有机溶剂,和水有很好的溶解性。 活性基团: N3 反应基…

C++ Reference: Standard C++ Library reference: Containers: map: map: find

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/find/ 公有成员函数 <map> std::map::find iterator find (const key_type& k); const_iterator find (const key_type& k) const;获取指向元素的iterator 在容器中搜索键值等于k的元素&…

和ChatGPT大战多个回合,我知道了这些真相

最近&#xff0c;ChatGPT在国内外社交平台上可谓是火出圈了。作为一款人工智能语言模型&#xff0c;它可以和人类以对话的方式进行互动&#xff0c;比你早已熟知的Siri&#xff0c;小度还有小爱同学要更加智能与专业。因为它除了回答问题外还能进行创作&#xff0c;比如写小作文…

服务器多用户共享Anaconda

实验室最近买了台服务器&#xff0c;这篇Blog用来记载一下给ubuntu 20.04的服务器安装一个共享的anaconda的步骤。 安装Anaconda 首先去anaconda的官网下载linux的安装包&#xff0c;推送到服务上。然后进行安装&#xff1a; sudo bash ./Anaconda3-2022.10-Linux-x86_64.sh…

病毒之Worm.Win32.AutoRun

题外话&#xff1a;在被奥密克戎包围的我(两个室友和我&#xff0c;一个低烧、一个咳嗽、就差我了&#xff0c;这属实是真被包围了丫)在和Worm.Win32.AutoRun决一死战… 本次Worm.Win32.AutoRun的来源&#xff1a; windows电脑上重装vscode&#xff0c;然后没有 mingw-get-setu…

Scala环境搭建

目录1&#xff09;安装步骤2&#xff09;测试3&#xff09;IDEA安装Scala 插件1&#xff09;安装步骤 1.首先确保 JDK1.8 安装成功 2.下载对应的 Scala 安装文件 scala-2.x.zip 3.解压 scala-2.12.11.zip&#xff0c;我这里解压到 F:\software 4.配置 Scala 的环境变量 …

全面解析若依框架(springboot-vue前后分离--后端部分)

1、 若依框架分解 - 启动配置 前端启动 # 进入项目目录 cd ruoyi-ui# 安装依赖 npm install# 强烈建议不要用直接使用 cnpm 安装&#xff0c;会有各种诡异的 bug&#xff0c;可以通过重新指定 registry 来解决 npm 安装速度慢的问题。 npm install --registryhttps://regist…

python 之 numpy图片处理 矩阵操作

目录 一&#xff1a;垂直方向翻转(行逆序) 二&#xff1a;水平方向翻转(列逆序) 三&#xff1a;垂直、水平方向翻转(行、列逆序) 四&#xff1a;调整亮度&#xff0c;变明亮*2.0 五&#xff1a;调整亮度&#xff0c;变暗 六&#xff1a;垂直方向裁剪 七&#xff1a;水平…