动手学深度学习(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.rhkb.cn/news/364692.html

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

相关文章

Java养老护理助浴陪诊小程序APP源码

💖护理助浴陪诊小程序💖 一、引言:养老新趋势🌱 在快节奏的现代生活中,养老问题逐渐成为了社会关注的焦点。如何为老年人提供便捷、贴心的服务,让他们晚年生活更加安心、舒适,是我们每个人都需…

【工具分享】SQLmap

文章目录 工具介绍安装方式环境准备安装 sqlmap 工具介绍 sqlmap 是一个非常强大的自动化 SQL 注入工具,主要用于渗透测试和安全审计。它能够检测和利用 SQL 注入漏洞,进而访问数据库服务器。 GitHub:https://github.com/sqlmapproject/sql…

【深度学习】tensorboard的使用

目前正在写一个训练框架,需要有以下几个功能: 1.保存模型 2.断点继续训练 3.加载模型 4.tensorboard 查询训练记录的功能 命令: tensorboard --logdirruns --host192.168.112.5 效果: import torch import torch.nn as nn impor…

ONLYOFFICE8.1新版本桌面编辑器测评

什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器,支持编辑处理文本文档、电子表格、演示文稿、可填写的表单、PDF,可多人在线协作,支持 AI 集成。 该套件可在 Windows、Linux、Android 和 iOS上使用,包括网页…

【three.js案例二】时空隧道

import * as THREE from ./build/three.module.js // 引入轨道控制器扩展库OrbitControls.js import { OrbitControls } from three/addons/controls/OrbitControls.js; // 引入dat.gui.js的一个类GUI import { GUI } from three/addons/libs/lil-gui.module.min.js;// 场景 co…

4、matlab双目相机标定实验

1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来,从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数(如焦距、主点、畸变等)和外部参数(如相机位置、朝向等&#xff09…

180Kg大载重多旋翼无人机技术详解

一、机体结构与材料 180Kg大载重多旋翼无人机在机体结构上采用了高强度轻量化设计。其主体框架采用航空铝合金材料,既保证了机体的结构强度,又减轻了整体重量。同时,关键部位如连接件、旋翼支撑臂等则采用碳纤维复合材料,以进一步…

2024年6月29日 每周新增游戏

图吧工具箱: 全名图拉丁吧硬件检测工具箱,是开源、免费、绿色、纯净的硬件检测工具合集,专为图钉及所有DIY爱好者制作,包含常用硬件测试和检测工具,月工JS必备! iGuzheng爱古筝iguzheng古筝是一款可以在线模拟古筝练习的软件,用户可以直接在手机上练习古筝&#xff…

Java实现RS485串口通信

博客链接地址 近期,我接到了一个任务,将报警器接入到Java项目中,而接入的方式就是通过RS485接入,本人之前可以说是对此毫无所知。不过要感谢现在的互联网,通过网络我查到了我想要知道的一切,这里记录下本次…

数据结构-分析期末选择题考点(广义表)

莫道桑榆晚 为霞尚满天 数据结构-图期末选择题 数据结构-串、数组选择题 数据结构-排序选择题 数据结构-线性表、栈、队列、二叉树合集 契子✨ 广义表&#xff1a; <1>考点一&#xff1a;基本概念 广义表的基础概念 &#xff08;1&#xff09;什么是广义表 广义表&#…

Qt开发报错:Q_INTERFACES Error: Undefined interface

1、背景 VS2019qt5.12.10 从svn拉下来的项目&#xff0c;结果报错&#xff1a; Q_INTERFACES Error: Undefined interface 之前在VS的扩展中在线安装了qt插件&#xff0c; 安装了一半&#xff0c;比较慢&#xff0c;直接强行退出了。。 后来安装了qt官网的插件。。。。 2、报…

PTA-线性表实验(JAVA)

题目1&#xff1a;Josephus环的问题及算法 【实验内容】 编程实现如下功能&#xff1a; 题意说明&#xff1a;古代某法官要判决n个犯人的死刑&#xff0c;他有一条荒唐的法律&#xff0c;将犯人站成一个圆圈&#xff0c;从第start个犯人开始数起&#xff0c;每数到第distance的…

八月份的护网行动如何参加?

护网行动背景 什么是“护网行动”&#xff1f; 指挥机构∶由公安机关统一组织的"网络安全实战攻防演习"。 护网分为两级演习∶公安部对总部&#xff0c;省厅对省级公司。 什么是“实战攻防演习” 每支队伍3-5 人组成&#xff0c;明确目标系统&#xff0c;不限制攻…

【Linux】进程信号_3

文章目录 八、进程信号2. 信号的保存3. 信号的处理 未完待续 八、进程信号 2. 信号的保存 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到…

css 滚动词云

css javascript 实现滚动词云效果 // 163css.js var radius 120; var dtr Math.PI / 180; var d 300; var mcList []; var active false; var lasta 1; var lastb 1; var distr true; var tspeed 10; var size 250; var mouseX 0; var mouseY 0; var howElliptic…

weiyang**3.控制台01

1. 搭建单群组FISCO BCOS联盟链 使用开发部署工具 build_chain.sh脚本在本地搭建一条4 节点的FISCO BCOS链&#xff0c;以Ubuntu 22.04 64bit系统为例操作。 1.1 安装依赖 sudo apt install -y openssl curl 1.2 创建操作目录, 下载安装脚本 ## 创建操作目录 cd ~ &&a…

【保姆级教程+配置源码】在VScode配置C/C++环境

目录 一、下载VScode 1. 在官网直接下载安装即可 2. 安装中文插件 二、下载C语言编译器MinGW-W64 三、配置编译器环境变量 1. 解压下载的压缩包&#xff0c;复制该文件夹下bin目录所在地址 2. 在电脑搜索环境变量并打开 3. 点击环境变量→选择系统变量里的Path→点击编…

uniapp - 微信小程序 - 自定义底部tabbar

废话不多说&#xff0c;直接行源码 这里需要的底部tabbar的图片在这里 我的资源里面呢 图片是这样的 先看成品吧 首先 - BaseApp\components\Tabbar.vue <script setup>import {ref,nextTick,watch} from "vue"// 核心 - 隐藏uniapp自带的底部tabbaruni.hi…

如何配置Redis + Rdis在IDEA中的使用

文章目录 Step1. 下载zipStep2. 修改环境变量Step3. 启动Redis服务端Step4. 启动Redis客户端Step5. IDEA中链接Redis Step1. 下载zip 下载 Redis-x64-xxx.zip压缩包&#xff0c;解压到 E 盘后&#xff0c;将文件夹重新命名为 redis 下载地址&#xff1a;Redis下载地址 Step2…

STM32F1+HAL库+FreeTOTS学习2——STM32移植FreeRTOS

STM32F1HAL库FreeTOTS学习2——STM32移植FreeRTOS 获取FreeRTOS源码创建工程窥探源码移植 上期我们认识了FreeRTOS&#xff0c;对FreeRTOS有了个初步的认识&#xff0c;这一期我们来上手移植FreeRTOS到STM32上。 获取FreeRTOS源码 进入官网&#xff1a;https://www.freertos.o…