【深度学习实战(35)】数据处理之数据增强(不修改标签)

一、简介

不需要修改标签的数据增强有变明,变暗,hsv增强,color增强,cutout,模拟太阳光,雨水,雾等。

二、 代码

import random
import numpy as np
import os.path
import cv2
from PIL import Image
from PIL import ImageEnhance
from torchvision import transforms
import torch


orgin_dir = "E:/HPA-MTL-Ofilm/hpa-mtl-ofilm_debug/data/data_750/train/images"

aug_dir = "E:/HPA-MTL-Ofilm/hpa-mtl-ofilm_debug/data/data_750/train/aug_images/"
if not os.path.exists(aug_dir):
    os.mkdir(aug_dir)

def bright_aug(image, percetage):
    image_copy = image.copy()
    w = image.shape[1]
    h = image.shape[0]
    #get brighter
    for xi in range(0,w):
        for xj in range(0,h):
            image_copy[xj,xi,0] = np.clip(int(image[xj,xi,0]*percetage),a_max=255,a_min=0)
            image_copy[xj,xi,1] = np.clip(int(image[xj,xi,1]*percetage),a_max=255,a_min=0)
            image_copy[xj,xi,2] = np.clip(int(image[xj,xi,2]*percetage),a_max=255,a_min=0)
    return image_copy

def dark_aug(image,percetage):
    image_copy = image.copy()
    w = image.shape[1]
    h = image.shape[0]
    #get darker
    for xi in range(0,w):
        for xj in range(0,h):
            image_copy[xj,xi,0] = int(image[xj,xi,0]*percetage)
            image_copy[xj,xi,1] = int(image[xj,xi,1]*percetage)
            image_copy[xj,xi,2] = int(image[xj,xi,2]*percetage)
    return image_copy

def blur_aug(image,):
    #image
    image_copy = cv2.GaussianBlur(image, (7, 7), 1.5)  # cv2.GaussianBlur(图像,卷积核,标准差)
    return image_copy

def hsv_aug(image, hgain=5, sgain=50, vgain=50):
    # BGR->HSV
    img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV).astype(np.int16)
    hsv_augs = np.random.uniform(-1, 1, 3) * [hgain, sgain, vgain]  # uniform 上界:1 下届:-1 尺寸:3
    hsv_augs *= np.random.randint(0, 2, 3)  # randint 上界:2 下届:0 尺寸:3
    hsv_augs = hsv_augs.astype(np.int16)  # int16
    img_hsv[..., 0] = (img_hsv[..., 0] + hsv_augs[0]) % 180
    img_hsv[..., 1] = np.clip(img_hsv[..., 1] + hsv_augs[1], 0, 255)
    img_hsv[..., 2] = np.clip(img_hsv[..., 2] + hsv_augs[2], 0, 255)
    # HSV->BGR
    img_bgr = cv2.cvtColor(img_hsv.astype(image.dtype), cv2.COLOR_HSV2BGR)
    return img_bgr

def random_color(image):
    image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))  # 格式转换

    random_factor = np.random.randint(0, 31) / 10  # 随机因子
    color_image = ImageEnhance.Color(image).enhance(random_factor)  # 饱和度

    random_factor = np.random.randint(8, 15) / 10  # 随机因子
    brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor)  # 亮度

    random_factor = np.random.randint(10, 21) / 10  # 随机因子
    contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor)  # 对比度

    random_factor = np.random.randint(0, 31) / 10  # 随机因子
    shape_image = ImageEnhance.Sharpness(contrast_image).enhance(random_factor)  # 锐度

    image_out = cv2.cvtColor(np.asarray(shape_image), cv2.COLOR_RGB2BGR)  # 格式转换
    return image_out

def sunlight_aug(img):
    rows, cols = img.shape[:2]
    centerX = np.random.randint(0, rows)
    centerY = np.random.randint(0, cols)
    radius = np.random.randint(50, min(rows / 2, cols / 2))
    arr_rows = np.arange(rows).reshape(rows, 1)
    arr_cols = np.arange(cols).reshape(1, cols)
    arr = 1 - np.sqrt(((arr_cols - centerY) ** 2) + ((arr_rows - centerX) ** 2)) / radius
    value_B = np.random.randint(255, 256)
    value_G = np.random.randint(255, 256)
    value_R = np.random.randint(255, 256)
    arr_B = np.maximum(np.int16(value_B * arr), 0)
    arr_G = np.maximum(np.int16(value_G * arr), 0)
    arr_R = np.maximum(np.int16(value_R * arr), 0)
    img = np.int16(img)
    img[:, :, 0] += np.int16(arr_B / 10 * 8)
    img[:, :, 1] += np.int16(arr_G / 10 * 8)
    img[:, :, 2] += np.int16(arr_R / 10 * 8)
    img = np.maximum(img, 0)
    img = np.minimum(img, 255)
    img = np.uint8(img)
    return img

def cutout_aug(image, n_holes=25, height=320, width=320):
    # 根据图像尺寸,调整小黑块大小
    length_ratio = 0.2 * (height // 640 + width // 640)
    length = int(35 * length_ratio)
    # array -> tensor
    image = transforms.ToTensor()(image)
    h = image.size(1)
    w = image.size(2)
    mask = np.ones((h, w), np.float32)
    for n in range(n_holes):
        y = np.random.randint(h)
        x = np.random.randint(w)
        y1 = np.clip(y - length // 2, 0, h)
        y2 = np.clip(y + length // 2, 0, h)
        x1 = np.clip(x - length // 2, 0, w)
        x2 = np.clip(x + length // 2, 0, w)
        mask[y1:y2, x1:x2] = 0
    mask = torch.from_numpy(mask)
    mask = mask.expand_as(image)
    image = image * mask
    # tensor -> array
    image = image.mul(255).byte()
    image = image.numpy().transpose((1, 2, 0))
    return image.copy()

bright_aug_p = 0.3
dark_aug_p = 0.3
blur_aug_p = 0.3
hsv_p = 0.3
random_color_p = 0.3
sunlight_p = 0.3
cutout_p = 0.4

num_files = int(len(os.listdir(orgin_dir)))
num=0
for img_name in os.listdir(orgin_dir):
    if img_name[len(img_name) - 4: len(img_name)] == '.png' or img_name[len(img_name) - 4: len(img_name)] == '.jpg' or img_name[len(img_name) - 4: len(img_name)] == '.bmp':
            num+=1

            # ----- read -----#
            img_path = orgin_dir + '/' + img_name
            img = cv2.imread(img_path)

            # ----- bright -----#
            if random.random() < bright_aug_p:
                img=bright_aug(img,  percetage=1.5)

            # ----- dark -----#
            if random.random() < dark_aug_p:
                img=dark_aug(img, percetage=0.9)

            # ----- blur -----#
            if random.random() < blur_aug_p:
                img=blur_aug(img)

            # ----- hsv -----#
            if random.random() < hsv_p:
                img=hsv_aug(img)

            # ----- color -----#
            if random.random() < random_color_p:
                img=random_color(img)

            # ----- sunlight -----#
            if random.random() < sunlight_p:
                img=sunlight_aug(img)
            
            # ----- cutput -----#
            if random.random() < cutout_p:
                img=cutout_aug(img)


            # ----- save -----#
            save_img_path = aug_dir + img_name[0:-4] + '.jpg'
            cv2.imwrite(save_img_path, img)

            print("已完成%d张图片增强,进度为%f %%" % (num, num * 100 / num_files))

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

发布GPT-5的方式可能会与以往不同;开源vocode使用 AI 自动拨打电话;开源gpt智能对话客服工具;AI自动写提示词

✨ 1: vocode 用AI通过声音与用户进行实时交流 Vocode是一个旨在帮助开发者快速构建基于声音的大型语言模型&#xff08;LLM&#xff09;应用程序的开源库。简单来说&#xff0c;如果你想要开发一个能够通过声音与用户进行实时交流的应用&#xff0c;比如电话机器人、语音助手…

三层交换机与路由器连通上网实验

三层交换机是一种网络交换机&#xff0c;可以实现基于IP地址的高效数据转发和路由功能&#xff0c;通常用于大型企业、数据中心和校园网络等场景。此外&#xff0c;三层交换机还支持多种路由协议&#xff08;如OSPF、BGP等&#xff09;&#xff0c;以实现更为复杂的网络拓扑结构…

一、Prometheus介绍及部署

目录 一、什么是Prometheus&#xff1f; 二、特点 三、prometheus 的生态组件&#xff1a; 四、Prometheus架构图 五、prometheus 的工作模式 六、Prometheus 的工作流程 七、部署Prometheus 1、prometheus配置文件介绍 2、配置文件详解 3、配置systemd服务 用systemct…

原子学习笔记4——GPIO 应用编程

一、应用层如何操控 GPIO 与 LED 设备一样&#xff0c;GPIO 同样也是通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/gpio 目录下&#xff0c;如下所示&#xff1a; gpiochipX&#xff1a;当前 SoC 所包含的 GPIO 控制器&#xff0c;我们知道 I.MX6UL/I.MX6ULL 一共包…

r语言数据分析案例-北京市气温预测分析与研究

一、选题背景 近年来&#xff0c;人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放&#xff0c;大量温室气体强烈吸收地面辐射中的红外线&#xff0c;造 成温室效应不断累积&#xff0c;使得地球温度上升&#xff0c;造成全球气候变暖。 气象温度的预测一直以来都是…

Java基础(三):Java异常机制以及底层实现原理

&#x1f337;一、异常 ☘️1.1 什么是异常 Java异常是程序发生错误的一种处理机制&#xff0c;异常的顶级类是Throwable&#xff0c;Throwable字面意思就是可抛出的&#xff0c;该类是所有的错误和异常的超类&#xff0c;只有Throwable类或者Throwable子类的实例对象才可以被…

【小红书采集软件】根据关键词批量爬取小红书笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴可能了解&#xff0c;我之前开发过2款软件&#xff1a; 【GUI软件】小红书搜索结果批量采集&#xff0c;支持多个关键词同时抓取&#xff01; 【GUI软件】小红书详情数据批量采集&#xff0c;含笔记内容、转评赞藏等&#xff0c;支…

开启异步线程的方法

1&#xff0c;开启异步线程&#xff0c;在启动类上加注解&#xff1a; 2&#xff0c;自定义线程池&#xff1a; Configuration public class PromotionConfig {Beanpublic Executor generateExchangeCodeExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExec…

ROS2 安装与测试

文章目录 ROS2 安装与测试ROS2 安装1. 设置编码2. 添加源3. 安装 ROS24. 设置环境变量 ROS2 示例测试实例一&#xff1a;命令行实例实例二&#xff1a;小海龟仿真实例 参考链接 ROS2 安装与测试 ROS2 安装 基于 Ubuntu 22.04 LTS 操作系统。 1. 设置编码 sudo apt update &…

获取Android开发板已连接WiFi密码

硬件/软件环境&#xff1a; 1&#xff09;全志芯片开发板A40i 2&#xff09;Android Studio Giraffe | 2022.3.1 Patch 3 连接条件&#xff1a; 1)两端都是USB-A接口线&#xff0c;一端插入电脑端USB接口&#xff0c;另一端插入开发板USB接口&#xff1b; 2&#xff09;Andr…

Spring-Bean 作用域

作用域 作用域案例 public class BeanScopeDemo {AutowiredQualifier("singletonPerson")Person person;AutowiredQualifier("prototypePerson")Person person1;AutowiredQualifier("prototypePerson")Person person2;AutowiredSet<Person&g…

perf 中的 cpu-cycles event 介绍

perf 中的 cpu-cycles event 介绍 cycles简介 cycles事件记录处理器核心执行的时钟周期数。每个时钟周期代表处理器内部时钟振荡器的一个周期。这个事件通常用于衡量处理器的执行速度&#xff0c;因为它直接反映了指令执行所需的时间。一个较高的cycles计数可能意味着代码执行…

【数据结构】顺序表与链表的差异

顺序表和链表都是线性表&#xff0c;它们有着相似的部分&#xff0c;但是同时也有着很大的差异。 存储空间上的差异&#xff1a; 对于插入上的不同点&#xff0c;顺序表在空间不够时需要扩容&#xff0c;而如果在使用realloc函数去扩容&#xff0c;会有原地扩容和异地扩容两种情…

Blender细节补充

1.饼状菜单&#xff0c;用于快速切换/选择 例如&#xff1a; ~&#xff1a;切换视图 Z&#xff1a;切换着色方式 &#xff0c;&#xff1a;切换坐标系 .&#xff1a;切换基准点 Shift S&#xff1a;吸附 有两种使用方式&#xff1a; -点选 -滑选&#xff0c;按快捷键…

在Tiled中制作动画瓦片图

什么是瓦片图&#xff1f;瓦片图是指用图块把游戏场景评出来 工具安装链接&#xff1a;Tiled | Flexible level editor 资源下载教程 资源下载&#xff1a;Mystic Woods - 16x16 Pixel Art Asset Pack by Game Endeavor 解压后得到一些资源 新建图块集合 Tiled的安装就不介绍…

Nginx或Tengine服务器配置SSL证书

目录 前提条件 步骤一&#xff1a;下载SSL证书 步骤二&#xff1a;在Nginx服务器安装证书 步骤三&#xff1a;验证SSL证书是否配置成功 前提条件 已通过数字证书管理服务控制台签发证书SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射已在Web服…

全志ARM-SG90舵机

控制转角 向黄色信号线“灌入”PWM信号。 PWM波的频率不能太高&#xff0c;50hz&#xff0c;即周期1/频率1/500.02s&#xff0c;20ms左右数据&#xff1a; 不同的PWM波形对应不同的旋转角度&#xff0c;以20ms为周期&#xff0c;50hz为频率的PWM波 定时器需要定时20ms,关心的单…

Ubuntu24安装搜狗输入法,修复闪屏问题

下载deb安装包&#xff1a;搜狗输入法linux-首页 安装&#xff1a;sudo dpkg -i 1.deb 搜狗输入法linux-安装指导 重启&#xff0c;但是完成后闪烁。按以下步骤更改桌面配置。 sudo gedit /etc/gdm3/custom.conf 取消WaylandEnable的注释即可

Python 函数式编程

匿名函数 Python 允许用 lambda 关键字创造匿名函数。匿名顾名思义就是没有名字&#xff0c;即不需要以标准的方式来声明&#xff0c;比如说&#xff0c;使用 def 加函数名来声明。一个完整的 lambda “语句”代表了一个表达式&#xff0c;这个表达式的定义体必须和声明放在同…

CountDownLatch应用场景代码练习

目录 概念原理核心参数和方法两种应用场景实现代码应用一&#xff1a;让 主任务 等待 所有子任务执行完毕后&#xff0c;再继续执行执行结果应用二&#xff1a;让所有子任务同时执行&#xff0c;打印出发时间执行结果应用二&#xff08;扩展&#xff09;&#xff1a;让所有子任…