DeepLearning
Keras
TensorFlow
MobileNet
ssdkeras

MobileNet-SSD~ssdkerasのその先2~

対象

Faaster-RCNN,SSD,Yoloなど物体検出手法についてある程度把握している方.
VGG16,VGG19,Resnetなどを組み込むときの参考が欲しい方.
自作のニューラルネットを作成している方.

1.MobileNetとは

チャンネル方向への畳み込みを行わないことで,計算量を削減したモバイルアプリケーション向けのニューラルネットワーク.従来の畳込みフィルターの代わりに空間方向への畳み込みを行うDepthwise畳み込みフィルターと1x1のPointwise畳み込みフィルターを組み合わせることで計算量を削減.

比較
Convolutuion:カーネルサイズxカーネルサイズxチャネル数(入力)
DepthwiseConv:カーネルサイズxカーネルサイズx1
PointwiseConv:1x1xチャネル数(入力)

MobileNetではDepthwiseな畳み込みとPointwiseな畳み込みを組み合わせることによって通常の畳み込みをパラメータを削減しながら行っている.
dwconv.png

また,バッチ正規化はどこでも使われ始めており,MobileNetも例外ではない,共変量シフトを抑え,感覚的には学習効率を14倍ほどに上げることができるらしい.
MibileNetBatchNorm.jpg

全体のフローは以下のようになっており,Xceptionのように
EntryFlow
MiddleFlow
ExitFlow
と分けるのであれば,(Depthwise+Pointwise)×5のMiddleFlowがボトルネックになりそうだ.

MobileNetIndex.png

2.MobileNet-SSDを作成する

ざっくりと説明するとMobileNetのEntryFlow,MiddleFlowを残し,ExitFlowを取り換えた.
今回はcaffe版のSSDを参考にし,組み立て,ExitFlowを取っ払い,SSDのDetection層のFullyConvolutionnal版とGlobalAveragePoolling版とで迷ったが,GlobalAveragePooling版を入れることにした.

また,Caffe版のMobileNet-SSDはRelu6をReluにしたとあり,kernel正規化,バッチ正規化が入っているので,Reluを使用した...Relu6の実装は苦ではない.
フィルター数は速度と精度との兼ね合いになるのだが,filter数はデフォルトの数とした.

3.考察

理論と現実では少し齟齬があり,MobileNetのMultiAddはVGG16よりはるかに少なく(9分の1くらい)学習の高速化及び学習回数の削減に寄与してくれるらしい.CPUマシンでは学習速度の向上が見て取れるのだが,GPUマシンでは学習速度の向上があまり感じられない.(VGG16の1.3倍くらいかな)
また,conv11のレイヤーの大きさが19×19であるころから,もともとのVGG16-SSDよりも大きい物体の検出は苦手とする印象.

以下実験動画(GTX10801枚です)
mobileNet.gif

4.終わりに

Keras版の自作ネットワークを作っている方がいたらアドバイスなどお願いします.
https://github.com/tanakataiki/ssd_kerasV2
SSDはガラス細工並みに繊細な構造で,職人技の数値設定が必要です.
上手くいった方はプルリク待ってます.
筆者の環境
CPU:Xenon GPU:GTX1080Ti
今後は他のネットワークを載せていくつもりです.

参考
https://arxiv.org/abs/1704.04861
http://tensorflow.classcat.com/category/mobilenet/
https://qiita.com/namakemono/items/4fbc7758ffba4791e581
https://github.com/chuanqi305/MobileNet-SSD