Closed6

【論文読解めも】Fixing the train-test resolution discrepancy

takoroytakoroy

概要

画像分類モデルにおいて、訓練時の前処理(データ拡張)とテスト時の前処理(center crop)が異なることによって生じる切り取り領域(RoC: Region of Classification)の違いが、データ分布のシフトをもたらしてしまうことを明らかにしている。

ここで、分布のシフトとは以下のヒストグラムに示すような事態を指している。紫の分布は、訓練時のデータ拡張と切り抜きによって得られる領域が、全画像の面積の何%を閉めているかという割合を表している。ランダムなリサイズ&切り抜きを行うために、なだらかな分布になる。一方で、テスト時は、center cropのみを行うと画像の縦横比のみがこの割合を決定するために、(データセット内で縦横比が同じ画像が多いため)一部の値のみが突出して頻度が大きいという結果が得られている。ひと目見てわかるように、訓練時の分布とテスト時の分布は大きく異なる。

この問題を回避するために、訓練時の解像度とテスト時の解像度を適切に選ぶことによって、分布のシフトを抑え、精度を向上させる手法を提案している。訓練時の解像度の方がテスト時の解像度よりも低い方が望ましいという結論が得られ、その結果として訓練時間の短縮ももたらされる。

Touvron, H., et al. "Fixing the train-test resolution discrepancy." Advances in Neural Information Processing Systems (NeurIPS), 2019 (2019).

https://arxiv.org/abs/1906.06423

takoroytakoroy

訓練時とテスト時でRoCが異なってしまうという状況は2つの問題をもたらす。

  • リサイズによって、物体の見かけ上の大きさが変化してしまう
  • global pooling層の出力の統計量を変化させてしまう

以下、それぞれについてどういうことなのかを確認する。

takoroytakoroy

Scale and apparent object size

単純な透視投影モデルを考える。物体の大きさをR、カメラから物体までの距離をZ、カメラの焦点距離をfとする。画像に現れる物体の大きさ(ピクセル)はr = f R / Zとなる。fはカメラ依存で、視野角を\theta_\mathrm{F O V}、画像サイズをH \times Wとすると、k^{-1} = 2 \tan{\theta_\mathrm{F O V} / 2} \approx 1を使って、f = k\sqrt{H \times W}と書ける。また、r=f \cdot r_1r_1=R/Zとおくと、r_1はカメラとは独立した分布となる。

訓練時のRoC:RandomResizedCrop

PyTorchのRandomResizedCropを例に、訓練時のRoCがどのように決まるのかを確認する。
RandomResizedCropでは、ランダムな大きさ\sigmaのスケールと縦横比\alphaの変更を行って入力画像からH_\mathrm{RoC} \times W_\mathrm{RoC}の領域を切り抜き、K_\mathrm{train} \times K_\mathrm{train}にリサイズする。\sigmaは、\sigma^{2} \sim U\left(\left[\sigma_{-}^{2}, \sigma_{+}^{2}\right]\right)によってサンプルされる。簡単のために、\alpha=1, H=Wとして、拡大率sは、以下のように表される。

s=\frac{\sqrt{K_{\text {train }} K_{\text {train }}}}{\sqrt{H_{\mathrm{Ro}} W_{\mathrm{RoC}}}}=\frac{1}{\sigma} \cdot \frac{K_{\text {train }}}{\sqrt{H W}}

このようにして切り抜かれた画像中に含まれる物体の大きさr_\mathrm{train}は、以下のように書ける。

r_{\text {train }}=s \cdot r=s f \cdot r_{1}=\frac{k K_{\text {train }}}{\sigma} \cdot r_{1}

k K_{\text {train }}は定数なので、r_{\text {train }}は入力画像のサイズH \times Wには影響されない、サイズ標準化機能をもっている。

テスト時のRoC:CenterCrop

テスト時は、入力画像の短辺がK_{\text {test }}^{\text {image }}になるようにリサイズし、その中央のK_{\text {test }} \times K_{\text {test }}を切り抜く。簡単のためにH=Wとすると、拡大率ss=K_{\text {test }}^{\text {imge }} / \sqrt{H W}となる。よって、テスト画像中の物体の大きさr_\text{test}は以下のようになる。

r_{\text {test }}=s \cdot r=k K_{\text {test }}^{\text {image }} \cdot r_{1}

こちらも、サイズ標準化機能をもっている。

訓練時とテスト時の物体の大きさ

訓練画像中の物体の大きさとテスト画像中の物体の大きさを比較すると、以下のようになる。

\frac{r_{\text {test }}}{r_{\text {train }}}=\sigma \cdot \frac{K_{\text {test }}^{\text {image }}}{K_{\text {train }}}

まず、\sigma\left[\sigma_{-}, \sigma_{+}\right]=\left[0.28, 1\right]からサンプルされる。また、\frac{K_{\text {test }}^{\text {image }}}{K_{\text {train }}} \approx 1.15となる(よくある例としては、K_{\text {test }}^\text{image}=256, K_{\text {train }}=224である)。この2つの要素から、\frac{r_{\text {test }}}{r_{\text {train }}}の期待値は以下のように書ける。

\mathrm{E}\left[\frac{r_{\text {test }}}{r_{\text {train }}}\right]=F \cdot \frac{K_{\text {test }}^{\text {image }}}{K_{\text {train }}} \approx 0.80, \quad F=\frac{2}{3} \cdot \frac{\sigma_{+}^{3}-\sigma_{-}^{3}}{\sigma_{+}^{2}-\sigma_{-}^{2}}

この結果は、テスト画像中の物体サイズは訓練中の物体サイズよりも小さい傾向があることを表している。この比率の期待値を1に近づけるためには、テスト画像のサイズを訓練画像のサイズよりも大きくする必要がある。

takoroytakoroy

Scale and activation statistics

224のサイズで訓練したResNet-50を用いて、テスト画像をさまざまな解像度で入力した時、global average poolingの出力(ReLUを経由しているので0以上の値)の累積分布がどのようになるのかを以下に示す。

テスト画像のサイズが64のように小さい時は、global average pooling前の出力は2 \times 2しかなく、0の占める割合が29.8%にもなる。また、2を超えるような大きい値をとることも多く、いわゆるヘビーテイルな分布になっていることがわかる。テスト画像の解像度を大きくすることにより、非ゼロでかつ1以内という範囲に収まる値が多くなることがわかる。テスト画像の解像度が大きいほど、訓練時に生じていたであろう穏当なactivationの分布に近づくことがわかる。

Larger test crops result in better accuracy

以上のような事実を踏まえ、テスト時の入力画像の解像度K_\text{test}を変化させてみて、Top-1精度がどのように変わるのかを以下に示す。モデルはResNet-50、データセットはImageNetである。この結果は、テスト画像の解像度が、訓練時の解像度よりも大きい方が高い精度を示す、ということがわかった。

takoroytakoroy

手法

ここまでの議論を踏まえて、訓練時とテスト時における物体の見た目の大きさの差異を調整し、global average pooling後の出力の累積分布を揃えるための方法を提案している。

見た目の大きさの際の調整

K_{\text{test}}^{\text{image}}, K_\text{test}を増やし、K_\text{test} > K_\text{train}とすることによって、\mathrm{E}\left[\frac{r_{\text {test }}}{r_{\text {train }}}\right]=F \cdot \frac{K_{\text {test }}^{\text {image }}}{K_{\text {train }}} \approx 0.80となっていたのを補正する。具体的にはスケール係数\alpha=1/0.80=1.25程度の補正を行う。

Activationの統計の補正

上の操作によって、見た目の大きさに関する補正が行えるが、global average pooling後の出力の累積分布が異なってしまうという問題が生じるので、以下の2つの戦略によって補正することを考える。しかし、実際にはいずれの場合も、大きな改善はみられなかったと結論づけている。

Frechetモデルの当てはめによる調整

global average pooling後の出力が、Frechet分布にしたがっているとして、入力画像サイズによってこの分布のパラメータがどのように異なるのかを推定し、それを元に分布が一致するように補正している。

ファインチューニングによる調整

入力画像サイズの変化は、一種のドメインシフトと考えられるので、一般的なファインチューニングの作法が使える。訓練データを使用したまま、K_\text{train}K_\text{test}にして、ネットワークの最後の数層をファインチューニングする。

これにより、以下のように分布が一致するように補正できる。

takoroytakoroy

本論文が提案している手法は、最近の画像分類モデルだと当たり前に使われている。もっとも、Activationの統計の補正は採用していないことが多いようだ。

このスクラップは2021/03/01にクローズされました