この記事はMATLAB/Simulink Advent Calendar 2021の9日目の記事として書かれています。
また、過去の記事はこちらのブログトップからアクセスいただけると幸いです。
はじめに
本記事では、畳み込み込みニューラルネットワーク(CNN)に役立つ、データ拡張の手法を勉強したので、簡単にまとめ、実装の例を示したいと思います。間違いなどがあれば教えていただけますと幸いです。
データ拡張では、分類や物体検出をする際に、回転や、反転、移動、せん断、色味の変更などを加えることで、訓練データのバリエーションを高め、認識精度を高めるために行います。
以下のページでは、その例が画像と共に紹介されているのでイメージがつきやすいです。
また、上のような多種多様なデータ拡張も、そのオプションを1行書き加えるだけで実行可能な場合が多く(以下の記事はMATLABの例)、非常に簡単にデータ拡張も試せるようになっています。
それ以外のデータ拡張の手法の例
上で述べたシンプルな方法に加えて、その他にも有効なデータ拡張の手法が知られています。ここでは、
1) random erasing や CutOut 2) Mix-upやSamplePairing の2つを紹介したいと思います。
Random Erasing について
ここで紹介する私の実装のコードについては、以下のページからダウンロードできます。
MATLABで行う場合、公式からも関数が提供されています。 jp.mathworks.com
Random Erasingの論文は以下のとおりです。
cutoutの論文は以下の通りです。
Random Erasingのイメージは、以下の論文の図がわかりやすいです。画像にグレーのマスクや、ランダムな色のマスクがかかっていますね。
rectangle region in the image and erase its pixels with random values or the ImageNet mean pixel value
ランダムな値や、ImageNet内の画像のピクセル値の平均値(おそらくグレーにちかい)でマスクをすると論文中にも書いています。
図出展:Zhongら (2017) [1] より
また、動画にすると以下のようなイメージです。
また、cutoutについても同様で、以下の図が論文中にあります。ひとまずこの記事では、特にrandom erasingとcutoutの区別はせず、訓練画像にマスクをかけてデータ拡張を行う方法を試します。
ここでのパラメータとしては、マスクをかけるときのマスクの大きさや縦横比の範囲、マスクの色(例:ランダムか、白か、グレーか黒か)、マスクの数(もしそのようなカスタマイズをしたい場合は)などが考えられます。論文中でも、そのような条件を変えて実験をしているので、詳しいパラメータと精度やデータセットの関係はもとの論文を参照いただけますと幸いです。
以下に、私の方で実装したコードで、CIFAR-10を用いて比較したときの結果です。左がRandom Erasingを行った場合、右がそうでない場合です。左のRandom Erasingがある場合は、テストデータによる分類精度は77.6%で、ない場合は73.1%と、確かに精度が高まりました。今回は非常にシンプルなネットワークで行っているということもあり、論文よりはずいぶんと精度が低いです。
random erasing/cutoutの効果について
論文中にもあるとおり、確かにこれらの方法を用いることで精度の向上を確認することができました。例えばcutoutの論文には、
cutoutの主なモチベーションは、物体が隠れてしまう(オクルージョン)問題への対処です。オクルージョンは物体認識、物体追跡、姿勢推定など、多くのコンピュータビジョンのタスクにおいて発生する問題です。マスクをかけて新しい画像を生成することで(データ拡張をすることで)、より多くの画像の文脈(規則性や連続性など)を考慮するよう学習させることができます。
とあります。
また、random erasingの論文でも、オクルージョンのあるテストデータには、CNNがうまく機能しないことが考えられ、オクルージョンは非常に悩ましいことである、との記述があります。実際に本文中で、テストデータにもマスクをかけて(オクルージョンを作って)分類精度を確認したところ、random erasingを用いて学習したモデルがうまく機能すると確認されています。
実際にオクルージョンがある画像セットを用意して、random erasing/cutoutの有無でどのようなテスト結果になるかを比べるとオクルージョン対策が成功し、分類精度が向上したのかどうかの確認につながりそうな気がしました。
Mix-up / SamplePairingについて
次に、Mix-up や SamplePairingについて紹介します。
もととなる論文は以下のとおりです。
私のほうで簡単に実装したコードはこちらになります。混ぜる比率を単純に一様分布からランダムに決めています。
これらの方法では、マスクをして一部を隠すのではなく、以下のように、画像どうしをブレンドします。以下の例では、自動車と梨の画像がブレンドされていることがわかります。そして、例えば色味を1:1でブレンドした場合は、正解データを0.5ずつ分け与えます。例えば、その分類では、犬、猫、牛を扱っていて、犬と猫の画像をブレンドした場合、正解ラベルは [0.5, 0.5, 0] とします。ブレンドする比率を変えることも可能です。
I1=imread('car2.jpg'); I2=imread('pears.png'); Iblend=imfuse(I1,imresize(I2,[size(I1,1),size(I1,2)]),'blend'); figure;montage({I1,I2,Iblend});
また、Inoue (2018) [4] から以下の図を引用しています。SamplePairingがある場合とない場合では、ある場合のほうが誤差が低く、分類の問題に対して効果的であると示されています。また、SamplePairingにおける、設定を複数試していますが、どの場合もbaselineの方法よりも性能がいいことがわかります。
図出展:Inoue (2018) [4] より
以下の右側の図(mixup)にあるとおり、画像どうしを混ぜ合わせて、それに応じてラベルの値も0と1の間を取るので、クラスどうしの境界面にグラデーションができていることがわかります。これにより、正則化の効果がうまれ、認識精度が向上するようです。正則化に関しては、dropout
との比較も本文中にありました。
出展:Zhang, Hongyi et al. (2017) [3] より.
mix-upに関する考察に関してはこちらの記事が参考になりました。 www.inference.vc
次に読みたい論文
このmix-upと関連する論文の中で、特に次に読みたい論文と参考になる記事を挙げます。
- BC-learning: Mixupはただ2枚の異なる画像を混ぜるだけなのに対して、BC-Learningは異なるクラスの異なる2枚の画像を混ぜるのだそうです
www.slideshare.net
- Cutmix: cutoutとmixupを合わせたような方法
- Manifold mixup: Manifold Mixuでは、より特徴量が整理された中間層で混ぜるMIXUPを行うデータ拡張手法だそうです。