导读
本文总结了13种图像增强技术的pytorch实现方法,附代码详解。
使用数据增强技术可以增加数据集中图像的多样性,从而提高模型的性能和泛化能力。主要的图像增强技术包括:
调整大小 灰度变换 标准化 随机旋转 中心裁剪 随机裁剪 高斯模糊 亮度、对比度调节 水平翻转 垂直翻转 高斯噪声 随机块 中心区域 调整大小 在开始图像大小的调整之前我们需要导入数据(图像以眼底图像为例)。
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/000001.tif'))torch.manual_seed(0) # 设置 cpu 生成随机数的 种子 ,方便下次复现实验结果print(np.asarray(orig_img).shape) #(800, 800, 3)#图像大小的调整resized_imgs = [t.resize(size=size)(orig_img) for size in [128,256]]# plt.figure('resize:128*128')ax1 = plt.subplot(131)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(132)ax2.set_title('resize:128*128')ax2.imshow(resized_imgs[0])ax3 = plt.subplot(133)ax3.set_title('resize:256*256')ax3.imshow(resized_imgs[1])plt.show() 灰度变换
此操作将rgb图像转化为灰度图像。
gray_img = t.grayscale()(orig_img)# plt.figure('resize:128*128')ax1 = plt.subplot(121)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(122)ax2.set_title('gray')ax2.imshow(gray_img,cmap='gray') 标准化
标准化可以加快基于神经网络结构的模型的计算速度,加快学习速度。
从每个输入通道中减去通道平均值
将其除以通道标准差。
normalized_img = t.normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))(t.totensor()(orig_img))normalized_img = [t.topilimage()(normalized_img)]# plt.figure('resize:128*128')ax1 = plt.subplot(121)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(122)ax2.set_title('normalize')ax2.imshow(normalized_img[0])plt.show() 随机旋转
设计角度旋转图像
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))rotated_imgs = [t.randomrotation(degrees=90)(orig_img)]print(rotated_imgs)plt.figure('resize:128*128')ax1 = plt.subplot(121)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(122)ax2.set_title('90°')ax2.imshow(np.array(rotated_imgs[0]))
中心剪切
剪切图像的中心区域
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))center_crops = [t.centercrop(size=size)(orig_img) for size in (128,64)]plt.figure('resize:128*128')ax1 = plt.subplot(131)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(132)ax2.set_title('128*128°')ax2.imshow(np.array(center_crops[0]))ax3 = plt.subplot(133)ax3.set_title('64*64')ax3.imshow(np.array(center_crops[1]))plt.show() 随机裁剪
随机剪切图像的某一部分
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))random_crops = [t.randomcrop(size=size)(orig_img) for size in (400,300)]plt.figure('resize:128*128')ax1 = plt.subplot(131)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(132)ax2.set_title('400*400')ax2.imshow(np.array(random_crops[0]))ax3 = plt.subplot(133)ax3.set_title('300*300')ax3.imshow(np.array(random_crops[1]))plt.show() 高斯模糊
使用高斯核对图像进行模糊变换
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))blurred_imgs = [t.gaussianblur(kernel_size=(3, 3), sigma=sigma)(orig_img) for sigma in (3,7)]plt.figure('resize:128*128')ax1 = plt.subplot(131)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(132)ax2.set_title('sigma=3')ax2.imshow(np.array(blurred_imgs[0]))ax3 = plt.subplot(133)ax3.set_title('sigma=7')ax3.imshow(np.array(blurred_imgs[1]))plt.show() 亮度、对比度和饱和度调节
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))# random_crops = [t.randomcrop(size=size)(orig_img) for size in (832,704, 256)]colorjitter_img = [t.colorjitter(brightness=(2,2), contrast=(0.5,0.5), saturation=(0.5,0.5))(orig_img)]plt.figure('resize:128*128')ax1 = plt.subplot(121)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(122)ax2.set_title('colorjitter_img')ax2.imshow(np.array(colorjitter_img[0]))plt.show() 水平翻转from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))horizontalflip_img = [t.randomhorizontalflip(p=1)(orig_img)]plt.figure('resize:128*128')ax1 = plt.subplot(121)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(122)ax2.set_title('colorjitter_img')ax2.imshow(np.array(horizontalflip_img[0]))plt.show() 垂直翻转
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))verticalflip_img = [t.randomverticalflip(p=1)(orig_img)]plt.figure('resize:128*128')ax1 = plt.subplot(121)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(122)ax2.set_title('verticalflip')ax2.imshow(np.array(verticalflip_img[0]))# ax3 = plt.subplot(133)# ax3.set_title('sigma=7')# ax3.imshow(np.array(blurred_imgs[1]))plt.show() 高斯噪声 向图像中加入高斯噪声。通过设置噪声因子,噪声因子越高,图像的噪声越大。
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))def add_noise(inputs, noise_factor=0.3): noisy = inputs + torch.randn_like(inputs) * noise_factor noisy = torch.clip(noisy, 0., 1.) return noisynoise_imgs = [add_noise(t.totensor()(orig_img), noise_factor) for noise_factor in (0.3, 0.6)]noise_imgs = [t.topilimage()(noise_img) for noise_img in noise_imgs]plt.figure('resize:128*128')ax1 = plt.subplot(131)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(132)ax2.set_title('noise_factor=0.3')ax2.imshow(np.array(noise_imgs[0]))ax3 = plt.subplot(133)ax3.set_title('noise_factor=0.6')ax3.imshow(np.array(noise_imgs[1]))plt.show() 随机块
正方形补丁随机应用在图像中。这些补丁的数量越多,神经网络解决问题的难度就越大。
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))def add_random_boxes(img,n_k,size=64): h,w = size,size img = np.asarray(img).copy() img_size = img.shape[1] boxes = [] for k in range(n_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 = image.fromarray(img.astype('uint8'), 'rgb') return imgblocks_imgs = [add_random_boxes(orig_img,n_k=10)]plt.figure('resize:128*128')ax1 = plt.subplot(131)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(132)ax2.set_title('10 black boxes')ax2.imshow(np.array(blocks_imgs[0]))plt.show() 中心区域
和随机块类似,只不过在图像的中心加入补丁
from pil import imagefrom pathlib import pathimport matplotlib.pyplot as pltimport numpy as npimport sysimport torchimport numpy as npimport torchvision.transforms as tplt.rcparams[savefig.bbox] = 'tight'orig_img = image.open(path('image/2.png'))def add_central_region(img, size=32): h, w = size, size img = np.asarray(img).copy() img_size = img.shape[1] img[int(img_size / 2 - h):int(img_size / 2 + h), int(img_size / 2 - w):int(img_size / 2 + w)] = 0 img = image.fromarray(img.astype('uint8'), 'rgb') return imgcentral_imgs = [add_central_region(orig_img, size=128)]plt.figure('resize:128*128')ax1 = plt.subplot(131)ax1.set_title('original')ax1.imshow(orig_img)ax2 = plt.subplot(132)ax2.set_title('')ax2.imshow(np.array(central_imgs[0]))## ax3 = plt.subplot(133)# ax3.set_title('20 black boxes')# ax3.imshow(np.array(blocks_imgs[1]))plt.show()
小米6什么时候上市?小米6最新消息:小米新机米6将在4月19发布,性能强悍,防水持航能力强
新唐全新开发板Chili让你在40分钟内完成Linux下的应用开发
语音识别模块WTK6900G-B02的简单介绍
高性能低功耗,利尔达KP5A远距离蓝牙通讯模组上市
高性能LDO线性稳压器的设计
13种图像增强技术的pytorch实现方法
MS9122集成了HDMI 数据接口和音视频处理模块
内置调节器和外置调节器如何区分
HDMI支持的显示格式
小米6要抢国内首发?AR成骁龙835最大亮点
如何处理植保无人机喷头堵塞问题?
特斯拉前AI总监Andrej Karpathy:大模型有内存限制,这个妙招挺好用!
AMD发布首款平板电脑低功耗芯片
赛灵思用定点数实现信号处理链
压力变送器故障检修案例分析
物联网卡在物品定位追踪器中的应用
芯片市场低迷开始
艾拉比发布三大升级产品 拿下8家OEM订单
是德科技推出新款 PXI Express SMU高速源/测量单元
步进电机和伺服电机的主要区别在哪