需要用到imgaug库,可自行安装。

直接上代码。transforms.py主要是对标签坐标进行转换及执行扩充操作

# import torch
import torch.nn.functional as F
import numpy as npimport imgaug.augmenters as iaa
from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImageimport torchvision.transforms as transforms# function: 将中心坐标(x,y),宽高(w, h)转为左上角坐标和右下角坐标的形式(x1, y1, x2, y2)
def xywh2xyxy_np(x):y = np.zeros_like(x)y[..., 0] = x[..., 0] - x[..., 2] / 2y[..., 1] = x[..., 1] - x[..., 3] / 2y[..., 2] = x[..., 0] + x[..., 2] / 2y[..., 3] = x[..., 1] + x[..., 3] / 2return yclass ImgAug(object):def __init__(self, augmentations=[]):self.augmentations = augmentationsdef __call__(self, data):img, boxes = data# convert xywh to xyxyboxes = np.array(boxes)boxes[:, 1:] = xywh2xyxy_np(boxes[:,1:])# convert bounding boxes to imgaugbounding_boxes = BoundingBoxesOnImage([BoundingBox(*box[1:], label = box[0]) for box in boxes],shape=img.shape)# apply augmentationsimg, bounding_boxes = self.augmentations(image = img,bounding_boxes = bounding_boxes)bounding_boxes = bounding_boxes.clip_out_of_image()# convert bounding boxes back to numpyboxes = np.zeros((len(bounding_boxes), 5))for box_idx, box in enumerate(bounding_boxes):x1 = box.x1y1 = box.y1x2 = box.x2y2 = box.y2#returns (x, y, w, h)boxes[box_idx, 0] = box.labelboxes[box_idx, 1] = ((x1+x2)/2)boxes[box_idx, 2] = ((y1+y2)/2)boxes[box_idx, 3] = (x2-x1)boxes[box_idx, 4] = (y2-y1)return img, boxesclass RelativeLabels(object):def __init__(self, ):passdef __call__(self, data):img, boxes = data# w, h, _ = img.shapeh = img.shape[0]w = img.shape[1]boxes[:, [1, 3]] /= wboxes[:, [2, 4]] /= hreturn img, boxesclass AbsoluteLabels(object):def __init__(self, ):passdef __call__(self, data):img, boxes = data# w, h, _ = img.datah = img.shape[0]w = img.shape[1]# boxes[:, [1, 3]]*=h# print(boxes[:, [1, 3]])boxes[:, 1] = boxes[:, 1] * wboxes[:, 3] = boxes[:, 3] * w# boxes[:, [2, 4]]*=wboxes[:, 2] = boxes[:, 2] * hboxes[:, 4] = boxes[:, 4] * hreturn img, boxesclass PadSquare(ImgAug):def __init__(self, ):self.augmentations = iaa.Sequential([iaa.PadToAspectRatio(1.0, position="center-center").to_deterministic()])class ToTensor(object):def __init__(self, ):passdef __call__(self, data):img, boxes = data#extract image as pytorch tensorimg = transforms.ToTensor()(img)bb_targets = torch.zeros((len(boxes), 6))bb_targets[:, 1:] = transforms.ToTensor()(boxes)return img, bb_targetsclass Resize(object):def __init__(self, size):self.size = sizedef __call__(self, data):img, boxes = dataimg = F.interpolate(img.unsqueeze(0), size = self.size, mode="nearest").squeeze(0)return img, boxesDEFAULT_TRANSFORMS = transforms.Compose([AbsoluteLabels(),PadSquare(),RelativeLabels()
])

数据扩充操作的代码,命名为augmentations.py,主要是设置扩充的参数等信息。

import imgaug.augmenters as iaa
from transforms import *   # 这里的transforms是上面的transforms.py文件,如果修改了文件名,这里对应修改即可
# imgaug是一个用于机器学习实验中图像增强的python库class DefaultAug(ImgAug):def __init__(self, ):self.augmentations = iaa.Sequential([  # 定义变换序列iaa.Dropout([0.0, 0.01]),          # 随机去掉一些像素点,即把这些像素点变成0iaa.Sharpen((0.0, 0.2)),iaa.Affine(rotate=(-20, 20), translate_percent=(-0.2,0.2)),  #仿射变换, rotate by -45 to 45 degrees (affects segmaps)iaa.AddToBrightness((-30, 30)), iaa.AddToHue((-20, 20)),iaa.Fliplr(0.5),    # 水平翻转图像(左右)], random_order=True)AUGMENTATION_TRANSFORMS = transforms.Compose([AbsoluteLabels(),       # 绝对标签DefaultAug(),           # 一些基本的数据增强RelativeLabels(),       # 相对标签])

函数入口所在代码

import numpy as np
import os
import cv2
from tqdm import tqdm
import argparse
from PIL import Image
from augmentations import *  # 这里的augmentations就是上面的augmentations.py文件# 获取文件下属性为imgProperty的所有文件
def GetImgNameByEveryDir(file_dir,imgProperty):   FileName         = []for root, dirs, files in os.walk(file_dir):  for file in files:  if os.path.splitext(file)[1] in imgProperty:  FileName.append(file)                              # 保存图片名称return FileNamedef readBoxes(txt_path):boxes = []with open(txt_path) as file:txt_lines = file.readlines()for txt_line in txt_lines:box = txt_line.rstrip().split(" ")boxes.append([int(box[0]), float(box[1]), float(box[2]), float(box[3]), float(box[4])])return boxes# 程序入口
# --img_path为需要扩增的图像数据
# note:图像和标签文件存在同一个文件夹
# 标签坐标:中心点坐标和宽高(cX, cY, W, H)if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--img_path', type=str, default = 'D:\\Code\\pythonCode\\enhanceImgColor\\imgs',help = 'image path')opt = parser.parse_args()img_list = GetImgNameByEveryDir(opt.img_path, ['.jpg', '.jpeg'])for img_name in tqdm(img_list):img_is_ok = 1boxes = []img_path = opt.img_path + '\\' + img_nametry:img = np.array(Image.open(img_path).convert('RGB'), dtype=np.uint8)img1 = cv2.imread(img_path)except Exception as e:print(f"could not read image '{img_path}'. ")img_is_ok = 0if img_is_ok: # 如果图像存在,读取对应的标签文件txt_path = img_path[:-3] + 'txt'boxes = readBoxes(txt_path)print(boxes)transform = AUGMENTATION_TRANSFORMSboxes = np.array(boxes)temp_boxes = np.zeros_like(boxes)temp_boxes[:, :] = boxes[:, :]## copy_num为对同一张图片扩充的张数 copy_num = 5for i in np.arange(copy_num):new_img, bb_target = transform((img1, boxes))save_name = img_name[:-4] + "_" + str(i)cv2.imwrite(save_name + '.jpg', new_img)txt_file = open(save_name + '.txt', 'w')for line in bb_target:bb = str(int(line[0])) + ' ' + str(line[1]) + ' ' + str(line[2])+ ' ' + str(line[3]) + ' ' + str(line[4]) +'\n'txt_file.write(bb)txt_file.close()boxes[:, :] = temp_boxes[:, :]

图像扩充前后对比实例:(示例图片源自COCO2014)

输出结果:

深度学习之数据扩充,对应生成扩充的标签文件相关推荐

  1. 仿真的数据能否用来深度学习_数字孪生弥合了深度学习的数据鸿沟

    点击上方"蓝色字体",选择 "设为星标" 关键讯息,D1时间送达! 随着企业开始使用可将其数据投入使用的深度学习(DL)项目,他们必须保护这些数据,而数字孪生是 ...

  2. 深度学习——day38 读论文:基于深度学习的数据竞争检测方法(DeleRace计算机研究与发展 2022)

    基于深度学习的数据竞争检测方法 chap0 Introduction 本文贡献: 原文及笔记下载 chap1 DeleRace 1.1 检测框架 1.2 选取实际应用程序 1.3 特征提取 1.3.1 ...

  3. 深度学习训练数据打标签过程

    深度学习训练数据打标签过程 为了获取大量的图片训练数据,在采集数据的过程中常用视频的方式采集数据,但对于深度学习,训练的过程需要很多的有有标签的数据,这篇文章主要是解决视频文件转换成图片文件,并加标签 ...

  4. 深度学习故障诊断之-使用条件生成对抗网络CGAN生成泵流量信号

    开始填坑 MATLAB统计机器学习,深度学习,计算机视觉 - 哥廷根数学学派的文章 - 知乎 MATLAB统计机器学习,深度学习,计算机视觉 - 知乎 之前写过在使用深度学习对机械系统或电气系统进行故 ...

  5. MATLAB中深度学习的数据集合

    简 介: 本文总结了部分MATLAB中用于深度学习的数据集合. 关键词: MATLAB,DEEPLENARING #mermaid-svg-xPWl4yTsAw5Z4HFe {font-family: ...

  6. DL:关于深度学习常用数据集中训练好的权重文件(Deeplab v3、MobileNet、InceptionV3、VGG系列、ResNet、Mask R-CNN )下载地址集合(持续更新)

    DL:关于深度学习常用数据集中训练好的权重文件(Deeplab v3.MobileNet.InceptionV3.VGG系列.ResNet.Mask R-CNN )下载地址集合(持续更新) 目录 基于 ...

  7. 花书+吴恩达深度学习(二九)生成随机网络 GSN

    文章目录 0. 前言 1. 生成随机网络 GSN 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔,我会非常开心的~ 花书+吴恩达深度学习(二七)深度生成模型之玻尔兹曼机及其变体(RBM, DB ...

  8. 深度学习 Day 8——解决GIF生成错误以及有关GAN过程问题

    深度学习 Day 8--解决GIF生成错误以及有关GAN过程问题 文章目录 深度学习 Day 8--解决GIF生成错误以及有关GAN过程问题 一.前言 二.我的环境 三.问题一:生成GIF时报错 四. ...

  9. 毕业设计-基于深度学习的数据融合方法研究

    目录 前言 课题背景和意义 实现技术思路 一.深度学习概述 二.基于深度学习的数据融合方法分类 1.基于深度学习特征提取的数据融合方法 2.基于深度学习融合的数据融合方法 3.基于深度学习全过程的数据 ...

  10. Keras深度学习实战(22)——生成对抗网络详解与实现

    Keras深度学习实战(22)--生成对抗网络详解与实现 0. 前言 1. 生成对抗网络原理 2. 模型分析 3. 利用生成对抗网络生成手写数字图像 小结 系列链接 0. 前言 生成对抗网络 (Gen ...

最新文章

  1. [心得分享] 我在 GitHub 上学习开源
  2. Ext.MessageBox.Show使用Progress
  3. number five
  4. Golang Json文件解析为结构体工具-json2go
  5. UI实用素材|登录和个人资料界面模板
  6. ping命令 仿源码实现 以及几个 命令的 使用
  7. BZOJ1853: [Scoi2010]幸运数字(容斥原理)
  8. How to read MANIFEST.MF file from JAR using Bash
  9. 排序合并连接(sort merge join)的原理
  10. 强的离谱!串烧70+个Transformer模型,涵盖CV、NLP、金融、隐私计算...
  11. Windows 下 XDebug 手工配置
  12. 移远BC95 nbiot接入华为OC云平台(电信云)
  13. 图片右侧加文字html完整代码,怎么用css在图片右下方添加文字
  14. 路由器忘记密码的解决办法
  15. Linux数据备份与恢复 dump、restore、dd命令
  16. MATLAB优化工具箱—Optimization Toolbox™
  17. 托福口语_新航道_刘莹_task 3 task5
  18. “文心一言”和“ChatGPT”两者有何差距?
  19. XCTF simple-unpacked
  20. 关于 webview 截图 部分显示空白的处理

热门文章

  1. PHP + HTML5兔子奔月吃月饼游戏源码
  2. 推股指期货规则准备工作基本完毕
  3. 中投民生:境外投资开放?只有你想不到!
  4. 扩展quill-editor的工具栏
  5. 一个被挂上木马Trojan-Dropper.MSWord.Lafool.i的政府网站
  6. 谷歌SEO外贸实用工具推荐
  7. 汽车销售行业微信小程序策划方案分享
  8. JavaScript day10
  9. Spark - 数据倾斜实战之 skewness 偏度与 kurtosis 峰度 By ChatGPT4
  10. vue基础之vue的常用指令