038、语义分割

news/2025/3/31 13:40:51/

之——介绍与数据集

杂谈

        语义分割,语义分割(Semantic Segmentation)方法-CSDN博客:

        语义分割是计算机视觉领域的一项重要任务,旨在将图像中的每个像素分配到其对应的语义类别中。与物体检测或图像分类不同,语义分割不仅要识别图像中的对象,还要为每个像素标注其语义类别,实现对图像的细粒度理解。

        在语义分割中,每个像素都被赋予一个标签,表示该像素属于图像中的哪个语义类别,例如人、车、道路、树等。这使得语义分割成为深度学习在医学图像分析、自动驾驶、农业图像处理等领域中的关键技术之一。

        常见的语义分割方法包括基于卷积神经网络(CNN)的深度学习方法。这些方法通常使用编码器-解码器结构,通过学习图像的高级特征来实现像素级别的分类。语义分割在许多应用中都有广泛的用途,如交通场景理解、医学图像分析、卫星图像解释等。


正文

1.语义分割

        像素级的分割:

        一般的分割只是对类似样式像素进行聚类,而语义分割在此基础上还加入了对这个类别的理解。


2.应用

        背景虚化:

        道路分割:

         另外还有一个进化版,在语义分割上升级为对每个实例都有区分:


3.数据集

        Pascal VOC2012数据集:

d2l.DATA_HUB['voc2012'] = (d2l.DATA_URL + 'VOCtrainval_11-May-2012.tar','4e443f8a2eca6b1dac8a6c57641b67dd40621a49')voc_dir = d2l.download_extract('voc2012', 'VOCdevkit/VOC2012')

        读取,依次把图片和对应的标号读进来:

def read_voc_images(voc_dir, is_train=True):"""读取所有VOC图像并标注"""txt_fname = os.path.join(voc_dir, 'ImageSets', 'Segmentation','train.txt' if is_train else 'val.txt')mode = torchvision.io.image.ImageReadMode.RGBwith open(txt_fname, 'r') as f:images = f.read().split()features, labels = [], []for i, fname in enumerate(images):features.append(torchvision.io.read_image(os.path.join(voc_dir, 'JPEGImages', f'{fname}.jpg')))labels.append(torchvision.io.read_image(os.path.join(voc_dir, 'SegmentationClass' ,f'{fname}.png'), mode))return features, labelstrain_features, train_labels = read_voc_images(voc_dir, True)

        展示:

n = 5
imgs = train_features[0:n] + train_labels[0:n]
imgs = [img.permute(1,2,0) for img in imgs]
d2l.show_images(imgs, 2, n);

        列举颜色和类别名:

VOC_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]]#@save
VOC_CLASSES = ['background', 'aeroplane', 'bicycle', 'bird', 'boat','bottle', 'bus', 'car', 'cat', 'chair', 'cow','diningtable', 'dog', 'horse', 'motorbike', 'person','potted plant', 'sheep', 'sofa', 'train', 'tv/monitor']

        通过以上定义的两个常量,可以方便地查找标签中每个像素的类索引。

        通过创造个colormap,可能的颜色组合就是256^3,然后进行三通道颜色的融合计算与类别数一一映射上:

def voc_colormap2label():"""构建从RGB到VOC类别索引的映射"""colormap2label = torch.zeros(256 ** 3, dtype=torch.long)for i, colormap in enumerate(VOC_COLORMAP):colormap2label[(colormap[0] * 256 + colormap[1]) * 256 + colormap[2]] = ireturn colormap2labeldef voc_label_indices(colormap, colormap2label):"""将VOC标签中的RGB值映射到它们的类别索引"""colormap = colormap.permute(1, 2, 0).numpy().astype('int32')idx = ((colormap[:, :, 0] * 256 + colormap[:, :, 1]) * 256+ colormap[:, :, 2])return colormap2label[idx]

         这样就把分割颜色转换为了类别:

y = voc_label_indices(train_labels[1], voc_colormap2label())
y[190:200, 190:200], VOC_CLASSES[20]

        可见 VOC_CLASSES 和数字挂上了钩:

         随机裁剪图像:

def voc_rand_crop(feature, label, height, width):"""随机裁剪特征和标签图像"""rect = torchvision.transforms.RandomCrop.get_params(feature, (height, width))feature = torchvision.transforms.functional.crop(feature, *rect)label = torchvision.transforms.functional.crop(label, *rect)return feature, labelimgs = []
for _ in range(n):imgs += voc_rand_crop(train_features[0], train_labels[0], 200, 300)imgs = [img.permute(1, 2, 0) for img in imgs]d2l.show_images(imgs[::2] + imgs[1::2], 2, n);

        自定义语义分割数据集:

class VOCSegDataset(torch.utils.data.Dataset):"""一个用于加载VOC数据集的自定义数据集"""def __init__(self, is_train, crop_size, voc_dir):self.transform = torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])self.crop_size = crop_sizefeatures, labels = read_voc_images(voc_dir, is_train=is_train)self.features = [self.normalize_image(feature)for feature in self.filter(features)]self.labels = self.filter(labels)self.colormap2label = voc_colormap2label()print('read ' + str(len(self.features)) + ' examples')def normalize_image(self, img):return self.transform(img.float() / 255)def filter(self, imgs):return [img for img in imgs if (img.shape[1] >= self.crop_size[0] andimg.shape[2] >= self.crop_size[1])]def __getitem__(self, idx):feature, label = voc_rand_crop(self.features[idx], self.labels[idx],*self.crop_size)return (feature, voc_label_indices(label, self.colormap2label))def __len__(self):return len(self.features)

拓展

        语义分割的算法和技术在不断发展,以下是一些常见的算法和技术:

  1. 全卷积网络(Fully Convolutional Networks,FCN):这是语义分割领域中的里程碑之一。FCN将传统的卷积神经网络中的全连接层替换为全卷积层,允许输入图像尺寸与输出分割结果尺寸不同。通过上采样和跳跃连接,FCN能够生成像素级别的语义分割。

  2. U-Net:U-Net结构由编码器(收缩路径)和解码器(扩展路径)组成,通过特征提取和逐步上采样,能够在保留空间信息的同时进行语义分割,尤其在医学图像分割中应用广泛。

  3. DeepLab:DeepLab系列模型利用空洞卷积(或称为膨胀卷积)来扩大卷积操作的感受野,有助于捕获更广阔的上下文信息。DeepLab模型还使用了空间金字塔池化(Spatial Pyramid Pooling)等技术来处理多尺度信息。

  4. Mask R-CNN:这是一种结合了目标检测和语义分割的方法。它在Faster R-CNN的基础上增加了分割分支,可以同时检测和分割图像中的对象。

  5. 图卷积网络(Graph Convolutional Network,GCN):针对具有图结构的数据,如社交网络或分子结构,GCN可用于图像语义分割。它能够处理像素之间的关联信息,有助于更好地理解图像中像素之间的联系。

  6. 实例分割(Instance Segmentation):与语义分割类似,但不仅对像素进行语义标注,还能区分不同实例。Mask R-CNN是其中一个流行的实例分割方法。

        这些算法和技术的不断发展使得语义分割在医学影像、自动驾驶、农业图像处理、地理信息系统等领域中有着广泛的应用和进展。同时,结合了深度学习和传统计算机视觉技术的组合也在不断涌现,为语义分割领域带来了新的创新。

        关于yolo的分割:

        YOLOv3 及其后续版本也包含了一定程度的语义分割功能。

        虽然 YOLO 主要是用于目标检测,但YOLOv3及后续版本提供了一种称为“预测像素级别标签”的功能。这种功能允许 YOLO 模型输出对图像进行分割的结果。虽然它并不是专门用于像素级别的语义分割,但这种预测可以提供较为粗略的分割效果。


http://www.ppmy.cn/news/1227403.html

相关文章

iOS_折叠展开 FoldTextView

1. 显示效果 Test1:直接使用: Test2:在 cell 里使用: 2. 使用 2.1 直接使用 // 1.1 init view private lazy var mooFoldTextView: MOOFoldTextView {let view MOOFoldTextView(frame: .zero)view.backgroundColor .cyanvie…

Nodejs中net模块多次Socket.setTimeout无法覆盖之前函数,导致叠加执行问题解决

Hi, I’m Shendi Nodejs中net模块多次Socket.setTimeout无法覆盖之前函数,导致叠加执行问题解决 问题描述 在 Nodejs 中,net 模块的 Socket 的 setTimeout 函数是设置超时时间,如果多次设置,超时时间会是最后一次的时间&#xff…

pm2在Windows环境中的使用

pm2 进程管理工具可以Windows操作系统上运行,当一台Windows电脑上需要运行多个进程时,或者运维时需要运行多个进程以提供服务时。可以使用pm2,而不再是使用脚本。 1. 使用PM2管理进程 1.1. 启动PM2项目 1.1.1. 直接启动项目 参数说明&…

使用Spring Boot结合JustAuth实现支付宝、微信、微博扫码登录功能

使用Spring Boot结合JustAuth实现支付宝、微信、微博扫码登录功能 在使用Spring Boot结合JustAuth实现支付宝、微信、微博扫码登录功能之前,需要先确保已经配置好Spring Boot项目,并且添加了JustAuth的依赖。你可以在项目的pom.xml文件中添加如下依赖&a…

【测开求职】面试题:HR面相关的开放性问题

每一面可能都会穿插一些岗位理解的问题,有一些问题是真的挺不好回答的,最好还是提前准备一下,本篇文章总结了在面测试开发岗位中遇到的一些开放性问题👉 目录 💗如何理解测试开发💗为什么选择测试💗如何学习测试开发近期的职业规划前面面试的总结说一下你的优缺点最…

【SQL】简单博客开发代码

前几天做到一些CMS的题&#xff0c;涉及一些sql的代码审计&#xff0c;于是尝试着自己开发一个连接数据库的博客&#xff0c;加深一遍理解 简单实现了登录&#xff0c;验证&#xff0c;登出&#xff0c;目录&#xff0c;增删改查等功能 下面贴代码 conn.php <?phpsessi…

二阶低通滤波器(二阶巴特沃斯滤波器)

连续传递函数G(s) 离散传递函数G(z) 差分方程形式 二阶巴特沃斯滤波器参数设计 设计采样频率100Hz&#xff0c;截止频率33Hz。 注意&#xff1a;设计参数使用在离散系统中&#xff01; 同理&#xff0c;其他不同阶数不同类型的滤波器设计&#xff0c;如二阶高通滤波器、二阶…

JVM判断对象是否存活之引用计数法、可达性分析

目录 前言 引用计数法 概念 优点 缺点 可达性分析 概念 缺点&#xff1a; 扩展&#xff1a; 1.GC Roots 概念 2.STW (Stop the world) 前言 JVM有两种算法来判断对象是否存活&#xff0c;分别是引用计数法和可达性分析算法&#xff0c;针对可达性分析算法STW时间长、…