多类分割One-hot 编码实现方式(转)

原链接:数据预处理 One-hot 编码的两种实现方式

1. 什么是 One-hot 编码

最直观的理解就是,比如说现在有三个类别 A、B、C,它们对应的标签值分别为 [1, 2, 3],如果对这三个类别使用One-hot编码,得到的结果则是,[[1, 0, 0], [0, 1, 0], [0, 0, 1]],相当于:

  • 1 被编码为 1 0 0
  • 2 被编码为 0 1 0
  • 3 被编码为 0 0 1

2. 为什么要对数据进行 One-hot 编码

分割任务中,网络模型最后的输出shape为[N, C, H, W] (以pytoch为例, 其中N为batch_size, C为预测的类别数),而我们给的的gt(ground truth)的shape一般为[H, W, 3](彩色图或rgb图)或[H, W](灰度图)。
假设我们现在的分割任务里面有5个目标需要分割,给定的gt是彩色的。则网络模型最后的输出shape为 [N, 5, H, W],这和gt的shape不匹配,在训练的时候它们两者之间不能进行损失值计算。因此,就需要使用One-hot编码对gt进行编码,将其编码为[H, W, 5],最后再对维度进行transpose即可。

编码前和编码后的变化类似图中所示(上图对应编码前,下图对应编码后)。

(图片来源:https://www.eefocus.com/communication/413211/r0)
(图片来源:https://www.eefocus.com/communication/413211/r0)

3.代码实现

3.1 方法一

mask_to_onehot用来将标签进行one-hot,onehot_to_mask用来恢复one-hot,在可视化的时候使用。

def mask_to_onehot(mask, palette):
    """
    Converts a segmentation mask (H, W, C) to (H, W, K) where the last dim is a one
    hot encoding vector, C is usually 1 or 3, and K is the number of class.
    """
    semantic_map = []
    for colour in palette:
        equality = np.equal(mask, colour)
        class_map = np.all(equality, axis=-1)
        semantic_map.append(class_map)
    semantic_map = np.stack(semantic_map, axis=-1).astype(np.float32)
    return semantic_map

def onehot_to_mask(mask, palette):
    """
    Converts a mask (H, W, K) to (H, W, C)
    """
    x = np.argmax(mask, axis=-1)
    colour_codes = np.array(palette)
    x = np.uint8(colour_codes[x.astype(np.uint8)])
    return x

方法一在使用的时候需要先定义好颜色表palette(根据自己的数据集来定义就行了)。下面演示两个例子。

假设gt是灰度图,需要分割两个目标(正常器官和肿瘤)(加上背景就是3分类任务),正常器官的灰度值为128,肿瘤的灰度值为255, 背景的灰度值为0。

palette = [[0], [128], [255]]  # 里面值的顺序不是固定的,可以按自己的要求来
# 注意:灰度图的话要确保 gt的 shape = [H, W, 1],该函数实在最后的通道维上进行映射
# 如果加载后的gt的 shape = [H, W],则需要进行通道的扩维
gt_onehot = mask_to_onehot(gt, palette)  # one-hot 后 gt的shape=[H, W, 3]

假设gt彩色图,需要分割5个目标(加上背景就是6分类任务),颜色值如下。 和灰度图的处理方法类似。

palette = [[0, 0, 0], [192, 224, 224], [128, 128, 64], [0, 192, 128], [128, 128, 192], [128, 128, 0]]
gt_onehot = mask_to_onehot(gt, palette)  # one-hot 后 gt的shape=[H, W, 6]

3.1 方法二

为了以示区别,名字不要起的一样。

def mask2onehot(mask, num_classes):
    """
    Converts a segmentation mask (H,W) to (K,H,W) where the last dim is a one
    hot encoding vector

    """
    _mask = [mask == i for i in range(num_classes)]
    return np.array(_mask).astype(np.uint8)

def onehot2mask(mask):
    """
    Converts a mask (K, H, W) to (H,W)
    """
    _mask = np.argmax(mask, axis=0).astype(np.uint8)
    return _mask

用法:如果gt是灰度图,如上面的例子,用起来就比较简单。

# 需要先指定每个类别的颜色值对应的标签
# 注意: 第一类从0开始,而不是从1开始
label2trainid = {0: 0, 128: 1, 255: 2}
gt_copy = gt.copy()
# 这一步相当于把
for k, v in label2trainid.items():
    gt_copy[gt == k] = v
gt_with_trainid = gt_copy.astype(np.uint8)

gt_onehot = mask2onehot(gt_with_trainid, 3) # one-hot 后 gt的shape=[3, H, W]

如果gt是彩色图,要先把rgb颜色值映射为标签,再进行one-hot编码,相对来说就比较繁琐了。直接用方法一就行了。

医学图像分割多目标分割(多分类)实践

二分类和多分类基本差不多,二分类的标签图像像素值处理成0和1组成的矩阵,多分类(N类)的标签图像处理成N层0和1组成的矩阵,即one-hot编码。二分类最后一层的激活函数activation是sigmoid函数,多分类的则是softmax函数。然后对应的损失函数loss分别是binary_crossentropy和categorical_crossentropy。其他的包括基本原理是相同的。

作者:馨意
链接:https://www.zhihu.com/question/319894290/answer/650175752
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345