深度学习之数据扩充,对应生成扩充的标签文件
需要用到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)
输出结果:
深度学习之数据扩充,对应生成扩充的标签文件相关推荐
- 仿真的数据能否用来深度学习_数字孪生弥合了深度学习的数据鸿沟
点击上方"蓝色字体",选择 "设为星标" 关键讯息,D1时间送达! 随着企业开始使用可将其数据投入使用的深度学习(DL)项目,他们必须保护这些数据,而数字孪生是 ...
- 深度学习——day38 读论文:基于深度学习的数据竞争检测方法(DeleRace计算机研究与发展 2022)
基于深度学习的数据竞争检测方法 chap0 Introduction 本文贡献: 原文及笔记下载 chap1 DeleRace 1.1 检测框架 1.2 选取实际应用程序 1.3 特征提取 1.3.1 ...
- 深度学习训练数据打标签过程
深度学习训练数据打标签过程 为了获取大量的图片训练数据,在采集数据的过程中常用视频的方式采集数据,但对于深度学习,训练的过程需要很多的有有标签的数据,这篇文章主要是解决视频文件转换成图片文件,并加标签 ...
- 深度学习故障诊断之-使用条件生成对抗网络CGAN生成泵流量信号
开始填坑 MATLAB统计机器学习,深度学习,计算机视觉 - 哥廷根数学学派的文章 - 知乎 MATLAB统计机器学习,深度学习,计算机视觉 - 知乎 之前写过在使用深度学习对机械系统或电气系统进行故 ...
- MATLAB中深度学习的数据集合
简 介: 本文总结了部分MATLAB中用于深度学习的数据集合. 关键词: MATLAB,DEEPLENARING #mermaid-svg-xPWl4yTsAw5Z4HFe {font-family: ...
- DL:关于深度学习常用数据集中训练好的权重文件(Deeplab v3、MobileNet、InceptionV3、VGG系列、ResNet、Mask R-CNN )下载地址集合(持续更新)
DL:关于深度学习常用数据集中训练好的权重文件(Deeplab v3.MobileNet.InceptionV3.VGG系列.ResNet.Mask R-CNN )下载地址集合(持续更新) 目录 基于 ...
- 花书+吴恩达深度学习(二九)生成随机网络 GSN
文章目录 0. 前言 1. 生成随机网络 GSN 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔,我会非常开心的~ 花书+吴恩达深度学习(二七)深度生成模型之玻尔兹曼机及其变体(RBM, DB ...
- 深度学习 Day 8——解决GIF生成错误以及有关GAN过程问题
深度学习 Day 8--解决GIF生成错误以及有关GAN过程问题 文章目录 深度学习 Day 8--解决GIF生成错误以及有关GAN过程问题 一.前言 二.我的环境 三.问题一:生成GIF时报错 四. ...
- 毕业设计-基于深度学习的数据融合方法研究
目录 前言 课题背景和意义 实现技术思路 一.深度学习概述 二.基于深度学习的数据融合方法分类 1.基于深度学习特征提取的数据融合方法 2.基于深度学习融合的数据融合方法 3.基于深度学习全过程的数据 ...
- Keras深度学习实战(22)——生成对抗网络详解与实现
Keras深度学习实战(22)--生成对抗网络详解与实现 0. 前言 1. 生成对抗网络原理 2. 模型分析 3. 利用生成对抗网络生成手写数字图像 小结 系列链接 0. 前言 生成对抗网络 (Gen ...
最新文章
- [心得分享] 我在 GitHub 上学习开源
- Ext.MessageBox.Show使用Progress
- number five
- Golang Json文件解析为结构体工具-json2go
- UI实用素材|登录和个人资料界面模板
- ping命令 仿源码实现 以及几个 命令的 使用
- BZOJ1853: [Scoi2010]幸运数字(容斥原理)
- How to read MANIFEST.MF file from JAR using Bash
- 排序合并连接(sort merge join)的原理
- 强的离谱!串烧70+个Transformer模型,涵盖CV、NLP、金融、隐私计算...
- Windows 下 XDebug 手工配置
- 移远BC95 nbiot接入华为OC云平台(电信云)
- 图片右侧加文字html完整代码,怎么用css在图片右下方添加文字
- 路由器忘记密码的解决办法
- Linux数据备份与恢复 dump、restore、dd命令
- MATLAB优化工具箱—Optimization Toolbox™
- 托福口语_新航道_刘莹_task 3 task5
- “文心一言”和“ChatGPT”两者有何差距?
- XCTF simple-unpacked
- 关于 webview 截图 部分显示空白的处理