先安装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博客_深度学习数据扩充

图像数据增强及其对应的标签扩充相关推荐

  1. Python:图像数据增强和保存

    Python:图像数据增强和保存 code 参考博客链接:https://blog.csdn.net/qq_36756866/article/details/108255715 在进行模型分析处理的时 ...

  2. python批量实现图像数据增强(扩增)

    什么是数据扩增? 数据扩增是对数据进行扩充的方法的总称.数据扩增可以增加训练集的样本,可以有效缓解模型过拟合的情况,也可以给模型带来的更强的泛化能力. 通常在进行数据扩增操作的时候应该保持图像原本的标 ...

  3. YOLO自带的图像数据增强方法

    yolo数据增强code: V3: https://github.com/ultralytics/yolov3/blob/master/utils/datasets.py V4: https://gi ...

  4. 图像数据增强方法一览(附python代码)

    在图像分类任务中,图像数据增强一般是大多数人会采用的方法之一,这是由于深度学习对数据集的大小有一定的要求,若原始的数据集比较小,无法很好地满足网络模型的训练,从而影响模型的性能,而图像增强是对原始图像 ...

  5. 干货 | 图像数据增强实战

    我目前正在做图像数据增强的深度和有效性的研究.这项研究的目的是学习怎样增加只有有限或少量数据的数据集大小,增强训练的卷积网络模型的鲁棒性. 需要列出所有可以想到的图像增强的方法,并将这些方法进行组合, ...

  6. 【Tool】Augmentor和imgaug——python图像数据增强库

    Augmentor和imgaug--python图像数据增强库 Tags: ComputerVision Python 介绍两个图像增强库:Augmentor和imgaug,Augmentor使用比较 ...

  7. python图像增强_【Tool】Augmentor和imgaug——python图像数据增强库

    Augmentor和imgaug--python图像数据增强库 Tags: ComputerVision Python 介绍两个图像增强库:Augmentor和imgaug,Augmentor使用比较 ...

  8. 目标检测:python实现多种图像数据增强的方法(光照,对比度,遮挡,模糊)

    图像数据增强的内容(可根据需要自定义选择): 1.直方图均衡化 2.clahe自适应对比度直方图均衡化 3.白平衡 4.亮度增强 5.亮度,饱和度,对比度增强 6.去除图像上的高光部分 7.自适应亮度 ...

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

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

最新文章

  1. R语言使用Rtsne包进行TSNE分析:通过数据类型筛选数值数据、scale函数进行数据标准化缩放、提取TSNE分析结果合并到原dataframe中(tSNE with Rtsne package)
  2. c语言中 char怎样用,C语言中char*和char[]用法区别分析
  3. AI开放平台,这里给你罗列全了
  4. C#的控件输入法变换
  5. HDU 1247(Hat’s Words )
  6. python 闭包(closure)
  7. 对照片进行边缘化处理,并将边缘化处理后的结果保存
  8. 第六十七期:全球500强公司的2100万登录信息惊现于暗网上!
  9. Webpack构建性能优化指南
  10. C#LeetCode刷题之#566-重塑矩阵( Reshape the Matrix)
  11. django 实现linux运维管理平台
  12. Python之数据分析(坐标刻度定位器、散点图、柱状图、颜色区域填充)
  13. python中argsparse_Python中的argparse模块
  14. 编译lua5.3.5报错:libreadline.so存在多处未定义的引用
  15. Struts框架面试题
  16. Python 实现端口扫描器
  17. git push 报错Push rejected、 remote unpack failed 、unpacker error、 failed to push some refs to
  18. 适合小白的大白话讲解---Git与Github的区别
  19. 历年四级作文范文(1994.6-2007.6)
  20. love2d之路(一)环境配置

热门文章

  1. java比较器原理理解
  2. 在R中统计数据的频数或者密度分布并图形化
  3. DeFi+NFT出圈姿势盘点,NFT借贷等应用领域值得关注
  4. Matlab二维图形绘制与图形处理
  5. 战舰世界闪击战游戏攻略
  6. Android应用性能优化最佳实践.2.3 布局优化
  7. 在线制作网站sitemap并提交
  8. 数字视音频处理知识点小结
  9. G. Good Key, Bad Key(暴力)
  10. 《分布式与云计算》课程笔记——2.2 Distributed Systems:P2P