機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

ScratchDet: Exploring to Train Single-Shot Object Detectors from Scratchを読んだのでメモ

はじめに

ScratchDet: Exploring to Train Single-Shot Object Detectors from Scratchを読んだのでメモ.

気持ち

現状の物体検出器は基本的にimageNetなどのpretrainedモデルを使って学習している.この論文ではこれが精度の低下を起こすと主張.その理由として

  1. 事前学習に使ったデータと検出の学習に使うデータのドメインのギャップ

  2. 分類と検出の目的関数間のギャップ

  3. ネットワーク構造の制約

の3つを挙げている.1に関しては別な文献で指摘があり,2に関しては分類と検出ではtranslationに対してのセンシティビティが異なる点を意味する.最後の3に関してはオリジナルのネットワークをimageNetなどで事前学習するコストが高いことから挙げている.

これらを解決するためにスクラッチから学習可能な枠組みを提案するというもの.論文通してとにかくBatchNormすごいということしか言ってない感はある.

ScratchDet

ここではSSDをスクラッチで学習することを仮定.オリジナルのSSDはBatchNormを使っていないがここではまずbackbone(VGGやresnetなどメインのネットワーク部分)に使うことを考える.理由としてはBatchNormは目的関数を滑らかにして勾配を落ち着かせる効果があると言われているのでスクラッチから学習する上では必要だろうという思いがある.これだけでとりあえずmAPが67.6%から72.8%まで上がるとのこと.さらに面白いのは学習率を大きくすればするほど精度が向上するらしい.具体的にはオリジナルのSSDでは学習率0.001だったが,BatchNormを入れて学習率を0.05にすると78%まで精度向上するとのこと.これは(実験条件をどこまで揃えているかわからないが)SSDの元の論文で報告されていた77.2%を上回っている.

次にdetection head subnetworkにBatchNormを入れることを考える.backboneに入れずdetection headに入れるだけでmAPが67.6%から71.0%に改善,さらに学習率を0.001から0.01にあげると75.6%まで改善する(さっきと違い0.05の場合は試していないよう).学習途中の勾配のノルムを確認したところbatchnormを入れると入れないものより安定していてlandscapeが滑らかになっている,すなわちフラットな解になっていることが確認できる(と言い切るのはやりすぎ感はあるけど).

Backboneとdetection head両方にBatchNormを入れた場合には最大で78.7%まで向上した.ただし,学習率が0.001,0.01の場合には両方に入れるよりbackboneのみの方がmAP的には良い.

BatchNormを使えばスクラッチからでも十分な性能が出せることが確認できたので,次はより良いbackbone networkの構造を探す.SSDで一般的なVGG-16とResNet-101を比べるとImageNetではResNet-101が良い結果を示しているが,DSSDの論文によるとSSDにおいてはVGG-16の方が良いmAPを達成している.これはResNet-101は最初の段階で一気に解像度を下げていることが原因で,これにより小さな物体の検出が難しくなる.なので入力の解像度をあげれば解決できる問題で実際論文でも解像度が大きい場合にはVGG-16よりもResNet-101が優っている.さらに言えば,cocoデータセットのように検出のカテゴリ数が増えればResNet-101の分類能力の高さが発揮されて入力の解像度が小さくてもVGG-16より良い結果を達成できる.詳細はDSSDの論文読めとのこと.

以上を踏まえて最初のdownsamplingをなくせば大体の状況でVGG-16よりいい精度を出せるだろうということで,Root-ResNetなる構造を提案.提案といっても内容は単純で最初の畳み込みのストライドを1にしてカーネルサイズを3に変更しただけとのこと(この畳み込みをroot blockと定義).

実験

BatchNormの部分は繰り返しになるので割愛.root-resnetに関してResNet-18を使って検証.ResNetの最初の畳み込みのdownsamplingをなくすだけでmAPが4%ほど改善するそう.さらに最初の畳み込みをカーネルサイズ7の畳み込みの代わりにカーネルサイズ3の畳み込み数回で代用したところ精度が向上.具体的にResNetの構造に対し,7x7を3x3に変えて層の数を3にしたところ2%ちょっと改善,さらにroot-resnetの構造(downsamplingを無くす場合)にすればやはり4%程改善.

様々なベースライン手法とPascalVOCで比較.300x300の解像度を入力としてもスクラッチから学習したroot-resnet-34がほぼ全てを上回るmAPを達成.唯一負けたのがCoupleNetでroot-resnet-34がmAP78.5%に対してCoupleNetが80.4%.またms cocoでの比較ではtwo-stage系の手法(Faster R-CNNなど)には劣る結果.ただし,multi-scale testingをした場合では一応全ての手法を大きく上回っている.

まとめ

SSDの論文書いた人たちはBatchNorm入れてうまくいかなかったとかgithubのissueに書いてた気がするけどなんだろなという気持ち.内容としては技術レポート的な感じだが実践的に役立ちそうなことは多かった.数式は出てこなかったなあ