提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
卷积神经网络基础学习2
Rand_Augment模块
class Rand_Augment():
def init(self, Numbers=None, max_Magnitude=None):
图像增强类,输入参数有两个:图像增强的种类数目,增强的幅度。
增强的种类,十种:“自动对比”、“均衡”、“旋转”、“日光”、“色调”、“多色调分色”、“对比度”、“亮度”、“锐度”、“X剪切”、“Y剪切”、“X平轴向平移”、“Y平轴向平移”
self.transforms = ['autocontrast', 'equalize', 'rotate', 'solarize', 'color', 'posterize', 'contrast', 'brightness', 'sharpness', 'shearX', 'shearY', 'translateX', 'translateY']
默认增强种类为五种,默认增强幅度为10
if Numbers is None:
self.Numbers = len(self.transforms) // 2
else:
self.Numbers = Numbers
if max_Magnitude is None:
self.max_Magnitude = 10
else:
self.max_Magnitude = max_Magnitude
以下是建议量值取值范围,
语法numpy.linspace
numpy.linspace(start,stop,num = 50,endpoint = True,retstep = False,dtype = None,axis = 0 )
返回指定间隔内的等间隔数字。
返回在间隔[ start,stop ]内计算的num个均匀间隔的样本。
间隔的端点可以选择排除。
参量
start
数据类型 array
序列的起始值。
stop
数据类型 array
序列的最终值,除非将端点设置为False。在这种情况下,该序列包括除最后一个 均匀间隔的样本外的所有样本,因此排除了终止点。请注意,当端点为False时,步长会更改。num + 1
num
int,可选
要生成的样本数。默认值为50。必须为非负数。
endpoint
布尔值,可选
如果为True,则停止是最后一个样本。否则,不包括在内。默认值为True。
retoo
布尔值,可选
如果为True,则返回(samples,step),其中step是样本之间的间隔。
dtype
dtype,可选
输出数组的类型。如果dtype未给出,则从其他输入参数推断数据类型。
1.9.0版中的新功能。
axis
int,可选
结果中的轴用于存储样本。仅当start或stop类似于数组时才相关。默认情况下(0),样本将沿着在开始处插入的新轴。使用-1来获得轴的末端。
1.16.0版中的新功能。
退货
samples
数据类型ndarray
在关闭间隔或半开间隔 (取决于端点是True还是False)中,有num个等间隔的样本 。[start, stop][start, stop)
step
数据类型float, optional
仅在retstep为True时返回
样本之间的间距大小。
fillcolor = 128
self.ranges = {
"shearX": np.linspace(0, 0.3, 10),
"shearY": np.linspace(0, 0.3, 10),
"translateX": np.linspace(0, 0.2, 10),
"translateY": np.linspace(0, 0.2, 10),
"rotate": np.linspace(0, 360, 10),
"color": np.linspace(0.0, 0.9, 10),
"posterize": np.round(np.linspace(8, 4, 10), 0).astype(np.int),
"solarize": np.linspace(256, 231, 10),
"contrast": np.linspace(0.0, 0.5, 10),
"sharpness": np.linspace(0.0, 0.9, 10),
"brightness": np.linspace(0.0, 0.3, 10),
"autocontrast": [0] * 10,
"equalize": [0] * 10,
"invert": [0] * 10
}
语法im.transform
im.transform(size,method, data) ⇒ image
im.transform(size, method, data, filter) ⇒ image
用给定的尺寸生成一张新的图像,与原图有相同的模式,使用给定的转换方式将原图数据拷贝到新的图像中。在当前的PIL版本中,参数method为EXTENT(裁剪出一个矩形区域),AFFINE(仿射变换),QUAD(将正方形转换为矩形),MESH(一个操作映射多个正方形)或者PERSPECTIVE。变量filter定义了对原始图像中像素的滤波器。在当前的版本中,变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。
转换方法:
1.EXTENT
从图像中裁剪一个区域。变量data为指定输入图像中两个坐标点的4元组(x0,y0,x1,y1)。输出图像为这两个坐标点之间像素的采样结果。例如,如果输入图像的(x0,y0)为输出图像的(0,0)点,(x1,y1)则与变量size一样。这个方法可以用于在当前图像中裁剪,放大,缩小或者镜像一个任意的长方形。它比方法crop()稍慢,但是与resize操作一样快。
2.AFFINE
对当前的图像进行仿射变换,变换结果体现在给定尺寸的新图像中。变量data是一个6元组(a,b,c,d,e,f),包含一个仿射变换矩阵的第一个两行。输出图像中的每一个像素(x,y),新值由输入图像的位置(ax+by+c, dx+ey+f)的像素产生,使用最接近的像素进行近似。这个方法用于原始图像的缩放、转换、旋转和裁剪。
3.QUAD
输入图像的一个四边形(通过四个角定义的区域)映射到给定尺寸的长方形。变量data是一个8元组(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四边形的左上,左下,右下和右上四个角。
4.PERSPECTIVE
对当前图像进行透视变换,产生给定尺寸的新图像。变量data是一个8元组(a,b,c,d,e,f,g,h),包括一个透视变换的系数。对于输出图像中的每个像素点,新的值来自于输入图像的位置的(a x + b y + c)/(g x + h y + 1), (d x+ e y + f)/(g x + h y + 1)像素,使用最接近的像素进行近似。这个方法用于原始图像的2D透视。
self.func = {
"shearX": lambda img, magnitude: img.transform(
img.size, Image.AFFINE, (1, magnitude *
random.choice([-1, 1]), 0, 0, 1, 0),
Image.BICUBIC, fill=fillcolor),
"shearY": lambda img, magnitude: img.transform(
img.size, Image.AFFINE, (1, 0, 0, magnitude *
random.choice([-1, 1]), 1, 0),
Image.BICUBIC, fill=fillcolor),
"translateX": lambda img, magnitude: img.transform(
img.size, Image.AFFINE, (1, 0, magnitude *
img.size[0] * random.choice([-1, 1]), 0, 1, 0),
fill=fillcolor),
"translateY": lambda img, magnitude: img.transform(
img.size, Image.AFFINE, (1, 0, 0, 0, 1, magnitude *
img.size[1] * random.choice([-1, 1])),
fill=fillcolor),
"rotate": lambda img, magnitude: self.rotate_with_fill(img, magnitude),
# "rotate": lambda img, magnitude: img.rotate(magnitude * random.choice([-1, 1])),
PIL中的ImageEnhance图像增强模块
1.classPIL.ImageEnhance._Enhance
返回增强图像。
参数
factor – 控制增强的浮点值。因子1.0始终返回原始图像的副本,较低的因子意味着较少的颜色(亮度、对比度等),较高的值更多。此值没有限制。
2.classPIL.ImageEnhance.Color(image)
调整图像颜色平衡。
该类可用于调整图像的颜色平衡,其方式类似于彩色电视机上的控件。增强系数为0.0会产生黑白图像。系数1.0表示原始图像。
3.classPIL.ImageEnhance.Contrast(image)
调整图像对比度。
此类可用于控制图像的对比度,类似于电视机上的对比度控制。增强系数为0.0时,图像呈灰色。系数1.0表示原始图像。
4.classPIL.ImageEnhance.Brightness(image)
调整图像亮度。
此类可用于控制图像的亮度。增强系数为0.0会产生黑色图像。系数1.0表示原始图像。
5.classPIL.ImageEnhance.Sharpness(image)
调整图像清晰度。
此类可用于调整图像的清晰度。增强系数为0.0表示图像模糊,系数为1.0表示原始图像,系数为2.0表示图像锐化。
"color": lambda img, magnitude: ImageEnhance.Color(img).enhance(1 + magnitude * random.choice([-1, 1])),
"posterize": lambda img, magnitude: ImageOps.posterize(img, magnitude),
"solarize": lambda img, magnitude: ImageOps.solarize(img, magnitude),
"contrast": lambda img, magnitude: ImageEnhance.Contrast(img).enhance(
1 + magnitude * random.choice([-1, 1])),
"sharpness": lambda img, magnitude: ImageEnhance.Sharpness(img).enhance(
1 + magnitude * random.choice([-1, 1])),
"brightness": lambda img, magnitude: ImageEnhance.Brightness(img).enhance(
1 + magnitude * random.choice([-1, 1])),
"autocontrast": lambda img, magnitude: ImageOps.autocontrast(img),
"equalize": lambda img, magnitude: img,
"invert": lambda img, magnitude: ImageOps.invert(img)
}
生成数据增强的元组,包含增强类型与增强种类数目。
def rand_augment(self):
"""Generate a set of distortions.
Args:
N: Number of augmentation transformations to apply sequentially. N is len(transforms)/2 will be best
M: Max_Magnitude for all the transformations. should be <= self.max_Magnitude """
M = np.random.randint(0, self.max_Magnitude, self.Numbers)
sampled_ops = np.random.choice(self.transforms, self.Numbers)
return [(op, Magnitude) for (op, Magnitude) in zip(sampled_ops, M)]
魔术方法之def call(self, *args)
Python中的函数是一级对象。这意味着Python中的函数的引用可以作为输入传递到其他的函数/方法中,并在其中被执行。
而Python中类的实例(对象)可以被当做函数对待。也就是说,我们可以将它们作为输入传递到其他的函数/方法中并调用他们,正如我们调用一个正常的函数那样。而类中__call__()函数的意义正在于此。为了将一个类实例当做函数调用,我们需要在类中实现__call__()方法。也就是我们要在类中实现如下方法:def call(self, *args)。这个方法接受一定数量的变量作为输入。
假设x是X类的一个实例。那么调用x.call(1,2)等同于调用x(1,2)。这个实例本身在这里相当于一个函数。
def __call__(self, image):
image = Image.fromarray(image)
operations = self.rand_augment()
for (op_name, M) in operations:
operation = self.func[op_name]
mag = self.ranges[op_name][M]
image = operation(image, mag)
return np.asarray(image)
参考:
https://www.osgeo.cn/pillow/reference/ImageEnhance.html
https://blog.csdn.net/Yaokai_AssultMaster/article/details/70256621?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160411840819725225030281%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160411840819725225030281&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-2-70256621.first_rank_ecpm_v3_pc_rank_v2&utm_term=call&spm=1018.2118.3001.4449