1、绪论
1.1 KerasCV简介
KerasCV是一个专注于计算机视觉任务的模块化组件库,基于Keras构建,可与TensorFlow、JAX或PyTorch等框架配合使用。
-
概念与定位:
- KerasCV是Keras API的水平扩展,提供了一系列新的第一方Keras对象,这些对象过于专业化,无法添加到核心Keras中。
- 它获得了与核心Keras API相同级别的完善和向后兼容性保证,并由Keras团队维护。
-
功能与应用:
- KerasCV的API协助执行常见的计算机视觉任务,如数据增强、分类、对象检测、分割、图像生成等。
- 它包括针对流行计算机视觉数据集的预训练模型,例如ImageNet、COCO和Pascal VOC,可用于迁移学习。
- KerasCV还提供了一系列可视化工具,用于检查模型学习的中间表示以及可视化对象检测和分割任务的结果。
-
框架兼容性:
- 虽然KerasCV主要支持TensorFlow框架,但由于其模块化设计,一些组件和功能可能也可以与其他兼容Keras的框架(如JAX或某些版本的PyTorch)一起使用。
- 这些模型、层、指标、回调等基于Keras Core构建,可以在任何框架中进行训练和序列化,并在另一个框架中重复使用,而无需进行昂贵的迁移。
-
应用场景:
- 应用计算机视觉工程师可以利用KerasCV为常见的计算机视觉任务快速组装生产级、最先进的训练和推理管道。
- 在多个领域中都有广泛应用,例如自动驾驶、医学影像处理、视频监控等。
KerasCV是一个功能强大、灵活且易于使用的计算机视觉库,为开发者提供了丰富的工具和资源来构建和优化各种计算机视觉模型。
1.2 YOLOV8简介
YOLOV8(You Only Look Once version 8)是一个深度学习框架,专门用于实现实时对象检测。
-
算法思想:
- YOLO(You Only Look Once)算法的核心思想是只需要浏览一次图像,就可以识别出图像中物体的类别和位置。它采用了一种Region-free(无区域)或单阶段(1-stage)的方法,与需要两阶段(2-stage)的Region-based方法不同。
-
性能特点:
- 实时性能:YOLOV8继承了YOLO系列的实时检测特性,即使在较低的硬件配置上也能达到很高的帧率(FPS)。
- 高准确度:通过更深更复杂的网络结构和改进的训练技巧,YOLOV8在保持高速度的同时,也大幅提高了检测的准确度。
- 多尺度预测:YOLOV8引入了改进的多尺度预测技术,能够更好地检测不同大小的对象。
- 自适应锚框:新版在自适应调整锚框方面做了优化,可以更准确地预测对象的位置和大小。
- 更强的特征提取器:YOLOV8使用了更先进的特征提取网络,有助于从图像中提取出更丰富、更有区分度的特征。
-
功能与应用:
- YOLOV8不仅是一个目标检测算法,还结合了多算法实现多目标追踪、实例分割和姿态估计功能。
- 它在计算机视觉领域具有广泛的应用前景,如智能监控、自动驾驶、人机交互等领域。
-
创新点:
- YOLOV8是在Yolo系列历史版本的基础上推出的最新版本,引入了新的功能和改进点,如新的骨干网络、新的Ancher-Free检测头和一个新的损失函数。
- 它的可扩展性允许它不仅仅用于Yolo系列模型,还能支持非Yolo模型以及分类、分割、姿态估计等各类任务。
-
模型评估:
- 在COCO Val 2017数据集上,YOLOV8相比前代模型如YOLOV5,在精度上有所提升,但模型参数量和FLOPs(浮点运算次数)也相应增加。然而,与YOLOV5相比,大部分模型的推理速度可能会变慢。
YOLOV8是一个功能强大、性能优越的实时对象检测算法,具有广泛的应用前景和强大的扩展能力。
1.3 图像目标识别概述
图像目标识别是计算机视觉领域中的一个重要任务,旨在从给定的图像中自动识别和定位出其中的目标物体。
-
定义:
- 图像目标识别是利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术。
-
主要步骤:
- 图像预处理:对图像进行平移、旋转和缩放等几何规范,使图像识别能够更快速、准确。同时,图像滤波用于消除噪声,保持图像特征。
- 图像分割:是实现机器视觉图像自动识别与分析的关键步骤,其分割质量对后续图像的分析具有重要意义。
- 目标检测:在图像中定位出目标的位置,通常使用边界框来表示目标的位置和大小。
- 目标分类:在检测到目标后,对其进行分类,识别出目标的类别。
-
技术特点:
- 图像目标识别通过存储的信息(记忆中存储的信息)与当前的信息(当时进入感官的信息)进行比较实现对图像的识别。
- 前提是图像描述,即使用数字或符号表示图像或景物中各个目标的相关特征,甚至目标之间的关系。
- 图像识别技术对图像中个性特征进行提取时,可以采用模板匹配模型等方法。
-
应用领域:
- 图像识别技术已广泛应用于多个领域,包括生物医学、卫星遥感、机器人视觉、货物检测、目标跟踪、自主车导航、公安、银行、交通、军事、电子商务和多媒体网络通信等。
-
技术发展:
- 随着技术的发展,出现了基于机器视觉的目标识别、基于深度学习的目标识别等,这些方法大大提高了图像识别的准确度和识别效率。
图像目标识别是一个复杂的任务,涉及多个步骤和技术方法。通过不断的研究和技术创新,图像目标识别的性能正在不断提高,为各个领域的应用提供了有力的支持。
2、图像物体识别过程
2.1软件安装及设置
KerasCV 是 Keras 在计算机视觉任务上的扩展。在本文中我们将看到如何使用 KerasCV 训练 YOLOv8 目标检测模型。在进行训练之前,将简要介绍软件的安装和设置。
2.1.1 软件安装
!pip install --upgrade git+https://github.com/keras-team/keras-cv -q
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
2.1.2 设置
import os
from tqdm.auto import tqdm
import xml.etree.ElementTree as ET
import tensorflow as tf
from tensorflow import keras
import keras_cv
from keras_cv import bounding_box
from keras_cv import visualization
2.2 数据预处理
2.2.1 数据加载
本文我们将使用从 roboflow 获取的自动驾驶汽车数据集。为了使数据集更易于管理,我已经提取了较大数据集的一个子集,该数据集原本包含15,000个数据样本。在此子集中,我选择了7,316个样本用于模型训练。
为了简化手头的任务并集中我们的努力,我们将使用减少数量的对象类别。具体来说,我们将考虑五个主要类别进行检测和分类:汽车、行人、交通灯、摩托车手和卡车。这些类别代表了自动驾驶汽车环境中遇到的一些最常见和最重要的对象。
通过将数据集缩小到这些特定类别,我们可以集中精力构建一个能够准确识别和分类这些重要对象的强大目标检测模型。
TensorFlow 数据集库提供了一种方便的方式来下载和使用各种数据集,包括目标检测数据集。对于想要快速开始使用数据而无需手动下载和预处理的人来说,这是一个很好的选择。
程序员可以在这里查看各种目标检测数据集:TensorFlow 数据集
然而,在本文的代码示例中,我们将演示如何从头开始使用 TensorFlow 的 tf.data
管道加载数据集。这种方法提供更多的灵活性,并允许程序员根据需要自定义预处理步骤。
使用 tf.data
管道加载在 TensorFlow 数据集库中不可用自定义数据集是使用 tf.data
管道的一个主要优势。这种方法允许程序员创建一个定制的数据预处理管道,以满足程序员对数据集的特定需求和要求。
2.2.2 设置超参数
SPLIT_RATIO = 0.2
BATCH_SIZE = 4
LEARNING_RATE = 0.001
EPOCH = 5
GLOBAL_CLIPNORM = 10.0
2.2.3 创建数据字典
在图像目标识别任务中,建立一个详细的数据字典是一个至关重要的步骤,它确保了模型能够准确地将图像中的目标映射到对应的类别。数据字典,通常被称为标签字典或类别字典,是一个将目标类别名称与唯一标识符相关联的集合。以下是建立和使用数据字典的详细过程:
首先,需要明确你的数据集中包含哪些目标类别。这些类别通常是根据你的具体应用场景和需求来定义的,例如,在自动驾驶系统中,类别可能包括“汽车”、“行人”、“交通灯”等;在动物识别应用中,类别可能包括“猫”、“狗”、“鸟”等。
接下来,你需要列出所有的目标类别,并确保每个类别名称都是唯一的,没有拼写错误或混淆的可能性。这一步是为了确保在后续的数据处理和模型训练过程中,每个类别都能够被正确地识别和区分。
然后,为每个类别分配一个唯一的标识符。这个标识符通常是一个整数或字符串,用于在数据处理和模型训练过程中代替类别名称。整数标识符在处理速度和内存使用方面通常更具优势,因此在大多数图像目标识别任务中更为常用。你可以按照某种顺序(如字母顺序或自定义顺序)为类别分配标识符,只要确保每个类别都有一个唯一的标识符即可。
现在,你可以创建一个数据字典,将类别名称作为键,将对应的标识符作为值。在创建数据字典时,可以使用编程语言(如Python)中的字典数据结构来实现。这个数据字典将成为你在整个项目过程中处理类别标签的参考依据。
在训练、验证和测试过程中,你需要使用数据字典来编码和解码类别标签。编码是指将类别名称转换为对应的标识符,以便模型能够处理这些标签。解码是指将模型输出的标识符转换回可读的类别名称,以便你能够理解模型的预测结果。在编码和解码过程中,你只需要查找数据字典中相应的键值对即可。
需要注意的是,在整个项目过程中,你需要确保始终使用相同的数据字典。不要更改字典中的映射关系,除非你有充分的理由这样做。此外,如果你的数据集将来需要添加新的类别,你需要确保你的数据字典可以轻松地扩展以包含新的映射关系。一种常见的做法是在数据字典中预留一些额外的标识符,以便将来添加新的类别时使用。
通过建立和使用一个详细的数据字典,你可以确保在图像目标识别任务中准确地处理类别标签,从而提高模型的识别精度和性能。
物体类别映射
class_ids = [
"car",
"pedestrian",
"trafficLight",
"biker",
"truck",
]
class_mapping = dict(zip(range(len(class_ids)), class_ids))
# 图像和注释的路径
path_images = "/kaggle/input/dataset/data/images/"
path_annot = "/kaggle/input/dataset/data/annotations/"
# 获取 path_annot 中所有 XML 文件路径并排序
xml_files = sorted(
[
os.path.join(path_annot, file_name)
for file_name in os.listdir(path_annot)
if file_name.endswith(".xml")
]
)
# 获取 path_images 中所有 JPEG 图像文件路径并排序
jpg_files = sorted(
[
os.path.join(path_images, file_name)
for file_name in os.listdir(path_images)
if file_name.endswith(".jpg")
]
)
下面定义的函数读取 XML 文件,找到图像名称和路径,然后遍历 XML 文件中的每个对象,提取每个对象的边界框坐标和类别标签。
该函数返回三个值:图像路径、边界框列表(每个边界框表示为四个浮点数的列表:xmin, ymin, xmax, ymax),以及与每个边界框对应的类别 ID 列表(表示为整数)。类别 ID 是通过使用名为 class_mapping
的字典将类别标签映射到整数值来获得的。
def parse_annotation(xml_file):
tree = ET.parse(xml_file)
root = tree.getroot()
image_name = root.find("filename").text
image_path = os.path.join(path_images, image_name)
boxes = []
classes = []
for obj in root.iter("object"):
cls = obj.find("name").text
classes.append(cls)
bbox = obj.find("bndbox")
xmin = float(bbox.find("xmin"