首页 > 其他分享 >Albumentations库使用

Albumentations库使用

时间:2024-07-31 22:29:38浏览次数:5  
标签:Albumentations aug 变换 image mask limit 使用 ax

1 Albumentations库介绍

一个好用的开源图像处理库,适用于对RGB、灰度图、多光谱图像,以及对应的mask、边界框和关键点同时变换。通常用于数据增广,是PyTorch生态系统的一部分。

主页:https://albumentations.ai/

2 核心点

支持的变换:https://albumentations.ai/docs/getting_started/transforms_and_targets/

  • 分为两类:pixel-level transforms 和 spatial-level transforms. 前者像素级变换,mask等不需要动;后者mask同步变换;

变换概率:https://albumentations.ai/docs/getting_started/setting_probabilities/

  • 每种变换都有一个参数p,来控制应用这个变换的概率;
  • 有的变换默认p为1,而有的默认为0.5;
  • 如果有嵌套,比如Compose、OneOf、GaussNoise等,概率相乘;
  • 对于OneOf里面的各个变换概率,会被归一化;

捕获变换的参数:https://albumentations.ai/docs/examples/replay/

  • 用replay可以捕获变换的参数,从而用到多张图上;
  • 也可以用来debug;

多张图片同步变换,比如多张图对应同一个mask,或者一张图对应多个mask:https://albumentations.ai/docs/examples/example_multi_target/

3 代码示例

3.1 测试代码

适用于在本地测试各个变换的实际效果。

    import random
    import cv2
    from matplotlib import pyplot as plt
    import albumentations as A
    
    ## 可视化变换前后图像和对应mask
    def visualize(image, mask, original_image=None, original_mask=None):
        fontsize = 14
    
        if original_image is None and original_mask is None:
            f, ax = plt.subplots(2, 1, figsize=(8, 5))
    
            ax[0].imshow(image, cmap=plt.cm.gray)
            ax[1].imshow(mask, cmap=plt.cm.gray)
        else:
            f, ax = plt.subplots(2, 2, figsize=(8, 5))
    
            ax[0, 0].imshow(original_image, cmap=plt.cm.gray)
            ax[0, 0].set_title('Original image', fontsize=fontsize)
    
            ax[1, 0].imshow(original_mask, cmap=plt.cm.gray)
            ax[1, 0].set_title('Original mask', fontsize=fontsize)
    
            ax[0, 1].imshow(image, cmap=plt.cm.gray)
            ax[0, 1].set_title('Transformed image', fontsize=fontsize)
    
            ax[1, 1].imshow(mask, cmap=plt.cm.gray)
            ax[1, 1].set_title('Transformed mask', fontsize=fontsize)
    
    image = cv2.imread(r"D:\samples\0000.png", cv2.IMREAD_GRAYSCALE)
    mask = cv2.imread(r"D:\samples\0000_mask.png", cv2.IMREAD_GRAYSCALE)
    
    ## 变换示例1:pixel-level transforms,mask不变
    # aug = A.RandomGamma(p=1, gamma_limit=(60, 90))
    # aug = A.RandomBrightnessContrast(p=1, brightness_limit=(-0.1, 0.2), contrast_limit=(-0.4, 0.4))
    # aug = A.CLAHE(p=1, clip_limit=2.0, tile_grid_size=(4, 4))
    # aug = A.MotionBlur(p=1, blur_limit=5)
    # aug = A.GlassBlur(p=1, sigma=0.05, max_delta=1, iterations=1)
    # aug = A.GaussianBlur(p=1, blur_limit=(1, 3))
    
    ## 变换示例2:spatial-level transforms
    # aug = A.ElasticTransform(p=1, alpha=80, sigma=8, alpha_affine=10)
    # aug = A.GridDistortion(p=1, num_steps=5, distort_limit=(-0.3, 0.3))
    # aug = A.OpticalDistortion(distort_limit=1, shift_limit=1, p=1)
    # aug = A.RandomResizedCrop(size=(120,248), scale=(0.5,1.0), ratio=(1.8,2.4), p=1)
    # aug = A.Affine(p=1, scale=(0.9,1.1), translate_percent=None, shear=(-20, 20), rotate=(-40,40))
    aug = A.Perspective(p=1, scale=(0.05, 0.3))
    
    random.seed(9) #固定种子便于复现,实际使用时注掉
    augmented = aug(image=image, mask=mask)
    
    image_elastic = augmented['image']
    mask_elastic = augmented['mask']
    
    print(f"image_elastic.shape {image_elastic.shape}")
    print(f"mask_elastic.shape {mask_elastic.shape}")
    
    visualize(image_elastic, mask_elastic, original_image=image, original_mask=mask)

3.2 实际使用代码

适用于嵌入Pytorch的dataloader,用于数据增广。

  • 里面HorizontalFlip变换发生概率为 0.9 * 0.5;
  • 第一个OneOf中RandomGamma变换发生概率为 0.9 * 0.6 * (1 / (1+2+1));

# Define the transformations
self.transform = A.Compose([
    A.OneOf([
        A.RandomGamma(p=1, gamma_limit=(60, 90)),
        A.RandomBrightnessContrast(p=2, brightness_limit=(-0.1, 0.2), contrast_limit=(-0.4, 0.4)),
        A.CLAHE(p=1, clip_limit=2.0, tile_grid_size=(4, 4))
    ], p=0.6),
    A.OneOf([
        A.MotionBlur(p=1, blur_limit=5),
        A.GlassBlur(p=1, sigma=0.05, max_delta=1, iterations=1),
        A.GaussianBlur(p=1, blur_limit=(1, 3))
    ], p=0.6),
    A.HorizontalFlip(p=0.5),
    A.Affine(p=0.6, scale=(0.9,1.1), translate_percent=None, shear=(-10, 10), rotate=(-30,30)),
    A.RandomResizedCrop(p=0.6, size=(120,248), scale=(0.6,1.0), ratio=(1.9,2.3)),
    A.Perspective(p=0.8, scale=(0.05, 0.3)),
], p=0.9, additional_targets={'image0': 'image'})

#训练时进行数据增广
if self.train:
    transformed = self.transform(image=data['ir'], 
                                 image0=datax['speckle'], 
                                 mask=data['gt'])
    data['ir'] = transformed['image']
    data['speckle'] = transformed['image0']
    data['gt'] = transformed['mask']

标签:Albumentations,aug,变换,image,mask,limit,使用,ax
From: https://www.cnblogs.com/inchbyinch/p/18335626

相关文章

  • Ubuntu24.04LTS使用pip时显示:error: externally-managed-environment
    Ubuntu24.04LTS中使用apt按照pip,然后pipinstall时显示如下信息:error:externally-managed-environment×Thisenvironmentisexternallymanaged╰─>ToinstallPythonpackagessystem-wide,tryaptinstallpython3-xyz,wherexyzisthepackageyouaretryin......
  • 使用LinkedList实现队列和栈
    LinkedList底层是由双向链表实现的,因此可以支持Queue和Stack。本文讨论的实现基于JDK8源码。实现QueueLinkedList本身实现了Queue接口。入队方法签名接口说明(JDK手册)代码实现概括(JDK8)boolean add(Ee)将指定的元素插入此队列(如果立即可行且不会违反容量限制),在......
  • docker常用的使用方法
    docker如何退出进入的容器?要退出Docker容器的shell环境可以按以下步骤操作:在容器shell状态下,按下键盘上的Ctrl和P键。2然后按下Ctrl和Q键。这将使您退出容器的shell环境,但不会停止容器的运行。您将返回到宿主机的shell终端,而容器将继续在后台运行。如果......
  • docker中使用mongo命令显示命令未找到
    dockerpsdockerexec-it098e580a70f6bashmongosh是因为Mongodb6.0版本之后命令从mongo改为mongoshmogondb中的一些查找、删除命令:showdbsusexxxshowcollectionsdb.collectionName.find()//查看集合中的所有数据db.collectionName.remove({})//删......
  • 全网最适合入门的面向对象编程教程:29 类和对象的Python实现-断言与防御性编程和help函
    全网最适合入门的面向对象编程教程:29类和对象的Python实现-断言与防御性编程和help函数的使用摘要:在Python中,断言是一种常用的调试工具,它允许程序员编写一条检查某个条件。本文主要介绍了断言的应用场景和特点以及assert语句的使用,同时介绍了防御性编程和help()函数......
  • FPGA开发——数码管的使用(二)
    一、概述   在上一篇文章中我们针对单个数码管的静态显示和动态显示进行了一个设计和实现,这篇文章中我们针对多个数码管同时显示进行一个设计。这里和上一篇文章唯一不同的是就是数码管位选进行了一个改变,原来是单个数码管的显示,所以位选就直接赋值就可以了,但在本篇文章......
  • 在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析
    原文链接:http://tecdat.cn/?p=9024原文出处:拓端数据部落公众号  最近我们被要求撰写关于GAM的研究报告,包括一些图形和统计输出。用GAM进行建模时间序列我已经准备了一个文件,其中包含四个用电时间序列来进行分析。数据操作将由data.table程序包完成。将提及的智能电表数据......
  • 使用Shell登录Jenkins
    使用Shell登录Jenkins在root用户下使用sujenkins​命令切换到jenkins​用户时失败.可以先检查jenkins​用户有没有shell权限:grepjenkins/etc/passwd如果jenkins​用户的登录shell设置为/bin/false​,它会阻止用户登录系统。手动编辑/etc/passwd​文件来更改......
  • NIS(Network Information Services)服务端在R系部署,客户端rpm,deb简单使用
    #!/bin/bash####@Author:[email protected]#@Date:2024-05-28#@LastEditors:[email protected]#@LastEditTime:2024-07-19#@FilePath:NIS-use.sh#@Description:NIS(NetworkInformationServices)source:https://www.th......
  • Linux下C++动态链接库的生成以及使用
    目录一.前言二.生成动态链接库三.使用动态链接库一.前言这篇文章简单讨论一下Linux下如何使用gcc/g++生成和使用C++动态链接库(.so文件)。二.生成动态链接库先看下目录结构然后看下代码//demo.h#ifndefDEMO_H#defineDEMO_H#include<string>classDemo{......