物体検出の実装を目指す-SPPnetについて
RCNNに続き、次はSPPnetの理解、実装を目指す。
今回も頑張って論文を読んだ。気のせいかRCNNの論文より読みやすかった。アジアの人が書いた論文だからかな。
まずRCNNの問題点として以下が挙げられる。
RCNNはSelectiveSearchなどで得た候補領域の1つ1つをクロッピング、ワーピングの処理を施してCNNの入力に渡すが、クロッピング、ワーピングの処理は望ましくない幾何学的な歪みをもたらす可能性があること。
SelectiveSearchで得る約2000件ほどの候補領域1つ1つをCNNにかけるのでとても時間がかかること。
2つめにおいては、認識に関係ないような候補領域までCNNにかけていたら時間が無駄になってしまう。
SPPnetはこれを改善し、なんと畳み込みの処理を画像全体から一度だけ行うことで計算時間の短縮ができると書いてあった。しゅごい。。。。
特に最大の特徴はSPP(Spatial Pyramid Pooling)と呼ばれるプーリングを実装することで、入力の画像サイズに関わらず固定長の出力を得ることができるので入力が固定ではなく可変サイズに変更できること。
RCNNの論文を読んだ自分からすれば胸が熱くなる内容しか書いてない。素晴らしい。。。。
実装としてはあるCNNの最後のConv層に、SPP層を追加するだけっぽい。
上の方法がRCNNでの手順で、下の方法がSPPnetでの手順。
SPP層で何を行うかというと以下のような処理をする。
畳み込み層からの特徴マップを それぞれ 16x16, 4x4, 1x1 のウィンドウでmaxプーリングを行う。(ウィンドウサイズの設定は条件がある。)
行った結果をreshapeして固定長の出力にして全結合層へ渡すといった形かな。
実装があっているか確信はないけど、SPP層らしきものを作り結果を試してみた。
学習率1e-5,ミニバッチ30枚でのAlexnetで試す。SPP層なしの方では
ミニバッチのせいもあるけど損失値が上がったり下がったり不安定。でもちゃんと学習している。
ありの方では
0~20stepからかなり小さい損失の値を出している。でも200stepくらいではなしの方と値はどっこいといった感じだろうか。ありの方が順調に学習している感じがする。実装が間違っていなければ
このSPP層による物体検出のプログラムを作りたいがいくつかまだ疑問が残っていて、
畳み込みの入力は画像一枚からだが、何を学習したCNNを選べばいいのか
SPP層の操作を行った出力か、それとも元の入力画像をSelectiveSearchにかけるのか。(SPP層の出力で強く発火した元の入力画像の候補領域を全結合層に渡すのか)
プログラムの構築も難しそうだが、まだ理解できていない部分が多い。道のりは長そう。
上記の画像はSPPnetの論文から引用。
論文のリンク