背景
CV训练模型时,如果数据缺乏,我们会采用多种数据增强策略,用于增加数据多样性,常用的数据增强策略有亮度增强、翻转、旋转、模糊等方法。本文主要是基于imgaug库函数实施的一种旋转的数据增强策略。
代码如下
import os
import cv2
import random
import numpy as np
import imgaug
import imgaug.augmenters as iaa
seqs = iaa.Sequential([
iaa.Fliplr(0.35),
iaa.Sometimes(0.35, iaa.AdditiveGaussianNoise(scale=(10, 30))),
iaa.Sometimes(0.35, iaa.GaussianBlur(sigma=(0, 3.0))),
iaa.Sometimes(0.35, iaa.Affine(rotate=(-10, 10)))
], random_order=True)
def parse_gts(gtpath):
polys = []
reader = open(gtpath, "r").readlines()
for line in reader:
points = line.strip().split(",")[:-1]
points = np.array(list(map(int, points[4:]))).reshape((-1, 2))
polys.append(points)
return polys
if __name__ == '__main__':
root_dir = "..."
imgdir = os.path.join(root_dir, "images")
gtsdir = os.path.join(root_dir, "gts")
txtpath = os.path.join(root_dir, "test.txt")
save_imgdir = imgdir + "_shows"
if not os.path.exists(save_imgdir):
os.mkdir(save_imgdir)
reader = open(txtpath, "r").readlines()
for line in reader[:]:
imgname = line.strip()
imgpath = os.path.join(imgdir, imgname)
gtspath = os.path.join(gtsdir, imgname + ".txt")
image = cv2.imread(imgpath)
img_shape = image.shape[:2]
polys = parse_gts(gtspath)
aug_seqs = seqs.to_deterministic()
aug_image = aug_seqs.augment_image(image)
length = len(polys)
newpolys = []
for i in range(length):
keypoints = [imgaug.Keypoint(p[0], p[1]) for p in polys[i]]
keypoints = aug_seqs.augment_keypoints(
[imgaug.KeypointsOnImage(keypoints, shape=img_shape)])[0].keypoints
poly = [(int(p.x), int(p.y)) for p in keypoints]
poly = np.array(poly).reshape((-1, 2))
newpolys.append(poly)
# print(img_shape)
for poly in newpolys:
# print(poly)
aug_image = cv2.polylines(aug_image, [poly], True, [0, 255, 0], 2)
cv2.imwrite(os.path.join(save_imgdir, imgname), aug_image)