💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》
语义分割打标签是个煎熬的过程,当我们标记一部分样本后可以通过数据增强来扩充训练样本,本教程就是针对语义分割训练样本进行扩充讲解。
如果还不会打标签,先学习一下语义分割打标签的过程,推荐两个工具: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 代码获取
完整的代码获取方法文章末扫码到公众号「视觉研坊」中回复关键字:语义分割数据增强。获取下载链接。
四、数据增强效果
通过上面代码数据增强后,图像和标签图都是同步增强,可以直接用于语义分割训练。
五、总结
以上就是语义分割训练图像和标签图同步增强的详细演示,希望能帮到你!
感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖
关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!