文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python基于域相关实现图像增强的方法是什么

2023-06-26 03:59

关注

这篇文章主要讲解了“Python基于域相关实现图像增强的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于域相关实现图像增强的方法是什么”吧!

介绍

当在图像上训练深度神经网络模型时,通过对由数据增强生成的更多图像进行训练,可以使模型更好地泛化。常用的增强包括水平和垂直翻转/移位、以一定角度和方向(顺时针/逆时针)随机旋转、亮度、饱和度、对比度和缩放增强。

Python中一个非常流行的图像增强库是albumentations,通过直观的函数和优秀的文档,可以轻松地增强图像。它也可以与PyTorch和TensorFlow等流行的深度学习框架一起使用。

域相关的数据增强

直觉

背后的想法来自于在现实中可能遇到的图像。例如,像雪或雨滴这样的增强是不应该在x射线图像中发现的增强,但胸管和起搏器是可以在x射线图像中发现的增强。

这个想法从何而来

改变了Roman (@ nroman on Kaggle)为SIIM-ISIC黑色素瘤分类比赛做增强的方法。 增强的一个片段如下所示:

Python基于域相关实现图像增强的方法是什么

原始图像(左上方)和头发增强图像(右上方)

此文确实在我们的模型训练中使用了他的增强函数,这有助于提高我们大多数模型的交叉验证(CV)分数。

想说的是,这种形式的增强可能在我们的最终排名中发挥了关键作用!从那时起,使用头发(或一般的人工制品)来增强图像数据的想法在我参加的后续比赛中非常接近,并尽可能地加以应用。

特别是,该方法被推广并应用于全球小麦检测、木薯叶病分类挑战赛。

昆虫增强

正如标题所示,这种方法包括用昆虫增强图像。这可以是数据中的一种自然设置,因为昆虫通常在空中或地面上被发现。

在本例中,在木薯和全球小麦检测竞赛中,蜜蜂被用作增强叶片图像时的首选昆虫。以下是增强图像的外观示例:

蜜蜂在叶子周围飞翔的增强图像

Python基于域相关实现图像增强的方法是什么

我们还可以使用掩码形式,导致图像中出现黑点(类似于相册中的脱落),即没有颜色和黑色的蜜蜂:

增强图像,黑色/黑色蜜蜂围绕树叶飞行

Python基于域相关实现图像增强的方法是什么

以下以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。

使用针的增强

在这种方法中,使用针来增强图像,例如可以是x射线图像。以下是增强图像的外观示例:

x光片左侧带针头的增强图像

Python基于域相关实现图像增强的方法是什么

类似地,我们可以使用黑色版本的针,从而生成以下增强图像:

x射线两侧带有黑色/黑色针头的增强图像

Python基于域相关实现图像增强的方法是什么

作为上述扩展模块的代码片段如下所示:

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。

实验结果

总的来说,局部CV结果有所改善,大部分略有改善(如0.001&ndash;0.003)。但在某些情况下,使用这种增强方法在训练过程中“失败”。

例如,在全球小麦检测竞赛中,任务涉及检测小麦头部,即目标检测任务。尽管进行了大量的超参数调整,但使用原始蜜蜂的蜜蜂增强导致训练验证损失波动很大。

虽然使用增强器确实提高了CV,但可以说这确实是一个幸运的机会。使用仅保留黑色像素的增强被证明在应用程序的各个领域是稳定的。特别是,CV的提升是实质性的,也是一致的。

到目前为止,尚未找到蜜蜂数量增加导致不同epoch之间出现这种训练结果的原因,但有一种假设是蜜蜂的颜色接近某些麦头,因此“混淆”了检测算法,该算法随后在同一边界框内捕获麦头和最近的蜜蜂。

在一些边界框预测中观察到了这一点,但没有足够的观察案例可以肯定地说这一假设是正确的。在任何情况下,还应该考虑图像属性(颜色)是否具有接近目标(例如小麦头)的分布。

另一方面,使用针的增强被证明(原始及其黑色/黑色版本)都相对稳定。在该示例中,预测的目标虽然在颜色分布上相似,但可能具有明显的特征(例如,胸管看起来与针头大不相同),因此分类算法不会混淆针头是否是正确的目标。

感谢各位的阅读,以上就是“Python基于域相关实现图像增强的方法是什么”的内容了,经过本文的学习后,相信大家对Python基于域相关实现图像增强的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯