深入理解机器学习数据的需求越来越受到重视。然而,由于审查大型数据集所需的努力很大,这在计算机视觉领域仍然没有被广泛实践。仅仅点击浏览图片是不可能对数据集很好的了解。
特别是在对象检测这一计算机视觉的子领域中,通过定义边界框来定位图像内的对象,不只是识别对象那么简单。它还关乎理解对象的上下文、大小以及与场景中其他元素的关系。因此,对类别分布、物体大小的多样性以及类别出现的常见上下文有一个好的概览,有助于评估和调试以找到训练模型中的错误模式,使得额外训练数据的选择更加有针对性。
本文提供了一个教程,讲解如何使用Renumics Spotlight创建一个交互式的对象检测可视化。作为例子,我们考虑
从COCO数据集下载带有人物的图像
首先,安装所需的软件包
!pip install fiftyone ultralytics renumics-spotlight
通过 FiftyOne 的可恢复下载功能,你可以从 COCO 数据集下载图像,仅包含包含一个或多个人的 1,000 张图像:
import pandas as pd
import numpy as np
import fiftyone.zoo as foz
# download 1000 images from the COCO dataset with persons
dataset = foz.load_zoo_dataset(
"coco-2017",
split="validation",
label_types=[
"detections",
],
classes=["person"],
max_samples=1000,
dataset_name="coco-2017-person-1k-validations",
)
现在你可以使用:
def xywh_to_xyxyn(bbox):
"""convert from xywh to xyxyn format"""
return [bbox[0], bbox[1], bbox[0] + bbox[2], bbox[1] + bbox[3]]
row = []
for i, sample in enumerate(dataset):
labels = [detection.label for detection in sample.ground_truth.detections]
bboxs = [
xywh_to_xyxyn(detection.bounding_box)
for detection in sample.ground_truth.detections
]
bboxs_persons = [bbox for bbox, label in zip(bboxs, labels) if label == "person"]
row.append([sample.filepath, labels, bboxs, bboxs_persons])
df = pd.DataFrame(row, columns=["filepath", "categories", "bboxs", "bboxs_persons"])
df["major_category"] = df["categories"].apply(
lambda x: max(set(x) - set(["person"]), key=x.count)
if len(set(x)) > 1
else "only person"
)
将数据准备成一个Pandas DataFrame,其中包括文件路径、边界框的类别、边界框、包含人物的边界框以及主要类别(除了人物之外的)列,以指定图片中人物的上下文环境:
现在你可以用Spotlight来可视化它:
from renumics import spotlight
spotlight.show(df)
你可以在检视器视图中使用“添加视图”按钮,并在BoundingBox视图中选择“bboxs_persons”和“filepath”一起,以显示相应的边界框和图片。
使用嵌入丰富数据
为了给数据带来结构性,你可以使用基础模型的图像嵌入向量(密集向量表示)。因此,可以应用ViT嵌入向量于整幅图像来通过进一步的降维技术比如UMAP或t-SNE来构建数据集的结构,从而提供图像的2D相似性地图。此外,预训练的目标检测器的输出可以用来根据大小或包含对象的数量来构建数据的结构。同样,使用预训练目标检测器的输出可以帮助根据检测到的对象的大小或数量对数据进行分类。由于COCO数据集已经提供了这些信息,我们可以直接利用它。
Spotlight已经整合了对google/vit-base-patch16–224-in21k视觉变换器(ViT)模型和UMAP的支持。当使用文件路径来创建嵌入向量时,这些支持会被自动应用。
spotlight.show(df, embed=["filepath"])
Spotlight 将计算嵌入向量,并应用 UMAP 来在相似性地图中显示结果。颜色编码代表主要类别。现在你可以使用相似性地图来浏览数据。
Ultralytics YOLOv8 是一个最先进的目标检测模型,用于快速识别对象。它设计用于快速图像处理,适合实时检测任务,并且可以应用于大量数据而无需长时间等待。
你可以从加载预训练模型开始:
from ultralytics import YOLO
detection_model = YOLO("yolov8n.pt")
并进行检测:
detections = []
for filepath in df["filepath"].tolist():
detection = detection_model(filepath)[0]
detections.append(
{
"yolo_bboxs": [np.array(box.xyxyn.tolist())[0] for box in detection.boxes],
"yolo_conf_persons": np.mean([
np.array(box.conf.tolist())[0]
for box in detection.boxes
if detection.names[int(box.cls)] == "person"
]),
"yolo_bboxs_persons": [
np.array(box.xyxyn.tolist())[0]
for box in detection.boxes
if detection.names[int(box.cls)] == "person"
],
"yolo_categories": np.array(
[np.array(detection.names[int(box.cls)]) for box in detection.boxes]
),
}
)
df_yolo = pd.DataFrame(detections)
在一台配备12GB内存的GeForce RTX 4070 Ti上,这个过程不到20秒就可以完成。现在你可以将结果包含在DataFrame中,并使用Spotlight进行可视化。
df_merged = pd.concat([df, df_yolo], axis=1)
spotlight.show(df_merged, embed=["filepath"])
Spotlight 将再次计算嵌入并应用 UMAP 来在相似性地图中显示结果。但这一次,你可以选择模型对检测到的对象的置信度,并使用相似性地图来浏览置信度低的簇。这些是模型不确定的图像,且这些图像通常是相似的。
这项简短的分析表明,该模型在以下几类图像中遇到了系统性问题:
你可以决定这些问题是否真的影响了你的人物检测目标,如果是的话,可以考虑通过增加额外的训练数据来优化数据集,以提高模型在这些特定场景下的性能。
结论
通过使用预先训练的模型和 Spotlight 等增强数据科学工作流程的工具,可以使对象检测的可视化变得更加容易。