【问题标题】:How to extract foreground objects from COCO dataset or Open Images V6 Dataset?如何从 COCO 数据集或 Open Images V6 数据集中提取前景对象?
【发布时间】:2021-11-04 20:14:19
【问题描述】:

目前,我正在为对象检测任务准备一个合成数据集。有可用于此类任务的注释数据集,例如 COCO 数据集和 Open Images V6。我正在尝试从那里下载图像,但只下载特定类的前景对象,例如人,也就是没有透明背景的图像。我这样做的原因是我想在将这些图像编辑成新图像后插入它们,例如街景。

到目前为止,我已经尝试过,我使用了一个名为 FiftyOne 的库,并下载了带有语义标签的数据集,但我被困在这里,我不知道还能做什么。

没有必要使用 FiftyOne,任何其他方法都可以。

这是我用来下载带有标签的数据集样本的代码

import fiftyone as fo
import fiftyone.zoo as foz

dataset = foz.load_zoo_dataset(
    "coco-2017",
    split="validation",
    dataset_dir = "path/fiftyone",
    label_types=["segmentations"],
    classes = ["person"],
    max_samples=10,
    label_field="instances",
    dataset_name="coco-images-person",
)

# Export the dataset
dataset.export(
    export_dir = "path/fiftyone/image-segmentation-dataset",
    dataset_type=fo.types.ImageSegmentationDirectory,
    label_field="instances",
)

谢谢

【问题讨论】:

    标签: python computer-vision dataset object-detection fiftyone


    【解决方案1】:

    最简单的方法是使用FiftyOne 在一个简单的 Python 循环中迭代您的数据集,使用 OpenCV 和 Numpy 格式化对象实例的图像并将其写入磁盘。

    例如,此函数将接收 FiftyOne 样本的任何集合(ViewDataset)并将所有对象实例写入磁盘中由类标签分隔的文件夹中:

    import os
    
    import cv2
    import numpy as np
    
    def extract_classwise_instances(samples, output_dir, label_field, ext=".png"):
        print("Extracting object instances...")
        for sample in samples.iter_samples(progress=True):
            img = cv2.imread(sample.filepath)
            img_h,img_w,c = img.shape
            for det in sample[label_field].detections:
                mask = det.mask
                [x,y,w,h] = det.bounding_box
                x = int(x * img_w)
                y = int(y * img_h)
                h, w = mask.shape
                mask_img = img[y:y+h, x:x+w, :] 
                alpha = mask.astype(np.uint8)*255
                alpha = np.expand_dims(alpha, 2)
                mask_img = np.concatenate((mask_img, alpha), axis=2)
        
                label = det.label
                label_dir = os.path.join(output_dir, label)
                if not os.path.exists(label_dir):
                    os.mkdir(label_dir)
                output_filepath = os.path.join(label_dir, det.id+ext)
                cv2.imwrite(output_filepath, mask_img)
    

    这是一个完整的示例,它加载 COCO2017 数据集的子集并将所有“人”实例写入磁盘:

    import fiftyone as fo
    import fiftyone.zoo as foz
    from fiftyone import ViewField as F
    
    dataset_name = "coco-image-example"
    if dataset_name in fo.list_datasets():
        fo.delete_dataset(dataset_name)
    
    label_field = "ground_truth"
    classes = ["person"]
    
    dataset = foz.load_zoo_dataset(
        "coco-2017",
        split="validation",
        label_types=["segmentations"],
        classes=classes,
        max_samples=20,
        label_field=label_field,
        dataset_name=dataset_name,
    )
    
    view = dataset.filter_labels(label_field, F("label").is_in(classes))
    
    output_dir = "/path/to/output/segmentations/dir/"
    os.makedirs(output_dir, exist_ok=True)
    
    extract_classwise_instances(view, output_dir, label_field)
    

    如果此功能将被定期使用,那么为这种格式写一个custom dataset exporter 可能会很有用。

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2020-07-18
      • 2021-12-11
      • 1970-01-01
      • 2021-03-28
      • 2018-11-21
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      相关资源
      最近更新 更多