动手学深度学习(Pytorch版)代码实践 -计算机视觉-46语义分割和数据集

46语义分割和数据集

在这里插入图片描述

# 图像分割和实例分割
"""
图像分割将图像划分为若干组成区域,这类问题的方法通常利用图像中像素之间的相关性。
它在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区域具有我们希望得到的语义。
图像分割可能会将狗分为两个区域:一个覆盖以黑色为主的嘴和眼睛,另一个覆盖以黄色为主的其余部分身体。实例分割也叫同时检测并分割(simultaneous detection and segmentation),
它研究如何识别图像中各个目标实例的像素级区域。
与语义分割不同,实例分割不仅需要区分语义,还要区分不同的目标实例。
例如,如果图像中有两条狗,则实例分割需要区分像素属于的两条狗中的哪一条。
"""
# Pascal VOC2012 语义分割数据集
# URL:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/ 
import os
import torch
import torchvision
from d2l import torch as d2l
import matplotlib.pyplot as plt#@save
# d2l.DATA_HUB['voc2012'] = (d2l.DATA_URL + 'VOCtrainval_11-May-2012.tar',
#                            '4e443f8a2eca6b1dac8a6c57641b67dd40621a49')# voc_dir = d2l.download_extract('voc2012', 'VOCdevkit/VOC2012')voc_dir = '../data/VOCdevkit/VOC2012'#@save
def read_voc_images(voc_dir, is_train=True):"""将所有输入的图像和标签读入内存"""txt_fname = os.path.join(voc_dir, 'ImageSets', 'Segmentation','train.txt' if is_train else 'val.txt')# 设置读取图像的模式为 RGB 模式mode = torchvision.io.image.ImageReadMode.RGB# 打开包含图像文件名的文本文件,并读取其中的所有文件名with open(txt_fname, 'r') as f:images = f.read().split()# 初始化存储特征图像(features)和标签图像(labels)的列表features, labels = [], []# 遍历每一个图像文件名for i, fname in enumerate(images):# 读取图像文件,并将其添加到 features 列表中features.append(torchvision.io.read_image( # 图像文件默认模式读取方式为RGBos.path.join(voc_dir, 'JPEGImages', f'{fname}.jpg')))# 读取标签文件(使用 RGB 模式),并将其添加到 labels 列表中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)# 设置要处理的图像数量为5
n = 5
# 从 train_features 中取前 n 个图像,从 train_labels 中取前 n 个标签,并将它们组合成一个列表
imgs = train_features[0:n] + train_labels[0:n]
# 对列表中的每个图像进行 permute 操作,将每个图像的维度从 (C, H, W) 变换为 (H, W, C)
# 这样做是为了将图像的通道维度移到最后,从而满足图像显示函数的输入要求。
imgs = [img.permute(1,2,0) for img in imgs]
# 使用 d2l.show_images 函数显示这些图像,布局为2行 n列
d2l.show_images(imgs, 2, n)
plt.show()# 列举RGB颜色值和类名
#@save
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']#@save
def voc_colormap2label():"""构建从RGB到VOC类别索引的映射"""colormap2label = torch.zeros(256 ** 3, dtype=torch.long)# enumerate 是 Python 内置函数之一,# 用于遍历可迭代对象(如列表、元组或字符串)时同时获取元素的索引和值for i, colormap in enumerate(VOC_COLORMAP):colormap2label[(colormap[0] * 256 + colormap[1]) * 256 + colormap[2]] = ireturn colormap2label#@save
def 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[0], voc_colormap2label())
# print(y[105:115, 130:140])
# print(VOC_CLASSES[1])
"""
tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],[0, 0, 0, 0, 0, 0, 0, 1, 1, 1],[0, 0, 0, 0, 0, 0, 1, 1, 1, 1],[0, 0, 0, 0, 0, 1, 1, 1, 1, 1],[0, 0, 0, 0, 0, 1, 1, 1, 1, 1],[0, 0, 0, 0, 1, 1, 1, 1, 1, 1],[0, 0, 0, 0, 0, 1, 1, 1, 1, 1],[0, 0, 0, 0, 0, 1, 1, 1, 1, 1],[0, 0, 0, 0, 0, 0, 1, 1, 1, 1],[0, 0, 0, 0, 0, 0, 0, 0, 1, 1]])
aeroplane
"""# 预处理数据
#@save
# 将图像裁剪为固定尺寸,而不是再缩放
# 使用图像增广中的随机裁剪,裁剪输入图像和标签的相同区域
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) # 便于展示
"""
imgs = [0, 1, 2, 3, 4, 5]
result = imgs[::2] + imgs[1::2]
# imgs[::2] 返回 [0, 2, 4]
# imgs[1::2] 返回 [1, 3, 5]
# result 将这两个子列表连接起来,返回 [0, 2, 4, 1, 3, 5]
"""
plt.show()#@save
class VOCSegDataset(torch.utils.data.Dataset):"""一个用于加载VOC数据集的自定义数据集"""def __init__(self, is_train, crop_size, voc_dir):# 定义标准化转换,使用 ImageNet 数据集的均值和标准差self.transform = torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])self.crop_size = crop_size   # 保存裁剪尺寸# 读取 VOC 数据集中的图像和标签features, 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):# 将图像标准化:将图像的像素值从 [0, 255] 缩放到 [0, 1] 然后应用标准化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)# 分别创建训练集和测试集的实例
crop_size = (320, 480)
voc_train = VOCSegDataset(True, crop_size, voc_dir)
voc_test = VOCSegDataset(False, crop_size, voc_dir)
# read 1114 examples
# read 1078 examples# 定义训练集的迭代器
batch_size = 64
train_iter = torch.utils.data.DataLoader(voc_train, batch_size, shuffle=True,drop_last=True,num_workers=0)
for X, Y in train_iter:print(X.shape)print(Y.shape)break
# torch.Size([64, 3, 320, 480])
# torch.Size([64, 320, 480])# 整合所有组件
#@save
def load_data_voc(batch_size, crop_size):"""加载VOC语义分割数据集"""voc_dir = '../data/VOCdevkit/VOC2012'num_workers = 4train_iter = torch.utils.data.DataLoader(VOCSegDataset(True, crop_size, voc_dir), batch_size,shuffle=True, drop_last=True, num_workers=num_workers)test_iter = torch.utils.data.DataLoader(VOCSegDataset(False, crop_size, voc_dir), batch_size,drop_last=True, num_workers=num_workers)return train_iter, test_iter

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业im(即时通讯)作为安全专属的移动数字化平台的重要工具

企业IM即时通讯作为安全专属的移动数字化平台的重要工具,正在越来越多的企业中发挥着重要的作用。随着移动技术和数字化转型的发展,企业对于安全、高效的内部沟通和协作工具的需求也越来越迫切。本文将探讨企业IM即时通讯作为安全专属的移动数字化平台的…

JAVA学习笔记-JAVA基础语法-DAY19-File类、递归

第一章 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。 1.2 构造方法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。public File(St…

【Science重磅】以纳米级分辨率重建的人类大脑皮层颗粒片段

翻查五月的Science发现一个有意思的项目《A petavoxel fragment of human cerebral cortex reconstructed at nanoscale resolution》由美国哈佛大学Jeff W. Lichtman 和美国谷歌研究中心 Viren Jain 共同合作 据介绍,充分了解人类大脑是如何工作的机理&#xff0c…

[Redis]主从模式

启动主从复制 由于我们只有一台机器,所以我们只能在机器上开多个redis程序来演示不同的机器 因为一个端口号只能被一个进程绑定,所以我们需要修改配置,绑定不同的端口号,并且还要修改工作目录(数据持久化的位置&#…

七天速通javaSE:第六天 对象:类与对象

文章目录 前言一、认识对象1. 编程思想1.1 面向过程1.2 面向对象 2. 面向对象编程(oop) 二、再识方法1. 修饰符2. 参数的传递与赋值2.1 值传递2.2 引用传递 总结: 三、创建与初始化对象1. 类与对象的关系2. 创建与初始化对象 四、构造函数1. …

Debugging using Visual Studio Code

One of the key features of Visual Studio Code is its great debugging support. VS Code’s built-in debugger helps accelerate your edit, compile, and debug loop. Debugger extensions VS Code 内置了对 Node.js 运行时的调试支持,可以调试 JavaScript、TypeScript…

DarkGPT:基于GPT-4-200k设计的人工智能OSINT助手

关于DarkGPT DarkGPT是一款功能强大的人工智能安全助手,该工具基于GPT-4-200k设计并实现其功能,可以帮助广大研究人员针对泄露数据库进行安全分析和数据查询相关的OSINT操作。 工具要求 openai1.13.3 requests python-dotenv pydantic1.10.12 工具安装 …

Echarts地图实现:杭州市困难人数分布【动画滚动播放】

Echarts地图实现:杭州市困难人数分布 实现功能 杭州市地区以及散点图分布结合的形式数据展示动画轮播可进去杭州市下级地区可返回杭州市地图展示 效果预览 实现思路 使用ECharts的地图和散点图功能结合实现地区分布通过动画轮播展示数据变化实现下级地区数据的展…

【Python】已解决ModuleNotFoundError: No module named ‘tensorflow‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决ModuleNotFoundError: No module named ‘tensorflow‘ 一、分析问题背景 ModuleNotFoundError: No module named ‘tensorflow’ 是一个常见的错误,通常在Pytho…

汽车电子工程师入门系列——汽车操作系统架构学习研究-AUTOSAR

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

chrome.storage.local.set 未生效

之前chrome.storage.local.set 和 get 一直不起作用 使用以下代码运行成功。 chrome.storage.local.set({ pageState: "main" }).then(() > {console.log("Value is set");});chrome.storage.local.get(["pageState"]).then((result) > …

有了文章生成器,轻易满足你对文章的需求

写文章对于大多数人来说并不轻松,往往一篇文章写作完成是需要消耗一个人的大量时间与精力的,如果想要写的文章特别好,那么还要再花一点时间去进入后期的修改。就没有什么方法让大家轻易的去完成文章写作吗?答案是有的,…

将 Cohere 与 Elasticsearch 结合使用

本教程中的说明向你展示了如何使用推理 API 使用 Cohere 计算嵌入并将其存储起来,以便在 Elasticsearch 中进行高效的向量或混合搜索。本教程将使用 Python Elasticsearch 客户端执行操作。 你将学习如何: 使用 Cohere 服务为文本嵌入创建推理端点&…

【python刷题】【深基5.例5】旗鼓相当的对手

题目描述 算法思路 用二维数组data存放成绩数据。双重循环遍历所有的组合,因为自己不能和自己比,所以要注意内层遍历的起始位置。新建一个数组用来得出各个科目的分差,便于代码的书写。由于分差计算出来会出现负数,所以比较的时候…

python办公自动化之pandas

用到的库:pandas 实现效果:创建一张空白的表同时往里面插入准备好的数据 代码: import pandas # 准备好要写入的数据,字典格式 data{日期:[7.2,7.3],产品型号:[ca,ce],成交量:[500,600]} dfpandas.DataFrame(data) # 把数据写入…

学习C语言第一步:300行代码实现输出“Hello World“

学习所有语言的第一步几乎都是在控制台输出"Hello World",C语言也是如此,C语言支持结构化编程、词汇范围和递归等特性,C语言编写的代码在稍作修改或无需修改的情况下可以在多种不同的操作系统和平台上编译和运行,同时运行速度极快。…

[HBM] HBM TSV (Through Silicon Via) 结构与工艺

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 全文 3300 字。 1 概念 1.1 什么是HBM TSV 使用 TSV 堆叠多个DDR DRAM成为一块HBM, 成倍提高了存储器位宽, 一条位宽相当于高速公路的一条车道, 车道越多&#xff…

期末考试后班主任如何发布学生成绩?

期末考试成绩一出,家长们便急切地想要了解孩子的学习情况。以往,老师们需要一个个私信家长,将成绩单发送出去,这项工作既繁琐又耗时。期末之际,老师们的工作本就繁重,如何有效减轻他们的负担,让…

Prompting已死?DSPy:自动优化LLM流水线

在 LLM 应用中,如何优化一个 pipeline 的流程一直是一个比较头疼的问题。提示词作为一个预定义字符串,往往也没有很好地优化方向。本文中的 DSPy 框架或许能在实际应用中对效果优化起到一定帮助。 当前,在 LLM 的应用中,大家都在探…

Hugging Face Accelerate 两个后端的故事:FSDP 与 DeepSpeed

社区中有两个流行的零冗余优化器 (Zero Redundancy Optimizer,ZeRO)算法实现,一个来自DeepSpeed,另一个来自PyTorch。Hugging FaceAccelerate对这两者都进行了集成并通过接口暴露出来,以供最终用户在训练/微调模型时自主选择其中之…