ImageOnlyTransformクラスを継承して、RandomShadowのdata augmentationを実装
CutoutとRandom Erasing
最早定番となったdata augmentationの手法であるCutout/Random Erasing、入力画像をランダムなマスクで欠落させることで、より強い正則化の効果を作り出すことを狙いとしています。
Cutout [arXiv]
Random Erasing [arXiv]
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()