Python基于域相关实现图像增强的方法教程

目录
  • 介绍
  • 昆虫增强
  • 使用针的增强
  • 实验结果

介绍

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

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之间出现这种训练结果的原因,但有一种假设是蜜蜂的颜色接近某些麦头,因此“混淆”了检测算法,该算法随后在同一边界框内捕获麦头和最近的蜜蜂。

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

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

到此这篇关于Python基于域相关实现图像增强的方法教程的文章就介绍到这了,更多相关Python图像增强内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python深度学习之使用Albumentations对图像做增强

    目录 一.导入所需的库 二.定义可视化函数显示图像上的边界框和类标签 三.获取图像和标注 四.使用RandomSizedBBoxSafeCrop保留原始图像中的所有边界框 五.定义增强管道 六.输入用于增强的图像和边框 七.其他不同随机种子的示例 一.导入所需的库 import random import cv2 from matplotlib import pyplot as plt import albumentations as A 二.定义可视化函数显示图像上的边界框和类标签 可视化函数

  • python 图像增强算法实现详解

    使用python编写了共六种图像增强算法: 1)基于直方图均衡化 2)基于拉普拉斯算子 3)基于对数变换 4)基于伽马变换 5)限制对比度自适应直方图均衡化:CLAHE 6)retinex-SSR 7)retinex-MSR其中,6和7属于同一种下的变化. 将每种方法编写成一个函数,封装,可以直接在主函数中调用. 采用同一幅图进行效果对比. 图像增强的效果为: 直方图均衡化:对比度较低的图像适合使用直方图均衡化方法来增强图像细节 拉普拉斯算子可以增强局部的图像对比度 log对数变换对于整体对比度

  • python 基于opencv实现图像增强

    为了得到更加清晰的图像我们需要通过技术对图像进行处理,比如使用对比度增强的方法来处理图像,对比度增强就是对图像输出的灰度级放大到指定的程度,获得图像质量的提升.本文主要通过代码的方式,通过OpenCV的内置函数将图像处理到我们理想的结果. 灰度直方图 灰度直方图通过描述灰度级在图像矩阵中的像素个数来展示图像灰度级的信息,通过灰度直方图的统计我们可以看到每个灰度值的占有率.下面是一个灰度直方图的实现: import cv2 import numpy as np import sys import

  • 基于Python的图像数据增强Data Augmentation解析

    1.1 简介 深层神经网络一般都需要大量的训练数据才能获得比较理想的结果.在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加训练样本的多样性, 提高模型鲁棒性,避免过拟合. 在计算机视觉中,典型的数据增强方法有翻转(Flip),旋转(Rotat ),缩放(Scale),随机裁剪或补零(Random Crop or Pad),色彩抖动(Color jittering),加噪声(Noise) 笔者在跟进视频及图像中的人体姿态检测和关键点追踪(Human Pose Es

  • Python图像的增强处理操作示例【基于ImageEnhance类】

    本文实例讲述了Python图像的增强处理操作.分享给大家供大家参考,具体如下: python中PIL模块中有一个叫做ImageEnhance的类,该类专门用于图像的增强处理,不仅可以增强(或减弱)图像的亮度.对比度.色度,还可以用于增强图像的锐度. 具体见下面的例子: #-*- coding: UTF-8 -*- from PIL import Image from PIL import ImageEnhance #原始图像 image = Image.open('lena.jpg') imag

  • Python 图像对比度增强的几种方法(小结)

    图像处理工具--灰度直方图 灰度直方图时图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率. 例子:矩阵 图片来自网络,侵删! 上面图片的灰度直方图 python实现 #!usr/bin/env python #-*- coding:utf-8 _*- """ @author:Sui yue @describe: 灰度直方图,描述每个灰度级在图像矩阵中的像素个数或者占有率 @time: 2019/09/15 """ import

  • Python基于域相关实现图像增强的方法教程

    目录 介绍 昆虫增强 使用针的增强 实验结果 介绍 当在图像上训练深度神经网络模型时,通过对由数据增强生成的更多图像进行训练,可以使模型更好地泛化.常用的增强包括水平和垂直翻转/移位.以一定角度和方向(顺时针/逆时针)随机旋转.亮度.饱和度.对比度和缩放增强. Python中一个非常流行的图像增强库是albumentations(https://albumentations.ai/),通过直观的函数和优秀的文档,可以轻松地增强图像.它也可以与PyTorch和TensorFlow等流行的深度学习框

  • Python基于list的append和pop方法实现堆栈与队列功能示例

    本文实例讲述了Python基于list的append和pop方法实现堆栈与队列功能.分享给大家供大家参考,具体如下: #coding=utf8 ''''' 堆栈: 堆栈是一个后进先出(LIFO)的数据结构. 在栈上"push"元素是个常用术语,意思是把一个对象添加到堆栈中. 删除一个元素,可以把它"pop"出堆栈. 队列: 队列是一种先进先出(FIFO)的数据类型. 新的元素通过"入队"的方式添加进队列的末尾, "出对"就是从

  • Python基于pygame模块播放MP3的方法示例

    本文实例讲述了Python基于pygame模块播放MP3的方法.分享给大家供大家参考,具体如下: 安装pygame(可参考:安装Python和pygame及相应的环境变量配置) pip安装这个whl文件 装完就直接跑代码啦,很短的 import time import pygame file=r'C:\Users\chan\Desktop\Adele - All I Ask.mp3' pygame.mixer.init() print("播放音乐1") track = pygame.m

  • Python基于pillow判断图片完整性的方法

    本文实例讲述了Python基于pillow判断图片完整性的方法.分享给大家供大家参考,具体如下: 1.安装第三方库. pip install pillow 2.函数示例. #encoding=utf-8 #author: walker #date: 2016-07-26 #summary: 判断图片的有效性 import io from PIL import Image #判断文件是否为有效(完整)的图片 #输入参数为文件路径 def IsValidImage(pathfile): bValid

  • Python基于ThreadingTCPServer创建多线程代理的方法示例

    本文实例讲述了Python基于ThreadingTCPServer创建多线程代理的方法.分享给大家供大家参考,具体如下: #coding=utf8 from BaseHTTPServer import BaseHTTPRequestHandler from SocketServer import ThreadingTCPServer import gzip from StringIO import StringIO import logging logging.basicConfig(level

  • Python基于辗转相除法求解最大公约数的方法示例

    本文实例讲述了Python基于辗转相除法求解最大公约数的方法.分享给大家供大家参考,具体如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其实课后题中的算法修改要求实现的是辗转相除法求解最大公约数. 这个题目我最初的理解理解错了,自然也没有做出标准答案.现在按照标准答案的解答写一下相应的代码实现: # -*- coding:utf-8 -*- #! python2 def MaxCommDivisor(m,n): while m * n != 0: m = m % n if m == 0

  • Python基于dom操作xml数据的方法示例

    本文实例讲述了Python基于dom操作xml数据的方法.分享给大家供大家参考,具体如下: 1.xml的内容为del.xml,如下 <?xml version="1.0" encoding="utf-8"?> <catalog> <maxid>4</maxid> <login username="pytest" passwd='123456'> <caption>Python

  • Python基于xlrd模块操作Excel的方法示例

    本文实例讲述了Python基于xlrd模块操作Excel的方法.分享给大家供大家参考,具体如下: 一.使用xlrd读取excel 1.xlrd的安装: pip install xlrd==0.9.4 2.基本操作示例: #coding: utf-8 import xlrd #导入xlrd模块 xlsfile=r"D:\workspace\host.xls" #获得excel的book对象 book = xlrd.open_workbook(filename=None, file_con

  • python基于xmlrpc实现二进制文件传输的方法

    本文实例讲述了python基于xmlrpc实现二进制文件传输的方法.分享给大家供大家参考.具体实现方法如下: 服务器端: from SimpleXMLRPCServer import SimpleXMLRPCServer import xmlrpclib def python_logo(): handle = open("python_logo.jpg",'rb') return xmlrpclib.Binary(handle.read()) handle.close() server

  • python基于socket实现网络广播的方法

    本文实例讲述了python基于socket实现网络广播的方法.分享给大家供大家参考.具体实现方法如下: import socket, sys dest = ('<broadcast>', 51423) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1) s.sendto("Hi", dest) print &qu

随机推荐