语义分割——数据增广

news2024/11/15 19:33:51

 前言 

        在进行语义分割的时候,我们的数据集有时候不够用,常常需要进行数据增广。

        比较常用的数据增广方法(包括旋转,上下翻转,左右翻转,裁剪,调整对比度,调整饱和度,调整亮度,中心裁剪等)

代码实现

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 is None:
            angle = transforms.RandomRotation.get_params([-180, 180])  # -180~180随机选一个角度旋转
        image = tf.rotate(image, angle)
        mask = tf.rotate(mask, angle)
        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)
        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[:2]
        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)
        return image, mask

    def adjustContrast(self, image, mask):
        factor = random.uniform(0.5, 1.5)  # 这里调增广后的数据的对比度因子
        image = tf.adjust_contrast(image, factor)
        return image, mask

    def adjustBrightness(self, image, mask):
        factor = random.uniform(0.5, 1.5)  # 这里调增广后的数据亮度因子
        image = tf.adjust_brightness(image, factor)
        return image, mask

    def centerCrop(self, image, mask, size=None):  # 中心裁剪
        if size is None:
            size = image.size  # 若不设定size,则是原图。
        image = tf.center_crop(image, size)
        mask = tf.center_crop(mask, size)
        return image, mask

    def adjustSaturation(self, image, mask):  # 调整饱和度
        factor = random.uniform(0.5, 1.5)  # 这里调增广后的数据饱和度因子
        image = tf.adjust_saturation(image, factor)
        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()
    images = [os.path.join(image_path, f) for f in os.listdir(image_path)]
    masks = [os.path.join(mask_path, f) for f in os.listdir(mask_path)]
    datas = list(zip(images, masks))
    num = len(datas)

    for (image_path, mask_path) in datas:
        image = Image.open(image_path).convert("RGB")
        mask = Image.open(mask_path).convert("RGB")
        for opt in option:
            num += 1
            if opt == 1:
                image_tensor, mask_tensor = aug.rotate(image, mask)
                aug_type = 'rotate'
            elif opt == 2:
                image_tensor, mask_tensor = aug.flip(image, mask)
                aug_type = 'flip'
            elif opt == 3:
                image_tensor, mask_tensor = aug.randomResizeCrop(image, mask)
                aug_type = 'ResizeCrop'
            elif opt == 4:
                image_tensor, mask_tensor = aug.adjustContrast(image, mask)
                aug_type = 'Contrast'
            elif opt == 5:
                image_tensor, mask_tensor = aug.centerCrop(image, mask)
                aug_type = 'centerCrop'
            elif opt == 6:
                image_tensor, mask_tensor = aug.adjustBrightness(image, mask)
                aug_type = 'Brightness'
            elif opt == 7:
                image_tensor, mask_tensor = aug.adjustSaturation(image, mask)
                aug_type = 'Saturation'
            else:
                continue

            image_tensor = tf.to_tensor(image_tensor)
            mask_tensor = tf.to_tensor(mask_tensor)
            transforms.ToPILImage()(image_tensor).save(os.path.join(save_dir, 'img', f'{num}_{aug_type}.jpg'))
            transforms.ToPILImage()(mask_tensor).save(os.path.join(save_dir, 'mask', f'{num}_{aug_type}_mask.jpg'))


augmentationData(r'D:\wheat\project\tips\jpg', r'D:\wheat\project\tips\PNG',
                 save_dir=r'D:\wheat\project\tips\finished')

效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【文献阅读】应用人工智能在Simulink中开发软件

参考文献:《AI用于Simulink模型的降阶方法和应用场景》Mathworks在2024年MATLAB XEPO大会的演讲 文章目录: 1、模型框架 2、数据准备 3、AI建模 4、仿真和测试 5、部署应用 Tips:降阶模型(Reduced Order Modeling&#xff0…

Centos 7 安装刻录至硬件服务器

前言 在日常测试中,会遇到很多安装的场景,今天给大家讲一下centos 7 的安装,希望对大家有所帮助。 一.下载镜像 地址如下: centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…

Redis学习笔记【基础篇】

SQL vs NOSQL SQL(Structured Query Language)和NoSQL(Not Only SQL)是两种不同的数据库处理方式,它们在多个维度上有所差异,主要区别包括: 数据结构: SQL(关系型数据库)…

修改element-ui el-radio颜色

修改element-ui el-radio颜色 需求效果图代码实现 小结 需求 撤销扣分是绿色&#xff0c;驳回是红色 效果图 代码实现 dom <el-table-columnlabel"操作"width"200px"><template v-slot"scope"><el-radio-group v-model"s…

基础—SQL—DQL(数据查询语言)分页查询

一、引言 上一篇博客学习了排序查询&#xff0c;这次来讲查询的最后一个部分&#xff1a;分页查询。 涉及到的关键字是&#xff1a;LIMIT 。 二、DQL—分页查询 对于分页&#xff0c;不管以后做的是传统的管理系统还是做互联网的项目&#xff0c;基本上都会遇到分页查询的操…

入门flask:Python后端开发的首选框架

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;从零开始学习弗拉斯克 二、弗拉斯克的微框架哲学 三、弗拉斯克的核心…

vs code便利手册

vs code终端改造 改造颜色 未改造前&#xff1a; 改造后&#xff1a; 改造方法&#xff1a;VS Code 终端美化成自己喜欢的样子_vs code 终端样式-CSDN博客

如何备份RDK X3(旭日X3派)的 SD卡镜像

该方法可以在Ubuntu的开发机上生成一个img镜像&#xff0c;后续可以直接使用rufus软件烧录备份好的镜像。 Step 1&#xff1a;在Ubuntu的开发机上安装gparted软件 如果安装失败则需要为您的Ubuntu开发机换源&#xff0c;这里推荐阿里源&#xff1a;https://developer.aliyun.…

Linux网络编程:应用层协议|HTTPS

目录 1.预备知识 1.1.加密和解密 1.2.常见加密方式 1.2.1.对称加密 1.2.2.非对称加密 ​编辑 1.3.数据摘要&#xff08;数据指纹&#xff09;和数据签名 1.4.证书 1.4.1.CA认证 1.4.2.证书和数字签名 2.HTTPS协议 2.1.自行设计HTTPS加密方案 2.1.1.只使用对称加密 …

【python深度学习】——大型工程项目管理以及互相导入

【python深度学习】——大型工程项目管理以及互相导入 1. 工程项目中常见的文件组织形式2. python中的“包”、“模块”、与__init__.py2.1 概念理解2.2 \__init__py的使用3. 包的导入——相对导入与绝对导入3.1 相对导入3.1.1 相对导入的语法3.1.2 相对导入的使用注意事项与常…

jupyter notebook anaconda环境下查看|加载|更换内核

文章目录 1 问题复现2 查看内核位置3 调整python解释器位置 1 问题复现 在conda虚拟环境中使用pip安装相应package&#xff0c; 但是在jupyter notebook中加载该package时报错 [ERROR]ModuleNotFoundError: No module named shap 此时&#xff0c;除去包安装出现问题以外&am…

【国产化适配】国产化设备安装银河麒麟服务器V10填坑之路

银河麒麟官网申请试用&#xff0c;下载链接 AMD64/海光版/兆芯版 共享文件下载 - Kylin Distrohttps://distro-images.kylinos.cn:8802/web_pungi/download/share/vYTMm38Pkaq0KRGzg9pBsWf2c16FUwJL/ 飞腾版/鲲鹏版/ARM64 共享文件下载 - Kylin Distrohttps://distro-image…

运算符重载(下)

目录 前置和后置重载前置的实现Date& Date::operator()代码 后置的实现Date Date::operator(int )代码 前置--和后置--重载前置--的实现Date& Date::operator--( )代码 后置--的实现Date Date::operator--(int )代码 流插入运算符重载流插入运算符重载的实现流提取运算…

完蛋,AI一不小心把手机影像颠覆了

文&#xff5c;刘俊宏 2024上半年的发售季&#xff0c;手机影像大战再起。 近年来&#xff0c;影像年年卷&#xff0c;年年挤牙膏&#xff0c;直到AI大模型来临。 刚推出的荣耀跟法国百年摄影工作室雅顾合作&#xff0c;主打手机上拍出2万一张人像照片的高级感。华为nou在Pu…

【Python】 如何从列表中移除第一个元素?

基本原理 在Python中&#xff0c;列表是一种非常灵活的数据结构&#xff0c;可以存储一系列的元素。这些元素可以是任何类型&#xff0c;包括数字、字符串、其他列表等。列表中的元素是有序的&#xff0c;并且可以通过索引来访问和修改。 当我们想要从列表中移除第一个元素时…

【C++】哈希(2万字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 unordered系列关联式容器 unordered_map unordered_map的文档介绍 unordered_map的接口说明 unordered_set 底层结构 哈希概念 哈希冲突 哈希函数 哈希…

Linux CFS调度器之周期性调度器scheduler_tick函数

文章目录 前言一、简介二、源码分析2.1 scheduler_tick2.2 task_tick2.3 entity_tick2.4 check_preempt_tick2.5 resched_curr 参考资料 前言 Linux内核调度器主要是主调度器和周期性调度器&#xff0c;主调度器请参考&#xff1a;Linux 进程调度之schdule主调度器 一、简介 …

【JavaEE】多线程(1)

&#x1f386;&#x1f386;&#x1f386;个人主页&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;JavaEE专栏&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;计算机是怎么工作的&#x1f386;&#x1f3…

ctfshow web刷题

1.红包题第六弹 作者给了提示 F12查看页面源代码 <html lang"zh-CN"> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /> <meta name"viewport" content"widthdevice-…

低代码赋能企业数字化转型:数百家软件公司的成功实践

本文转载于葡萄城公众号&#xff0c;原文链接&#xff1a;https://mp.weixin.qq.com/s/gN8Rq9TDmkMpCtNMMsBUXQ 导读 在当今的软件开发时代&#xff0c;以新技术助力企业数字化转型已经成为一个热门话题。如何快速适应技术变革&#xff0c;构建符合时代需求的技术能力和业务模…