如何从ADE20K数据集的图像分割图中提取类别数据
ADE20K分割图类别标签提取方案
你已经拿到全量类别-RGB映射表和参考素材的前提下,直接按以下流程提取即可,不需要额外训练模型:
- 前期校验
先对照你手里的类别RGB值对照表示例,确认你拿到的映射表版本和标注集匹配:ADE20K分为150类基准版、847类全量标注版两个常用版本,版本不匹配会出现大面积标签错配。
核心提取逻辑:ADE20K的分割标注图为三通道RGB编码图,每个像素的RGB取值唯一对应一个语义类别,逐像素匹配映射表即可得到全图的标签结果。
单张图标注提取代码
基于Python+PIL+Numpy实现,无额外复杂依赖:
import numpy as np from PIL import Image import csv import os # 加载RGB-类别映射表,替换为你本地的映射表路径 rgb_to_category = {} with open("你的ADE20K_RGB类别映射表路径.csv", "r", encoding="utf-8") as f: csv_reader = csv.DictReader(f) for line in csv_reader: rgb_tuple = (int(line["R"]), int(line["G"]), int(line["B"])) rgb_to_category[rgb_tuple] = line["类别名称"] # 加载分割标注图,替换为你本地的分割图路径 seg_image = Image.open("你的分割标注图路径.png").convert("RGB") seg_array = np.array(seg_image) img_h, img_w = seg_array.shape[:2] # 生成逐像素标签矩阵 label_map = np.empty((img_h, img_w), dtype=object) for rgb, cat_name in rgb_to_category.items(): match_pos = (seg_array[..., 0] == rgb[0]) & (seg_array[..., 1] == rgb[1]) & (seg_array[..., 2] == rgb[2]) label_map[match_pos] = cat_name # 输出当前图包含的所有类别 print("当前图包含的语义类别:", list(np.unique(label_map)))
批量处理全文件夹注意事项
- 文件配对规则:ADE20K官方命名规则为原始图后缀是
.jpg,对应分割标注图后缀为_seg.png,文件名前缀完全一致,批量遍历的时候直接按这个规则配对即可,不用手动整理文件对应关系。 - 性能优化:处理万张以上量级的标注时,不要用逐像素循环的写法,可以把RGB三元组转成单值哈希(计算方式:
R*256*256 + G*256 + B),用numpy向量化操作做匹配,处理速度可以提升10~20倍。 - 结果校验:先拿你手里的3~5张示例图做测试,重点核对墙面、天空、地面这类大面积区域的标签是否和示例匹配,排除通道顺序读反、映射表列名对应错误这类低级问题。
常见踩坑提醒
- 不要直接用OpenCV默认接口读取分割图:OpenCV默认以BGR通道顺序读入图片,会直接打乱RGB对应关系,导致匹配结果全错;如果一定要用OpenCV读,记得读入后做
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)通道转换。 - 记得过滤忽略区域:绝大多数版本的ADE20K映射表中,RGB值为(0,0,0)的像素属于无标注/忽略区域,统计类别、生成训练标签的时候要把这部分区域排除,不要计入有效类别。
内容的提问来源于stack exchange,提问作者Ritesh Panditi
相关产品推荐
相关产品推荐

