从代码学习深度学习 - 语义分割和数据集 PyTorch版
文章目录
- 前言
- 什么是语义分割?
- 图像分割和实例分割
- Pascal VOC2012 语义分割数据集
- Pascal VOC2012 语义分割数据集介绍
- 基本信息
- 语义分割部分特点
- 数据格式
- 评价指标
- 应用价值
- 数据集获取
- 使用提示
- 辅助工具代码 (`utils_for_huitu.py`)
- 读取数据
- 预处理数据
- 自定义语义分割数据集类
- 读取数据集
- 整合所有组件
- 总结
前言
大家好!欢迎来到“从代码学习深度学习”系列。今天,我们将深入探讨计算机视觉中一个非常重要且有趣的任务——语义分割。语义分割的目标是将图像中的每个像素分配给一个特定的类别,从而实现对图像内容的像素级理解。这与目标检测(仅识别物体边界框)和图像分类(对整个图像进行单一标记)不同,语义分割提供了更精细的场景理解。
在本篇博客中,我们将:
- 理解什么是语义分割,以及它与图像分割和实例分割的区别。
- 详细了解一个经典的语义分割数据集——Pascal VOC2012。
- 通过 PyTorch 代码学习如何读取、预处理和加载这个数据集,为后续的模型训练打下坚实的基础。
让我们开始吧!
完整代码:下载链接
什么是语义分割?
语义分割(semantic segmentation)问题重点关注于如何将图像分割成属于不同语义类别的区域。与目标检测不同,语义分割可以识别并理解图像中每一个像素的内容:其语义区域的标注和预测是像素级的。下图展示了语义分割中图像有关狗、猫和背景的标签。与目标检测相比,语义分割标注的像素级的边框显然更加精细。
图像分割和实例分割
图像分割将图像划分为若干组成区域,这类问题的方法通常利用图像中像素之间的相关性。它在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区域具有我们希望得到的语义。以上图中的图像作为输入,图像分割可能会将狗分为两个区域:一个覆盖以黑色为主的嘴和眼睛,另一个覆盖以黄色为主的其余部分身体。
实例分割也叫同时检测并分割(simultaneous detection and segmentation),它研究如何识别图像中各个目标实例的像素级区域。与语义分割不同,实例分割不仅需要区分语义,还要区分不同的目标实例。例如,如果图像中有两条狗,则实例分割需要区分像素属于的两条狗中的哪一条。
Pascal VOC2012 语义分割数据集
Pascal VOC2012 语义分割数据集介绍
Pascal VOC2012 (Visual Object Classes) 是计算机视觉领域中最经典和广泛使用的数据集之一,特别在语义分割 (Semantic Segmentation) 任务中具有重要地位。
基本信息
- 全称:PASCAL Visual Object Classes Challenge 2012
- 发布机构:由英国牛津大学、微软剑桥研究院等机构联合发起
- 主要任务:目标检测、语义分割、分类等
语义分割部分特点
- 图像数量:
- 训练集:1,464张图像
- 验证集:1,449张图像
- 测试集:1,456张图像 (标签非公开)
- 总共包含11,540个可分割对象
- 类别:共21个类别,包括20个前景对象类别和1个背景类别:
- 背景 (background)
- 人 (person)
- 动物 (bird, cat, cow, dog, horse, sheep)
- 交通工具 (airplane, bicycle, boat, bus, car, motorbike, train)
- 室内物品 (bottle, chair, dining table, potted plant, sofa, tv/monitor)
数据格式
- 图像:标准JPG格式
- 分割标注:PNG格式的标签图,每个像素值对应一个类别索引
- 目录结构:
JPEGImages
:存放原始图像SegmentationClass
:存放语义分割标签,标签也采用图像格式,其尺寸和它所标注的输入图像的尺寸相同。 此外,标签中颜色相同的像素属于同一个语义类别ImageSets/Segmentation
:存放训练、验证和测试集的图像名称列表
评价指标
Pascal VOC2012使用的主要评价指标是平均交并比(mean Intersection over Union, mIoU),计算方式为:
- 对每个类别计算IoU(真实区域与预测区域的交集除以并集)
- 计算所有类别IoU的平均值
应用价值
- 基准测试:作为评估分割算法性能的重要基准
- 算法开发:FCN、DeepLab、PSPNet等经典分割网络都在此数据集上进行了测试
- 学术研究:大量语义分割相关论文都使用此数据集进行实验验证
- 预训练模型:常用于训练可迁移到其他任务的基础模型
数据集获取
可以从Pascal VOC官方网站下载完整数据集:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/
使用提示
- 由于原始训练集较小,研究中通常会使用扩展版本SBD(Semantic Boundaries Dataset),将训练样本增加到约10,000张
- 难点在于物体边界的精确分割以及不同类别之间的区分
- 适合入门语义分割任务的学习和研究
Pascal VOC2012是计算机视觉领域的经典数据集,尽管发布已有多年,但仍然是评估分割算法性能的重要标准之一。
辅助工具代码 (utils_for_huitu.py
)
为了方便地显示图像,我们通常会使用一些辅助函数。以下是 utils_for_huitu.py
文件的内容,它提供了一个 show_images
函数。
# 导入必要的包
import matplotlib.pyplot as plt # 用于创建和操作 Matplotlib 图表
from matplotlib_inline import backend_inline # 用于设置 Jupyter 中的显示格式
from IPython import display # 用于在 Jupyter 中实现动态显示功能
import torchdef show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):"""绘制图像列表参数:imgs: 要显示的图像列表num_rows: 行数num_cols: 列数titles: 每张图像的标题,默认为Nonescale: 图像缩放比例,默认为1.5返回:matplotlib的轴对象列表"""# 计算图像尺寸,根据行列数和缩放比例确定figsize = (num_cols * scale, num_rows * scale)# 创建子图fig, axes = plt.subplots(num_rows, num_cols, figsize=figsize)# 将axes数组展平成一维数组,方便遍历axes = axes.flatten()# 遍历每个图像和对应的轴对象for i, (ax, img) in enumerate(zip(axes, imgs)):if torch.is_tensor(img):# 处理PyTorch张量类型的图像,需要转换为NumPy数组ax.imshow(img.numpy())else:# 处理PIL图像或其他类型的图像ax.imshow(img)# 隐藏x轴刻度和标签ax.axes.get_xaxis().set_visible(False)# 隐藏y轴刻度和标签ax.axes.get_yaxis().set_visible(False)# 如果提供了标题,则设置对应图像的标题if titles:ax.set_title(titles[i])# 返回轴对象列表,方便后续自定义处理return axes
读取数据
我们首先编写一个函数 read_voc_images
来读取Pascal VOC2012数据集的图像和对应的语义分割标签。
import os
import torch
import torchvisiondef read_voc_images(voc_dir, is_train=True):"""读取Pascal VOC2012数据集的图像和对应的语义分割标签参数:voc_dir (str): VOC数据集根目录路径is_train (bool): 是否读取训练集数据,True表示读取训练集,False表示读取验证集返回:tuple: (features, labels)- features (list): 包含所有图像张量的列表,每个张量形状为[3, H, W]- labels (list): 包含所有标签张量的列表,每个张量形状为[1, H, W]"""# 确定读取训练集还是验证集的文件列表txt_fname = os.path.join(voc_dir, 'ImageSets', 'Segmentation','train.txt' if is_train else 'val.txt')# 设置读取模式为RGB (使用torchvision的常量)mode = torchvision.io.image.ImageReadMode.RGB# 从文本文件中读取图像文件名列表with open(txt_fname, 'r') as f:images = f.read().split() # 列表,每个元素是不带扩展名的图像文件名# 初始化特征(图像)和标签(分割掩码)列表features = [] # 将存储图像张量,每个张量形状为[3, H, W]labels = [] # 将存储标签张量,每个张量形状为[1, H, W]# 遍历所有图像文件名并读取对应的图像和标签for i, fname in enumerate(images):# 读取原始图像,形状为[3, H, W],值范围为0-255的整数image_path = os.path.join(voc_dir, 'JPEGImages', f'{fname}.jpg')image_tensor = torchvision.io.read_image(image_path)features.append(image_tensor)# 读取语义分割标签,形状为[3, H, W],值范围为0-255的整数label_path = os.path.join(voc_dir, 'SegmentationClass', f'{fname}.png')labe
相关文章:

从代码学习深度学习 - 语义分割和数据集 PyTorch版
文章目录 前言什么是语义分割?图像分割和实例分割Pascal VOC2012 语义分割数据集Pascal VOC2012 语义分割数据集介绍基本信息语义分割部分特点数据格式评价指标应用价值数据集获取使用提示辅助工具代码 (`utils_for_huitu.py`)读取数据预处理数据自定义语义分割数据集类读取数…...

4G物联网模块实现废气处理全流程数据可视化监控配置
一、项目背景 随着工业化进程的加速,工业废气的排放对环境造成了严重影响,废气处理厂应运而生。然而,废气处理厂中的设备众多且分散,传统的人工巡检和数据记录方式效率低下,难以及时发现问题。为了实现对废气处理设备…...
深圳SMT贴片加工厂制造流程解析
内容概要 作为大湾区电子制造产业链的重要节点,深圳SMT贴片加工厂凭借精密的生产体系与技术创新,构建了涵盖12道核心工序的标准化流程。从PCB基板的来料检验开始,通过全自动贴片机的高精度元件定位、SPI三维锡膏检测、智能温控回流焊接等关键…...

电商平台如何做好DDoS 攻防战?
一、新型 DDoS 攻击技术演进分析 1.1 电商平台面临的四类攻击范式 graph LR A[DDoS攻击] --> B{网络层} A --> C{应用层} B --> D[CLDAP反射攻击<br>峰值达3.5Tbps] B --> E[QUIC协议洪水攻击] C --> F[API CC攻击<br>精准打击抢购接口] C -->…...
Spark处理过程-转换算子
大家前面的课程,我们学习了Spark RDD的基础知识,知道了如何去创建RDD,那spark中具体有哪些rdd,它们有什么特点呢? 我们这节课来学习。 (一)RDD的处理过程 Spark使用Scala语言实现了RDD的API,程…...

【计算机视觉】OpenCV实战项目:Athlete-Pose-Detection 运动员姿态检测系统:基于OpenCV的实时运动分析技术
运动员姿态检测系统:基于OpenCV的实时运动分析技术 1. 项目概述1.1 技术背景1.2 项目特点 2. 技术架构与算法原理2.1 系统架构2.2 核心算法2.3 模型选择 3. 项目部署与运行指南3.1 环境准备硬件要求软件依赖 3.2 项目配置3.3 运行项目基本运行模式高级参数 4. 常见问…...
Java 性能调优全解析:从设计模式到 JVM 的 7 大核心方向实践
引言 在高并发、低延迟的技术场景中,Java 性能优化需要系统化的方法论支撑。本文基于7 大核心优化方向(复用优化、计算优化、结果集优化、资源冲突优化、算法优化、高效实现、JVM 优化),结合权威框架与真实案例,构建从…...

为什么要选择七彩喜数字康养平台?加盟后有何优势?
一.七彩喜数字康养平台 1.技术领先性 七彩喜依托“端-网-云-脑”四层技术架构,整合毫米波雷达、AI算法引擎、区块链等前沿技术,解决传统养老的隐私泄露、设备孤岛等痛点。 比如非接触式健康监测系统通过毫米波雷达实现跌倒检测准确率&#…...

【计算机视觉】OpenCV实战项目:基于OpenCV的车牌识别系统深度解析
基于OpenCV的车牌识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理1) 自适应光照补偿2) 边缘增强 2.2 车牌定位1) 颜色空间筛选2) 形态学操作3) 轮廓分析 2.3 字符分割1) 投影分析2) 连通域筛选 2.4 字符识别 3. 实战部署指南3.1 环境配置3.2 项目代码解析 4.…...

鸿蒙接入flutter环境变量配置windows-命令行或者手动配置-到项目的创建-运行demo项目
鸿蒙接入flutter环境变量配置 参考官网 下载flutter git clone https://gitcode.com/openharmony-sig/flutter_flutter.git git checkout -b dev origin/dev # 国内镜像 export PUB_HOSTED_URLhttps://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URLhttps://storage.fl…...

Flink CDC—实时数据集成框架
Flink CDC 是一个基于流的数据集成工具,旨在为用户提供一套功能更加全面的编程接口(API),它基于数据库日志的 CDC(变更数据捕获)技术实现了统一的增量和全量数据读取。 该工具使得用户能够以 YAML 配置文件…...
Redis的持久化:RDB和AOF机制
概述 Redis 提供 RDB 和 AOF 两种持久化机制,它们在数据安全性、性能、恢复速度等方面有显著差异。 为什么要进行持久化?如果是大数据量的恢复,会有下述的影响 会对数据库带来巨大的压力,数据库的性能不如Redis。导致程序响应慢…...

微调ModernBERT为大型语言模型打造高效“过滤器”
ModernBERT(2024 年 12 月)是最近发布的小型语言模型,由 Answer.AI、LightOn 和 HuggingFace 共同开发。它利用了现代优化技术,如用于 8,192 token 上下文窗口的 RoPE 和 GeGLU layers,在保持效率的同时提升性能。jina…...
数据库查询中的分页实现:Page对象与Pageable接口详解
文章目录 前言1. 分页查询的核心概念1.1 Page对象1.2 Pageable接口2. 实现代码详解2.1 实体类定义2.2 Repository接口定义2.3 服务层实现2.4 控制器层实现3. 关键点解析3.1 Pageable对象的创建3.2 Page对象的常用方法3.4 错误用法示例4.完整示例输出4.1 基本分页查询输出4.2 条…...

各大编程语言基本语法区别
1:语言特点 函数式语言和面向对象语言的区别:函数式用函数直接进行操作,面向对象用object.method()进行操作;如:len() <=> object.length() C 语言:1)C 语言可以像汇编语言一样对位、字节和地址进行操作;2)有函数原型;3)具有大量的数值类型;4)函数是C语言…...

云计算中的虚拟化:成本节省、可扩展性与灾难恢复的完美结合
云计算中虚拟化的 4 大优势 1. 成本效益 从本质上讲,虚拟化最大限度地减少了硬件蔓延。团队可以将多个虚拟机整合到单个物理主机上,而不是为每个工作负载部署单独的服务器。这大大减少了前期硬件投资和持续维护。 结果如何?更低的功耗、更低…...

【Java ee初阶】网络原理
TCP协议 1.确认应答 实现可靠传输的核心机制 2.超时重传 实现可靠传输的核心机制 3.连接管理 网络部分最高频的面试题 4.滑动窗口 提高传输效率的机制 5.流量控制 依据接收方的处理能力,限制发送方的发送速度。 6.拥塞控制 依据传输链路的处理能力,…...
MongoDB 的核心概念(文档、集合、数据库、BSON)是什么?
MongoDB 是一个面向文档的数据库,它的核心概念与传统的关系型数据库(RDBMS)有所不同。以下是它的四个主要核心概念: 文档 (Document) 定义: 文档是 MongoDB 中的基本数据单元。它类似于关系型数据库中的一行记录&#…...
Spring 事件监听机制的使用
文章目录 1. 创建自定义事件2. 发布事件3. 监听事件4. 异步事件 1. 创建自定义事件 事件可以是任意对象(Spring 4.2支持POJO),或继承ApplicationEvent(旧版)。 // 自定义事件(POJO形式,无需继…...

awesome-digital-human本地部署及配置:打造高情绪价值互动指南
在数字化交互的浪潮中,awesome-digital-human-live2d项目为我们打开了本地数字人互动的大门。结合 dify 聊天 api,并借鉴 coze 夸夸机器人的设计思路,能为用户带来充满情绪价值的交互体验。本文将详细介绍其本地部署步骤、dify 配置方法及情绪…...
WebSocket与Socket.IO实现简易客服聊天系统全解析
WebSocket结合Socket.IO实现简易客服聊天系统全解析 一、技术选型对比 技术优点缺点适用场景原生WebSocket浏览器原生支持,性能好API较底层,需手动处理断线重连等逻辑简单实时应用Socket.IO自动重连,房间管理,兼容性好体积较大&…...
[原创](现代Delphi 12指南):[macOS 64bit App开发]: 获取macOS App的Bundle路径信息.
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...
C++取时间戳窗口
应用场景 防止接口在指定的时间内重复调用,比如 10 秒内不能重复调用。 函数实现 #include <chrono>/// brief 计算当前时间戳所属时间窗口的起始点(对齐到 Window 秒的整数倍) /// param Window 时间窗口长度(单位&…...

第26节:卷积神经网络(CNN)-数据增强技术(PyTorch)
1. 引言 在深度学习领域,数据增强(Data Augmentation)是提升卷积神经网络(CNN)性能的关键技术之一。通过人为地扩展训练数据集,数据增强能够有效提高模型的泛化能力,防止过拟合,特别是在训练数据有限的情况下。本文将全面介绍PyTorch框架下的数据增强技术,包括基本原理、…...

求助求助,重金酬谢
如图,我先在服务器上运行一个 dock 容器,然后用 nohup 命令把 auto_run.py 程序挂起,然后我查了一下是在 12 端口运行的,这时候我关闭命令窗口,我再重新打开运行 docker 容器就找不到挂起的进程了!这是为什…...
【生产实践】Dolphinscheduler集群部署后Web控制台不能登录问题解决
太长不看版 问题描述: Dolphinscheduler按生产手册使用一键脚本集群部署后,控制台登录页面可以打开,但使用默认账户怎么都登录不进去,尝试在数据库中清理登录用户字段,发现数据库中并没有相关用户字段,而后…...
【东枫科技】使用LabVIEW进行深度学习开发
文章目录 DeepLTK LabVIEW深度学习工具包LabVIEW中的深度神经网络**功能与特性****功能亮点:** **支持的网络层****支持的网络架构****参考示例** 授权售价 DeepLTK LabVIEW深度学习工具包 LabVIEW中的深度神经网络 功能亮点: 在 LabVIEW 中创建、配置…...
PYTHON训练营DAY25
BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型,例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐:捕获所有类型的异常&…...

Axure :基于中继器的列表删除 、 列表编辑
文章目录 I 列表删除思路操作说明II 列表编辑功能思路修改按钮的交互操作说明编辑页面的保存按钮交互设置取消标记I 列表删除 思路 中继器删除行交互事件; 操作说明 在操作列中添加删除标签,同步添加鼠标点击交互事件 在交互事件中插入中继器删除行动作 多选删除,勾选已标…...

基于GPUGEEK 平台进行深度学习
一、平台简介 GPUGEEK 是一个专注于提供 GPU 算力租赁服务的平台,在人工智能与深度学习领域为用户搭建起便捷的算力桥梁。它整合了丰富多样的 GPU 资源,涵盖 RTX - 4090、RTX - 3090、A100 - PCIE 等多种型号,满足不同用户在模型训练、数据处…...