深度学习之实现图像数据增强

2023-11-09

深度学习之实现图像数据增强

前言

数据增强的意思就是让数据量增多。对于深度学习来说,大的数据量可以训练出更好的深度学习模型。

在图像增强方面,我们常用的手段如下:

  1. 旋转
  2. 翻转
  3. 缩放
  4. 平移
  5. 尺度变换
  6. 对比度变换
  7. 噪声扰动
  8. 颜色变换

1. 使用tensorflow2.X的ImageDataGenerator进行数据增强

在这里插入图片描述
经过如下代码可以在img_temp文件夹中生成20张经过数据增强的图片

from tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array
import numpy as np
# ---------------------------------- #
    #   训练集进行的数据增强操作
    #   1. rotation_range -> 随机旋转角度
    #   2. width_shift_range -> 随机水平平移
    #   3. width_shift_range -> 随机数值平移
    #   4. rescale -> 数据归一化
    #   5. shear_range -> 随机错切变换
    #   6. zoom_range -> 随机放大
    #   7. horizontal_flip -> 水平翻转
    #   8. brightness_range -> 亮度变化
    #   9. fill_mode -> 填充方式
# ---------------------------------- #

train_data = ImageDataGenerator(
        rotation_range=50, 
        width_shift_range=0.1, 
        height_shift_range=0.1,
        rescale=1/255.0,
        shear_range=10,
        zoom_range=0.1,
        horizontal_flip=True,
        brightness_range=(0.7, 1.3),
        fill_mode='nearest'
    )

img = load_img('./img/cat.8662.jpg')
img = img_to_array(img)
img = np.expand_dims(img, 0)
i = 0
for j in train_data.flow(img, batch_size=1, save_to_dir='img_temp', save_prefix='cat', save_format='jpeg'):
    i += 1
    if i == 20:
        break

在这里插入图片描述

具体的函数说明可以在tensorflow官网中找到
下面是我经常用到的几个函数

def data_process(self, file_path, y):
        img = tf.io.read_file(filename=file_path)
        img = tf.image.decode_jpeg(img, channels=3)
        # 归一化
        img = tf.cast(img, tf.float32) / 255.0
        # 数据预处理
        #   1. 调节亮度
        #   2. 随机调节对比度
        #   3. 随机水平翻转一个图像(从左到右)
        #   4. 垂直随机翻转图像(上下颠倒)
        img = tf.image.random_brightness(img, 0.2)
        img = tf.image.random_contrast(img, 0.2, 0.4)
        img = tf.image.random_flip_left_right(img)
        img = tf.image.random_flip_up_down(img)
        img = tf.image.resize(img, size=self.input_size)        
        return img, y

2. 使用Albumentations进行数据增强

文档网址:https://albumentations.ai/docs/

2.1 图像分类

import albumentations
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
"""
RandomGamma: 随机灰度系数
RandomBrightnessContrast: 随机改变输入图像的亮度和对比度
CLAHE: 自适应直方图均衡
HorizontalFlip: 围绕y轴水平翻转输入
ShiftScaleRotate: 随机平移,缩放和旋转输入
ColorJitter: 随机改变图像的亮度、对比度和饱和度
"""

train_transform = albumentations.Compose([
        albumentations.OneOf([
            albumentations.RandomGamma(gamma_limit=(60, 120), p=0.9),
            albumentations.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.9),
            albumentations.CLAHE(clip_limit=4.0, tile_grid_size=(4, 4), p=0.9),
            albumentations.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2, always_apply=False, p=0.5)
        ]),
        albumentations.HorizontalFlip(p=0.7),
        albumentations.ShiftScaleRotate(p=1),
        albumentations.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), max_pixel_value=255.0, p=1.0)
        ])

img = Image.open('./img/cat.8662.jpg')
img = np.array(img)
img = train_transform(image=img)['image']
plt.imshow(img)
plt.show()

结果如下:
在这里插入图片描述

2.2 目标检测

此部分来自AI浩

import random
 
import cv2
from matplotlib import pyplot as plt
 
import albumentations as A

BOX_COLOR = (255, 0, 0) # Red
TEXT_COLOR = (255, 255, 255) # White
 
# 定义画框的函数
def visualize_bbox(img, bbox, class_name, color=BOX_COLOR, thickness=2):
    """Visualizes a single bounding box on the image"""
    x_min, y_min, w, h = bbox
    x_min, x_max, y_min, y_max = int(x_min), int(x_min + w), int(y_min), int(y_min + h)
 
    cv2.rectangle(img, (x_min, y_min), (x_max, y_max), color=color, thickness=thickness)
 
    ((text_width, text_height), _) = cv2.getTextSize(class_name, cv2.FONT_HERSHEY_SIMPLEX, 0.35, 1)    
    cv2.rectangle(img, (x_min, y_min - int(1.3 * text_height)), (x_min + text_width, y_min), BOX_COLOR, -1)
    cv2.putText(
        img,
        text=class_name,
        org=(x_min, y_min - int(0.3 * text_height)),
        fontFace=cv2.FONT_HERSHEY_SIMPLEX,
        fontScale=0.35, 
        color=TEXT_COLOR, 
        lineType=cv2.LINE_AA,
    )
    return img
 
# 定义可视化函数
def visualize(image, bboxes, category_ids, category_id_to_name):
    img = image.copy()
    for bbox, category_id in zip(bboxes, category_ids):
        class_name = category_id_to_name[category_id]
        img = visualize_bbox(img, bbox, class_name)
    plt.figure(figsize=(12, 12))
    plt.axis('off')
    plt.imshow(img)
    plt.show()
    
# 299, 160, 446, 252
image = cv2.imread('./img/000013.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

bboxes = [[299, 160, 147, 92]]
category_ids = [17]
 

category_id_to_name = {17: 'cow'}
visualize(image, bboxes, category_ids, category_id_to_name)

# 数据增强
"""
RandomSizedBBoxSafeCrop裁剪图像的随机部分。它确保裁剪的部分将包含来自原始图像的所有边界框。
然后转换缩放作物的高度和宽度指定由各自的参数。侵蚀率参数控制了种植后原始包围盒的损失面积。
Erosion_rate = 0.2意味着增强的包围框的面积可能比原来的包围框的面积小20%。
"""
transform = A.Compose(
    [A.RandomSizedBBoxSafeCrop(width=448, height=336, erosion_rate=0.2),
     A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2, always_apply=False, p=0.5),
     A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.9),
     A.ShiftScaleRotate(p=1)# A.Affine(0.6,p=0.8) # 对图像进行缩放
    ],
    bbox_params=A.BboxParams(format='coco', label_fields=['category_ids']),
)


transformed = transform(image=image, bboxes=bboxes, category_ids=category_ids)

visualize(
    transformed['image'],
    transformed['bboxes'],
    transformed['category_ids'],
    category_id_to_name,
)

结果如下:
原图:
在这里插入图片描述
数据增强后:
在这里插入图片描述

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

深度学习之实现图像数据增强 的相关文章

随机推荐

  • java概述,发展历程

    1 java概述 首先对于刚刚接触java的小白来说 可能连java是什么 为什么叫这么名字都不知道 其实 Java语言是有个曾用名的 叫Oak 而且起这个名字的时候也是很随心的 只是因为看到了窗口外的一颗橡树 歌词 只是因为面向窗外多看了
  • python 合并不同文件夹下名称相同的文件

    转载 https blog csdn net qq 42769683 article details 104565285 utm source app app version 4 10 0 code app 1562916241 uLink
  • 3D 人体姿态估计简述[转]

    转自 3D 人体姿态估计简述 知乎 0 前言 3D Human Pose Estimation 以下简称 3D HPE 的目标是在三维空间中估计人体关键点的位置 3D HPE 的应用非常广泛 包括人机交互 运动分析 康复训练等 它也可以为其
  • 使用Python的Cufflinks库创建三维散点图

    使用Python的Cufflinks库创建三维散点图 在数据可视化中 三维散点图是一种常用的图形展示方式 如果您正在寻找一种方便易用的数据可视化工具来创建三维散点图 那么Cufflinks就是一个不错的选择 Cufflinks是一个基于pl
  • 恕我直言,自从用完Gradle后,有点嫌弃Maven了!速度贼快!

    点击上方蓝色字体 选择 标星公众号 优质文章 第一时间送达 99套Java企业级实战项目 4000G架构师资料 作者 乐百川 点击阅读原文前往 授权转载自 toutiao com i6824937779193971207 相信使用Java的
  • Spring 基于ApplicationEvent、ApplicationEventPublisher、ApplicationListener的事件监听、发布记录

    1 概述 事件发布和订阅具体流程 1 具体要发布的事件 事件中携带发送的数据 2 发送事件 3 监听器 监听发布的事件 获取事件的携带数据 执行业务逻辑 发布 事件作为参数 事件 监听 事件作为参数 例如 使用切面记录系统日志 发送相同类型
  • oracle 9i在线重定义,Oracle 9i中表的在线重定义(转)

    今天遇到要把数据库中的某张表改成分区表 而且该表在别的地方还有其他的注册信息 如果自己手工建一个分区表的替代该表的话 那就得要手工地去执行该表在其他地方的注册 所以不想删除该表再手工创建同名的分区表 想到了Oracle 9i中可以使用在线重
  • gitee上传代码方法(命令)

    第一次上传 创建一个gitee仓库 在 我的电脑 里找到你要上传的文件的位置 在地址栏输入cmd 回车 输入git init 输入git add 输入git commit m 备注信息可更改 输入 git remote add origin
  • C语言中的清屏函数(自己编写)

    在csdn论坛里看到这样一个问题 如何在c语言命令提示下清除屏幕 感兴趣 随查之 有解 include
  • 蓝帽杯半决赛2022

    手机取证 1 iPhone手机的iBoot固件版本号 答案参考格式 iBoot 1 1 1 直接通过盘古石取证 打开 取证大师和火眼不知道为什么都无法提取这个 手机取证 2 该手机制作完备份UTC 8的时间 非提取时间 答案参考格式 200
  • 修炼离线:(五)hbase映射表插入hive

    一 创建hive表 sql drop table if exists ods odsyyy create table if not exists ods odsfff row id string comment 行记录唯一ID 对应ROW
  • Makefile入门二、理解$@、$^和$<

    文章目录 一 理解 lt 的含义 二 举例 三 简提Makefile中打印日志信息 前面简单记录了一下Makefile中helloworld的用法 这次来理解一些 lt 的含义 一 理解 lt 的含义 Makefile中 格式为这样的 ta
  • Spring Roo 实站( 一 )部署安装 & 第一个示例程序

    一 安装 注 可以参与官网spring roo static springsource org spring roo reference html intro html intro exploring sampleROO OPTS http
  • 【Linux 驱动篇(二)】LED 驱动开发

    文章目录 一 Linux 下 LED 灯驱动原理 1 地址映射 1 1 ioremap 函数 1 2 iounmap 函数 2 I O 内存访问函数 2 1 读操作函数 2 2 写操作函数 二 实验程序编写 1 LED 灯驱动程序编写 2
  • 电脑不能开热点的一种可以尝试的解决方法

    1 说明 方法不一定万能 个人情况 win10 以前可以开热点 不知何时起不能再开 会显示 我们无法设置移动热点 2 解决办法 1 管理员方式打开cmd 2 运行命令 netsh int ip reset netsh winsock res
  • 【金融系列】【statsmodels】如何用Python做实证研究?介绍一个功能和STATA很像的Python包,最小二乘,虚拟变量

    博主本科接触的研究主要是公司金融方向的研究 在公司金融的实证研究中 我们的终极目标是建立变量间的因果关系 我们需要识别因果关系 来检验理论 评价政策效果 或作出预测 目前该领域的研究大部分是使用了STATA和R这两种工具来开展研究的 其实作
  • 亲测可用:opencv图片序列转视频

    亲测可用 glob函数可以遍历文件夹下文件 完毕后可在项目目录下生成output avi视频 可以稍作改进 转换的时候显示当前转换图像 include
  • 网络安全专业毕业设计最新最全选题精华汇总-持续更新中

    前言 大家好 这里是海浪学长毕设专题 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的升学就业做准备 一边要为毕业设计耗费大量精力 学长给大家整理了网络安全专业最新精选选题 如遇选题困难或选题有任何疑问
  • 将语雀文档迁移到飞书

    前言 我爬虫课程的文字版内容沉淀在语雀的知识库中 一开始感觉很不错 随着课程一直在卖 很快就超过了200人的限制 我已经是个人版中最高级的会员了 但语雀知识库的协作人数依旧限制在200人 即花钱无法解决问题 先说一下我的需求 我需要一个可以
  • 深度学习之实现图像数据增强

    深度学习之实现图像数据增强 前言 数据增强的意思就是让数据量增多 对于深度学习来说 大的数据量可以训练出更好的深度学习模型 在图像增强方面 我们常用的手段如下 旋转 翻转 缩放 平移 尺度变换 对比度变换 噪声扰动 颜色变换 1 使用ten