初めに
みなさん、Faster-RCNNは好きですか。
もしかしたら、あなたの上司はFaster-RCNNが大好きで、「Faster-RCNNを作ってくれ」と言ってくるかもしれません。
幸いにもFaster-RCNNの原理についての解説はQiitaやそのほかのサイトにも多くあります。
しかし、それでもわからないことがあります。
それは、画像ごとに検出する物体の個数が違うのをどう扱うか。
上司に「入力の前処理と出力の後は別の人にやらせるから仕様を教えてくれ」と言われても困ってしまいます。
そうならないように皆さんも今のうちに備えましょう。
論文
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (arxiv)
疑問
- 物体の個数は画像ごとに異なっていて、また不明だがそれをどういった形式で出力するか
答え
入力のバッチサイズは1。
なので、出力のサイズは単純にbounding boxでは[RPNが提案した画像の枚数、4]、物体のクラスは[RPNが提案した画像の枚数、クラス数+1]。
(RPNはRegion Proposal Networkの略。クラス数+1となっているのは背景の場合があるため)
言われてしまえば、なんということはない。
論文の著者らが公開しているソースコードの設定ファイルに
IMS_PER_BATCH: 1
という項目がある。
余談
Faster R-CNNはend2endで学習できるのが売りだが、いきなりend2endで学習するのはRPNが変な領域ばかり提案して効率が悪い。
そのため、先にRPNを学習すると論文に書いてある。
その際、学習データが負例ばかりになるのを避けるために正例と負例を128個ずつサンプリングするが、正例が128個以下の場合は負例で埋めるので、合計サイズは256で一定。
この場合は画像ごとにサイズが異なる心配はしなくてもいいが、入力画像は1枚みたいなのであまり関係ない。
最後に
思い込みって怖いですね。
ミニバッチで複数の画像を入力するものとばかり思っていて、その中で可変長に対応する方法を探していたが、1枚ずつ入力するとは思いもしなかった。
これで、入出力の仕様が定まってよかったですね。
上司に無事に報告できます。
それでは、良き物体検出ライフを。