1、绪论
1.1 KerasCV概念
KerasCV是一个模块化计算机视觉组件库,它可与TensorFlow、JAX或PyTorch原生配合使用。这些模型、层、指标、回调等基于Keras Core构建,可以在任何框架中进行训练和序列化,并在另一个框架中重复使用,而无需进行昂贵的迁移。
KerasCV可以理解为Keras API的水平扩展:组件是新的第一方Keras对象,它们过于专业化,无法添加到核心Keras中。这些组件获得与核心Keras API相同级别的完善和向后兼容性保证,并且由Keras团队维护。
KerasCV的API协助执行常见的计算机视觉任务,例如数据增强、分类、对象检测、分割、图像生成等。应用计算机视觉工程师可以利用KerasCV为所有这些常见任务快速组装生产级、最先进的训练和推理管道。
KerasCV主要支持TensorFlow框架,因为它是基于Keras构建的,而Keras是TensorFlow的高级API之一。然而,由于KerasCV的模块化设计,它的一些组件和功能可能也可以与其他兼容Keras的框架(如JAX或某些版本的PyTorch)一起使用,但这需要进一步的验证和确认。
尽管KerasCV主要关注TensorFlow,但它提供的工具和库可以跨多个框架进行迁移和使用,为计算机视觉工程师提供了灵活性和选择性。
KerasCV是一个专注于计算机视觉任务的模块化组件库,它基于Keras构建,可以与TensorFlow、JAX或PyTorch等框架配合使用。以下是KerasCV的一些主要应用场景:
-
图像分类:KerasCV提供了丰富的预训练模型和工具,可以轻松地实现图像分类任务,例如识别照片中的动物、物体等。
-
目标检测:在图像中识别和定位多个对象,如人脸检测、车辆检测等。KerasCV提供了多种目标检测算法和模型,可以帮助用户快速构建高效的目标检测系统。
-
语义分割:将图像分割成多个具有特定语义含义的区域,例如将街道图像分割成道路、建筑、车辆等部分。KerasCV中的语义分割模型可以处理这类任务。
-
图像生成:利用生成对抗网络(GAN)等技术生成逼真的图像。KerasCV中的相关组件可以简化这类模型的构建和训练过程。
-
图像增强:通过对图像进行各种变换和增强操作,提高模型的泛化能力和鲁棒性。KerasCV提供了多种图像增强技术,如随机裁剪、旋转、缩放等。
-
视频处理:虽然KerasCV主要关注静态图像处理,但也可以将其应用于视频处理任务,如视频分类、目标跟踪等。通过处理视频帧,可以实现对视频内容的分析和理解。
-
医学图像处理:在医学领域,KerasCV可以用于处理和分析医学图像,如X光片、CT扫描等。通过构建相应的模型,可以帮助医生更准确地诊断疾病。
-
自动驾驶:在自动驾驶系统中,KerasCV可以用于实现车辆的感知功能,如道路检测、行人检测等。这些功能对于确保车辆的安全行驶至关重要。
1.2 研究KerasCV的意义
研究KerasCV的意义在于深入了解和掌握这个专注于计算机视觉任务的模块化组件库,从而更高效地处理与图像和视频相关的任务。以下是研究KerasCV的具体意义:
- 提高计算机视觉任务的效率:KerasCV提供了丰富的预训练模型和工具,可以大大简化计算机视觉任务的实现过程,减少开发时间,提高工作效率。
- 扩展和定制功能:KerasCV允许用户轻松地添加新的模型或自定义注意力模块,以满足特定任务的需求。这使得研究人员和开发者能够根据自己的需求来定制和优化模型,提高模型的性能和准确性。
- 易于理解和使用:KerasCV的组件都封装在统一的接口中,易于理解和使用。这使得研究人员和开发者能够更快地掌握和使用这个工具,从而更快地推进计算机视觉领域的研究和应用。
- 与主流框架的兼容性:KerasCV可以与TensorFlow、JAX或PyTorch等主流深度学习框架配合使用,这意味着用户可以利用这些框架的强大功能和资源来加速模型的训练和推理过程。
- 持续更新和同步最新研究成果:KerasCV项目保持与最新研究成果同步,持续引入新的模型和改进。这使得研究人员和开发者能够利用最新的技术和算法来改进他们的模型,提高模型的性能和准确性。
- 支持多种应用场景:从图像分类、目标检测、语义分割到图像生成和增强,KerasCV可以应用于各种计算机视觉任务。这使得研究人员和开发者能够利用这个工具来处理各种复杂和多样化的应用场景。
研究KerasCV对于提高计算机视觉任务的效率、扩展和定制功能、易于理解和使用、与主流框架的兼容性、持续更新和同步最新研究成果以及支持多种应用场景等方面都具有重要的意义。
1.3 使用 KerasCV 进行目标检测的概念和应用场景
使用KerasCV进行目标检测涉及在图像中找出所有感兴趣的目标(物体),确定它们的类别和位置。这是计算机视觉领域中的核心问题之一,对于各种应用场景具有重要意义。
1.3.1概念:
目标检测的任务是找出图像或视频帧中的目标物体,这些目标可能是人、车辆、动物或其他任何有特定形状和大小的物体。这通常涉及两个主要步骤:首先是定位,即确定目标物体在图像中的位置(如边界框);其次是分类,即确定该位置上的物体属于哪个类别。目标检测是计算机视觉和数字图像处理的一个热门方向,广泛应用于各种领域。
1.3.2应用场景:
- 机器人导航:机器人需要能够识别和理解其周围环境中的物体,以便进行导航和避障。目标检测可以帮助机器人识别出路径上的障碍物、路标或其他重要物体。
- 智能视频监控:在监控系统中,目标检测可以用于自动检测异常事件,如入侵者、交通事故或火灾等。此外,它还可以用于人数统计、行为分析等任务。
- 工业检测:在制造业中,目标检测可以用于产品质量控制、自动化生产线上的物体识别和分类等任务。
- 航空航天:在航空航天领域,目标检测可以用于卫星图像分析、无人机自主导航和避障等任务。
- 医疗影像分析:在医疗领域,目标检测可以帮助医生自动识别和定位医学影像(如X光片、CT扫描等)中的病变区域,提高诊断效率和准确性。
KerasCV作为一个为计算机视觉任务设计的库,提供了丰富的工具和预训练模型,使得目标检测的实现变得更加简单和高效。通过使用KerasCV,研究人员和开发人员可以更快地构建出高性能的目标检测模型,并应用于各种实际场景中。
2、使用KerasCV进行目标检测
2.1 系统设置
!pip install -q --upgrade keras-cv
!pip install -q --upgrade keras # Upgrade to Keras 3.
import os
os.environ["KERAS_BACKEND"] = "jax" # @param ["tensorflow", "jax", "torch"]
from tensorflow import data as tf_data
import tensorflow_datasets as tfds
import keras
import keras_cv
import numpy as np
from keras_cv import bounding_box
import os
from keras_cv import visualization
import tqdm
2.2 目标检测概念
目标检测是在给定的图像中识别、分类和定位对象的过程。通常,输入是图像,而程序员的标签则是带有可选类别标签的边界框。目标检测可以看作是分类的扩展,但不同于仅为图像提供一个类别标签,需要检测和定位任意数量的类别。
图像通常可以用代码进行如下的描述
image = [height, width, 3]
bounding_boxes = {
"classes": [0], # 0 is an arbitrary class ID representing "cat"
"boxes": [[0.25, 0.4, .15, .1]]
# bounding box is in "rel_xywh" format
# so 0.25 represents the start of the bounding box 25% of
# the way across the image.
# The .15 represents that the width is 15% of the image width.
}
自从 You Only Look Once(简称 YOLO)问世以来,目标检测主要通过深度学习来解决。大多数深度学习架构通过将目标检测问题巧妙地转化为多个小分类问题和多个回归问题的组合来实现这一点。
更具体地说,这是通过在输入图像上生成许多不同形状和大小的锚框(anchor boxes),并为每个锚框分配一个类别标签以及 x、y、宽度和高度偏移量来完成的。模型被训练来预测每个锚框的类别标签,以及被预测为目标的每个锚框的 x、y、宽度和高度偏移量。这些偏移量表示了锚框与实际目标边界框之间的调整量,从而使得模型能够精确地定位和识别图像中的对象。
目标检测是一个技术上复杂的问题,但幸运的是,我们提供了一种可靠的方法来获得出色的结果。这通常涉及使用预训练的深度学习模型,如YOLO、SSD或Faster R-CNN,这些模型已经在大量数据上进行了训练,并学会了如何有效地检测图像中的对象。
2.3使用预训练模型进行目标检测
在KerasCV的目标检测API中,最高级别的API是keras_cv.models。这个API包含了完全预训练的目标检测模型,比如keras_cv.models.YOLOV8Detector。
pretrained_model = keras_cv.models.YOLOV8Detector.from_preset(
"yolo_v8_m_pascalvoc", bounding_box_format="xywh"
)
在目标检测中,bounding_box_format
是一个重要的参数,因为它定义了边界框坐标的表示方式。常见的边界框格式包括:
-
(x_min, y_min, width, height)
: 左上角坐标((x_min, y_min)
)和宽度、高度定义了边界框的位置和大小。这是很多目标检测算法使用的格式,包括 YOLO 系列。 -
(x_min, y_min, x_max, y_max)
: 左上角和右下角的坐标定义了边界框的位置。 -
(center_x, center_y, width, height)
: 边界框的中心点坐标和宽度、高度定义了边界框的位置和大小。 -
归一化坐标: 上述任何格式的坐标都可以被归一化,即坐标值被缩放为相对于图像宽度的比例(对于 x 坐标)和相对于图像高度的比例(对于 y 坐标)。这通常在将坐标传递给深度学习模型之前进行,因为模型通常期望输入在特定范围内(如 0 到 1)。
当你使用 keras_cv.models.YOLOV8Detector
或其他目标检测模型时,确保你了解模型期望的边界框格式,并在预处理和后处理数据时相应地调整它们。
如果你在使用 keras_cv.models.YOLOV8Detector
并且需要设置 bounding_box_format
参数(尽管这个参数在标准的 KerasCV API 中可能不存在,因为它通常是模型内部处理的),你可能需要查阅该模型的特定文档或源代码来了解如何正确地处理和解释边界框坐标。
在实际应用中,你还需要注意后处理步骤,如非极大值抑制(NMS),它用于过滤重叠的边界框并仅保留最自信的预测。这些步骤通常依赖于特定的边界框格式。
bounding_boxes = {
"classes": [num_boxes],
"boxes": [num_boxes, 4]
}
“boxes” 字段在标签字典中的值所采取的格式,xywh
格式指的是边界框由其左上角坐标 (x, y)
和宽度 w
、高度 h
来定义。
因此,一个左上角坐标在 (100, 100)
、宽度为 55
、高度为 70
的边界框在 xywh
格式下会被表示为:
[100, 100, 55, 70]
这里的列表包含了四个元素,分别对应 x 坐标、y 坐标、宽度和高度。在目标检测任务中,这样的边界框表示方式很常见,特别是在 YOLO(You Only Look Once)系列的检测器中。当处理或准备数据集以进行训练或评估时,确保边界框数据以正确的格式提供。
尽管这看起来很简单,但它是KerasCV目标检测API中至关重要的一部分!每个处理边界框的组件都需要一个bounding_box_format
参数。您可以在API文档中阅读更多关于KerasCV边界框格式的信息。
这是因为边界框没有唯一的正确格式!不同流程中的组件期望不同的格式,因此通过要求指定这个参数,我们确保组件保持可读性、可重用性和清晰性。边界框格式转换错误可能是目标检测流程中最常见的错误类型之一——通过要求这个参数,我们可以减少这些错误(尤其是当代码来自多个来源时)。
接下来,让我们加载一张图像:
filepath = keras.utils.get_file(origin="https://i.imgur.com/gCNcJJI.jpg")
image = keras.utils.load_img(filepath)
image = np.array(image)
visualization.plot_image_gallery(
np.array([image]),
value_range=(0, 255),
rows=1,
cols=1,
scale=5,
)
使用带有ResNet50骨干网的YOLOV8Detector架构时,您需要将图像调整为64的倍数大小。这是为了确保与ResNet中卷积层执行的下采样操作数量相兼容。
如果调整大小的操作改变了输入的纵横比,模型的性能将会显著下降。对于我们正在使用的预训练“yolo_v8_m_pascalvoc”预设,如果使用简单的调整大小操作,pascalvoc/2012评估集上的最终平均精度均值(Mean Average Precision, mAP)会从0.38下降到0.15。
此外,如果您像在分类任务中那样裁剪图像以保持纵横比,您的模型可能会完全错过一些边界框。因此,在运行对象检测模型的推理时,我们建议使用填充以达到所需的大小,同时调整最长边的大小以匹配原始图像的纵横比。
KerasCV使正确的调整大小操作变得简单;只需将pad_to_aspect_ratio=True