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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:21:33