shimopino / papers-challenge

Paper Reading List I have already read
30 stars 2 forks source link

Rethinking Data Augmentation for Image Super-resolution: A Comprehensive Analysis and a New Strategy #64

Open shimopino opened 4 years ago

shimopino commented 4 years ago

論文へのリンク

[arXiv:2004.00448] Rethinking Data Augmentation for Image Super-resolution: A Comprehensive Analysis and a New Strategy

著者・所属機関

Jaejun Yoo, Namhyuk Ahn, Kyung-Ah Sohn

投稿日時(YYYY-MM-DD)

2020-04-01

1. どんなもの?

超解像でのデータ増強手法として、低解像度の画像と高解像度の画像の一部の領域を互いに入れ替えるCutBlurという手法を提案した。この手法を用いることでモデルに対してどのように解像度を上げるかだけではなく、画像中のどの領域の解像度を上げるべきなのか学習させることができる。

本手法はノイズ除去といったほかのタスクにも効果を発揮することを示した。

2. 先行研究と比べてどこがすごいの?

超解像タスクでは画像を人工的に低解像度に変換することでデータセットを構築しているが、この合成で得られたデータと実データの分布は異なっている。そこで近年では超解像用のデータセットが構築されているが学習データはまだ少なくデータ増強手法が重要になる。

本研究では既存のデータ増強手法の比較することで、空間的な構造を大きく変化させるMixUpなどの手法よりも明るさといったピクセル値を変化させる手法がより高い性能を発揮することを示し、この分析をもとに新たなデータ増強手法であるCutBlurを提案した。

image

2.1 Data augmentation analysis

画像分類では画像の抽象的な特徴量を学習することで、その画像に何が映っているのか判断している。しかし超解像やノイズ除去といったタスクでは、より局所的なまた大域的なピクセル間の関係性が重要になってくる。

そのため空間構造を大きく変化させるデータ増強手法は超解像タスクではあまり効果を発揮しない。反対にRGB値を変動させるような手法はより高い性能を発揮する。実際に達成した精度を比較すると、この前提が正しいことがわかる。

image

3. 技術や手法の"キモ"はどこにある?

CutBlurではスケールがs倍異なる画像に対して、低解像度の画像をBicubicなどの手法を使用してs倍に拡大した後に、一部の領域を入れ替える。入れ替えにはCutMixと同様に2値マスク画像を使用する。

image

Why CutBlur works for SR?

CutBlurでは低解像度と高解像度の画像を領域を入れ替えるだけなので、ほかの手法のようにパッチ領域の境界線の効果などが低減され、またピクセル空間中の関係性も大きく変化しないため、超解像タスクで効果を発揮すると考えられる。

What does the model learn with CutBlur?

CutBlurを使用することでモデルが画像を過度にシャープにすることを防ぎ、必要な領域に対してのみ超解像を行うようにできる。

実際に高解像度の画像を入力にした際に、画像を過度にシャープにしないように超解像を行っていることがわかる。

image

低解像度の画像を入力にした場合でも、解像度の高い領域はそのままに低解像度の領域のみを超解像にできていることがわかる。

image

CutBlur vs. Giving HR inputs during training

学習したネットワークが恒等関数にするために学習中に高解像な画像を入力に使用することも考えられるが、CurBlurはより高い精度を発揮しており、学習中に高解像度の画像を入力にすることはCurBlurではM=0やM=1のケースと考えられる。

Mixture of augmentation (MoA)

以下の検証ではCutBlurとRGB perbのような手法を組み合わせて学習させた場合の結果を載せる。この際に特徴量空間に対するデータ増強手法は採用しないようにしている。

4. どうやって有効だと検証した?

まずは使用するモデルのサイズによってデータ増強手法の効果がどのように変化するのかを検証した。小さなモデルではデータ増強手法を適用する確率をP=0.2に設定しており、大きなモデルではP=1.0を設定している。

結果からわかるように小さなモデルでは表現能力に制限があるためデータ増強手法の効果が出ていないが、表現能力が高い大きなモデルでは十分に効果を発揮していることがわかる。

image

上図はデータセットを制限した場合でも高い効果を発揮しており、RCANやEDSRといった大きなサイズのモデルでは、本手法がより高い性能を発揮していることがわかる。

image

本手法を適用した場合の性能の量的な比較を行った。大きなモデルでは本手法を適用することでより高い性能を発揮していることがわかる。

image

また生成された画像を比較してみると、CutBlurを導入することで一部の領域に対してのみ超解像を行うことで、過度に画像をシャープにしていないことがわかる。

image

では実際にWebから取得した画像(左)とiPhone11 Proで撮影した画像(右)を2分の1に圧縮した画像を入力にして超解像を行った。CutBlurを導入することで、実画像に対しても過度にシャープにすることを防いでいることがわかる。

image

またガウスノイズの除去とJPEGによる圧縮効果の低減タスクに対してどの程度の効果を発揮するのか検証した。異なるタスクに対しても十分効果を発揮していることがわかる。

image

image

image

5. 議論はあるか?

shimopino commented 4 years ago

https://github.com/clovaai/cutblur

shimopino commented 4 years ago
def cutblur(im1, im2, prob=1.0, alpha=1.0):
    # 画像のサイズ入力エラー
    if im1.size() != im2.size():
        raise ValueError("im1 and im2 have to be the same resolution.")

    # パラメータ設定がおかしい場合は変化を加えずに画像を返す
    if alpha <= 0 or np.random.rand(1) >= prob:
        return im1, im2

    # 切り取り領域の割合指定
    cut_ratio = np.random.randn() * 0.01 + alpha

    h, w = im2.size(2), im2.size(3)
    ch, cw = np.int(h*cut_ratio), np.int(w*cut_ratio)
    cy = np.random.randint(0, h-ch+1)
    cx = np.random.randint(0, w-cw+1)

    # apply CutBlur to inside or outside
    # 低解像度を混ぜるか高解像度を混ぜるか決める
    if np.random.random() > 0.5:
        im2[..., cy:cy+ch, cx:cx+cw] = im1[..., cy:cy+ch, cx:cx+cw]
    else:
        im2_aug = im1.clone()
        im2_aug[..., cy:cy+ch, cx:cx+cw] = im2[..., cy:cy+ch, cx:cx+cw]
        im2 = im2_aug

    return im1, im2