语义分割数据增强,图像和标签同步对应详细增强教程(附代码)

news2024/11/24 20:54:26

在这里插入图片描述

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》


在这里插入图片描述

语义分割打标签是个煎熬的过程,当我们标记一部分样本后可以通过数据增强来扩充训练样本,本教程就是针对语义分割训练样本进行扩充讲解。

如果还不会打标签,先学习一下语义分割打标签的过程,推荐两个工具:Labelme和ISAT,关于这两个工具的使用,看我以前总结的教程:使用Labelme打标签、使用ISAT打标签

目录

  • 一、数据增强优势
  • 二、数据增强方法
    • 2.1 随机缩放
    • 2.2 随机亮度调整
    • 2.3 随机翻转
    • 2.4 随机旋转
    • 2.5 随机裁剪
  • 三、代码
    • 3.1参数修改
    • 3.2 代码获取
  • 四、数据增强效果
  • 五、总结

一、数据增强优势

在语义分割任务中,数据增强是提升模型性能和泛化能力的关键步骤。通过对训练样本进行各种形式的数据增强,可以产生更多样化的训练数据,从而增强模型在不同场景下的表现。

数据增强在语义分割中的几大好处:

提升模型的泛化能力: 数据增强通过人为制造样本的多样性,减少模型对固定场景的依赖,使得模型在测试时能更好地应对真实数据的分布变化。这样可以有效避免模型在新数据上的过拟合,提升在实际应用中的表现。

补充有限数据量的不足: 语义分割标注通常需要逐像素地进行,因此数据集构建成本较高,导致训练数据量有限。数据增强可以在不增加标注工作量的情况下扩充样本量,帮助模型学习到更多的特征和模式。

增强模型的鲁棒性: 通过数据增强(如旋转、缩放、亮度调整等)模拟不同的拍摄条件,使得模型能够更好地适应各种环境因素(如光线变化、视角差异、遮挡等)。这对于户外场景、医学影像等对数据变化敏感的任务尤为重要。

改善边缘和细节的学习: 某些增强方法(如镜像、平移)有助于模型更好地学习到目标的边缘和细节。这对于语义分割中细小目标的分割有较大的帮助,可以显著提升边缘区域的预测准确度。

模拟实际场景中的干扰因素: 在工业应用、医疗影像等场景中,目标物体可能会受噪声、模糊或遮挡等影响。通过添加噪声、模糊等增强方法,能够帮助模型学会在干扰下保持对目标的识别能力。

二、数据增强方法

针对语义分割训练样本,我使用的数据增强方法主要有随机缩放、随机亮度调整、随机水平和垂直翻转、随机旋转,下面依次介绍这几种增强方法及对应的代码。

2.1 随机缩放

通过对原图像和标签图像按比例缩放,不仅增加了训练样本的多样性,还帮助模型提高对不同尺度目标的适应能力。以下是代码的解析及其原理:

# 随机缩放函数
def random_scale(image, label, scale_range=(0.8, 1.2)):
    # 1. 随机生成缩放比例
    scale = random.uniform(*scale_range)

    # 2. 获取原始图像尺寸
    height, width = image.shape[:2]

    # 3. 计算新的图像尺寸
    new_size = (int(width * scale), int(height * scale))

    # 4. 按新尺寸缩放图像
    image = cv2.resize(image, new_size, interpolation=cv2.INTER_LINEAR)
    
    # 5. 按新尺寸缩放标签图像
    label = cv2.resize(label, new_size, interpolation=cv2.INTER_NEAREST)
    
    # 6. 返回缩放后的图像和标签
    return image, label

增加数据多样性:通过在训练样本中加入不同尺度的图像,模拟出大小不同的目标对象,增强数据的多样性。

提升模型的尺度不变性:模型可以更好地适应不同尺度的输入数据,有助于提升语义分割模型对尺度变化的鲁棒性。

2.2 随机亮度调整

随机调整亮度可以模拟不同光照条件,帮助模型在光照变化的场景中保持鲁棒性。以下是代码的逐行解析及其原理:

# 随机亮度调整函数
def random_brightness(image, brightness_range=(0.7, 1.3)):
    # 1. 创建亮度增强对象
    enhancer = ImageEnhance.Brightness(Image.fromarray(image))
    
    # 2. 在指定范围内生成随机亮度因子
    brightness = random.uniform(*brightness_range)
    
    # 3. 调整图像亮度
    image = enhancer.enhance(brightness)
    
    # 4. 转换图像格式并返回
    return np.array(image)

增加数据多样性:通过引入亮度变化,使训练样本具有不同的光照条件,增加数据的多样性。

提升模型对光照不变性:模型在训练时看到不同亮度的样本,从而增强了其对光照变化的适应能力。这在真实场景中可能会遇到多种光照条件,能提升模型的泛化能力和稳健性。

2.3 随机翻转

通过随机水平和垂直翻转,可以让模型更好地识别各种翻转方向的目标,提升其对翻转不变性的适应能力。以下是逐行解析及原理说明:

def random_flip(image, label):
    # 1. 随机水平翻转
    if random.random() > 0.5:
        image = cv2.flip(image, 1)
        label = cv2.flip(label, 1)

    # 2. 随机垂直翻转
    if random.random() > 0.5:
        image = cv2.flip(image, 0)
        label = cv2.flip(label, 0)

    return image, label

增加样本多样性:通过随机水平和垂直翻转,可以使同一张图像生成多个不同方向的版本,从而丰富训练数据。

提高模型的翻转不变性:模型会在训练中学习到不同翻转方向的样本,有助于增强对目标方向变化的鲁棒性,从而在实际应用中表现更好。

2.4 随机旋转

通过随机旋转,可以让模型更好地识别不同旋转角度的目标,从而提升对旋转不变性的适应能力。以下是逐行解析及原理说明:

def random_rotation(image, label, angle_range=(-30, 30)):
    # 1. 在指定角度范围内随机生成旋转角度
    angle = random.uniform(*angle_range)
    
    # 2. 获取图像的高度和宽度
    height, width = image.shape[:2]
    
    # 3. 计算旋转矩阵
    matrix = cv2.getRotationMatrix2D((width // 2, height // 2), angle, 1)
    
    # 4. 应用旋转变换到图像
    image = cv2.warpAffine(image, matrix, (width, height), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_REFLECT)
    
    # 5. 应用旋转变换到标签
    label = cv2.warpAffine(label, matrix, (width, height), flags=cv2.INTER_NEAREST, borderMode=cv2.BORDER_REFLECT)
    
    # 6. 返回旋转后的图像和标签
    return image, label

增加样本多样性:通过旋转不同角度的图像,可以生成多个不同方向的样本,使模型对不同方向的目标具有更好的识别效果。

提高模型的旋转不变性:通过训练旋转过的样本,模型可以更好地应对旋转角度的变化,增强其泛化能力。

2.5 随机裁剪

裁剪操作能够让模型关注图像的不同局部区域,从而提升对小目标和局部特征的识别能力。下面是代码的逐行解析及其原理说明:

def random_crop(image, label, crop_size=(256, 256)):
    # 1. 获取图像的高度和宽度
    height, width = image.shape[:2]
    crop_h, crop_w = crop_size
    
    # 2. 判断图像是否可以满足裁剪大小
    if height > crop_h and width > crop_w:
        # 3. 随机生成裁剪的左上角坐标
        top = random.randint(0, height - crop_h)
        left = random.randint(0, width - crop_w)
        
        # 4. 从图像和标签中裁剪出指定大小的区域
        image = image[top: top + crop_h, left: left + crop_w]
        label = label[top: top + crop_h, left: left + crop_w]
    else:
        # 5. 如果图像尺寸不足,缩放图像以适配裁剪大小
        image = cv2.resize(image, crop_size, interpolation=cv2.INTER_LINEAR)
        label = cv2.resize(label, crop_size, interpolation=cv2.INTER_NEAREST)

    # 6. 返回裁剪后的图像和标签
    return image, label

增加样本多样性:随机裁剪操作提供了不同的局部视图,使模型在训练中能观察到目标的不同局部区域,从而增强模型的泛化能力。

提升模型的局部特征识别能力:对于语义分割任务,随机裁剪让模型能识别图像中的细节和小目标,有助于在训练时更好地学习局部特征。

三、代码

3.1参数修改

代码使用方法见下:

修改图像和标签路径:

在这里插入图片描述

下面参数enhanced_num主要控制在原有数据基础上增强多少倍:

在这里插入图片描述

下面是修改保存增强后图像的名称和格式。
在这里插入图片描述

3.2 代码获取

完整的代码获取方法文章末扫码到公众号「视觉研坊」中回复关键字:语义分割数据增强。获取下载链接。

四、数据增强效果

通过上面代码数据增强后,图像和标签图都是同步增强,可以直接用于语义分割训练。
在这里插入图片描述

五、总结

以上就是语义分割训练图像和标签图同步增强的详细演示,希望能帮到你!

感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖

关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

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

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

相关文章

pgsql和mysql的自增主键差异

1. 当有历史数据存在时, mysql的自增主键是默认从最大值自增。 pgsql的自增主键取初始值开始逐个尝试,所以存在可能与历史数据的主键重复的情况。 pgsql解决上述问题的方式:重设自增值。 SELECT SETVAL(t_db_filed_id_seq, (SELECT MAX(&q…

Spring Cloud Contract快速入门Demo

1.什么是Spring Cloud Contract ? Spring Cloud Contract 是 Spring 提供的一套工具,用于帮助开发者通过契约(Contract)驱动的方式进行微服务的测试和集成。它主要解决微服务之间通信时,如何确保服务提供者和消费者之…

OceanBase JDBC (Java数据库连接)的概念、分类与兼容性

本章将介绍 OceanBase JDBC的 概念与分类,已帮助使用 JDBC 的用户及技术人员更好的 了解JDBC,以及 OceanBase JDBC在与 MySQL 及 Oracle 兼容性方面的相关能力。 一、JDBC 基础 1.1 JDBC 的概念 JDBC 一般指 Java 数据库连接。Java 数据库连接&#xf…

自定义springCloudLoadbalancer简述

概述 目前后端用的基本都是springCloud体系; 平时在dev环境开发时,会把自己的本地服务也注册上去,但是这样的话,在客户端调用时请求可能会打到自己本地,对客户端测试不太友好. 思路大致就是前端在请求头传入指定ip&a…

Go/Golang语言各种数据类型内存字节占用大小和最小值最大值

具体请前往:Go/golang语言基本数据类型字节大小和取值范围(最小值~最大值)

力扣104 : 二叉树最大深度

补:二叉树的最大深度 描述: 给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 何解? 树一般常用递归:递到叶子节点开始倒着处理

Android GPU纹理数据拷贝

在 Android 开发中读取纹理数据有以下几种方法: glReadPixelsImageReaderPBO(Pixel BufferObject) HardwareBuffer 1. glReadPixels glReadPixels 是 OpenGL ES 的 API,通常用于从帧缓冲区中读取像素数据,OpenGL ES…

畅捷通T+ RecoverPassword.aspx

用友 畅捷通T RecoverPassword.aspx 存在未授权管理员密码修改漏洞,攻击者可以通过漏洞修改管理员账号密码登录后台 #漏洞影响版本 12.0,12.1.12.2.12.3 13.0 15.0 16.0 18.0 补丁号291都影响 19.0 补丁号167之前也有影响 对于老版本畅捷通已经…

最全最简单理解迭代器

1. 迭代器的基础概念(iterator) 1.1 本质 迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。 1.2 作用: 能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。重载了*,++,==,!=,=运算符。用以操作复杂的数据结构。容器提供迭代…

python数据写入excel文件

主要思路:数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e , v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法,指定了 orient‘index’ 表示使用字典的键作为行索引,然…

[CKS] Create/Read/Mount a Secret in K8S

最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于读取、创建以及挂载secret的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[C…

docker之容器设置开机自启(4)

命令语法: docker update --restartalways 容器ID/容器名 选项: --restart参数 no 默认策略,在容器退出时不重启容器 on-failure 在容器非正常退出时(退出状态非0),才会重启容器 …

机器学习:决策树——ID3算法、C4.5算法、CART算法

决策树是一种常用于分类和回归问题的机器学习模型。它通过一系列的“决策”来对数据进行分类或预测。在决策树中,每个内部节点表示一个特征的测试,每个分支代表特征测试的结果,而每个叶节点则表示分类结果或回归值。 决策树工作原理 根节点&…

Angular 和 Vue2.0 对比

前言 :“业精于勤,荒于嬉;行成于思,毁于随” 很久没写博客了,大多记录少进一步探查。 Angular 和 Vue2.0 对比: 一.概念 1.1 Angular 框架: 是一款由谷歌开发的开源web前端框架(核…

Python酷库之旅-第三方库Pandas(208)

目录 一、用法精讲 971、pandas.MultiIndex.set_levels方法 971-1、语法 971-2、参数 971-3、功能 971-4、返回值 971-5、说明 971-6、用法 971-6-1、数据准备 971-6-2、代码示例 971-6-3、结果输出 972、pandas.MultiIndex.from_arrays类方法 972-1、语法 972-2…

[Linux]:IO多路转接之epoll

1. IO 多路转接之epoll 1.1 epoll概述 epoll是Linux内核为处理大规模并发网络连接而设计的高效I/O多路转接技术。它基于事件驱动模型,通过在内核中维护一个事件表,能够快速响应多个文件描述符上的I/O事件,如可读、可写、异常等,…

Spring Security 认证流程,长话简说

一、代码先行 1、设计模式 SpringSecurity 采用的是 责任链 的设计模式,是一堆过滤器链的组合,它有一条很长的过滤器链。 不过我们不需要去仔细了解每一个过滤器的含义和用法,只需要搞定以下几个问题即可:怎么登录、怎么校验账户、认证失败…

API 接口进行多分支管理的方法

原文链接:API 接口进行多分支管理的方法

链表类算法【leetcode】

链表的定义 面试时,需要自己手写... // 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 }; 【构造函数可以省略,C默认生成一个构造函数…

重构开发之道,Blackbox.AI为技术注入智能新动力

本文目录 一、引言二、Blackbox.AI实战体验2.1 基于网页界面生成前端代码进行应用开发2.2 与AI助手实现实时智能对话2.3 重塑大型文件交互方式2.4 链接Github仓库进行对话编程 三、总结 一、引言 在生产力工具加速进化的浪潮中,Blackbox.AI开始崭露头角&#xff0c…