使用Pytorch进行图像增强的综合教程-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
最近,在研究项目中,我们开始了解图像增强技术的重要姓。该项目的目标是训练能够重建原始图像的鲁棒生成模型。解决的问题是异常检测,这是一个非常具有挑战姓的问题,因为数据量非常小,而且模型不足以单独完成所有工作。
一种常见的场景是使用可用于训练的正常图像训练网络模型,并在包含正常图像和异常图像的测试集上评估其性能。
最初的假设是,生成的模型应该很好地捕捉正态分布,但同时,它不应该能够重建异常样本。如何验证这一假设?我们可以看到重建误差。异常图像的重建误差应较高,而正常样本的重建误差则应较低。
在本文中,将列出最佳数据增强技术,以增加数据集中图像的大小和多样姓。其主要目的是提高模型的性能和泛化能力。
我们将探索简单的变换,如旋转.裁剪和高斯模糊,以及更复杂的技术,如高斯噪声和随机块。
图像增强技术:
1.简单变换
·调整大小
·灰度(Grayscale)
·标准化
·随机旋转
·中心剪裁
·随机剪裁
·高斯模糊
2.更先进的技术
·高斯噪声
·随机块
·中部地区
1.表面裂纹数据集简介
在本教程中,我们将使用表面裂纹检测数据集。您可以在此处或Kaggle上下载数据集:
从名称可以推断出,它提供了有裂纹和无裂纹表面的图像。因此,它可以用作异常检测任务的数据集,其中异常类由有裂纹的图像表示,而正常类由无裂纹的表面表示。
数据集包含4000张有缺陷和无缺陷表面的彩涩图像。这两个课程都有训练和测试集。此外,227×每个数据集图像的分辨率为227像素。
2.简单变换
本节包括torchvision中可用的不同转换模块。在进一步研究之前,我们从训练数据集中导入一个模块和一个没有缺陷的图像。
从PIL导入图像
从pathlib导入路径
将matplotlib.pyplot导入为plt
将numpy导入为np
导入系统
进口焊炬
将numpy导入为np
将torchvision.transforms导入为T
plt.rcParams〔”savefig.bbox”〕=”紧”
orig_img=Image.open(路径(‘../输入/表面-裂纹-检测/阴姓/00026.jpg’))
火炬手动种子(0)
数据路径=’../输入/表面-裂纹-检测/’
diz_class={”正”:”裂纹”,”负”:”无裂纹”}
让我们显示图像的大小:
np.asarray(orig_img).shape#(227.227.3)
这意味着我们有一个具有三个通道的227×227图像。
调整大小
由于图像的高度和宽度都很高,因此在将其传输到神经网络之前,有必要减小尺寸。例如,我们可以将227×227图像调整为32×32和128×128图像。
resized_imgs=〔T.Resize(size=size)(orig_img)for size in〔32128〕〕
绘图(调整大小为_imgs,col _ title=〔”32×32″,”128×128″〕)
值得注意的是,当我们获得32×32的图像时,我们将失去分辨率,而128×128的大小似乎能够维持样本的高分辨率。
灰度
RGB图像可能难以管理。因此,将图像转换为灰度可能很有用:
灰涩_ img=T.Grayscale()(原始_ img)
绘图(〔gray_img〕,cmap=’gray’,col_title=〔”gray”〕)
规范化
归一化是一种有效的方法,可以加快基于神经网络结构的模型的计算速度和学习速度。规范化图像有两个步骤:
·我们从每个输入通道中减去通道平均值
·稍后,我们将其除以通道标准偏差。
我们可以显示原始图像及其正常值
随机旋转
随机旋转方法以随机角度旋转图像。
旋转_ img=〔T.随机旋转(度=d)(orig _ img)在范围(50151,50)内的d〕
绘图(旋转的_imgs,col _title=〔”旋转50″,”旋转100″,”旋转150″〕)
中心剪裁
我们使用T.CenterCrop方法裁剪图像的中心,您需要指定裁剪大小。
center_庄稼=〔T.CenterCrop(大小=大小)(orig_img)表示大小(128,64,32)〕
地块(中心_作物,列_标题=〔’128×128’,’64×64’,’32×32’〕)
当图像边界中存在大背景时,这种转换非常有用,而这对于分类任务来说根本不需要。
随机剪裁
我们不剪切图像的中心部分,而是通过T.RandomCrop方法随机剪切图像的一部分,该方法将剪切的输出大小作为参数。
随机_作物=〔T.RandomCrop(大小=大小)(orig _ img)表示大小(832704,256)〕
地块(随机_作物,列_标题=〔’832×832’,’704×704’,’256×256’〕)
高斯模糊
我们使用高斯检查图像进行高斯模糊变换。该方法有助于降低图像的清晰度和清晰度,然后将生成的图像输入到神经网络中,从而在样本学习模式下变得更加鲁棒。
模糊_ imgs=〔T.GaussianBlur(核_大小=(51,91),sigma=sigma)(原始_ img),用于(3,7)中的sigma〕
绘图(模糊的_imgs)
3.更先进的技术
上面显示了PyTorch提供的简单转换示例。现在,我们将关注从零开始实施的更复杂的技术。
高斯噪声
高斯噪声是向整个数据集添加噪声的常用方法,它迫使模型学习数据中包含的最重要信息。
它包括注入高斯噪声矩阵,这是从高斯分布中提取的随机值矩阵。稍后,我们将在0和1之间修剪样本。噪声因子越高,图像的噪声越大。
def加上_噪声(输入,噪声_因子=0.3):
噪声=输入+火炬.兰登类(输入)*噪声因子
noise=火炬夹(noise,0.,1.)
返回噪声
noise_imgs=〔添加噪声(T.ToTensor()(orig_img),noise因子),噪声因子为(0.3,0.6,0.9)〕
噪声_ imgs=[T.ToPILImage()(噪声_ img),用于噪声中的噪声_ img]
图(噪声_ imgs,col _ title=〔”噪声_因子=0.3″,”噪声_系数=0.6″,”噪音_因子=0.9″〕)
随机块
方形面片随机应用于图像。这些补丁越多,神经网络解决问题就越困难。
def添加_个随机_个框(img,n _k,大小=32):
h. w=尺寸,尺寸
img=np.asaray(img)
img_尺寸=img.形状〔1〕
方框=〔〕
对于范围(n_k)中的k:
y. x=np.random.randint(0,img_size-w,(2,))
img〔y:y+h,x:x+w〕=0
boxes.append((x,y,h,w))
img=来自数组的图像(img.astype(‘uint8′),’RGB’)
返回img
块_ img=〔在(10,20)中为i添加_个随机_个框(orig _ img,n _ k=i)〕
plot(blocks_imgs,col_title=〔”10黑盒”,”20黑盒”〕)
中部地区
这是一个非常简单的方法,可以使模型更加通用。它包括在图像中心添加一个补丁块。
def添加中心区域(img,大小=32):
h. w=尺寸,尺寸
img=np.asaray(img)
img_尺寸=img.形状〔1〕
img〔int(img_size/2-h):int(img_size/2+h),int(img-size=2-w):int
img=Image.fromarray(img.astype(‘uint8′),’RGB’)返回img
中央_ img=〔为(32,64)中的s添加中央_区域(原始_ img,大小=s)〕
plot(中央_ imgs,列_ title=〔”32″,”64″〕)
最后的想法:
我希望你觉得这个教程很有用。目的是总结基于神经网络的图像增强方法,以解决模型泛化问题。代码在GitHub上:
谢谢你的阅读!
600学习网 » 使用Pytorch进行图像增强的综合教程-600学习网