External Memory

プログラミング周辺知識の備忘録メイン

Fast/Faster R-CNN

前回のR-CNN、SPP-netの続き

Fast R-CNN

https://arxiv.org/pdf/1504.08083

Fast R-CNNはR-CNNやSPP-netの速度や精度などを改善したものである。
いくつかのconv層とmax pooling層の後にRoI pooling layerを導入することで、
multi-task lossを用いて学習を単一の段階で済ませ、fine-tuningにおいて全ての層を更新することが可能になる(SPPではFC層のみ)。
これによりFC層だけだったのがconv層部分もfine-tuneを行うことができVOC07のmAP基準で6%弱ほど向上している。

RoIに続いてFC層が配置され、その出力はクラス分類用とbounding-box regresson用として分岐し、それぞれのloss(multi-task loss)を用いて学習もしくは識別される。

RoIで抽出されたh×wサイズのwindowは予め設定されたグリッド数H×Wに分割され、
通常のmax poolingと同様の操作によりチャンネルごとに独立にグリッドに出力される。
これはSPPの単一pyramidと同等である。

SPP-netにおいてSPPより前のlayerの重みを学習できないのは、
その受容野の大きさにより逆伝播が非常に非効率になるからである。
効率的な学習のためにSGDにおいてmini-batchを階層的にサンプリングする。
batchに対して画像をサンプリング数Nと、RoIの出力サンプル数をRと固定する。
よって、RoIにおける画像当たりのサンプリング数はR/Nとなる。
この文献ではN=2、R=128で良い結果が得られたとある。
これにより、R-CNNやSPP-netの時のような単にN=128とするより約64倍の学習速度が出る。

lossの計算はクラス分類とbounding-box regressionを組み合わせたmulti-task lossを用いる。
L(p,u,t^u,v)=L_{cls}(p,u)+\lambda[u \geq 1]L_{loc}(t^u,v)

L_{cls}=-\log p_u

\displaystyle L_{loc}(t^u,v)=\sum_{i\in\{x,y,w,h\}}smooth_{L_1}(t_i^u-v_i)

smooth_{L_1}(x)=\left\{ \begin{array}{ll}
      0.5x^2 & (if\ |x|<1) \\
      |x|-0.5 & (otherwise)\end{array}\right.

t^uはカテゴリーuのタプルt^u=(t_x^u,t_y^u,t_w^u,t_x^h)
u,v=(v_x^u,v_y^u,v_w^u,v_x^h)はそれぞれカテゴリーとbounding-boxのラベルである。
カテゴリーが背景の場合はu=0、また文献においてはλ=1と設定している。

テスト時においてはproposalにselective searchを用い
Rは約2000で最大45000まで検討を行っているが、2000以降ではproposalの数が大きくなると精度は落ちる。


SPP-netと同じく物体認識のスケール不変性のためにsingle scale detectionとmulti-scaleを用いており、windowサイズは大体224*224、single scaleの場合s=600、multi-scaleの場合sは480-1200の範囲から6種類である。
multi-scaleの方がmAPはよくなるが、識別速度やGPUメモリの関係で非常に深いCNNでは適用が比較的難しくなる。

クラス分類器はSVMからsoftmaxに変更されており、softmaxの方が高いmAPが得られている。

VOC07に対して学習時間、テスト時間ともに大幅にスピードアップしており、
さらにSVDを用いることででR-CNNと比較して213倍の物体認識速度(テスト時の速度)が得られており、さらにR-CNNと比較して非常に深いCNNならばmAPも向上している。
ただしこれはregion proposalの経過時間は含まないようである。

Faster R-CNN

https://arxiv.org/pdf/1506.01497.pdf

Faster R-CNNはregion proposal処理部分をR-CNNの特徴マップの後に、
conv layersを追加し、そのunitをRegion Proposal Network(RPN)とする。
RPNはCNN構造内で効率的なproposalを計算し、領域境界とそれぞれの局所領域における物体認識スコアを同時に回帰する。
またFully-Connected層はconv層に置き換えるのでRPNはFCNである。

RPNはregion proposalと物体認識の計算において、同じconvoluion layersを共有する。
この共有conv layersはこの文献においてはZF、もしくはVGG-16が用いられる。
この共有CNNの出力特徴マップからn*n(この文献ではn=3)sliding windowを用いてより低次元(256or512)の特徴マップに送り込まれる。
この特徴マップはbox-regression layer (reg)、box-classification layer (cls)の二つに分岐し計算される。よってこの操作は共有CNNから3*3conv層と2つの1*1conv層unitへ入力されるのと同じである。

それぞれの領域における最大の提案可能proposal数をk(ここではk=9)とするので、box数kに対しreg層の出力は4k、cls層の出力は2kとなる。
このk boxesはanchorsと呼ばれ、スケールやアスペクト比の種類数と繋がっている。
k=9では、スケール3種、アスペクト比3種であり、特徴マップのサイズがW*Hならアンカー数はWHkとなる(スライド幅1より)。
この文献においてスケールは128*128、256*256、512*512でアスペクト比は1/1、2/1、1/2と設定している。


RPNにおけるloss関数はFast R-CNNとほぼ同じ形であるが、RPN内では二値分類である(object / not object)。

PRNの後RoIによりクラス分類とbounding-box regressionが行われる。
それぞれのスケールとアスペクト比にそれぞれregressorが割り当てられる。


RPNの学習においては逆伝播とSGDを用い、mini batchとしてランダムに256アンカーをサンプリング、positiveとnegativeが1:1となるようにnegativeをパディングする。
またZFの場合は全てのlayerを、VGGの場合はcov3_1からのlayerをtuneする。
RPNとR-CNNの学習は独立して(networkを分離)行いそれぞれ交互に反復して行う。


テストはスピードと精度のトレードオフの関係でs=600のシングルスケールモードで行われる。また、境界が交差したアンカーはテスト時には無視され、RPN proposalsはtop300個(NMSありなので少し減る)で充分なmAPが得られ、これを比較のため固定としている。
それ以上(6000 without NMS)proposalsはmAPは減少するがこれによりNMSの必要性が示唆されている。


Faste R-CNNのmAPはVOC07で69.9%、VOC2012で67.0%(学習はそれぞれに用意されたtrain dataのみの使用)である。
train dataにCOCOなどを利用すれば、さらに9%弱向上する。
Fast R-CNNより3%程度の向上である。
速度はVGGで10倍程度早くなっている(5fps)。



もうこのようなネットワークを使うならテストはまだしも学習はpre-trainedデータやら高性能GPU必須か。

R-CNN、SPP-netの物体領域認識

R-CNN

Rich feature hierarchies for accurate object detection and semantic segmentation(v5)
https://arxiv.org/pdf/1311.2524.pdf

テストはPASCAL VOC or ILSVRC2013を使っている。
ILSVRC2013からclassification taskの他にdetection taskが加わったようである。

R-CNNでは、region proposal、classification、bounding box regressorの複数のtaskに分かれている。

training

region proposal

  • CNNのfine-tuning用に、warpingしたproposal画像のground-truthに対するIoUが0.5以上の領域をpositive、それ以外をnegative(背景)として設定する。
  • SVM学習時にground-truthに対しIoUが0.3以上のnegativeは切り捨てる。

これらのIoU値による設定はCNNとSVMの認識性能が影響しており、
クラス分類は間違っていないが局所化ミスをすることを改善するための調節であると思われる(文献Figure 5)。CNNが画像中の対象の位置による認識差がないことに由来する。
また、softmaxによる学習の後にSVMによる学習を採用しているのは学習時のnegativeサンプルの抽出の仕方の違いが影響しており、性能低下はSVMの学習をしないからではないと述べている。


classification

  • ILSVRC2012データセットを使ってCNNのpre-training
  • 学習データ+validationの一部でCNNのfine-tuning(データがILSVRC2013ならクラス数は200+背景、VOCなら20+背景である。batchsizeは128でpositiveが32、negativeが96とする)
  • クラスごとに線形SVM学習


bounding box regressor

  • Bounding-box regressionを用いて、入力からground-truthを予測する。

予測にはproposal P のpool5層の特徴ベクトルの線形関数d_*(P)=\mathbf{w}_*^T\phi_5(P)を用いる。
x,yはproposalの中心座標、w,hは幅と高さである。
bounding-box regressorsで用いるpool5出力はvisualization, ablationの考察から来たものである。
pool5はCNN部分のtop層であり、FC層の手前の層であるので一番CNNの表現能力の大きい部分といえる。
また\mathbf{w}_*は学習可能なパラメータで以下の式で最適化される。

\displaystyle \mathbf{w}_*=argmin_{{\mathbf{\hat{w}}}_*}\sum_i^N(t_*^i-{\mathbf{\hat{w}}}_*^T\phi_5(P^i))^2+\lambda\|{\mathbf{\hat{w}}}_*\|^2

学習においてPはgroud-truthに近い領域でないと学習はうまくいかないのでIoUが0.6以上の最大値を用い、それ以外は捨て去る。

test
  • region proposals(約2000)を作成(ここではselective search fast modeを用いる)
  • regionをCNNに合わせるために変形(warp)
  • SVMでそれぞれ二値クラス分類

学習したSVMを用いて特徴ベクトルから点数をつけ、
greedy non-maximum suppressionにより、最大得点の領域と大きく重なる(IoUが大きい)領域を削除する。

  • それぞれのproposalに点数をつけて、bounding-box regressorsの学習した重みとpool5層出力により一度だけdetection windowを新しいものにする。


mAPはクラスごとの予測正答率の平均で、偽陽性が目立つと一気にmAPが下がりそう。

SPP-net

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
https://arxiv.org/pdf/1406.4729.pdf


これまではネットワークの入力に対して、画像サイズを固定する必要があったので
事前にwarpingやcroppingを行う必要があり、それが精度に影響を与えていた。
spatial pyramid pooling(SPP) layerはconv層とFully-Connected(FC)層の間に挿入することで、任意の画像サイズの入力に対して、FC層の固定されたunit数に対応させることが可能になる。

SPPは複数のウィンドウサイズを有するpooling layerを用意して、それぞれの出力を結合するものである。
conv層から出力された画像サイズが違っていても、それぞれのウィンドウサイズのpooling層の出力のサイズは入力のサイズにかかわらず一定なので、結果的に結合された出力の次元も固定される。
実際にILSVRC2012データセットの分類に対して使用されるSPPは1*1、2*2、3*3、6*6 pooling layerの組み合わせで出力次元(spatial bin)は50*チャンネル数である。
(n*n pooling layerでは出力の次元はn^2の倍数(チャンネル数)、1*1はglobal poolingである)


SPPより手前の層はbase CNNは既存のものを使用している(ZF-5、Convnet*-5、Overfeat-5/7)。

学習中はGPUを活かすためパラメータを共有した複数の固定サイズのネットワークを使ってSPP-netを再現する(Multi-size training)。
テスト時は直接SPP-netを使用する。
比較用にSPP構造のみを利用したSingle-size trainingも行っている。
(入力サイズはdata augmentation目的で224サイズにcroppingにより変更しており、multi-sizeの場合さらにスケーリングを行う)

SPPを用いることによりMulti-size training、Single-size trainingともにtop1/5 error率は減少している。Multi-size trainingのほうが効果は大きい。

また、テスト時の画像処理に関してはフルスケール画像をmin(w,h)=s∈Sでスケーリングを行い(|S|=6)、conv層からの特徴マップの中央と四隅、縁の中間とそのflippingで計18*6+6=96個(s=224の場合は6個)のwindowにSPPを適用する。
これらとフルスケール画像とそのflippingと合わせて、それぞれのスコアを平均化し最終的な予測とする。
これによりtop5 error率は単一モデルでtest setに対し9.08%、validation setに対し9.14%となる。

Object Detection

上記のR-CNNにおいて、テスト時に2000ものproposalsをネットワークに入力する必要があるがSPP-netでは一回で特徴マップを計算するだけで済み最大100倍以上計算速度が向上する。
特徴マップからの得られたそれぞれの候補windowごとにSPPを適用する。
さらにこれらのwindowsは任意のサイズで行うことが出来る。


detectionの流れは大体以下の通りである。

入力画像は5種類のサイズにスケーリングし、特徴マップを計算する。
selective searchのfast modeを使って2000個のwindowsを生成する。
特徴マップから抽出されたwindowが密で正方形に近ければ大体224*224くらいにリサイズする。
SPPによりpre-trainedされたネットワークの特徴マップをプールしwindowをFC層に送り込んで、二値線形SVM分類器でそれぞれのカテゴリーについてFC層分類のfine-tuneを行う。
この学習は上記R-CNN文献に倣っている。

また同じくFC層のfine-tuneとbounding box regressionの学習も行う。

学習においてpositiveサンプルはground-truthから生成し、negativeサンプルはpositiveとの重なりIoUが30%以下のものを使い、他のnegativeと70%以上重ならないようにする。
fine-tuningの際はground-truthとのIoUが[0.5,1]のものをpositiveとし、[0.1,0.5)をnegativeとする。



この後Fast R-CNN、Faster R-CNNが続けて出ている。

Batch Normalizationを試す

ResNetで出てきたBatch Normalization(BN)は学習速度が速くなるなら
すぐにでも導入したほうが効率が良いと考え検証した。

Batch Normalization

ResNetとBatch Normalization - External Memory


検証で使ったネットワークはconv2層(+max pooling2)+FC(FullyConnected)2層のtensorflow CIFAR10のサンプルコードで使用されているネットワーク構造と
比較的深い構造であるNetwork in Network(mlplayer3層)である。

BN層はReLU層の手前に挿入した。
NINにおいてtrainlossとtestlossの差からdropoutを省かなくても正則化効果が確認できそうだったでドロップアウトは省いていない。
以下の出力は単にBN層を追加したときのepochに対するtest lossと分類精度の比較である。最適化にはGradientDescentを用いて学習率は初期値0.1で60 epochごとに0.1倍に変化させている。

conv 2layers + FC 2layers
  epoch         loss     accuracy
------------------------------------
      0       2.3474       0.1070
     10       0.7504       0.7391
     20       0.7180       0.7628
     30       0.6642       0.7864
     40       0.6451       0.7856
     50       0.6584       0.7890
     60       0.6521       0.7969
     70       0.5603       0.8276
     80       0.5433       0.8359
     90       0.5476       0.8347
    100       0.5445       0.8358

    150       0.5440       0.8401

conv 2layers + FC 2layers + Batch Normalization
  epoch         loss     accuracy
------------------------------------
      0       2.3213       0.1122
     10       0.7047       0.7542
     20       0.5899       0.7941
     30       0.7298       0.7578
     40       0.6009       0.8004
     50       0.6568       0.7884
     60       0.5172       0.8296
     70       0.4458       0.8534
     80       0.4408       0.8535
     90       0.4431       0.8570
    100       0.4497       0.8518

Network in Network 
  epoch         loss     accuracy
------------------------------------
      0       2.3043       0.1000
     10       0.9792       0.6479
     20       0.7110       0.7556
     30       0.6209       0.7894
     40       0.5326       0.8256
     50       0.4895       0.8409
     60       0.4733       0.8502
     70       0.4140       0.8757
     80       0.4179       0.8762
     90       0.4243       0.8774
    100       0.4330       0.8774
    110       0.4405       0.8754
    120       0.4286       0.8776
    130       0.4343       0.8784
    140       0.4365       0.8795
    150       0.4366       0.8799

Network in Network + Batch Normalization
  epoch         loss     accuracy
------------------------------------
      0       2.3026       0.1077
     10       0.9656       0.7016
     20       0.5713       0.8111
     30       0.6258       0.8084
     40       0.5318       0.8319
     50       0.4388       0.8609
     60       0.4467       0.8564
     70       0.3472       0.8939
     80       0.3520       0.8949
     90       0.3512       0.8943
    100       0.3667       0.8931
    110       0.3506       0.8975
    120       0.3534       0.8952
    130       0.3545       0.8958
    140       0.3569       0.8955
    150       0.3548       0.8969

全体的に精度が良くなっていることが分かった。
accuracyの飽和するタイミングを見ると若干学習速度が速くなっていそうである。

正則化に関して、conv 2layers + FC 2layersの方は明らかにtrainlossとtestlossの差が小さくなったのでその効果が確認できた。
NINに関してはlossの差が小さくなならなかったが、lossが全体的に小さくなった。


Batch Normalizationを使用するにあたって、batch sizeの影響が大きくなると考えsizeを変えて比較した。
また、大きな学習率に対しても発散や消失などが抑えられるとの記載があるのでその検証を行った。

batch size

batch sizeの比較に関してはconv 2layers + FC 2layersを用いてbatch sizeを50から200に変更した。batch size200の結果は以下である。

conv 2layers + FC 2layers + batchsize 200
  epoch         loss     accuracy
------------------------------------
      0       2.2855       0.1444
     10       0.7906       0.7233
     20       0.6868       0.7701
     30       0.6466       0.7865
     40       0.5614       0.8101
     50       0.5492       0.8177
     60       0.6552       0.7886
     70       0.4672       0.8422
     80       0.4665       0.8438
     90       0.4794       0.8429
    100       0.4779       0.8421

少し精度が下がったが、epoch 60までのaccuracyのブレが若干大きいのでこのデータだけでは何とも言い難い。
正則化効果もそれほど差は無さそうなのでbatchの分布の偏りが50と200ではstepを重ねれば無視できるレベルなのだろうか。
BN適用においてbatch sizeは出来るだけ高い精度が欲しいときに最後に行うような微調整パラメータとなるかと思う。

学習率設定

大きな学習率の検証に関しては、学習率に対する発散やactivate消失の恐れが大きいNINで行った。
学習率初期値を1.0とし、20epochごとに0.1倍にした(学習時間が非常に長いため50epochまで)。

Network in Network + init lr1.0
  epoch         loss     accuracy
------------------------------------
      0       2.3032       0.1049
      5       0.8824       0.7008
     10       0.6091       0.8026
     15       0.5920       0.8108
     20       0.4943       0.8360
     25       0.3673       0.8798
     30       0.3637       0.8775
     35       0.3586       0.8842
     40       0.3634       0.8834
     45       0.3418       0.8875
     50       0.3395       0.8894

高い学習率においても、学習が停滞することがなく順調に進んだ。
精度はBN適用init lr 0.1の時と比べてわずかに落ちているが、調整すればBN適用時の精度を維持したままstep数に対して学習速度を速めることも出来そうである。
BNなしのbase NINに対して精度だけで比較するとかなりの学習速度アップである。
とはいえ、step数7%程度でほぼ同じ精度を達成しようとすると困難が伴うと思うが。


NINのような比較的深いネットワークになるとBNを挿入するとstepごとの学習時間が長くなるので、実時間に対する学習速度を考えるならばその効果は減ってしまう。
しかし単に精度も向上するのでBNを導入する価値はあると思う。