通过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
相关产品推荐
相关产品推荐

