katsura-jp / tour-of-albumentations

example of albumentations

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Tour of Albumentations

albumentationsのtransformsクラスのまとめ。

Albumentationsとは?

画像処理ライブラリを内部で使用している高速な画像augmentationライブラリ

特徴

  • OpenCVをベースにした高速な拡張
  • セグメンテーションや物体検出等の様々なタスクのためのシンプルなインターフェース
  • カスタマイズが容易
  • 他のフレームワークの追加が容易

インストール方法

pipでインストール

pip install albumentations

最新版をインストールするには

pip install -U git+https://github.com/albu/albumentations

Document

https://albumentations.readthedocs.io/en/latest/

使用する画像

Lennaの画像とBDD100Kのsegmentationとdetectionのデータを使います。

lenna seg mask detection

バウンディングボックスのフォーマットについて

このライブラリでは、バウンディングボックスを取り扱うにあたり、3種類のバウンディングボックスの形式を定義しています。

1. coco

MS COCOで扱われているバウンディングボックスのアノテーション。 
```
[x_min, y_min, width, height]
```
の順番であり、ボックスの左上の頂点の座標とそこからのx軸y軸それぞれの長さとなっている。

2. pascal_voc

Pascal VOCで扱われているバウンディングボックスのアノテーション。
```
[x_min, y_min, x_max, y_max]
```
の順番であり、ボックスの左上の頂点の座標と右下の頂点の座標となっている。

3. albumentations

albumentations内で処理される時の独自フォーマット。
```
[x_min, y_min, x_max, y_max]
```
の順番で、Pascal VOCと順番は変わらないが、座標が画像サイズで正規化されているため、それぞれが0から1までの数値となっている。

フォーマットの変換方法

フォーマットの変換は、

  • albumentations.augmentations.bbox_utils.convert_bbox_to_albumentations

  • albumentations.augmentations.bbox_utils.convert_bbox_from_albumentations

を使用します。(下記で触れるCompositionでは、内部で勝手に変換されるので、フォーマットだけ与えてください)

pascal vocからalbumentations

bboxesをpascal vocのフォーマットのバウンディングボックスとし、元の画像をimageとします。

convert_bboxes_to_albumentations(bboxes=bboxes, source_format='pascal_voc', rows=image.shape[0], cols=image.shape[1], check_validity=False)

albumentationsからpascal voc

bboxesをalbumentationsのフォーマットのバウンディングボックスとし、元の画像をimageとします。

convert_bboxes_from_albumentations(bboxes=bboxes, target_format='pascal_voc', rows=image.shape[0], cols=image.shape[1], check_validity=False)

詳しくは、こちら

Composition

Compositionは、画像を変換する際に変換するアルゴリズムのリストを引数に渡すことで、簡単に画像を変換できるようにするジェネレータです。実際に学習等でこのライブラリを使用する場合は、こちらを使用することが基本となります。下で説明するAugmentationクラスを簡単に組み合わせることが可能です。

詳しくは、こちらを参照してください。

また、Interfaceは、次に説明するTransformsの継承元として使用されているので、オリジナルのAugmentationクラスを作成する時は使うと良いと思います。

Composition一覧

  • Compose : リストを順に適用していく
  • OneOf : リストの中から1つを選択し適用していく

compose

Composeの内部にOneOfを入れることで、より柔軟に画像をランダムに変換できます。

Augmentation

実際の変換アルゴリズム

詳しくはこちらを参照してください。

Augmentationsの一覧

  • Transforms : 変換ジェネレータ(__call__の内部でFunctional transformsが呼び出されています)
  • Functional transforms : 変換関数
  • Helper functions for working with bounding boxes : バウンディングボックスの扱いに便利な関数

Transformsの一覧

  1. Blur
  2. MotionBlur
  3. MedianBlur
  4. GaussianBlur
  1. VerticalFlip
  2. HorizontalFlip
  3. Flip
  1. Transpose
  2. RandomRotate90
  3. Rotate
  4. ShiftScaleRotate
  1. RandomCrop
  2. ShiftScaleRotate (Rotate系に記載)
  3. CenterCrop
  4. PadIfNeeded
  5. Crop
  6. RandomScale
  7. LongestMaxSize
  8. SmallestMaxSize
  9. Resize
  10. RandomSizedCrop
  11. RandomCropNearBBox
  12. RandomSizedBBoxSafeCrop
  1. OpticalDistortion
  2. GridDistortion
  3. ElasticTransform
  1. CLAHE
  2. InvertImg
  3. RandomGamma
  4. ChannelShuffle
  5. HueSaturationValue
  6. RGBShift
  7. RandomBrightnessContrast
  8. RandomBrightness
  9. RandomContrast
  10. ToGray
  1. GaussNoise
  2. Cutout
  1. Normalize
  2. JpegCompression
  3. ToFloat
  4. FromFloat
  5. (Lambda)
  6. RandomSnow
  7. RandomRain
  8. RandomFog
  9. RandomSunFlare
  10. RandomShadow
  11. (ToTensor)

補足

引数にalways_applyというのがありますが、これはp=1と同義です。 p=0でもalways_apply=Trueであれば、transformsは呼ばれます。

また、composition, transformsどちらも一部を除き、callable引数はimage, mask, bboxes, keypointsが基本となります。返り値は引数に渡した引数のkeyのdict(例えば、image, mask, bboxesを渡した場合、{'image': np.array, 'mask': np.array, 'bboxes: list))で変換後の値がvalueとして得られます。

Documentの読み方

TransformsのDocumentは上の画像のように書かれています。Targetsとは、インスタンス化したtransformsクラスをイテレータで呼び出す際の引数です。左図ではimageのみなので、画像のみを変換します。 対して、右図ではimage,mask,bboxes,keypointsも変換されます。こちらは、segmentationやdetectionといったタスクで簡単にaugmentationすることが可能となります。sourceを覗くと、この二つのような違いは、それぞれ継承元が、ImageOnlyTransformかDualTransformかに依存していることがわかります。右図のようなクラスに対しては、image以外の引数は必須ではありません。segmentationの場合はmaskのみや、detectionの場合はbboxesのみに与えるように柔軟に変えることが可能です。

targetがimageのみだからといって、引数にmaskは与えられない分けではなく、その場合は、変換を実際にする関数にmaskは渡されることなく実行されるのでmaskに対して 変化はありません。

Image typesは入力画像の型指定になるので、左図のInvertImgクラスにはfloat32(0~1に正規化)の画像を与えることはできません。(全てを確認したわけではないですが、正規化前であればfloat32でもInvertImg等は動きます)

About

example of albumentations