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

在这里插入图片描述

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


在这里插入图片描述

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

如果还不会打标签,先学习一下语义分割打标签的过程,推荐两个工具: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.xdnf.cn/news/14303.html

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

相关文章

本地部署 OpenHands

本地部署 OpenHands 0. 引言1. 部署 OpenHands2. 访问 OpenHands3. 验证 OpenHands 0. 引言 OpenHands 是一个由人工智能驱动的软件开发代理平台。 OpenHands 代理可以执行人类开发人员可以执行的任何操作:修改代码、运行命令、浏览网页、调用 API,甚至…

amber分子动力学

分子动力学模拟是分子模拟中最接近实验条件的模拟方法,能够从原子层面给出体系的微观演变过程,直观的展示实验现象发生的机理与规律,促使学术研究向着更高效、更经济、更有预见性的方向发展。可以解决和研究DNA的折叠和性质、蛋白与配体的识别…

丹摩征文活动 |通过Pycharm复现命名实体识别模型--MECT模型

文章目录 🍋1 引言🍋2 平台优势🍋3 丹摩平台服务器配置教程🍋4 实操案例( MECT4CNER-main)🍋4.1 MECT4CNER-main模型🍋4.2 环境配置🍋4.3 训练模型🍋4.4 数据…

嵌入式系统的利器C++

一、嵌入式 C 概述 嵌入式 C 在嵌入式系统开发中占据着至关重要的地位。它是 C 的一个子集,由日本 CPU 大厂于 1996 年提出,目标是在保持 C 面向对象特性的同时,减小代码体积、提升执行效率并简化编译器。 在嵌入式系统开发中,嵌…

【计算机网络】【网络层】【习题】

计算机网络-传输层-习题 文章目录 13. 图 4-69 给出了距离-向量协议工作过程,表(a)是路由表 R1 初始的路由表,表(b)是相邻路由器 R2 传送来的路由表。请写出 R1 更新后的路由表(c)。…

C/C++精品项目之图床共享云存储(2):MySql连接池

一:介绍 C/C精品项目之图床共享云存储(1) 我们项目的第一个文章讲解了很多的基础组件,包括线程池。我们都知道线程池是为了资源的复用,提高效率。而我们的MySql连接池也是一样的,是为了维持管理固定数量的…

网安数学基础-同余关系

文章目录 参考等价关系实例 同余同余和等价同余的运算 乘法逆元一次同余方程消去律 剩余类中国剩余定理欧拉函数欧拉定理 费马小定理 参考 【一口气学完】密码学的数学基础2,《同余关系》,一小时学完 等价关系 三角形里的全等关系 等价关系定义 下面这…

工业主板市场现状和主要市场驱动因素概述

工业主板市场是计算机硬件行业中的一个重要细分市场,专注于供应专为工业应用而设计的主板。与消费级主板不同,工业主板可承受极端条件,包括高温、连续运行以及暴露在灰尘和潮湿环境中。工业主板对于制造、自动化、医疗、国防和能源等行业中使…

舌尖上的传统美味 —— 食家巷白吉饼

第一眼看到食家巷白吉饼,就被它朴实的外表所吸引。圆润的形状,淡淡的麦色,没有过多的装饰,却散发着一种让人安心的质朴之美。 🎈拿起一个白吉饼,轻轻一掰,“咔” 的一声,那酥脆的外…

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.kernel的启动 流程图如下所示:   OpenHarmony(简称OH)的标准系统的底层系统是linux,所以调用如下代码: linux-5.10/init/main.c: noinline void __ref rest_init(void) {struct task_struct *tsk;int pid;rcu_sch…

ANR分析实例

目录 一、ANR出的问题原因 二、日志分析 2.1 CPU 负载 2.2 内存 2.3 堆栈信息 三、案例分析 3.1 主线程无卡顿,处于正常状态堆栈 3.2 主线程执行耗时操作 3.3 主线程被锁阻塞 3.4 CPU被抢占 3.5 内存紧张导致ANR 3.6 系统服务超时导致ANR 3.7 Input dis…

知识库搭建:高企创新创业的智慧引擎与未来趋势

在当今这个科技迅猛发展的时代,高新技术企业(简称“高企”)作为推动经济社会进步的重要力量,正面临着前所未有的创新挑战与机遇。知识库,这一信息时代的关键工具,不仅汇聚了高企内部的丰富知识与经验&#…

D67【python 接口自动化学习】- python基础之数据库

day67 Python操作MySQL基础使用 学习日期:20241113 学习目标:MySQL数据库-- 136 Python操作MySQL基础使用 学习笔记: pymysql 创建MySQL的数据库链接 执行sql语句 总结 Python中使用第三方库:pymysql来操作MySQL,…

容器管理平台KubeSphere的使用

在之前的课程中我们是在minikube中安装了K8S环境,然后通过kubectl命令来管理K8S的,这种用命令来管理的方式虽然对程序员来说看起来很炫酷,但有时候用起来还是挺麻烦的。这节课程给大家介绍一款企业级容器管理平台KubeSphere,使用它能更方便地管理K8S中的容器,希望对大家有…

低代码可视化-uniapp气泡弹窗组件可视化-代码生成器

气泡弹窗组件是产品设计中常用的控件之一,以下是对uniapp气泡弹窗组件可视化的详细解析: 一、组件定义 气泡弹窗组件(diy-popover )指的是当触发某项操作时,在页面上方或特定位置展示的弹出层容器,容器内…

Unity3D学习FPS游戏(11)敌人AI巡逻(NavMesh)

前言:前面两篇博客已经实现了简单的敌人,但是呢,这样很无趣。因为敌人只会站在原地被攻击,所以本篇我们将实现敌人AI巡逻,让敌人动起来。 敌人AI巡逻 场景丰富一下导航网格NavMesh构建导航网格导航网格优化玩家被当作…

遇到“msvcr120.dll丢失”要怎么解决?详解msvcr120.dll的解决方法

遇到“msvcr120.dll丢失”错误通常表明你的系统缺少一个关键的DLL文件,这是Microsoft Visual C 2013的一部分。这个问题可能导致某些程序无法运行,影响电脑性能。不过,解决这一问题并不复杂。接下来,本文将向你展示几种简单的修复…

git相关知识

前言:在学习git之前首先需要了解几个概念:工作区,暂存区,版本库。 工作区:是电脑上写代码或者文件的目录。 暂存区:一般存放在.git目录下的index中,也称索引。(git add&#xff09…

Spring Boot项目的配置文件有哪些?加载优先级谁最高?配置优先级谁最高?

目录 一. 结论 二. .prperties、.yml、.yaml 文件类型简介及注意点 2.1 文件简介 2.2. .prperties(默认格式/传统格式) 2.3 application.yml(主流格式) 2.4 application.yaml(主流格式) 2.5 配置文件…

蓝牙眼镜WT6900HA语音控制芯片方案:开启智能穿戴新篇章

前言: 随着科技的飞速发展,智能穿戴设备已经逐渐融入我们的日常生活。从智能手表到智能手环,再到如今的智能蓝牙眼镜,这些设备不仅改变了我们的生活方式,更引领了一场科技革命。 今天,我们要为大家介绍一款…