📚
timm で画像の前処理を定義する
はじめに
画像分類の事前学習済みモデルを扱いたい時や、画像特徴量抽出器としての事前学習済み Backbone を探す際に timm
が選択肢として上がってくると思います。この記事では、画像の前処理クラスに対して 新しく timm の関数で定義する場合 と 事前学習済みモデルの前処理を使う場合 の二つを紹介します。
新しく前処理を定義する
timm のモデルに対する前処理は、自前で torchvision
の transform
を定義することもできますが、timm.data.create_transform()
を使うことで単純な前処理クラスであれば簡単に定義することが可能です。
create_transform()
は torchvision.transforms.transforms.Compose
を返すので、そのまま torch
のモデルに使うことができます。
transform = timm.data.create_transform(input_size=224)
transform
出力
Compose(
Resize(size=256, interpolation=bilinear, max_size=None, antialias=True)
CenterCrop(size=(224, 224))
MaybeToTensor()
Normalize(mean=tensor([0.4850, 0.4560, 0.4060]), std=tensor([0.2290, 0.2240, 0.2250]))
)
指定できるパラメータとデフォルト値
input_size=224, # ターゲット入力サイズ (チャンネル, 高さ, 幅) のタプルまたはサイズのスカラー値
is_training=False, # 学習用(ランダム)変換を返す
no_aug=False, # 学習時の拡張を無効化(デバッグ時に有用)
train_crop_mode=None, # 学習時のランダムクロップモード ('rrc', 'rkrc', 'rkrr')
scale=None, # ランダムリサイズスケール範囲(クロップ領域、< 1.0 => ズームイン)
ratio=None, # ランダムアスペクト比範囲(RRCのクロップ比、RKRの比調整係数)
hflip=0.5, # 水平フリップ確率
vflip=0.0, # 垂直フリップ確率
color_jitter=0.4, # ランダムカラージッター成分係数(輝度、コントラスト、彩度、色相)スカラーは (scalar,) * 3 として適用(色相なし)
color_jitter_prob=None, # Noneでなければこの確率でカラージッターを適用(SimCLR風拡張)
grayscale_prob=0.0, # グレースケール変換確率(SimCLR風拡張)
gaussian_blur_prob=0.0, # ガウシアンブラー適用確率(SimCLR風拡張)
auto_augment=None, # 自動拡張設定文字列(auto_augment.py参照)
interpolation='bilinear', # 画像補間モード
mean=timm.data.IMAGENET_DEFAULT_MEAN, # 画像正規化平均
std=timm.data.IMAGENET_DEFAULT_STD, # 画像正規化標準偏差
re_prob=0.0, # ランダム消去確率
re_mode='const', # ランダム消去塗りつぶしモード
re_count=1, # ランダム消去領域数
re_num_splits=0, # バッチサイズ全体でのランダム消去分割制御
crop_pct=None, # 推論時クロップ割合(出力サイズ / リサイズサイズ)
crop_mode=None, # 推論時クロップモード ['squash', 'border', 'center'] のいずれか。Noneの場合は 'center' がデフォルト
crop_border_pixels=None, # 推論時に元画像の端周辺から指定ピクセル数をクロップ
tf_preprocessing=False, # モデル移植テスト用にTF 1.0推論前処理を使用
use_prefetcher=False, # プリフェッチャー有効化。画像をテンソルに変換せず正規化もしない
normalize=True, # 提供されたmean/stdでテンソル出力を正規化(プリフェッチャー未使用時)
separate=False, # 変換を3段階のタプルで出力
naflex=False, # naflex設定
patch_size=16, # パッチサイズ
max_seq_len=576, # 最大シーケンス長(16x16パッチの場合は24x24)
patchify=False # パッチ化オプション
事前学習済みモデルの設定を利用する
timm
のモデルでは、timm.data.resolve_model_data_config()
と timm.data.create_transform()
を組み合わせることで、学習時・推論時の画像の前処理情報も取得することができます。
import timm
model = timm.create_model('mobilenetv3_large_100', pretrained=True)
data_config = timm.data.resolve_model_data_config(model)
transform = timm.data.create_transform(**data_config, is_training=False)
data_config の中身
{
'input_size': (3, 224, 224),
'interpolation': 'bicubic',
'mean': (0.485, 0.456, 0.406),
'std': (0.229, 0.224, 0.225),
'crop_pct': 0.875,
'crop_mode': 'center'
}
transform の中身
Compose(
RandomResizedCropAndInterpolation(size=(224, 224), scale=(0.08, 1.0), ratio=(0.75, 1.3333), interpolation=bicubic)
RandomHorizontalFlip(p=0.5)
ColorJitter(brightness=(0.6, 1.4), contrast=(0.6, 1.4), saturation=(0.6, 1.4), hue=None)
MaybeToTensor()
Normalize(mean=tensor([0.4850, 0.4560, 0.4060]), std=tensor([0.2290, 0.2240, 0.2250]))
)
まとめ
timm で前処理クラスを定義する方法を紹介しました。timm、便利ですよね。
また、以下のドキュメントにはいつもお世話になっております。読んだことがない方はぜひ読んでみてください。
Discussion