卷积神经网络基础学习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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值