pytorch的语义分割------数据增广

2023-11-09

官方文档:https://pytorch.org/docs/stable/torchvision/transforms.html?highlight=torchvision%20transforms%20functional#module-torchvision.transforms.functional

语义分割的labe与分类问题不同,语义分割的label是一个mask,所以训练图像在做增广的时候,mask也要做相应的变换。

如:原来的图片和mask如下:

做旋转后:

做翻转后:

所以对于语义分割而言,其数据增广是连同mask一起做的。

---------------------------------------------------------------------------------------------------

以下提供一份代码,集成了 torchvision.transforms.functional 里的比较常用的数据增广方法(包括旋转,上下翻转,左右翻转,裁剪,调整对比度,调整饱和度,调整亮度,中心裁剪等):

此代码用于在训练前通过对原来的数据做多种转换生产更多的训练数据。

此代码完全可以直接调用,用一个.py文件存放即可。

代码:

import random
import os
import numpy as np
from PIL import Image
from torchvision import transforms
import torchvision.transforms.functional as tf

class Augmentation:
    def __init__(self):
        pass
    def rotate(self,image,mask,angle=None):
        if angle == None:
            angle = transforms.RandomRotation.get_params([-180, 180]) # -180~180随机选一个角度旋转
        if isinstance(angle,list):
            angle = random.choice(angle)
        image = image.rotate(angle)
        mask = mask.rotate(angle)
        image = tf.to_tensor(image)
        mask = tf.to_tensor(mask)
        return image, mask
    def flip(self,image,mask): #水平翻转和垂直翻转
        if random.random()>0.5:
            image = tf.hflip(image)
            mask = tf.hflip(mask)
        if random.random()<0.5:
            image = tf.vflip(image)
            mask = tf.vflip(mask)
        image = tf.to_tensor(image)
        mask = tf.to_tensor(mask)
        return image, mask
    def randomResizeCrop(self,image,mask,scale=(0.3,1.0),ratio=(1,1)):#scale表示随机crop出来的图片会在的0.3倍至1倍之间,ratio表示长宽比
        img = np.array(image)
        h_image, w_image = img.shape
        resize_size = h_image
        i, j, h, w = transforms.RandomResizedCrop.get_params(image, scale=scale, ratio=ratio)
        image = tf.resized_crop(image, i, j, h, w, resize_size)
        mask = tf.resized_crop(mask, i, j, h, w, resize_size)
        image = tf.to_tensor(image)
        mask = tf.to_tensor(mask)
        return image, mask
    def adjustContrast(self,image,mask):
        factor = transforms.RandomRotation.get_params([0,10])   #这里调增广后的数据的对比度
        image = tf.adjust_contrast(image,factor)
        #mask = tf.adjust_contrast(mask,factor)
        image = tf.to_tensor(image)
        mask = tf.to_tensor(mask)
        return image,mask
    def adjustBrightness(self,image,mask):
        factor = transforms.RandomRotation.get_params([1, 2])  #这里调增广后的数据亮度
        image = tf.adjust_brightness(image, factor)
        #mask = tf.adjust_contrast(mask, factor)
        image = tf.to_tensor(image)
        mask = tf.to_tensor(mask)
        return image, mask
    def centerCrop(self,image,mask,size=None): #中心裁剪
        if size == None:size = image.size   #若不设定size,则是原图。
        image = tf.center_crop(image,size)
        mask = tf.center_crop(mask,size)
        image = tf.to_tensor(image)
        mask = tf.to_tensor(mask)
        return image,mask
    def adjustSaturation(self,image,mask): #调整饱和度
        factor = transforms.RandomRotation.get_params([1, 2])  # 这里调增广后的数据亮度
        image = tf.adjust_saturation(image, factor)
        #mask = tf.adjust_saturation(mask, factor)
        image = tf.to_tensor(image)
        mask = tf.to_tensor(mask)
        return image, mask


def augmentationData(image_path,mask_path,option=[1,2,3,4,5,6,7],save_dir=None):
    '''
    :param image_path: 图片的路径
    :param mask_path: mask的路径
    :param option: 需要哪种增广方式:1为旋转,2为翻转,3为随机裁剪并恢复原本大小,4为调整对比度,5为中心裁剪(不恢复原本大小),6为调整亮度,7为饱和度
    :param save_dir: 增广后的数据存放的路径
    '''
    aug_image_savedDir = os.path.join(save_dir,'img')
    aug_mask_savedDir = os.path.join(save_dir, 'mask')
    if not os.path.exists(aug_image_savedDir):
        os.makedirs(aug_image_savedDir)
        print('create aug image dir.....')
    if not os.path.exists(aug_mask_savedDir):
        os.makedirs(aug_mask_savedDir)
        print('create aug mask dir.....')
    aug = Augmentation()
    res= os.walk(image_path)
    images = []
    masks = []
    for root,dirs,files in res:
        for f in files:
            images.append(os.path.join(root,f))
    res = os.walk(mask_path)
    for root,dirs,files in res:
        for f in files:
            masks.append(os.path.join(root,f))
    datas = list(zip(images,masks))
    num = len(datas)

    for (image_path,mask_path) in datas:
        image = Image.open(image_path)
        mask = Image.open(mask_path)
        if 1 in option:
            num+=1
            image_tensor, mask_tensor = aug.rotate(image, mask)
            image_rotate = transforms.ToPILImage()(image_tensor).save(os.path.join(save_dir, 'img', str(num) + '__rotate.jpg'))
            mask_rotate = transforms.ToPILImage()(mask_tensor).save(os.path.join(save_dir, 'mask', str(num) + '_rotate_mask.jpg'))
        if 2 in option:
            num+=1
            image_tensor, mask_tensor = aug.flip(image, mask)
            image_filp = transforms.ToPILImage()(image_tensor).save(os.path.join(save_dir,'img',str(num)+'_filp.jpg'))
            mask_filp = transforms.ToPILImage()(mask_tensor).save(os.path.join(save_dir,'mask',str(num)+'_filp_mask.jpg'))
        if 3 in option:
            num+=1
            image_tensor, mask_tensor = aug.randomResizeCrop(image, mask)
            image_ResizeCrop = transforms.ToPILImage()(image_tensor).save(os.path.join(save_dir, 'img', str(num) + '_ResizeCrop.jpg'))
            mask_ResizeCrop = transforms.ToPILImage()(mask_tensor).save(os.path.join(save_dir, 'mask', str(num) + '_ResizeCrop_mask.jpg'))
        if 4 in option:
            num+=1
            image_tensor, mask_tensor = aug.adjustContrast(image, mask)
            image_Contrast = transforms.ToPILImage()(image_tensor).save(os.path.join(save_dir, 'img', str(num) + '_Contrast.jpg'))
            mask_Contrast = transforms.ToPILImage()(mask_tensor).save(os.path.join(save_dir, 'mask', str(num) + '_Contrast_mask.jpg'))
        if 5 in option:
            num+=1
            image_tensor, mask_tensor = aug.centerCrop(image, mask)
            image_centerCrop = transforms.ToPILImage()(image_tensor).save(os.path.join(save_dir, 'img', str(num) + '_centerCrop.jpg'))
            mask_centerCrop = transforms.ToPILImage()(mask_tensor).save(os.path.join(save_dir, 'mask', str(num) + '_centerCrop_mask.jpg'))
        if 6 in option:
            num+=1
            image_tensor, mask_tensor = aug.adjustBrightness(image, mask)
            image_Brightness = transforms.ToPILImage()(image_tensor).save(os.path.join(save_dir, 'img', str(num) + '_Brightness.jpg'))
            mask_Brightness = transforms.ToPILImage()(mask_tensor).save(os.path.join(save_dir, 'mask', str(num) + '_Brightness.jpg'))
        if 7 in option:
            num+=1
            image_tensor, mask_tensor = aug.adjustSaturation(image, mask)
            image_Saturation = transforms.ToPILImage()(image_tensor).save(os.path.join(save_dir, 'img', str(num) + '_Saturation.jpg'))
            mask_Saturation = transforms.ToPILImage()(mask_tensor).save(os.path.join(save_dir, 'mask', str(num) + '_Saturation.jpg'))


augmentationData(r'E:\datasets\isbi\train\images',r'E:\datasets\isbi\train\label',save_dir=r'E:\代码\mytext\suanfa\aug')

运行效果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch的语义分割------数据增广 的相关文章

  • 如何在Jenkins构建完代码后,能够查看HTML Report?

    有同学说想要在Jenkins构建完代码后就能查看构建后的结果报告 不知道怎么配置 这里我详细的说明一下步骤 对于想学习的同学有很大帮助 本次说明仅针对 python3 request unittest框架的案例作详细说明 想要完成这项配置过
  • python练习题-jmu_python_是否是数

    本题要求从键盘输入一个字符串 判断该串是否属于整数 浮点数或者复数的表示 输入格式 输入一个字符串 输出格式 输出yes或no 输入样例 299 输出样例 yes 几个语句判断input输入的类型的行了 当然这里还要有一个异常处理 eval
  • (三)Python3 NLTK(Natural Language Toolkit)安装和下载的常见问题

    NLTK Python自然语言工具包 用于诸如标记化 词形还原 词干化 解析 POS标注等任务 该库具有几乎所有NLP任务的工具 1 安装nltk pip install nltk 不要像一开始我一样傻傻的以为pip完就结束啦 2 进入py
  • Python3、setuptools、Pip3安装详解

    博客核心内容 1 Python3安装 2 setuptools安装 3 Pip3安装 之所以写这篇博客 也是有很多原因了 每次安装都要从网上各种百度 网上的答案也是各种各样 于是决定好好总结一下 下面是我在安装的过程中参考的几篇博客 附上相
  • Opencv-python3,处理rtsp流视频-----踩坑总结+VideoCapture.get()详解:

    最近项目在用opencv处理rtsp流相机 中间也踩了很多坑 这里写篇博客帮助那些可能会遇到相似问题的同胞 注 我这里同时用到了四个相机 1 电脑同时连接多个相机后 之后去打开rtsp相机时 初次打开特别耗时 甚至打开失败 在Win10上需
  • Windows7(x64) 安装Python3.7.0

    日期 2018年8月8日 作者 Commas 注释 本文写Windows7 x64 安装Python3 7 0 讲述了基本的安装操作 同时也介绍了一些相关的基础知识 本文若有哪些地方写的有所纰漏 还望各位看客指出 谢谢 如果您想了解更多有关
  • python3: xpath的使用

    转 本文转自 https blog csdn net qq 36148847 article details 79167267 python 具有一些比较流行的解析库 例如 lxml 使用的是 XPath 语法 是大众普遍认为的网页文本信息
  • Python绘制三角函数图(sin\cos\tan)并标注特定范围

    根据我们指定的条件检索函数中的元素 import matplotlib pyplot as plt import numpy as np a np linspace 0 2 np pi 50 b np sin a plt plot a b
  • 如何在 CentOS/RHEL 7 和 Fedora 上安装 Python 3.9

    Python 是一种非常流行 用途广泛且易于学习的编程语言 广泛应用于从 Web 开发和数据分析到人工智能和机器学习的各个行业和应用程序 Python 3 9 是该语言的最新版本之一 提供了改进的性能和许多新功能 在本教程中 我们将指导您完
  • FastAPI 01--快速入门FastApi

    FastAPI 01 快速入门 介绍 第一个FastApi 案例 说明 介绍 FastAPI 是一个用于构建 API 的现代 快速 高性能 的 web 框架 使用 Python 3 6 并基于标准的 Python 类型提示 快速 可与 No
  • pymysql中 execute 和 executemany 性能对比,以及与原生SQL 相比如何

    今天在mysql中插入大批量数据时 突然想起pymysql 还有executemany 方法 那么这两个方法到底谁快 快多少 测试环境 python3 mysql pymysql 老规矩 先上测试代码 class IN sql def in
  • python3 Excel转txt

    使用场景 每次都是点一下Excel表格链接 调到浏览器中 内容数据也多 这种机械的活 对于程序员来说 能省则省 最后的结果 附上代码 coding utf 8 Time 2018 7 19 19 47 Author 蛇崽 Email 643
  • python 头条 sign 参数 此篇针对实时列表 请使用73版本的谷歌浏览器

    1 首先谷歌浏览器打开今日头条F12调试找到sources 以旅游模块为例以此类推都一样 网站如https www toutiao com ch news travel 2 ctrl shift f全局搜索 window byted acr
  • python3 with.py

    模块 python3 with py 参考 https docs python org zh cn 3 reference compound stmts html with https docs python org zh cn 3 ref
  • python3生成中文词云图

    usr bin python3 coding utf 8 coding utf 8 导入wordcloud模块 from wordcloud import WordCloud 中文分词库 pip install jieba import j
  • python线程与进程概述_1.24

    多进程与多线程 进程 Process 是计算机中的程序关于某数据集合上的一次运行活动 是系统进行资源分配和调度的基本单位 是操作系统结构的基础 线程 Thread 有时被称为轻量级进程 Lightweight Process LWP 是程序
  • Python 一篇入门

    目录 Python 的简介与特点 Python支持多种编程风格 解释运行 跨平台 可扩展强 可嵌入 丰富的库 Python版本选择 Python开发环境搭建 认识Python解释器 快速入门 变量和赋值 动态类型 变量命名规则 认识 数字
  • python3 No module named 'PIL'

    在python3 scrapy框架已经安装好的情况下 还是出现了 python3 No module named PIL 在Python3下 PIL已经被Pillow替代了 所以只需要安装Pillow就可以了 使用命令 pip3 insta
  • 论文解读:Personalize Segment Anything Model with One Shot

    发表时间 2023 5 4 项目地址 https github com ZrrSkywalker Personalize SAM 体验地址 https huggingface co spaces justin zk Personalize
  • centos7 pip3 安装python模块包报错解决

    centos7 pip3 安装python模块包报错 bash usr local bin pip3 usr local bin python3 6 坏的解释器 没有那个文件或目录 root localhost Python pip3 in

随机推荐

  • etcd安装

    ETCD安装 windows版本 下载 下载地址https github com etcd io etcd releases 安装 其实也不用安装 下载解压后 得到如下 选中etcd exe 右键 属性 兼容性 以管理员身份运行此程序勾上
  • ajax实现前后端传输流文件(图片)

    ajax实现前后端传输流文件 图片 在参考了一众CSDN大神的帖子之后终于实现了从后端获取图片并正确显示在canvas中 下面是代码 var xmlhttp xmlhttp new XMLHttpRequest xmlhttp open G
  • 解决使用pip无法安装rasa与无限依赖告警:INFO: This is taking longer than usual. You might need to provide the....

    在直接使用 pip install rasa时几乎无限告警 INFO pip is looking at multiple versions of sanic to determine which version is compatible
  • 套接字及分层模型(一)

    套接字通信 1 内核开发的工程师将网络相关的头文件存储到一个专门目录include net中 而不是存储到include linux 2 ISO OS和TCP IP参考模型 应用层 网络服务与最终用户的接口 表示层 数据的表示 安全及压缩
  • Ubuntu Nginx+Rtmp服务器搭建

    参考博文 他人博文 首先感谢博主的分享 我用的是ubnutu16 04 在我搭的时候会碰到几个问题 1 下载安装 nginx 和nginx rtmp 编译依赖工具的时候会出现lib3的依赖库没有源 要更新 1 apt get update
  • 第一次连接数据库时速度很慢问题解决

    问题描述 在web容器加载完毕后 调用接口时 init连接池时 速度很慢 速度可能在1分钟左右 主要是因为它会先去查询DNS 然后再连接 解决方案 在mysql 的配置文件中 配置 skip name resolve 结果 速度有明显提升
  • Eclipse安装JavaScript智能提示插件 spket

    1 首先下载eclipse的spket插件 http www spket com download html 也可以下载Spket IDE单独安装使用 不用eclipse
  • 硬件系统工程师宝典(12)-----EMC应该知道的事

    各位同学大家好 欢迎继续做客电子工程学习圈 今天我们继续来讲这本书 硬件系统工程师宝典 上篇我们说到在做电源完整性分析时去耦电容要遵循的规则 大电容的去耦半径大 小电容的去耦半径小 电容焊盘扇出时 双过孔可以减少寄生电感等 今天我们开始学习
  • python读取、显示、保存图片

    一 opencv 读 cv2 imread path mode 读取出来是ndarray 如果是读取灰度图 需要指定颜色模式为cv2 IMREAD GRAYSCALE 这样读取出的是一个二维数组 而不是彩色图像的三维数组 如果读取彩色图像
  • ps2023如何导出svg

    在 文件 文件 导出首选项 里勾选 使用旧版导出为 就可以在图层里右键导出svg啦 否则切图也导不出svg 右键导出为里面的格式也没有svg选项 官方建议使用以下解决方案 https helpx adobe com photoshop us
  • windows配置git公钥,读写远程git项目

    首先Windows电脑需要下载并安装git 从官网直接下载然后安装即可 https git scm com download win 添加公钥 ssh keygen t rsa C xxxxx xx com 注意 这个xxxxx xx co
  • Hadoop是小象——Hadoop集群安装配置

    文章目录 所需软件 集群网络配置 集群SSH免密登陆设置 Hadoop安装配置 所需软件 Linux所需软件包括 JavaTM1 5 x 必须安装 建议选择Sun公司发行的Java版本 以前安装过 ssh 必须安装并且保证 sshd一直运行
  • 不认识的东西

    typedef struct 1 struct定义一个结构体 2 typedef给这个结构体改一个名字 typedef struct student Student Student就是这个结构体修改后的名字
  • 数据结构——单链表的实现(c语言版)

    前言 单链表作为顺序表的一种 了解并且熟悉它的结构对于我们学习更加复杂的数据结构是有一定意义的 虽然单链表有一定的缺陷 但是单链表也有它存在的价值 它也是作为其他数据结构的一部分出现的 比如在图 哈希表中 目录 1 链表节点的结构 2 头插
  • cublas_v2.h: No such file or directory

    caffe正常编译了 但是另外一个工程中使用caffe时显示 cublas v2 h No such file or directory 直接在该工程的cmakelist文件中加入 INCLUDE DIRECTORIES usr local
  • Git Pull 错误

    当是用TortoiseGit 从多个源 Pull过数据后 不能再使用默认的 Remote origin选项进行Pull操作 每个工程 Commit Push前需要Pull操作时 采用独立的URL 即 下面的选项 Arbitrary URL
  • Activiti进阶(九)——接收任务(ReceiveTask)

    转载地址 http blog csdn net zjx86320 viewmode contents 接收任务 ReceiveTask 即等待任务 接收任务是一个简单任务 它会等待对应消息的到达 当前 官方只实现 了这个任务的Java语义
  • HwBinder驱动篇-Android10.0 HwBinder通信原理(十)

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • 解决maven配置报错:The JAVA_HOME environment variable is not defined correctly(亲测有效)

    显然是环境变量的问题导致的 1 对于初学者而言 建议配置两个maven环境变量 2 添加至path 变量值是 MAVEN HOME bin M2 HOME bin 3 进入cmd 输入mvn v进行测试 如果是下面这样 说明就成功了 4 如
  • pytorch的语义分割------数据增广

    官方文档 https pytorch org docs stable torchvision transforms html highlight torchvision 20transforms 20functional module to