Python基于域相关实现图像增强的方法教程
作者:woshicver 发布时间:2023-08-24 15:30:22
介绍
当在图像上训练深度神经网络模型时,通过对由数据增强生成的更多图像进行训练,可以使模型更好地泛化。常用的增强包括水平和垂直翻转/移位、以一定角度和方向(顺时针/逆时针)随机旋转、亮度、饱和度、对比度和缩放增强。
Python中一个非常流行的图像增强库是albumentations(https://albumentations.ai/),通过直观的函数和优秀的文档,可以轻松地增强图像。它也可以与PyTorch和TensorFlow等流行的深度学习框架一起使用。
域相关的数据增强
直觉
背后的想法来自于在现实中可能遇到的图像。例如,像雪或雨滴这样的增强是不应该在x射线图像中发现的增强,但胸管和起搏器是可以在x射线图像中发现的增强。
这个想法从何而来
改变了Roman (@ nroman on Kaggle)为SIIM-ISIC黑色素瘤分类比赛做增强的方法。有关他的方法的详细信息,请参见:https://www.kaggle.com/c/siim-isic-melanoma-classification/discussion/159176. 增强的一个片段如下所示:
原始图像(左上方)和头发增强图像(右上方)
此文确实在我们的模型训练中使用了他的增强函数,这有助于提高我们大多数模型的交叉验证(CV)分数。
想说的是,这种形式的增强可能在我们的最终排名中发挥了关键作用!从那时起,使用头发(或一般的人工制品)来增强图像数据的想法在我参加的后续比赛中非常接近,并尽可能地加以应用。
特别是,该方法被推广并应用于全球小麦检测、木薯叶病分类挑战赛。
昆虫增强
正如标题所示,这种方法包括用昆虫增强图像。这可以是数据中的一种自然设置,因为昆虫通常在空中或地面上被发现。
在本例中,在木薯和全球小麦检测竞赛中,蜜蜂被用作增强叶片图像时的首选昆虫。以下是增强图像的外观示例:
蜜蜂在叶子周围飞翔的增强图像
我们还可以使用掩码形式,导致图像中出现黑点(类似于相册中的脱落),即没有颜色和黑色的蜜蜂:
增强图像,黑色/黑色蜜蜂围绕树叶飞行
以下以Albumentations风格编写的代码允许增强函数与来自Albumentations库的其他增强函数一起轻松使用:
from albumentations.core.transforms_interface import ImageOnlyTransform
class InsectAugmentation(ImageOnlyTransform):
"""
将昆虫的图像强加到目标图像上
-----------------------------------------------
参数:
insects (int): 昆虫的最大数量
insects_folder (str): 昆虫图片文件夹的路径
"""
def __init__(self, insects=2, dark_insect=False, always_apply=False, p=0.5):
super().__init__(always_apply, p)
self.insects = insects
self.dark_insect = dark_insect
self.insects_folder = "/kaggle/input/bee-augmentation/"
def apply(self, image, **kwargs):
"""
参数:
image (PIL Image): 画昆虫的图像。
Returns:
PIL Image: 带昆虫的图像。
"""
n_insects = random.randint(1, self.insects) # 在这个例子中,我用1而不是0来说明增强效果
if not n_insects:
return image
height, width, _ = image.shape # 目标图像的宽度和高度
insects_images = [im for im in os.listdir(self.insects_folder) if 'png' in im]
for _ in range(n_insects):
insect = cv2.cvtColor(cv2.imread(os.path.join(self.insects_folder, random.choice(insects_images))), cv2.COLOR_BGR2RGB)
insect = cv2.flip(insect, random.choice([-1, 0, 1]))
insect = cv2.rotate(insect, random.choice([0, 1, 2]))
h_height, h_width, _ = insect.shape # 昆虫图像的宽度和高度
roi_ho = random.randint(0, image.shape[0] - insect.shape[0])
roi_wo = random.randint(0, image.shape[1] - insect.shape[1])
roi = image[roi_ho:roi_ho + h_height, roi_wo:roi_wo + h_width]
# 创建掩码和反掩码
img2gray = cv2.cvtColor(insect, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# 现在黑掉的区域是昆虫
img_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
# 从昆虫图像中只选取昆虫区域。
if self.dark_insect:
img_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
insect_fg = cv2.bitwise_and(img_bg, img_bg, mask=mask)
else:
insect_fg = cv2.bitwise_and(insect, insect, mask=mask)
# 添加
dst = cv2.add(img_bg, insect_fg, dtype=cv2.CV_64F)
image[roi_ho:roi_ho + h_height, roi_wo:roi_wo + h_width] = dst
return image
如果你希望使用黑色版本,请将dark_insect设置为True。在这个Kaggle笔记本中可以找到一个示例实现:https://www.kaggle.com/khoongweihao/insect-augmentation-with-efficientdet-d6/notebook
使用针的增强
在这种方法中,使用针来增强图像,例如可以是x射线图像。以下是增强图像的外观示例:
x光片左侧带针头的增强图像
类似地,我们可以使用黑色版本的针,从而生成以下增强图像:
x射线两侧带有黑色/黑色针头的增强图像
作为上述扩展模块的代码片段如下所示:
def NeedleAugmentation(image, n_needles=2, dark_needles=False, p=0.5, needle_folder='../input/xray-needle-augmentation'):
aug_prob = random.random()
if aug_prob < p:
height, width, _ = image.shape # 目标图像的宽度和高度
needle_images = [im for im in os.listdir(needle_folder) if 'png' in im]
for _ in range(1, n_needles):
needle = cv2.cvtColor(cv2.imread(os.path.join(needle_folder, random.choice(needle_images))), cv2.COLOR_BGR2RGB)
needle = cv2.flip(needle, random.choice([-1, 0, 1]))
needle = cv2.rotate(needle, random.choice([0, 1, 2]))
h_height, h_width, _ = needle.shape # 针图像的宽度和高度
roi_ho = random.randint(0, abs(image.shape[0] - needle.shape[0]))
roi_wo = random.randint(0, abs(image.shape[1] - needle.shape[1]))
roi = image[roi_ho:roi_ho + h_height, roi_wo:roi_wo + h_width]
# 创建掩码和反掩码
img2gray = cv2.cvtColor(needle, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# 现在黑掉的区域是针
img_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
# 只选取针区域。
if dark_needles:
img_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
needle_fg = cv2.bitwise_and(img_bg, img_bg, mask=mask)
else:
needle_fg = cv2.bitwise_and(needle, needle, mask=mask)
# 添加
dst = cv2.add(img_bg, needle_fg, dtype=cv2.CV_64F)
image[roi_ho:roi_ho + h_height, roi_wo:roi_wo + h_width] = dst
return image
请注意,以上内容不是Albumentations格式,不能直接应用于常规Albumentations增强。必须进行一些调整,使其与上述昆虫/蜜蜂增强中的格式相同。但变化应该很小!
同样,如果你希望使用黑色版本,请将dark_Piners设置为True。在我的Kaggle笔记本中可以找到一个示例实现:https://www.kaggle.com/khoongweihao/x-ray-needle-augmentation-et-al/notebook.
实验结果
总的来说,局部CV结果有所改善,大部分略有改善(如0.001–0.003)。但在某些情况下,使用这种增强方法在训练过程中“失败”。
例如,在全球小麦检测竞赛中,任务涉及检测小麦头部,即目标检测任务。尽管进行了大量的超参数调整,但使用原始蜜蜂的蜜蜂增强导致训练验证损失波动很大。
虽然使用增强器确实提高了CV,但可以说这确实是一个幸运的机会。使用仅保留黑色像素的增强被证明在应用程序的各个领域是稳定的。特别是,CV的提升是实质性的,也是一致的。
到目前为止,尚未找到蜜蜂数量增加导致不同epoch之间出现这种训练结果的原因,但有一种假设是蜜蜂的颜色接近某些麦头,因此“混淆”了检测算法,该算法随后在同一边界框内捕获麦头和最近的蜜蜂。
在一些边界框预测中观察到了这一点,但没有足够的观察案例可以肯定地说这一假设是正确的。在任何情况下,还应该考虑图像属性(颜色)是否具有接近目标(例如小麦头)的分布。
另一方面,使用针的增强被证明(原始及其黑色/黑色版本)都相对稳定。在该示例中,预测的目标虽然在颜色分布上相似,但可能具有明显的特征(例如,胸管看起来与针头大不相同),因此分类算法不会混淆针头是否是正确的目标。
来源:https://blog.csdn.net/woshicver/article/details/122335324
猜你喜欢
- 仿google的asp分页代码index.asp(文件1)<%@LANGUAGE="VBSCRIPT" CODEP
- 我们用Select的onchange事件时,常会遇到这样一个问题,那就是连续选相同一项时,不触发onchange事件.select的onch
- 我想大家在用Sql2005一般都是.NET2005自带的SQL Server 2005是SQL Server2005 Express版本的,
- 日志日志是跟踪软件运行时所发生的事件的一种方法。软件开发者在代码中调用日志函数,表明发生了特定的事件。事件由描述性消息描述,该描述性消息可以
- 现在我们已经知道了,fixtures是一个非常强大的功能。那么有的时候,我们可能会写一个fixture,而这个fixture所有的测试函数都
- Win7或Windows server 2008中IIS7支持ASP+Access解决方法:1. 让IIS7支持ASPWin7或Window
- 本文实例讲述了Python3.5迭代器与生成器用法。分享给大家供大家参考,具体如下:1、列表生成式通过列表生成式可以直接创建一个列表。代码:
- 什么是数据库镜像?Robidoux:数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另一个
- 第一种方法:python操作xml文件随手找了一个xml文件内容(jenkins相关文件)<?xml version="1.
- 本文实例讲述了PHP实现基于3DES算法加密解密字符串。分享给大家供大家参考,具体如下:3DES(或称为Triple DES)是三重数据加密
- 最近随着狂风计划的席卷,我也终于开始橱窗产品位列表展示的编码工作,这只是一个改进项目,因此有原代码可供参考。但是当我打开原代码模板的时候便愣
- PDOStatement::bindValuePDOStatement::bindValue — 把一个值绑定到一个参数(PHP 5 >
- 通常人们使用以下两种方法来执行SQL语句: Set Rs=Conn.Execute(SqlStr) 和&nbs
- 相对于自动化测试工具QTP来说,selenium小巧、免费,而且兼容Google、FireFox、IE多种浏览器,越来越多的人开始使用sel
- XML同HTML一样,都来自Standard Generalized Markup Language, 即标准通用标记语言,简称SGML。早
- 如何在线压缩Access数据库?Access数据库可以在线压缩吗?可以的,代码和说明见下:compact.asp<%option&nb
- CSS代码更清晰高效的一些经验是许多网页制作者与开发者都关心的问题。但是大概没有什么魔法,可以保证一下就把你的样式表缩小到百分之多少,合理的
- 开发微信小程序过程中,有个需求需要用到日期时间筛选器,查看微信官方文档后,发现官方文档的picker筛选器只能单独支持日期或者是时间,所以为
- 本文实例讲述了PHP面向对象程序设计之类与反射API。分享给大家供大家参考,具体如下:了解类class_exists验证类是否存在<?
- “点睛”的广告代码,很牛B,本想从中找出在FireFox下如何实现findText及pasteHTML类似效果的,我看了大半天,楞是没有看出