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

2023-10-17 15:04

本文主要是介绍【视觉算法系列1】使用 KerasCV YOLOv8 进行红绿灯检测(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

提示:免费获取本文涉及的完整代码与数据集,请联系助理老师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 = dataself.metrics = keras_cv.metrics.BoxCOCOMetrics(bounding_box_format="xyxy",evaluate_freq=1e9,)self.save_path = save_pathself.best_map = -1.0def 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_mapself.model.save(self.save_path)  # Save the model when mAP improvesreturn 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 检测模型的准备工作,随后进行了训练和验证。

在这里插入图片描述

这篇关于【视觉算法系列1】使用 KerasCV YOLOv8 进行红绿灯检测(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226188

相关文章

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr