图像增强技术通过对训练图像进行一系列随机更改以生成相似但不同的训练示例来扩展训练数据集的规模。并且随机更改一些示例可以有效的减小模型对某些属性的依赖,提高模型的泛化能力:
- 通过不同的方式裁剪图像,可以使刚兴趣的对象出现在不同位置,减小模型对位置的依赖
- 通过对图片颜色的调节,降低模型对颜色的敏感度。
from d2l import mxnet as d2l
from mxnet import autograd, init, np, npx, gluon, image
from mxnet.gluon import nn
from plotly import express as px, graph_objs as go
from IPython.display import Image
import plotly.io as pio
pio.kaleido.scope.default_format = "svg"
npx.set_np()
使用形状为400×500的猫咪图片作为例子。
img = image.imread('img/cat1.jpg')
fig = px.imshow(img.asnumpy())
img_bytes = fig.to_image(format="png", engine="kaleido")
Image(img_bytes)
多数图像增强的方法具有一定的随机性,编写一个方法用于展示,一个功能对图片处理多次的变化情况
from plotly.subplots import make_subplots
def show_imgs(imgs, num_rows=2, num_cols=4, scale=0.8) :
fig = make_subplots(num_rows, num_cols)
for i in range(num_rows):
for j in range(num_cols):
fig.add_trace(go.Image(z=imgs[num_cols*i+j].asnumpy()),i+1,j+1)
fig.update_xaxes(visible=False, row=i+1, col=j+1)
fig.update_yaxes(visible=False, row=i+1, col=j+1)
img_bytes = fig.to_image(format="png", scale=scale, engine="kaleido")
return Image(img_bytes)
def apply(img, aug, num_rows=2, num_cols=4, scale=0.8) :
Y = [aug(img) for _ in range(num_rows * num_cols)]
return show_imgs(Y, num_rows, num_cols, scale=scale)
1. 翻转和剪切
左右翻转图像通常不会更改对象的类别。这是最早且使用最广泛的图像增强方法之一。通过transforms模块的RandomFlipLeftRight方法以50%的概率将图片左右翻转。
apply(img, gluon.data.vision.transforms.RandomFlipLeftRight()