趣味で作っているラーメン二郎識別モデルにRICAPを適用するとどうなるか興味があったため、年末年始にPyTorchで実装して検証してみました。
検証では、RICAPだけでなく、RICAPの論文でも参照されているデータ拡張手法であるmixup、そして、CutoutおよびRandom Erasingと組み合わせた場合にどの程度の識別精度となるかも比較しています。
また、大きなモデルやデータセットで学習すると時間が掛かりすぎるため、モデルはResNet50を採用し、各店舗500枚のみ(40店舗で計20,000枚)に絞った縮小版ラーメン二郎データセットを利用して検証しています。
今回の実験に使った実装は、 https://github.com/knjcode/pytorch-finetuner で公開しています。
検証内容
- ベースラインおよび、mixup, RICAP, Cutout, Random Erasingをそれぞれ比較
- 各手法に対してTTA(Test Time Augmentation)を実施した場合の比較
- mixup/RICAPとCutout/Random Erasingをそれぞれ組み合わせた場合の比較(あわせてTTAの比較)
結果概要
- RICAPによりbaselineモデルよりも若干精度が改善するが、CIFAR-10の場合と比較すると改善は少ない
- RICAPにCutoutやRandom Erasingを組み合わせると、RICAPのみの場合よりも精度が改善する
- RICAPを利用した場合TTA(Test Time Augmentation)の効き具合が悪化する
- mixup/RICAPとCutout/Random Erasingを組み合わせた場合よりも、Random Erasingのみを利用した場合のほうがテスト精度が良い
- ただし、データセットのサイズ(ラーメン二郎フルデータセット利用時等)によっては、mixup+Random Erasingの方が精度が高くなることもあった
各種データ拡張手法のイメージ
各種データ拡張手法の適用サンプルは以下の通りです。基本的に夜中に実装や確認をしていたため、サンプルには Caltech101 データセットを利用しています。(夜中にラーメン二郎データセットを見るとお腹が空いてしまう)
RICAP (4枚の画像をクロップして貼り合わせ)
mixup (2枚の画像をmix)
Cutout (画像の一部を平均色でマスク)
Randdom Erasing (画像の一部をランダムな画素でマスク)
利用したデータセットについて
ラーメン二郎データセットは現在約7万5千枚あり、すべて利用して学習すると時間がかかるため、今回の実験では各店舗500枚に限定した縮小版の二郎データセットを用意して利用しました。データセット詳細 (計 26,400枚)
- 40店舗(クラス)
- 学習データ 20,000枚 (各店舗 500枚)
- 評価データ 3,200枚 (各店舗 80枚)
- テストデータ 3,200枚 (各店舗 80枚)
学習条件
- モデル: ResNet50 (ImageNet学習済みモデルを転移学習, 全層再学習(レイヤーフリーズ無し))
- バッチサイズ: 256
- オプティマイザ: momentum SGD (momentum=0.9)
- 初期学習率: 0.0125 (warmup epoch=5 (学習率を徐々に増加し5エポック目に学習率の初期値となるよう調整))
- 学習率スケジューラ: Cosine Annealing (Tmax=1, Tmult=2, 周期1から始まり倍々に周期を増やす)
- エポック数: 132 (Warmup 5エポック + Cosine Annealing 7周期分)
- weight decay: 1e-4
- 学習回数: 5回 (同一条件で5回学習し、結果の平均および標準偏差を算出)
ベースラインモデルの設定
ベースラインとして、画像の短辺を256pxにリサイズ後にPyTorch組み込みの下記のデータ拡張を実施しています。- RandomRotation (degree=3.0)
- RandomResizedCrop (CropSize:224px)
- RandomHorizontalFlip (p=0.5)
- 各種jitter(brightness=0.25, contrast=0.4, saturation=0.2, hue=0.05)
識別精度の評価
学習時の各epochのモデルに対し評価データでAccuracy最大となるepochのモデルを選び、テストデータを評価した際のエラー率(%)を計測しました。baseline, mixup, RICAP, Cutout, Random Erasingの比較
まず、baselineと各データ拡張種法(mixup, RICAP, Cutout, Random Erasing)を比較しました。テストデータでの識別精度
結果は以下の通りで、Random Erasingが最も精度が高くなりました。RICAPについてはbaselineから約0.1%の改善ですが、改善幅は小さく試行によってはbaselineの方が良いケースもありました。
条件 | Top-1 Error(%) | 標準偏差 |
---|---|---|
baseline | 4.51 | ±0.15 |
+ mixup | 4.50 | ±0.12 |
+ RICAP | 4.41 | ±0.27 |
+ Cutout | 4.45 | ±0.23 |
+ Random Erasing | 4.08 | ±0.09 |
- mixup (α=0.2) ベータ分布の乱数λはミニバッチ間で共通の値を利用
- RICAP (β=0.3) ベータ分布の乱数w,hはミニバッチ間で共通の値を利用
- Cutout (n_holes:1, length:64, 対象画像の平均色でマスク)
- Random Erasing (p=0.5, sl=0.02, sh=0.4, r1=1/r2=0.3, ランダムな画素でマスク)
TTA(Test Time Augmentation)実施時の識別精度
TTAとは、テスト時のデータ拡張(Test Time Augmentation)のことで、画像分類タスクではモデルの精度を引き出すためによく使われる手法です。今回はテストデータの各画像を256pxにリサイズ後に、画像の左上、右上、左下、右下、中央の5箇所から224pxでクロップした5枚の画像、画像全体を224pxにリサイズした画像、256pxにリサイズ後に240pxで中央からクロップした画像の計7枚の画像でテストした結果の平均値をTTAの結果としています。
TTAを利用することで画像単体での識別精度よりも、1〜2%程度の精度向上が期待できます。 結果は以下の通りです。
条件 | (再掲)Top-1 Error(%) | 標準 偏差 | TTA 7crop Top-1 Error(%) | 標準 偏差 |
---|---|---|---|---|
baseline | 4.51 | ±0.15 | 2.99 | ±0.08 |
+ mixup | 4.50 | ±0.12 | 2.91 | ±0.16 |
+ RICAP | 4.41 | ±0.27 | 3.23 (baselineより悪い) | ±0.11 |
+ Cutout | 4.45 | ±0.23 | 2.91 | ±0.19 |
+ Random Erasing | 4.08 | ±0.09 | 2.76 | ±0.11 |
これまでの経験上、2枚の画像を合成するmixupを利用した場合に若干TTAの効きが下がる印象があったのですが、RICAPは明らかにTTAの効きが下がっています。
RICAPではベースラインのデータ拡張と組み合わせることで、ランダムクロップした4枚の画像をさらにクロップして組み合わせて利用しているため、画像の隅に近い部分の特徴に対する識別性能があまり高くならず、TTAの利き具合に影響しているのかもしれません。
mixup/RICAPとCutout/Random Erasingを組み合わせて試す
mixup/RICAPとCutout/Random Erasing それぞれの組み合わせについても確認しました。データ拡張の適用順序については、mixup/RICAP処理後にRandom Erasing/Cutoutを適用しています。以下に、組み合わせた場合のサンプルをいくつか示します。
mixup + Random Erasing のサンプ
RICP + Random Erasing のサンプル
結果は以下の通りです。条件 | Top-1 Error(%) | 標準 偏差 | TTA 7crop Top-1 Error(%) | 標準 偏差 |
---|---|---|---|---|
baseline | 4.51 | ±0.15 | 2.99 | ±0.08 |
+ Cutout | 4.45 | ±0.23 | 2.91 | ±0.19 |
+ Random Erasing | 4.08 | ±0.09 | 2.76 | ±0.11 |
+ mixup | 4.50 | ±0.12 | 2.91 | ±0.16 |
+ mixup + Cutout | 4.28 | ±0.21 | 2.93 | ±0.10 |
+ mixup + Random Erasing | 4.13 | ±0.16 | 2.85 | ±0.04 |
+ RICAP | 4.41 | ±0.27 | 3.23 | ±0.11 |
+ RICAP + Cutout | 4.42 | ±0.34 | 3.31 | ±0.15 |
+ RICAP + Random Erasing | 4.16 | ±0.20 | 3.02 | ±0.30 |
考察
手法を組み合わせたほうが良い結果になるかと思いきや、baseline+Random Erasingが最もテスト精度が良い結果となりました。ただし、データセットのサイズ(ラーメン二郎フルデータセット利用時等)によっては、mixup+Random Erasingの方が精度が高くなることもありました。現行のラーメン二郎識別bot(@jirou_deep)では、フルデータセットでmixup+Random Erasingで学習したモデルを使っています。(識別精度 98.78%, Top-1 Error 1.22%)
RICAPについては、Random Erasingと組み合わせることでRICAPのみの場合よりも若干精度がよくなりますが、Cutoutと組み合わせた場合にはさらに精度が悪化しています。
RICAPと画像をマスクするデータ拡張手法の組み合わせについて
RICAPは4枚の画像をパッチワークして新たに生成した画像に対し、画像の面積比を正しく識別できるようにモデルを学習します。RICAPをCutoutやRandom Erasingのような画像の一部をマスクする手法と組み合わせた場合、RICAPのパッチワーク境界との重なり具合によっては各画像の面積比が変化してしまいます。
そのため、学習時のlossの計算についてもマスクによる面積比の変化を考慮したものにする必要があると思いますが、今回の実験ではこの点は考慮していません。
mixupについても画像マスクによる影響は若干ありそうですが、CutoutやRandom Erasingと組み合わせてもbaselineより悪化することはありませんでした。
CutoutよりRandom Erasingの方が良い?
CutoutとRandom Erasingを比較するとRandom Erasingのほうが良い結果になっていますが、Cutoutの設定(マスク箇所の数やサイズ)が適切でない可能性もあります。Cutoutの論文を読んだ限りではImageNet等のサイズの画像に対する推奨設定値が見当たらなかったため、CIFAR-10やCIFAR-100の実験結果から勘で決めています。(64pxのマスク1箇所)Random Erasingについては提案論文に記載されている設定値を採用しています。
参考
- CIFAR-10でSOTAなエラー率2.19%を達成したdata augmentation手法 RICAP を試してみた
- RICAPを使ってアニメ顔を分類の精度にコミットする。
- RICAPのパラメーターをコサインカーブでゆらして更に使い倒す
- Caltech 101
各手法の提案論文
- RICAP (arxiv) Data Augmentation using Random Image Cropping and Patching for Deep CNNs
- mixup (arxiv) mixup: Beyond Empirical Risk Minimization
- Cutout (arxiv) Improved Regularization of Convolutional Neural Networks with Cutout
- Random Erasing (arxiv) Random Erasing Data Augmentation