【视觉算法系列1】使用 KerasCV YOLOv8 进行红绿灯检测(下)

news2024/11/26 7:43:45

在这里插入图片描述

提示:免费获取本文涉及的完整代码与数据集,请联系助理老师peaeci122

使用最新“KerasCV YOLOv8”模型进行红绿灯检测的综合指南

YOLO目标检测模型已经进入了无数的应用领域,从监控系统到自动驾驶汽车。那么,如果在KerasCV框架下配对YOLOv8的这种功能时会发生什么呢?

接上一篇

目录

· 红绿灯检测数据集
· 使用 KerasCV YOLOv8 进行物体检测
· 验证图像的推理
· 使用经过训练的 KerasCV YOLOv8 模型进行视频推理
· 总结与结论

KerasCV YOLOv8模型

使用 COCO 预训练主干创建 KerasCV YOLOv8 模型,主干是YOLOv8 Large,整个预训练模型中,先用 COCO 预训练权重加载主干网,然后使用随机初始化的头部权重创建整个 YOLOv8 模型。

在这里插入图片描述


backbone = keras_cv.models.YOLOV8Backbone.from_preset(
    "yolo_v8_l_backbone_coco",
    load_weights=True
)
 
yolo = keras_cv.models.YOLOV8Detector(
    num_classes=len(class_mapping),
    bounding_box_format="xyxy",
    backbone=backbone,
    fpn_depth=3,
)
 
yolo.summary()

设置 load_weights = True 很重要,否则 COCO 预训练的权重将无法加载到主干网中。

由于数据集注释文件是 XML 格式,所有的边界框都是 XYXY 格式,因此上述代码块中的 bounding_box_format 为 “xyxy”。此外,根据 KerasCV YOLOv8 官方文档,fpn_depth 为 3。

下一步:定义优化器并编译模型

optimizer = tf.keras.optimizers.Adam(
learning_rate=LEARNING_RATE,
global_clipnorm=GLOBAL_CLIPNORM,
)

yolo.compile(
optimizer=optimizer, classification_loss=“binary_crossentropy”, box_loss=“ciou”
)

学习率按照之前的定义进行设置,梯度剪切则使用 global_clipnorm 参数,这确保了影响模型参数更新的梯度不会变得太大而破坏训练的稳定性。

优化器准备就绪后,继续编译 YOLOv8 模型,这样模型就可以使用下面定义的损失函数进行训练了:

· Classification_loss:选择“binary_crossentropy”作为分类损失;

· box_loss:“ciou”或“Complete Intersection over Union”是一种先进的边界框损失函数,它可以解释预测框和真实框之间的大小和形状差异。

最终建立的模型包含 4100 万个参数,下面是模型摘要的片段,以及可训练参数的数量。

图 4. KerasCV YOLOv8 大模型摘要

评估指标

我们选择平均值 (mAP) 作为评估指标,KerasCV 已经为他所有目标检测模型提供了 mAP 的优化实现。


class EvaluateCOCOMetricsCallback(keras.callbacks.Callback):
    def __init__(self, data, save_path):
        super().__init__()
        self.data = data
        self.metrics = keras_cv.metrics.BoxCOCOMetrics(
            bounding_box_format="xyxy",
            evaluate_freq=1e9,
        )
 
        self.save_path = save_path
        self.best_map = -1.0
 
    def on_epoch_end(self, epoch, logs):
        self.metrics.reset_state()
        for batch in self.data:
            images, y_true = batch[0], batch[1]
            y_pred = self.model.predict(images, verbose=0)
            self.metrics.update_state(y_true, y_pred)
 
        metrics = self.metrics.result(force=True)
        logs.update(metrics)
 
        current_map = metrics["MaP"]
        if current_map > self.best_map:
            self.best_map = current_map
            self.model.save(self.save_path)  # Save the model when mAP improves
 
        return logs

使用自定义 Keras 回调来定义 EvaluateCOCOMetricsCallback,在每次验证循环后执行,如果当前的 mAP 大于之前的最佳 mAP,那么模型权重将被保存到磁盘中。

Tensorboard回调日志

我们还要定义一个 Tensorboard 回调,用于自动记录所有 mAP 和损失图。

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="logs_yolov8large")

所有 Tensorboard 日志都将存储在 logs_yolov8large 目录中。

对KerasCV YOLO8模型进行红绿灯检测的训练

现在可以开始训练过程了,所有组件都已准备就绪,只需调用 yolo.fit() 方法就可以开始训练。


history = yolo.fit(
    train_ds,
    validation_data=val_ds,
    epochs=EPOCH,
    callbacks=[
        EvaluateCOCOMetricsCallback(val_ds, "model_yolov8large.h5"),
        tensorboard_callback
    ],
)

train_ds 和 val_ds 分别用作训练数据集和验证数据集,而且我们还提供了上一节中定义的回调,mAP 和 loss 的值将存储在历史变量中。由于所有数据都会记录到 Tensorboard 中,所以并不需要这些数据。

图 5. 在红绿灯检测数据集上训练 KerasCV YOLOv8 模型后的 mAP

YOLOv8 模型的最佳 mAP 超过 48%,这也是保存最佳模型权重的地方。

验证图像的推理

由于我们现在已经有了训练好的模型,因此可以用它来对验证集的图像进行推理。

def visualize_detections(model, dataset, bounding_box_format):
    for i in range(10):
        images, y_true = next(iter(dataset.take(i+1)))
        y_pred = model.predict(images)
        y_pred = bounding_box.to_ragged(y_pred)
        visualization.plot_bounding_box_gallery(
            images,
            value_range=(0, 255),
            bounding_box_format=bounding_box_format,
            # y_true=y_true,
            y_pred=y_pred,
            scale=4,
            rows=2,
            cols=2,
            show=True,
            font_scale=0.7,
            class_mapping=class_mapping,
        )
visualize_detections(yolo, dataset=val_ds, bounding_box_format="xyxy")

上述函数对数据循环 10 次进行推理,每次推理后,会使用 KerasCV 内置的 plot_bounding_box_gallery 函数绘制结果。

下图显示了一些预测正确的结果

图 6. KerasCV YOLOv8 良好的验证结果

模型对所有红绿灯的预测都是正确的。

尽管模型准确度非常高了,但还不够完美,以下是一些预测结果不正确的图片。

图 7.   验证期间一些不正确和缺失的预测

上图显示了一个图像实例,模型将建筑物的窗户预测为红绿灯,在另一个例子中,它缺少对绿色和红色红绿灯的预测。

为了缓解上述情况,除了水平翻转之外,还可以对图像进行更多增强。KerasCV 有许多增强功能,可用于减少过度拟合并提高不同情况下的准确性。

使用模型进行视频推理

使用经过训练的 KerasCV YOLOv8 模型进行视频推理,在可下载内容中找到视频推理脚本,并在自己的视频上运行推理,下面是运行视频推理的示例命令。

python infer_video.py --input inference_data/video.mov

输入(–input)标记会获取运行推理的视频文件的路径,下面是一个视频推理实验的输出示例。

结果看起来不错,几乎在所有帧中,模型都能正确检测到红绿灯,当然也有一点闪烁,但很有可能在经过更多的训练和增强后就会消失。

使用训练有素的 KerasCV YOLOv8 模型进行红绿灯

总结与结论

本文到此结束,从 KerasCV 的初始设置开始,然后进入红绿灯检测数据集,详细介绍了 YOLOv8 检测模型的准备工作,随后进行了训练和验证。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.DApp-MetaMask怎么连接本地Ganache

题记 用metamask连接本地ganache,以下是全部操作流程 下载Ganache ganache是一个以太坊的个人开发环境,可以在上面部署合约、开发程序和进行测试。 ganache官网:Ganache - Truffle Suite 可以点击下面的按钮直接下载 ,下载速度…

怎样自动开始播放网页视频?

有些视频网站,网页打开后,并不会自动播放视频,需要人工点击视频或者播放器的播放按钮,才能进入视频播放状态。有没有办法一打开页面就自动播放视频呢?下面我们就来分析研究一下。 首先使用浏览器的开发者工具查看&am…

MybatisPlus多表关联分页返回结果异常

1. 按照该博客进行多表关联分页查询: https://blog.csdn.net/code_ang/article/details/116448694 2.在实际测试过程中,发现异常,分页返回的结果时而正确,时而错误。 count函数满足预期 count函数不满足预期 只是count了主表的…

pytorch 入门(二)

本文为🔗小白入门Pytorch内部限免文章 🍨 本文为🔗小白入门Pytorch中的学习记录博客🍦 参考文章:【小白入门Pytorch】教案二🍖 原作者:K同学啊 目录 一、神经网络的组成部分1. 神经元2. 神经网络…

热成像仪的工作原理及在工业设备状态监测中的应用

前面我们介绍过>>热分析技术在工业设备状态监测中的应用,下面我们将深入探讨热成像仪的工作原理及在工业设备状态监测中的应用。 近年来,热成像仪作为一种先进的检测工具,在工业设备状态监测领域得到了广泛的应用。热成像仪能够通过探测…

oauth2和knife4j结合

1.先说knife4j是个什么东西 他是swagger的升级版,在有swagger的调试功能以及接口描述的基础上,让人看着更加一目了然。 这次可能说的比较浅,主要是说怎么使用以及简单配置,还有我自己踩过的坑,因为这个东西我也第一次…

软件环境基础(ROS、CMake)

参考视频:【全】无人驾驶系列知识入门到提高 本文旨在对视频内容规划控制方面做一些学习记录,希望帮助有需要的人学习提高。不对处,望指正。 0 ROS介绍 ROS特点: 点对点设计(比如一个结点读取相机数据,传…

yolo配置(windows)

文章目录 一、下载Anaconda和pycharm1 、Anaconda官方下载地址:1.2 Anaconda 的安装 下载好之后双击打开可执行安装文件:1.3 进入到安装界面:1.4 这里建议两个都勾选(第一个选项是将 Anaconda 添加到环境变量中,不勾选…

火山引擎 ByteHouse:双十一即将到来,直播商家如何用数据“点播成金”?

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 “双十一”电商大促脚步渐近,各大平台的战火又将燃起。直播电商以低成本、高转化率等优势备受商家青睐。据智研咨询数据显示,2022 年我国直播…

iOS——JSONModel的使用与JSONModel的嵌套

什么是JSONModel JSONModel是一个解析JSON数据的开源库,可以将JSON数据直接解析成自定义的model 使用 JSONModel 非常简单,只需要将你的 model 类继承自 JSONModel ,而同时 model 中的属性名又恰巧可以和 JSON 数据中的 key 名字一样的话,那么非常恭喜你,你的工作…

10.16作业

头文件 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include<QDebug> #include<QIcon> #include<QPushButton> #include<QLineEdit> #include<QLabel> #include<QMovie> #include<QCheckBox> #include<QPa…

MyCAT:回顾当年的热潮,探寻这款备受欢迎的数据库中间件的核心特性

什么是 MyCAT &#xff1f; 根据 MyCAT 官网 - http://mycat.io/ 的描述可以知道&#xff0c; MyCAT 是如下的一个东东&#xff1a; 一个彻底开源的&#xff0c;面向企业应用开发的大数据库集支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库…

银河麒麟你服务x86访问ftp服务器上的文件

打开我的电脑 地址栏输入 ftp地址 可以选择需要的文件复制出来了

PyQt 小程序

设备管理程序 v0.0.1.0, 终于出了一个基础版本,… … 两个字典的键值判断 辛亏用的是Python 这个编码时间大大缩短了

node+vue+mysql后台管理系统

千千博客系统&#xff0c;该项目作为一套多功能的后台框架模板&#xff0c;适用于绝大部分的后台管理系统开发。基于 vue.js&#xff0c;使用 vue-cli3 脚手架&#xff0c;引用 Element UI 组件库&#xff0c;数据库直连mysql方便开发快速简洁好看的组件。 功能包含如下&#…

电子杂志制作不求人:简单易用的工具推荐

​如果你想要制作一份精美的电子杂志&#xff0c;但是又不想花费太多的时间和金钱&#xff0c;也不想求及朋友帮忙制作&#xff0c;那么可以试试这个网站制作电子杂志&#xff0c;展现出的效果跟专业级设计师的效果没什么区别哦 赶快收藏吧-------FLBOOK在线制作电子杂志平台&a…

iOS代码混淆和加固技术详解

目录 摘要&#xff1a; 本文介绍了iOS开发中常用的代码混淆和加固技术&#xff0c;包括数据加密、应用加壳和代码混淆。其中&#xff0c;重点讨论了代码混淆的实现方法和注意事项&#xff0c;并推荐了一些相关的工具和库。 引言 代码混淆和加固 数据加密 应用加壳 代码混…

易基因:细菌微生物基因表达调控表观研究方案|原核三代甲基化+转录组

1、原核甲基化 原核生物中的DNA甲基化 原核生物甲基化为什么基于三代测序&#xff1f; 第三代DNA测序为原核细菌的甲基化和表观遗传的研究开辟了一条新的途径&#xff0c;能够在基因组的水平上获取整个表观遗传的序列信息&#xff0c;绘制全基因组甲基化组。 细菌中DNA甲基化…

使用python中xird进行读取文件以及遇到的报错

由于平日系统导出的文档均为.xls的execel&#xff0c;故本文主要讲如何使用xlrd进行读取表格以及操作过程遇到的报错以及对应解决版本 一、基本使用 准备“成绩表.xlsx”文件&#xff0c;如下&#xff1a; 1、读取文件并获得文件的sheet名字 &#xff08;1&#xff09;代码 …

Python 作为开发语言可以吗?怎么掌握 python 才能提升自己

Python 作为开发语言好吗&#xff1f;怎么掌握 python 才能提升自己&#xff1f;下面就跟小编一起来看看吧&#xff01; 很多朋友都是零基础&#xff0c;在选择编程语言的时候&#xff0c;不知道哪种语言才是适合自己去深入学习的。现在全世界有非常多的 Python 语言用户&…