You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过FiftyOne调用OpenImages V7无法加载Drawing和Painting类求助

解决OpenImages V7在FiftyOne中无法加载Drawing/Painting类的问题

问题原因

OpenImages网页端的类别筛选基于视觉层级分类(Visual Hierarchy),Drawing和Painting是层级中的父类别,本身没有直接的图像标注;而FiftyOne的fo.utils.openimages.get_classes()返回的是数据集的原始标注叶节点类别——这些是实际标注在图像上的具体子类(比如Oil painting、Pencil drawing等),父类名称不在原始类别列表里,所以直接使用会被判定为无效。

解决方案

要获取属于Drawing或Painting类的图像,需要先找到这两个父类对应的所有子类别,再用这些子类加载数据集,最后可按需统一映射到父类标签。

步骤1:获取父类对应的所有子类别

import fiftyone as fo

# 获取OpenImages V7的类别层级结构
hierarchy = fo.utils.openimages.get_class_hierarchy(version='v7')

# 定位Painting和Drawing的层级节点
painting_node = hierarchy["Painting"]
drawing_node = hierarchy["Drawing"]

# 获取两个父类下的所有子类别(包含自身若有标注的情况)
painting_classes = painting_node.get_descendant_classes(include_self=True)
drawing_classes = drawing_node.get_descendant_classes(include_self=True)

# 合并目标类别列表
target_classes = list(set(painting_classes + drawing_classes))

步骤2:用子类列表加载数据集

import fiftyone.zoo as foz

dataset = foz.load_zoo_dataset(
    "open-images-v7",
    split="validation",
    label_types=["classifications"],
    classes=target_classes,
    max_samples=100,
)

步骤3:(可选)将子类标签统一映射为父类

如果需要把所有子类标签统一成Painting或Drawing,方便后续任务处理:

# 构建子类到父类的映射表
class_map = {}
for cls in painting_classes:
    class_map[cls] = "Painting"
for cls in drawing_classes:
    class_map[cls] = "Drawing"

# 遍历数据集更新标签
for sample in dataset:
    if sample.ground_truth:
        # 单分类场景处理逻辑,多分类可循环处理labels字段
        sample.ground_truth.label = class_map.get(sample.ground_truth.label, sample.ground_truth.label)
        sample.save()

验证

运行代码后,通过FiftyOne App查看数据集,所有图像的分类标签都会属于Drawing或Painting的子类(或已映射为父类),符合区分照片与手绘作品的需求。

内容的提问来源于stack exchange,提问作者Kaven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:36:12