ImageOnlyTransformクラスを継承して、RandomShadowのdata augmentationを実装

CutoutとRandom Erasing

 最早定番となったdata augmentationの手法であるCutout/Random Erasing、入力画像をランダムなマスクで欠落させることで、より強い正則化の効果を作り出すことを狙いとしています。

Cutout [arXiv]

f:id:spider-man-dance:20200903194352p:plain
Cutout



Random Erasing [arXiv]

f:id:spider-man-dance:20200903194720p:plain
Random Erasing

albumentation

 data augmentation時によく使われるalbumentationsですが、基底クラスを継承する事で自作のdata augmentationクラスを作成することができます。 Albumentationは次の2つの基底となるクラスが存在します。

  • ImageOnlyTransform・・・画像のみに処理を適用する
  • DualTransform・・・画像+物体検出(+その他)に処理を適用する

 実際に作成する際はinputする画像だけに処理すれば良いのか、それとも教師ラベルとなるマスク自体にも処理をすべきなのかで上記2つのどちらを継承するかが変わってきます。

RandomShadow

 先ほどまでのCutoutなどとは異なり、完全に情報を欠落させるのではなく、輝度を落としたい場面がでてきたので新しく自作クラスを作成しました。

ImageOnlyTransformを継承したRandomShadowの実装

実際に使用してみたイメージです。

import cv2
import matplotlib.pyplot as plt

random.seed(1)
img_origin = cv2.imread('baseball.png')
img_origin = cv2.cvtColor(img_origin, cv2.COLOR_BGR2RGB)
img = img_origin.copy()

img_shadow = RandomShadow(p=1.0)(image=img)['image']

fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(img_origin)
axes[1].imshow(img_shadow)

plt.show()

f:id:spider-man-dance:20200903214823p:plain