资源分享 | 使用 FiftyOne 加快您的论文写作速度

824 阅读9分钟

前言:

一篇论文中常常可以看到很多图,如论文提出模型与baseline模型在数据集上的效果对比示例图,(我们通常需要些在自己模型上预测很好,而baseline表现不好的样本作为展示),或者训出的模型在测试集上的检测效果示例图,可视化预测图。有时候在训模型过程中,需要了解哪些样本的预测效果很差,需要找到这些样本进行分析。

那如何迅速便捷地找到这些样本呢?

在本文将介绍一个python工具--FiftyOne,可以帮助解决以下这些痛点:

在更多数据集上获得结果,通常是你以前从未使用过的。

花时间整理数据和模型输出。

可视化你的模型结果以创建重要的第 1 页图。

将你的模型与baseline进行比较。

为你的论文找到合适的例子。

点个关注,及时获取更多计算机视觉的内容。

FiftyOne 支持的问题空间

分类

分类涉及训练模型以预测每个图像或视频样本的一个或多个分类标签。

图像目标检测

目标检测是通过训练模型为边界框生成一组坐标和标签来定位和分类图像中对象的任务。

​可通过滑动置信度选择显示图像中的目标

视频目标检测

视频目标检测与图像目标检测具有相同的目标,除了对象还必须从一帧跟踪到另一帧。 额外的数据维度使得这些标签的可视化变得更加困难!

语义和实例分割

分段通常存储为多色掩码,其中每种颜色代表不同的对象或对象类别。 语义分割只希望分割对象的类,而实例分割也希望分割类的单个实例。

折线/多边形/关键点

其他检测问题包括使用折线和多边形的关键点检测和分割。

FiftyOne的功能

可视化和分析模型结果

了解模型性能的最可靠方法是仔细查看它在样本组和单个示例上的表现。可视化您的模型性能通常是一个巨大的痛苦,需要花费太多时间编写脚本来仅在图像上可视化预测。我的同事告诉我,在我们发布 FiftyOne 之前,他一直使用 20 年前的脚本和工具,例如显示和动画。这甚至没有开始考虑实际解析数千张图像或视频剪辑以获得模型性能的完整故事的想法。

幸运的是,FiftyOne 旨在帮助缓解这个确切的问题。FiftyOne API 旨在使加载数据集和添加模型预测变得容易。这允许您使用 FiftyOne 应用程序使用您能想到的任何标准来可视化、浏览和搜索模型输出。请参阅下面的示例,了解从模型加载和搜索预测是多么容易:

import fiftyone as fo

# Create dataset
dataset = fo.Dataset(name="my-detection-dataset")

# Add your samples to the dataset
for filepath in IMAGE_DIRECTORY:
    sample = fo.Sample(filepath=filepath)

    # Convert model detections to FiftyOne format
    detections = []
    for obj in model_outputs[filepath]:
        label = obj["label"]
        bounding_box = obj["bbox"]

        detections.append(
            fo.Detection(label=label, bounding_box=bounding_box)
        )

    # Store detections in a field name of your choice
    sample["model"] = fo.Detections(detections=detections)

    dataset.add_sample(sample)

获取更多数据集的结果

FiftyOne API 包含一个dataset zoo,可帮助你快速获取新数据集以运行模型。 使用一个命令,您可以下载和访问dataset zoo中的任何数据集:

import fiftyone.zoo as foz

available_datasets = foz.list_zoo_datasets()

print(available_datasets)
#['caltech101', 
#'cifar10', 
#'cifar100', 
#'coco-2014', 
#'coco-2017', 
#'fashion-mnist', 
#'imagenet-2012', 
#'kitti', 
#'mnist', 
#'quickstart', 
#'quickstart-video', 
#'voc-2007', 
#'voc-2012']

dataset = foz.load_zoo_dataset("coco-2017", split="validation")

然后,你可以使用你的模型生成预测并将其加载到 FiftyOne。如果您想要加载一个不在dataset zoo中的数据集,FiftyOne API 提供了简单的功能来加载ground truth和预测标签。

整理数据和输出——支持超过 15 种数据集格式

解析不同的数据集和模型标签格式可能需要大量工作。坦率地说,60%的人将大部分实验时间都花在将数据转换为代码所需的格式上。我相信您通常也会花费大量时间编写脚本来将数据从一种格式转换为另一种格式。

在这方面,FiftyOne 可以帮助导入和导出多种格式的图像和标签。例如,可以以自定义格式加载检测模型预测,并以 COCO 格式导出它们以运行 pycocotools 评估。以下是FiftyOne支持的数据导入导出格式列表:

ImageDirectory

VideoDirectory

FiftyOneImageClassificationDataset

ImageClassificationDirectoryTree

TFImageClassificationDataset

FiftyOneImageDetectionDataset

COCODetectionDataset

VOCDetectionDataset

KITTIDetectionDataset

TFObjectDetectionDataset

CVATImageDataset

FiftyOneImageLabelsDataset

FiftyOneVideoLabelsDataset

BDDDataset

FiftyOneDataset

baseline比较

将您的方法的性能置于baseline和SOTA的背景下至关重要。 一种方法是在流行数据集的聚合指标上显示更高的性能。 但是,正如我上面提到的,您通常还需要查看模型表现更好或更差的个别示例和不同情况。

FiftyOne 是轻松执行此分析的好方法。以下代码片段展示了如何将多个模型分类加载到 FiftyOne 数据集中:

import fiftyone as fo

# Create dataset
dataset = fo.load_dataset("my-classification-dataset")

# Add your predictions to samples
for sample in dataset:    
  
  # Convert model 1 outputs to FiftyOne Classifications
  classifications = []
  for pred in model_1_output[sample.filepath]:
    classifications.append(fo.Classification(label=pred))
    
  sample["model_1"] = fo.Classifications(
      classifications=classifications
  )
    
  # Convert model 2 outputs to FiftyOne Classifications
  classifications = []
  for pred in model_2_output[sample.filepath]:
    classifications.append(fo.Classification(label=pred))
    
  sample["model_2"] = fo.Classifications(
      classifications=classifications
  )
  
  sample.save()

session = fo.launch_app(dataset=dataset)
为您的论文提取比较样本是很简单的。 例如,如果您想查看目标检测模型检测到超过 10 个真阳性而baseline预测超过 10 个假阳性的样本,您可以使用以下代码片段:


from fiftyone import ViewField as F

# Sort the dataset according to where my model had the most true positives
true_positives = dataset.sort_by(F("my_model.ground_truth_eval.true_positives.0_75"), reverse=True)

# Take the top 10 samples
true_positives = true_positives[:10]


# Sort the dataset according to where the baseline had the most false positives
false_positives = dataset.sort_by(F("baseline.ground_truth_eval.false_positives.0_75"))

# Take the top 10 samples
false_positives = false_positives[:10]

该工具可以非常轻松地将您的结果与baseline进行比较,因为它能够为您快速操作您的数据。

为您的论文查找示例

生成举例说明模型性能的图像可能很乏味。您首先必须筛选无数结果,才能找到能够讲述您想要的故事的样本。然后,您必须格式化和编辑图像以适合您的论文。

FiftyOne 旨在让您快速搜索数据集以查找符合模型性能各个方面的样本。例如,如果您正在处理检测问题,您可以编写一个简短的查询来查找您的模型如何处理小对象的示例

# Bounding box format is [top-left-x, top-left-y, width, height]
bbox_area = F("bounding_box")[2] * F("bounding_box")[3]

# Create a view that contains only predictions whose area is < 0.005
small_boxes_view = dataset.filter_detections("my_detection_model", bbox_area < 0.005)

session.view = small_boxes_view

另一个例子是,如果您有一个面部识别数据集,并且想要比较您的模型在识别男性和女性方面的表现:

# Get a view of all male faces and then only correctly predicted ones
male_view = dataset.match(F(“male”) == True)
correct_male_view = male_view.match(F("prediction") == F("ground_truth"))

session.view = correct_male_view

# Get a view of all female faces and then only correctly predicted ones
female_view = dataset.match(F(“male”) == False)
correct_female_view = female_view.match(F("prediction") == F("ground_truth"))

session.view = correct_female_view

# Compare accuracy of male and female predictions
print(len(correct_male_view) / len(male_view))
print(len(correct_female_view) / len(female_view))

关于为您的论文编辑图像,我们在 FiftyOne 文档中有一个秘诀,展示了如何使用它在单个样本上绘制标签和模型预测。您可以选择所需的图像,然后使用以下代码段生成带注释的图像并将其保存到磁盘:

selected = session.selected
subset = dataset.select(selected)

#
# You can customize the look-and-feel of the annotations
# For more information, see:
# https://voxel51.com/docs/fiftyone/user_guide/draw_labels.html#customizing-annotation-rendering
#
annotation_config = foua.AnnotationConfig({
        "font_size": 24,
        "show_all_confidences": True,
})

# Render the labels
subset.draw_labels(anno_dir, annotation_config=annotation_config)

总结

撰写论文是计算机视觉和机器学习研究的必要组成部分。有些人喜欢它;有些人讨厌它。在任何情况下,理解和证实您的模型性能将是真实的输出和可视化是至关重要的,但生成通常非常耗时。FiftyOne 是一款轻量级且易于使用的可视化工具,具有强大的查询功能,可以让您更好地了解您的模型,同时将其与SOTA模型进行比较并生成定性的纸质示例。

原文链接:

medium.com/voxel51/spe…

本文来源于公众号 CV技术指南 的论文分享系列。

欢迎关注公众号 CV技术指南 ,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读。

在公众号中回复关键字 “技术总结” 可获取以下文章的汇总pdf。

其它文章

为什么GEMM是深度学习的核心

使用深度神经网络为什么8位足够?

经典论文系列 | 目标检测--CornerNet & 又名 anchor boxes的缺陷

如何看待人工智能的泡沫

使用Dice loss实现清晰的边界检测

PVT--无卷积密集预测的多功能backbone

CVPR2021 | 开放世界的目标检测

Siamese network总结

视觉目标检测和识别之过去,现在及可能

在做算法工程师的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?

计算机视觉专业术语总结(一)构建计算机视觉的知识体系

欠拟合与过拟合技术总结

归一化方法总结

论文创新的常见思路总结

CV方向的高效阅读英文文献方法总结

计算机视觉中的小样本学习综述

知识蒸馏的简要概述

优化OpenCV视频的读取速度

NMS总结

损失函数技术总结

注意力机制技术总结

特征金字塔技术总结

池化技术总结

数据增强方法总结

CNN结构演变总结(一)经典模型

CNN结构演变总结(二)轻量化模型

CNN结构演变总结(三)设计原则

如何看待计算机视觉未来的走向

CNN可视化技术总结(一)特征图可视化

CNN可视化技术总结(二)卷积核可视化

CNN可视化技术总结(三)类可视化

CNN可视化技术总结(四)可视化工具与项目