torchvisionのtransformsはお手軽にdata augmentationができとても便利です。是非使い込んでほしいので、簡単な例を示しておきたいと思います。
公式ドキュメント
TRANSFORMING AND AUGMENTING IMAGES から入るのがよいでしょうか。特に ILLUSTRATION OF TRANSFORMS は変換後の画像が示されているので、直感的にわかりやすいです。
実装例
多くの場合以下の実装の微調整でいい線行くと思います。
from torchvision import transforms from PIL import ImageFilter trans_train = transforms.Compose([ transforms.ToPILImage(), lambda x: x if np.random.random_sample() <= 0.1 else x.filter(ImageFilter.GaussianBlur(radius=3)), transforms.ToTensor(), # this also convert pixel value from [0,255] to [0,1] transforms.RandomPerspective(distortion_scale=0.2), transforms.RandomResizedCrop(size=(your height, your width), scale=(lower scale, upper scale), interpolation=transforms.InterpolationMode.BICUBIC), transforms.RandomGrayscale(p=0.1), transforms.ColorJitter(brightness=0.5, hue=0.2, contrast=0.5, saturation=0.5), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ])
GaussianBlurはもちろん
transforms.GaussianBlur(kernel_size=(5, 9), sigma=(0.1, 5))
のような形でも行けますが、ここではあえて自前のカスタムフィルターの導入例にしてみました。PILのImageFilterもさまざまなフィルターをサポートしているので、試してみると面白いです。ただしテンソルへの変換前に施す必要があります。
後段でCropするのであれば、RandomPerspectiveはその前にやりましょう。余計な黒縁を避けることが可能になります。(もちろんCrop領域に依存します)
ElasticTransformとか面白いですね。認識系のdata augmentationには効果的に使えそうです。一方例えば視線推定のようなgeometricalなregression問題を解く場合にはRandomPerspectiveのように形を変えてしまうものは不適当あるいは慎重に扱う必要があると思われますので、状況に応じて使い分けましょう。
というわけで
今回はtransforms.Composeの実装例を紹介しました。超簡単な割に効果が高いので、ぜひお試しあれ。