のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Kaggleの画像コンペで便利なライブラリを紹介します。

Sponsored Links

皆さんこんにちは。
お久しぶりです。本日はPyTorchを用いて、Kaggleをする際に便利なソフトウェアを紹介します。
この記事はPyTorch Advent Calendar 15日目です。

qiita.com

私自身、画像コンペィションでは、豊富な実装からPyTorchを利用するケースが多いです。
PyTorchで今回使っているライブラリを2点紹介したいと思います。

Pretrained PyTorch

Pretraining modelを用いてFine turningをすることで、
初期から学習したモデルよりも精度が向上します。

PyTorchには公式で配布している以上に、
github上に様々なPreTrainingモデルを公開されています。

github.com

学習済モデルの利用

from pretrainedmodels.models.resnext import resnext101_32x4d
model = resnext101_32x4d(1000, pretrained="imagenet")
model(torch.randn(1, 3, 224, 224))

FineTurning

上記のままだと出力が1000層にしかなりません。
そのため、10クラスのみ分類したい場合だとモデルの加工が必要になります。
最後の層のインスタンス変数を直接書き換えることで、カスタマイズされたモデルの作成ができます。

from pretrainedmodels.models.resnext import resnext101_32x4d
model = resnext101_32x4d(1000, pretrained="imagenet")
model(torch.randn(1, 3, 224, 224))

model.last_linear = nn.Sequential(
    nn.Linear(2048, 1000),
    nn.ReLU(inplace=True),
    nn.Linear(1000, 10)
)

Albumentation

AlbumentationはOpenCVをバックエンドで利用した効率の良いライブラリです。
PyTorchだと非常に簡単に使える口はありますが、他のライブラリにも簡単に組み込めます。
高速なAugmentationの実装は学習速度に大きく影響します。


単純なAlbumentationの実装

次に単純なAlbumentationの実装を記載します。
HorizonalFlipのみを行うコードです。

import cv2
from albumentations import (
    HorizontalFlip
) # (1)
from urllib.request import urlopen

def download_image(url):
    data = urlopen(url).read()
    data = np.frombuffer(data, np.uint8)
    image = cv2.imdecode(data, cv2.IMREAD_COLOR)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    return image
image = download_image('https://d177hi9zlsijyy.cloudfront.net/wp-content/uploads/sites/2/2018/05/11202041/180511105900-atlas-boston-dynamics-robot-running-super-tease.jpg') # (2)
auged_img= aug(image=image)["image"] # (3)

import文で、Horizonal Flipを読み込みます。
(2)のdownload_image関数で画像をWeb上から読み込みます。そして、最後の(3)を実行して、変換後の画像を獲得できます。

Compose

前章では、Augmentationは1種類でした。
ただし、Kaggleでは、複数のAugmentationを実行したいケースがあります。
例えば、水平反転->回転->ノイズ適用のような場合です。

Albumentationには、これを実現するComposeと呼ばれるクラスがあります。
Composeは、複数のAugmentationを順番に実行します。

aug = Compose([ # (1)
    HorizontalFlip(0.5), # (2)
    OneOf([
        MotionBlur(p=.2),
        MedianBlur(blur_limit=3, p=.1),
        Blur(blur_limit=3, p=.1),
    ], p=0.2) # (3),
    ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=.2),# (4)
    OneOf([
        RandomContrast(),
        RandomBrightness(),
    ], p=0.3) # (5)
], p=0.5) 

(1)でComposeを宣言しています。これで0.5の確率で実行されます。
Augmentationの内部をリストを定義しています。

まず、(2)で、水平反転を0.5の確率で実行します。続いて、(3)でブラーを適用します。
ただし、ここでOneOfと呼ばれるどれか一つが適用されるクラスです。

これにより、モーションブラー、メディアンブラー、ブラーのどれかが適用されます。
そして、(4)で、平行移動、スケール、回転を適用します。
最後に(5)でコントラスト変換、輝度変換のどちらかを0.3の確率で適用します。

日本語で書くと長文の説明になりますが、コードで綺麗に記載できます。
後はDataset Classを拡張すれば、実装が可能になります。

特別、ライブラリ依存の実装にはなっていません。
そのため、各DLフレームワークのAugmentationの組み込み方法がわかれば、導入できます。

最後に

PyTorch自体に豊富なライブラリがあって使いやすいと感じています。
非常にコンペティションでは特に使いやすいので興味ある人はぜひ使ってみてください!