技术博客丨动手实践系列:CV语义宰割!

作者:游璐颖,福州大学,Datawhale成员 图象宰割是计算机视觉中除了分类和检测外的另一项基本任务,它意味着要将图片根据内容宰割成不同的块。相比图象分类和检测,宰割是一项更精细的工作,因为需要对每一个像素点分类。如下图的街景宰割,由于对每一个像素点都分类,物体的轮廓是精准勾勒的,而不是像检测那样给出边界框。图象宰割可以分为以下三个子领域:语义宰割、实例宰割、全景宰割。 由对比图可发现,语义宰割是从像素层次来识别图象,为图象中的每一个像素制定类型标记,目前广泛应用于医学图象和无人驾驶等;实例宰割相对

作者:游璐颖,福州大学,Datawhale成员 

图象宰割是计算机视觉中除了分类和检测外的另一项基本任务,它意味着要将图片根据内容宰割成不同的块。相比图象分类和检测,宰割是一项更精细的工作,因为需要对每一个像素点分类。

如下图的街景宰割,由于对每一个像素点都分类,物体的轮廓是精准勾勒的,而不是像检测那样给出边界框。

技术博客丨动手实践系列:CV语义宰割!图象宰割可以分为以下三个子领域:语义宰割、实例宰割、全景宰割。 

技术博客丨动手实践系列:CV语义宰割!

由对比图可发现,语义宰割是从像素层次来识别图象,为图象中的每一个像素制定类型标记,目前广泛应用于医学图象和无人驾驶等;实例宰割相对更具有挑战性,不仅需要正确检测图象中的目标,同时还要精确的宰割每一个实例;全景宰割综合了两个任务,要求图象中的每一个像素点都必须被分配给一个语义标签和一个实例id。

01 语义宰割中的关键步骤

在进行网络训练时,时常需要对语义标签图或是实例宰割图进行预处理。如对于一张彩色的标签图,通过颜色映照表得到每种颜色所代表的类型,再将其转换成相应的掩膜或Onehot编码完成训练。这里将会对于其中的关键步骤进行讲解。

首先,以语义宰割任务为例,介绍标签的不同表达形式。

1.1 语义标签图

语义宰割数据集中包括原图和语义标签图,两者的尺寸大小相同,均为RGB图象。

在标签图象中,白色和黑色分别代表边框和背景,而其他不同颜色代表不同的类型:

技术博客丨动手实践系列:CV语义宰割!

1.2 单通道掩膜

每一个标签的RGB值与各自的标注类型对应,则可以很容易地查找标签中每一个像素的类型索引,生成单通道掩膜Mask。

如下面这种图,标注类型包括:Person、Purse、Plants、Sidewalk、Building。将语义标签图转换为单通道掩膜后为右图所示,尺寸大小不变,但通道数由3变为1。

技术博客丨动手实践系列:CV语义宰割!

每一个像素点位置一一对应。

技术博客丨动手实践系列:CV语义宰割! 

1.3 Onehot编码

Onehot作为一种编码方式,可以对每一个单通道掩膜进行编码。

比如对于上述掩膜图Mask,图象尺寸为,标签类型共有5类,我们需要将这个Mask变为一个5个通道的Onehot输出,尺寸为,也就是将掩膜中值全为1的像素点抽取出生成一个图,相应位置置为1,其余为0。再将全为2的抽取出再生成一个图,相应位置置为1,其余为0,以此类推。

技术博客丨动手实践系列:CV语义宰割!

02 语义宰割实践

接下来以Pascal VOC 2012语义宰割数据集为例,介绍不同表达形式之间应该如何相互转换。

实践采用的是Pascal VOC 2012语义宰割数据集,它是语义宰割任务中十分重要的数据集,有 20 类目标,这些目标包括人类、机动车类以及其他类,可用于目标类型或背景的宰割。

数据集开源地址:

https://gas.graviti.cn/dataset/yluy/VOC2012Segmentation

2.1 数据集读取

本次使用格物钛数据平台服务来完成数据集的在线读取,平台支持多种数据集类型,且提供了很多公开数据集便于使用。在使用之前先进行一些必要的准备工作:

Fork数据集:如果需要使用公开数据集,则需要将其先fork到自己的账户。获取AccessKey:获取使用SDK与格物钛数据平台交互所需的密钥,链接为https://gas.graviti.cn/tensorbay/developer理解Segment:数据集的进一步划分,如VOC数据集分成了“train”和“test”两个部分。import os
from tensorbay import GAS
from tensorbay.dataset import Data, Dataset
from tensorbay.label import InstanceMask, SemanticMask
from PIL import Image
import numpy as np
import torchvision
import matplotlib.pyplot as plt

ACCESS_KEY = “<YOUR_ACCESSKEY>”
gas = GAS(ACCESS_KEY)

def read_voc_images(is_train=True, index=0):
    “””
read voc image using tensorbay
    “””
    dataset = Dataset(“VOC2012Segmentation”, gas)
    if is_train:
        segment = dataset[“train”]
    else:
        segment = dataset[“test”]

    data = segment[index]
    feature = Image.open(data.open()).convert(“RGB”)
    label = Image.open(data.label.semantic_mask.open()).convert(“RGB”)
    visualize(feature, label)

    return feature, label  # PIL Image

def visualize(feature, label):
    “””
visualize feature and label
    “””
    fig = plt.figure()
    ax = fig.add_subplot(121)  # 第一个子图
    ax.imshow(feature)
    ax2 = fig.add_subplot(122)  # 第二个子图
    ax2.imshow(label)
    plt.show()

train_feature, train_label = read_voc_images(is_train=True, index=10)
train_label = np.array(train_label) # (375, 500, 3)

技术博客丨动手实践系列:CV语义宰割!

2.2 颜色映照表

在得到彩色语义标签图后,则可以构建一个颜色表映照,列出标签中每一个RGB颜色的值及其标注的类型。

def colormap_voc():
    “””
create a colormap
    “””
    colormap = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0],
                    [0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128],
                    [64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0],
                    [64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128],
                    [0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0],
                    [0, 64, 128]]

    classes = [‘background’, ‘aeroplane’, ‘bicycle’, ‘bird’, ‘boat’,
                   ‘bottle’, ‘bus’, ‘car’, ‘cat’, ‘chair’, ‘cow’,
                   ‘diningtable’, ‘dog’, ‘horse’, ‘motorbike’, ‘person’,
                   ‘potted plant’, ‘sheep’, ‘sofa’, ‘train’, ‘tv/monitor’]

    return colormap, class

2.3 Label与Onehot转换

根据映照表,实现语义标签图与Onehot编码的相互转换:

def label_to_onehot(label, colormap):
    “””
Converts a segmentation label (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 colormap:
        equality = np.equal(label, 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_label(semantic_map, colormap):
    “””
Converts a mask (H, W, K) to (H, W, C)
    “””
    x = np.argmax(semantic_map, axis=-1)
    colour_codes = np.array(colormap)
    label = np.uint8(colour_codes[x.astype(np.uint8)])
    return label

colormap, classes = colormap_voc()
semantic_map = mask_to_onehot(train_label, colormap)
print(semantic_map.shape)  # [H, W, K] = [375, 500, 21] 包括背景共21个类型

label = onehot_to_label(semantic_map, colormap)
print(label.shape) # [H, W, K] = [375, 500, 3]

2.4 Onehot与Mask转换

同样,借助映照表,实现单通道掩膜Mask与Onehot编码的相互转换:

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

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

    “””
    semantic_map = [mask == i for i in range(num_classes)]
    return np.array(semantic_map).astype(np.uint8)

mask = onehot2mask(semantic_map.transpose(2,0,1))
print(np.unique(mask)) # [ 0  1 15] 索引相对应的是背景、飞机、人
print(mask.shape) # (375, 500)

semantic_map = mask2onehot(mask, len(colormap))
print(semantic_map.shape) # (21, 375, 500)

更多信息请访问格物钛官网

原创文章,作者:格物钛Graviti,如若转载,请注明出处:https://www.iaiol.com/news/ji-shu-bo-ke-gun-dong-shou-shi-jian-xi-lie-cv-yu-yi-zai-ge/

(0)
上一篇 2022年 1月 11日 上午9:35
下一篇 2022年 1月 11日 上午9:43

相关推荐

  • 性能提升、成本降低,这是分布式强化进修算法最新研究进展

    深度强化进修(Deep Reinforcement Learning,DRL)是一种公认的解决连续决策问题的有效技术。为了应对 DRL 的数据低效(data inefficiency)问题,受到分布式机器进修技术的启发,分布式深度强化进修 (distributed deep reinforcement learning,DDRL) 已提出并成功应用于盘算机视觉和自然语言处理领域。有观点认为,分布式强化进修是深度强化进修走向大规模应用、解决复杂决策空间和长期规划问题的必经之路。分布式强化进修是一个综合的研究子领域,需

    2024年 2月 15日
  • HAOMO AI DAY官宣定档,年末AI主动驾技术盛筵即将上演

    今日好消息,毫末智行HAOMO AI DAY定档12月23日! 特斯拉AI DAY后,中国AI主动驾驭领域也有了自己的AI主动驾驭技术盛筵!在即将过去的2021年中,毫末智行惊喜不断,三次品牌开放日接连带来Pre-A轮融资、全球首个L4无人车工厂、主动驾驭三定律、NOH 智慧领航辅佐驾驭零碎、全球算力最高的可量产主动驾驭计算平台ICU3.0等众多惊爆人眼球的业务及产品发布,特别是辅佐驾驭用户行驶里程仅150天即突破200万公里、辅佐驾驭零碎3年落地乘用车超100万台的成绩及目标,更是让人们看到了主动驾驭技术大规模量

    2021年 12月 14日
  • 何为多标签分类?这里有几种实用的经典办法

    这可能是最实用的多标签分类小贴士。

    2021年 10月 12日
  • 手把手教你,从零开始实现一个稀少混合大师架构语言模型(MoE)

    本文介绍了实现一个稀少混合大师语言模型(MoE)的方法,详细解释了模型的实施过程,包括采用稀少混合大师取代传统的前馈神经网络,实现 top-k 门控和带噪声的 top-k 门控,以及采用 Kaiming He 初始化技术。作者还说明了从 makemore 架构保持不变的元素,比如数据集处理、分词预处理和语言建模任务。最后还提供了一个 GitHub 仓库链接,用于实现模型的整个过程,是一本不可多得的实战教科书。内容简介在混合大师模型 Mixtral 发布后,混合大师模型(MoE)越来越受到人们的关注。在稀少化的混合专

    2024年 2月 16日
  • 量子力学与机械进修相结合,展望低温下的化学反应

    编辑/凯霞在低温下从氧化物中提炼金属不仅对于钢铁等金属的生产至关重要,而且对回收利用也必不可少。但当前的提炼过程是碳密集型的,会排放大量温室气体。钻研人员一直在探索开发「更绿色」的工艺法子。第一性道理理论的自下而上的计较过程设想,将是一个有吸引力的替代方案,但迄今为止尚未实现。来自哥伦比亚大学的钻研团队开发了一种新的计较技术,将量子力学和机械进修相结合,可准确展望金属氧化物对其「贱金属」的复原温度。该法子在计较上与常规计较一样有效,并且在测试中,比利用量子化学法子对温度效应的计较要求高的模拟更准确。该钻研以「Aug

    2021年 12月 13日
  • 详解AI加速器(三):架构基础离不开ISA、可重构处置惩罚器……

    在上一篇文章中,前苹果工程师、普林斯顿大学博士 Adi Fuchs 解释了为什么现在是 AI 加速器的黄金时代。在这篇文章中,我们将聚焦 AI 加速器的秘密基石——指令集架构 ISA、可重构处置惩罚器等。

    2022年 2月 13日
  • 归一化提高预训练、缓解梯度不匹配,Facebook的模型超越GPT-3

    来自 Facebook AI 的研究者提出了 NormFormer,该模型能够更快地达到目标预训练的蛊惑度,更好地实现预训练蛊惑度和下游义务功能。

    2021年 10月 27日
  • 英特尔 AI 100 Connect Day 大消费专场︱大消费变革背后的 AI 革新

    3月24日,英特尔 AI 百佳革新激励计划系列中心活动2021 AI 100 Connect Day 大消费专场在上海浦东新区浦发银行张江科技支行举行。大消费专场由英特尔联合浦发银行、上海市人工智能行业协会主办,由中关村融创企业开放革新促进会、德勤咨询(深圳)有限公司、机器之心,张江-英特尔联合革新中心协办。汇聚英特尔技能专家、财产领袖、顶级投资机构代表、大企业场景提供方、AI 百佳及生态合作伙伴,在“AI+大消费”的技能背景下,共同探讨大消费变革背后的革新和财产落地。上海浦东发展银行股份有

    2021年 3月 25日
  • 技术博客丨原来模型训练可以不用标注?一文全解四大机械进修法子

    本文将用通俗的方式,为大家介绍耳熟能详却分辨不清的四个机械进修核心概念:监视式进修、半监视进修、非监视进修和自监视进修,并将用实例简介它们试图解决的问题。

    2022年 1月 11日

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注