常用图像增广方法主要有:左右翻转(上下翻转对于许多目标并不常用),随机裁剪,变换颜色(亮度,对比度,饱和度和色调)等等,我们拟用opencv-python实现部分数据增强方法。
结构如下:
class FunctionClass:
def __init__(self, parameter):
self.parameter=parameter
def __call__(self, img):
要求
- 1.补全代码
- 2.验证增强效果
- 3.可自选实现其他增强效果
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
filename = '1.jpg'
## [Load an image from a file]
img = cv2.imread(filename)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
print(img.shape)
(350, 350, 3)
1.图片缩放
class Resize:
def __init__(self, size):
self.size=size
def __call__(self, img):
return cv2.resize(img, self.size)
# 此处插入代码
resize=Resize( (600, 600))
img2=resize(img)
plt.imshow(img2)
2.图片翻转
class Flip:
def __init__(self, mode):
self.mode=mode
def __call__(self, img):
return cv2.flip(img, self.mode)
# 此处插入代码
flip=Flip(mode=0)
img2=flip(img)
plt.imshow(img2)
3图片旋转
class Rotate:
def __init__(self, degree,size):
self.degree=degree
self.size=size
def __call__(self, img):
height, width, channels = img.shape
M = cv2.getRotationMatrix2D((height / 2, width / 2), self.degree, self.size)
return cv2.warpAffine(img, M, (height, width))
# 此处插入代码
rotate=Rotate( 45, 0.7)
img2=rotate(img)
plt.imshow(img2)
4.图片亮度调节
class Brightness:
def __init__(self,brightness_factor):
self.brightness_factor=brightness_factor
def __call__(self, img):
return np.uint8(np.clip((self.brightness_factor * img), 0, 255))
# 此处插入代码
brightness=Brightness(0.6)
img2=brightness(img)
plt.imshow(img2)
5.图片随机裁剪
import random
import math
class RandomErasing(object):
def __init__(self, EPSILON=0.5, sl=0.02, sh=0.4, r1=0.3,
mean=[0., 0., 0.]):
self.EPSILON = EPSILON
self.mean = mean
self.sl = sl
self.sh = sh
self.r1 = r1
def __call__(self, img):
if random.uniform(0, 1) > self.EPSILON:
return img
for attempt in range(100):
area = img.shape[0] * img.shape[1]
target_area = random.uniform(self.sl, self.sh) * area
aspect_ratio = random.uniform(self.r1, 1 / self.r1)
h = int(round(math.sqrt(target_area * aspect_ratio)))
w = int(round(math.sqrt(target_area / aspect_ratio)))
# 此处插入代码
if w < img.shape[0] and h < img.shape[1]:
x1 = random.randint(0, img.shape[1] - h)
y1 = random.randint(0, img.shape[0] - w)
if img.shape[2] == 3:
img[ x1:x1 + h, y1:y1 + w, 0] = self.mean[0]
img[ x1:x1 + h, y1:y1 + w, 1] = self.mean[1]
img[ x1:x1 + h, y1:y1 + w, 2] = self.mean[2]
else:
img[x1:x1 + h, y1:y1 + w,0] = self.mean[0]
return img
return img
erase = RandomErasing()
img2=erase(img)
plt.imshow(img2)
记录从飞桨的学习过程:https://aistudio.baidu.com/aistudio/course/introduce/11939?directly=1&shared=1