图像数据增强及其对应的标签扩充
先安装imgaug库,命令为:
pip install imgaug
以下代码用到的标签数据类型为yolo格式(即.txt),如果你的是voc格式(即.xml),可参考:
VOC格式标签与yolo格式标签互相转换代码_m0_48987347的博客-CSDN博客
进行格式转换。
然后按下图所示结构创建数据扩增项目。注意:图片和标签放于同一文件夹内,路径不含中文。
其中, 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.Sometimes(0.5, iaa.Fliplr(1)), 0.5概率翻转iaa.Fliplr(0.5), # 翻转图片,水平翻转图像(左右)], random_order=True)
AUGMENTATION_TRANSFORMS = transforms.Compose([AbsoluteLabels(), # 绝对标签DefaultAug(), # 一些基本的数据增强RelativeLabels(), # 相对标签])
expansion.py函数入口:注意修改default和copy_num的值
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()# default指定存放图像和标签的路径parser.add_argument('--img_path', type=str, default='JPEGImages',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[:, :]
扩充前后的数据效果对比:
输出结果:
参考:深度学习之数据扩充,对应生成扩充的标签文件_HowHardYouAre的博客-CSDN博客_深度学习数据扩充
图像数据增强及其对应的标签扩充相关推荐
- Python:图像数据增强和保存
Python:图像数据增强和保存 code 参考博客链接:https://blog.csdn.net/qq_36756866/article/details/108255715 在进行模型分析处理的时 ...
- python批量实现图像数据增强(扩增)
什么是数据扩增? 数据扩增是对数据进行扩充的方法的总称.数据扩增可以增加训练集的样本,可以有效缓解模型过拟合的情况,也可以给模型带来的更强的泛化能力. 通常在进行数据扩增操作的时候应该保持图像原本的标 ...
- YOLO自带的图像数据增强方法
yolo数据增强code: V3: https://github.com/ultralytics/yolov3/blob/master/utils/datasets.py V4: https://gi ...
- 图像数据增强方法一览(附python代码)
在图像分类任务中,图像数据增强一般是大多数人会采用的方法之一,这是由于深度学习对数据集的大小有一定的要求,若原始的数据集比较小,无法很好地满足网络模型的训练,从而影响模型的性能,而图像增强是对原始图像 ...
- 干货 | 图像数据增强实战
我目前正在做图像数据增强的深度和有效性的研究.这项研究的目的是学习怎样增加只有有限或少量数据的数据集大小,增强训练的卷积网络模型的鲁棒性. 需要列出所有可以想到的图像增强的方法,并将这些方法进行组合, ...
- 【Tool】Augmentor和imgaug——python图像数据增强库
Augmentor和imgaug--python图像数据增强库 Tags: ComputerVision Python 介绍两个图像增强库:Augmentor和imgaug,Augmentor使用比较 ...
- python图像增强_【Tool】Augmentor和imgaug——python图像数据增强库
Augmentor和imgaug--python图像数据增强库 Tags: ComputerVision Python 介绍两个图像增强库:Augmentor和imgaug,Augmentor使用比较 ...
- 目标检测:python实现多种图像数据增强的方法(光照,对比度,遮挡,模糊)
图像数据增强的内容(可根据需要自定义选择): 1.直方图均衡化 2.clahe自适应对比度直方图均衡化 3.白平衡 4.亮度增强 5.亮度,饱和度,对比度增强 6.去除图像上的高光部分 7.自适应亮度 ...
- 深度学习之实现图像数据增强
深度学习之实现图像数据增强 前言 数据增强的意思就是让数据量增多.对于深度学习来说,大的数据量可以训练出更好的深度学习模型. 在图像增强方面,我们常用的手段如下: 旋转 翻转 缩放 平移 尺度变换 对 ...
最新文章
- R语言使用Rtsne包进行TSNE分析:通过数据类型筛选数值数据、scale函数进行数据标准化缩放、提取TSNE分析结果合并到原dataframe中(tSNE with Rtsne package)
- c语言中 char怎样用,C语言中char*和char[]用法区别分析
- AI开放平台,这里给你罗列全了
- C#的控件输入法变换
- HDU 1247(Hat’s Words )
- python 闭包(closure)
- 对照片进行边缘化处理,并将边缘化处理后的结果保存
- 第六十七期:全球500强公司的2100万登录信息惊现于暗网上!
- Webpack构建性能优化指南
- C#LeetCode刷题之#566-重塑矩阵( Reshape the Matrix)
- django 实现linux运维管理平台
- Python之数据分析(坐标刻度定位器、散点图、柱状图、颜色区域填充)
- python中argsparse_Python中的argparse模块
- 编译lua5.3.5报错:libreadline.so存在多处未定义的引用
- Struts框架面试题
- Python 实现端口扫描器
- git push 报错Push rejected、 remote unpack failed 、unpacker error、 failed to push some refs to
- 适合小白的大白话讲解---Git与Github的区别
- 历年四级作文范文(1994.6-2007.6)
- love2d之路(一)环境配置