AI

Torchvisionのtransforms.Composeを使いこなしてtraining accuracyを上げよう !

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の実装例を紹介しました。超簡単な割に効果が高いので、ぜひお試しあれ。


   
関連記事
  • numpy.reshapeは気をつけて使おう !
  • PyTorch LightningのckptファイルをLoadするのにはまった話
  • PyTorchで突然malloc(): invalid next size (unsorted)が出たときの対処
  • PyTorchでclass_weightを適用するには
  • 学習中にexit code 137 (SIGKILL)が発生したときの対処
  • PyTorchの学習済みmodel fileの拡張子が.pth.tarではまった話

    コメントを残す

    *

    CAPTCHA