首页 > 解决方案 > 备份/恢复 FiftyOne 动态数据(例如标签、检测和分段)

问题描述

如何备份 FiftyOne 数据集中的动态内容?标签是需要备份的最重要的数据。我的一些用户将花费大量时间在 UI 中手动创建标签,我想确保我们备份他们的工作。我不需要备份静态内容,例如图像本身。

备份检测和分割也很好。对于较小的数据集,我可以从脚本中重新生成这些数据集,但对于较大的数据集,或者源数据(例如检测)发生变化的情况,最好不必重建这些数据集。

而且,一旦我备份了这些数据,我将如何恢复?

标签: fiftyonevoxel51

解决方案


五十一队

这个工作流程听起来好像可以通过FiftyOne Teams解决,这是 FiftyOne的企业版,专为在相同数据集上进行基于团队的协作而设计。它之所以重要,不仅因为它支持多个用户同时处理一个数据集,还因为数据集版本控制在 FiftyOne Teams 的近期路线图上。

数据集和字段克隆

FiftyOne中,当前推荐的备份DatasetDatasetViewField的方法是“克隆”它。

对于 aDataset和 a DatasetViewclone()方法将获取给定样本中的现有字段并将它们复制到新的Dataset. 克隆 aDatasetView时,只会克隆过滤视图中存在的字段。

您还可以使用clone_sample_field()将视图字段的内容复制到底层的新字段中Dataset。这适用于任何示例字段,包括标签和标签。

import fiftyone as fo
import fiftyone.zoo as foz

dataset = foz.load_zoo_dataset("quickstart")

# Create a view with only the "ground_truth" field
# and clone it into a new Dataset

view = dataset.select_fields("ground_truth")
bu_dataset = view.clone()



# Clone the "tags" field within the dataset

bu_dataset.clone_sample_field("tags", "tags_backup")

FiftyOne 仅将图像的路径存储在数据库中,不会复制任何媒体。这意味着在克隆 a 时Dataset,仅复制媒体文件路径,而不复制媒体本身。

恢复克隆的数据

克隆字段

恢复克隆的字段就像将字段重命名回原始名称一样简单。

bu_dataset.rename_sample_field("tags_backup", "tags")

为了进行更细致的恢复,您始终可以在简单的 Python 循环中迭代样本以准确恢复您需要的内容:

for sample in bu_dataset:
    backup_tags = sample.tags
    if "validation" in backup_tags:
        sample.tags = backup_tags
        sample.save()
克隆数据集

为了从克隆数据集中恢复字段,您可以将一个数据集中的样本合并到另一个数据集中:

merge_view = bu_dataset.select_fields("ground_truth")
dataset.merge_samples(merge_view)

数据集持久性

当计划Dataset多次使用 a 时, 应设置该persistent选项。当 aDataset设置为persistent时,即使 Python 内核和支持的 MongoDB 数据库关闭,Dataset也不会被删除,并且可以在将来重新加载

例如,要持久化数据集:

import fiftyone as fo
import fiftyone.zoo as foz

# Create your dataset
dataset = foz.load_zoo_dataset(
    "coco-2017",
    split="validation",
    max_samples=10,
    dataset_name="my_dataset",
)

dataset.persistent = True

现在您可以关闭 Python,重新打开它,然后加载Dataset.

import fiftyone as fo

print(fo.list_datasets())
# ["my_dataset"]

dataset = fo.load_dataset("my_dataset")

应用标记

tag在 FiftyOne App 中创建和应用a时,它会自动备份到 MongoDB 数据库中Dataset,因此会自动备份到支持的 MongoDB 数据库中。

例如,要custom_tagDataset上面加载的内容中创建一个,您可以启动应用程序,选择样本或标签,输入标签,然后点击“应用”:

session = fo.launch_app(dataset)

apply_tag_in_app

回到 Python 中,Dataset已经更新,在 App 中创建的标签可以查询或备份,如上所示。

tagged_view = dataset.match_tags("custom_tag")
print(tagged_view)
Dataset:     my_dataset
Media type:  image
Num samples: 3
Tags:        ['custom_tag', 'validation']
Sample fields:
    id:           fiftyone.core.fields.ObjectIdField
    filepath:     fiftyone.core.fields.StringField
    tags:         fiftyone.core.fields.ListField(fiftyone.core.fields.StringField)
    metadata:     fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.metadata.Metadata)
    ground_truth: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.labels.Detections)
View stages:
    1. MatchTags(tags=['custom_tag'], bool=True)

推荐阅读