You have 2 free member-only stories left this month.

Faster R-CNNにおけるRPNの世界一分かりやすい解説

Kai
Kai
Oct 3, 2019 · 14 min read

今更ですがFaster R-CNNとRPNについて勉強していたら、思いのほか分かりやすい記事がなかったので自分で書くことにしました。

英語版はこちら

Faster R-CNNとは

2015年にMicrosoftが発明した物体検出アルゴリズムです。Deep LearningによるEnd-to-Endな実装に初めて成功しています。

元論文:https://arxiv.org/pdf/1506.01497.pdf

ざっくりとした流れは
① ある矩形の中身が物体なのか背景(=何も写っていない)なのかを学習
② ①で検出した場所に、具体的に何が写っているのかを学習
という2段構造です。Faster R-CNNの偉い所は①においてResion Proposal Network(RPN)と呼ばれるCNN構造を用いたところです。今までは画像処理の手法であるSelective Searchを使っていたのですが、そこをDeep Learningによって実装している点が画期的でした。

元論文より引用:全体の構造

上図のように、一気通貫で学習させることが可能です。(まあこの図だけじゃさっぱりなんですけれども。)

さてそんなRPNですが、各所で論文を解説しているものの、読んでいると色々な疑問点が湧きました。

・sliding windowとは何なのかよく分からない(これに関してはRPN関係ないですが…。最後にちょっと触れています 。)
・Anchor boxが何なのかよく分からない
・RPNの出力層の形(=Faster-RCNNの後半部分=ROI Pooling部分に渡す形)が想像できない
・というかそもそもRPNが何なのかよく分からない
・Faster R-CNNの学習方法もよく分からない。

この記事ではこれらについて数式を使わずに解説していきます。

⓪ RPNの構造の概要

RPNはそれ自体が「ある画像のどこに物体が写っているか」=「物体が写っている場所と、その矩形の形」を検出できる機械学習モデルです。何が写っているかまではRPNではフォローしません(Faster R-CNNの後半部分でそこは学習させます)。RPNは機械学習モデルなので、学習させるためには入力データとその教師データが必要です。入力データはもちろん入力画像(縦×横×チャンネル数)です。教師データが厄介で、以下の手順で作成します。

  1. 入力画像から特徴マップを出力
  2. 特徴マップに対してAnchor boxesを設定する。
  3. Anchor boxesと答え(Ground Truth)の情報を比較しながらRPNの教師データ(=RPNモデルの出力層)を作成する。

これによって、
入力:画像
出力:3で作った教師データ
という形の教師あり学習を行います。

① 特徴マップについて

まず特徴マップについてです。

特徴マップについては非常に簡単で、「あるinputを、VGG16等の学習済みモデルを用いて最後の畳み込み層まで通したときの出力層」です。例えばVGG16の構造は下記のとおりです。

この中で特徴マップは最後のプーリング層の一個手前にある14×14×512の層を指します。学習済みモデルにVGG16を選んだ場合は4回プーリングをしているため、特徴マップは元の画像の1/16の縦横をもった512次元のデータになります。特徴マップを出力した以降の層、つまり7×7×512以降の部分はRPNでは使用しません。

例えば入力が224×224×3ならば、特徴マップは14×14×512になります。例えば元の画像が300×400×3であれば、feature mapsは18×25×512になります。

ここまでは特に問題ないと思います。

ここから本題かつ鬼門?のAnchor Boxesについてです。ここではサンプルとして下記の犬画像を用いる事にします。ground truthは犬を囲っている緑色の矩形(bounding box)です。この犬画像の横を300、縦を400と仮定します(肖像犬に関しましては本人に直接許可を取りました)。この画像の特徴マップのサイズは18x25x512となります。

可愛いですね!

② AnchorとAnchor boxesについて

特徴マップを作成したら、次にAnchorを設定します。後で細かい解説は書きますが、Anchorは特徴マップ上の各点です。また、それぞれのAnchorに対して9つのAnchor boxesを作っていきます。各Anchor boxesとGround Truthとを見比べた情報がRPNを学習させる際の教師データとなります。

Anchorについて

Anchorは、これから描く矩形の中心の役割を果たします。今回の例の場合、18×25=450個の点全てをAnchorとして設定します。VGG16によって、Anchorは元画像に対しては16ピクセルに1つの割合で出現するようになるため、図にすると下記のようにまばら、かつ等間隔に出現します。

feature mapsにAnchorを設定し、元画像に適用する

Anchorは色々な所に出現するため、物体がどこにあってもどれかしらのAnchorがその物体の中心の役割を担う事ができます。ここまでで矩形の中心候補は決まったのですが、まだこの矩形の縦横の長さが決まっていません。それを決めるのがAnchor boxの役割です。

Anchor boxについて

各Anchorから

  • 基準の長さ
  • 縦横比

をそれぞれ決めることで、複数のAnchor boxesを作り出します。例とし

  • 基準の長さ→64,128,256(画像の長さを超えないように注意)
  • 縦横比→1:1, 1:2, 2:1(正方形、横長、縦長)

のように設定すると、例えば(x,y)=(11,12)であるAnchorに対してAnchor boxesは以下のように作られます。

正方形(小)、縦長長方形(小)、横長長方形(小)、正方形(中)、…、横長長方形(大)で計9つ

Anchor boxesは一つのAnchorに対して
3(基準の長さ)×3(縦横比)=9つ作られます。
Anchor boxesを作る際には各基準の長さごとにAnchor boxesの面積は揃える必要があることには注意してください。
つまり基準の長さ=64のとき、Anchor boxesは
1:1→64×64 (=4096)
1:2→45×91 (≒4096)
2:1→91×45 (≒4096)
というサイズになります。尚、画像からはみ出たAnchor boxesは無視しますので、実際には以下の通りです。

正方形(大)と横長長方形(大)はハミ出てるからいらない

Anchor boxesは最大で18×25×9=4050個作られます。ここで様々な形のboxが提案されることにより、ground truthがどんな形であっても、ある程度答えと似ているboxの候補を生成することが出来ます。この基準の長さと縦横比はハイパーパラメータとして調整することが可能です(極端に縦長の矩形があることが事前に分かっているときは、5:1の縦横比を設定しておくなど)。

あとは一つ一つのAnchor boxとground truthを見比べて、その結果をRPNの出力とするだけです!

③ RPNの出力層の構造について

私がこの記事を書こうと思った最大の理由は、RPNの出力について書かれたサイトが1つもなかったからです。

元論文に書かれているように、RPNでは

  • あるAnchor boxの中身が背景か物体か
  • 物体だった場合、ground truthとどのくらいズレているか

の2つを学習させます。

元論文より引用。この図だけだとさっぱり分かりません…。

上図において、kはAnchor boxesの数です。今回の例の場合は9です。ので、”2k scores”は18個の分類タスクであることを表します。

「背景か物体か」については、ground truthとAnchor boxesのIOU(重なり具合)を計算して、IOU<0.3なら「背景」、IOU>0.7なら「物体」とラベルを付けます。そのため、9×2=18クラス作られます。
(IOUについてはここを見てください)
0.3<IOU<0.7の部分については学習に使いません。背景とも物体とも言い難い被り具合だからです。

また、「ground truthとあるAnchor boxのズレ」については、”中心x座標のズレ”、”中心y座標のズレ”、”横の長さのズレ”、”縦の長さのズレ”という4つの指標で評価しています。この4項目についてそれぞれ計算するため、9(Anchor Boxesの数)×4(ずれ方)=36クラス作られます。

…さて、ここまででRPNの出力層の形はイメージ出来ましたでしょうか!

私は全くイメージ出来ませんでした。

・「背景か物体か」について

結論を見るのが一番手っ取り早いです。結論はこうです。

「背景か物体か」の出力層

出力のz軸は各Anchorに対して、

Anchor box 1に対する背景ラベル|Anchor box 1に対する物体ラベル|Anchor box 2に対する背景ラベル|Anchor box 2に対する物体ラベル|
…|Anchor box 9に対する物体ラベル

というような順番で18個並んでいます。Anchor box 1というのは、基準の長さが64で縦横比が1:1であるbounding boxです。以下Anchor box 2 =「64で1:2」、Anchor box 3 = 「64で2:1」、Anchor box 4 =「128で1:1」…という順番でAnchor boxを1から9まで番号付けします。

先ほどの絵に戻ると、(x,y)=(11,12)に対して基準の長さ=256で縦横比=2:1(=Anchor box 9)のbounding boxはIOU>0.7を達成しています。

そのため、outputの(x,y,z)= (11,12,18)は「1」となります。

逆に、(x,y)=(11,12)の対して基準の長さが64で縦横比が1:1、1:2、2:1のbounding boxは全てIOU<0.3です。そのため、outputの(x,y,z) = (11,12,1), (11,12,3), (11,12,5)には1が付きます。

このように4050個のAnchor boxesを全て調べ、IOU<0.3である背景と、IOU>0.7である物体に1が付いたものが1つ目のアウトプットです。

・「ground truthとのズレ」について

こちらも結論の図からいきます。

2を4に変えただけ!

こちらには

Anchor box 1に対するxズレ|Anchor box 1に対するyズレ|Anchor box 1に対する横の長さズレ|Anchor box 1に対する縦の長さズレ|Anchor box 2に対するxズレ|…|Anchor box 9に対する縦の長さズレ

というような形で値が格納されます。ズレ量を調べるのはIOU>0.7となったAnchor boxのみです。そのため、ほとんどのラベルは0のままです。今回の例の場合、Anchorの(x,y)=(11,12)に対してAnchor box 9はIOU>0.7のため、(x,y,z)=(11,12,33), (11,12,34), (11,12,35), (11,12,36)の4箇所にはそれぞれに対応する値が入ります。

こうして作った2つの配列がRPNの教師データであり、RPNの出力層の形を作るものとなります。

④ RPNの学習について

RPNの出力については上記の通りでした。では最後に、RPN全体の構造がどのようになっているかを確認します。全体は以下の通りです。

  1. 入力画像をVGG16等(RPNの出力部を作るのに使ったモデルと同じモデル)に通し、特徴マップを得る。これによって、300×400の入力画像は18×25×512となります。当たり前ですね。
  2. 1に対し、さらに3×3畳み込み(512チャンネル)を行う。そこにさらに1×1畳み込みをかけることで、「背景 か物体か」用のアウトプット(18×25×18チャンネル)と、「ground truthとのズレ」用のアウトプット(18×25×36チャンネル)の2つを作る。
  3. 1入力2出力のモデルとして学習させる。

このように、「物体か背景か」の分類問題と「ground truthとのズレ」の回帰問題を同時に解いていきます。前者はバイナリクロスエントロピー、後者はL1ノルム(絶対値誤差)をベースにした誤差関数を適用します。

⑤ Faster-RCNNの学習について

Faster-RCNN全体の構造は以下の通りです。

  1. 入力画像をVGG16等(④-1で使ったものと同じ構造、同じ重み)に通し、特徴マップを得る。
  2. ROI Poolingという、入力を固定長に変換するアルゴリズムを適用し、入力特徴マップのサイズにかかわらず固定長の長さに変換する。
  3. 2で得たベクトルを4096の全結合層に2回通し、最後にクラス分類用と、矩形のズレ回帰用の2種類の出力を得る。
  4. 1入力2出力のモデルとして、機械学習する。

1を使いまわすのがポイントです。そして、RPNを学習させるのに用いた「3×3畳み込み→1×1畳み込み」部分はRPN特有の構造のため、Faster-RCNNで何かを予測する際には使いません。

最後の全結合層部分も入出力は常に固定サイズです。なのでFaster-RCNNは入力画像のサイズに依存しない学習、予測が可能となっています。

実際にFaster-RCNNを学習する際には
①RPN部分の勾配更新
②Faster-RCNN全体の勾配更新
を交互に行い、それぞれの精度を高めながら学習を進めます。図にすると以下のような感じです。

この図の①と②を交互に繰り返します。今ならこの図の意味も分かるのではないでしょうか。

おまけ:sliding windowについて

ただの畳み込み層のことです。昔は畳み込み層のことをsliding windowとも呼んでいたみたいです。私は知りませんでした。特に深く考える必要はありませんでした。

結論

RPNは畳み込み層とプーリング層のみで記述をしています。一般的な分類問題では最後に全結合層が来るため、入力画像は固定長でなければいけませんが、RPNは任意の大きさの画像を入力とすることが出来ます。さらにFaster-RCNN全体を通してみても、ROI Poolingで固定長にするため、入力サイズに依存しない学習が可能となっています。そのため非常に柔軟性が高いモデルだと言えるでしょう。

参考文献

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

2. https://towardsdatascience.com/faster-r-cnn-object-detection-implemented-by-keras-for-custom-data-from-googles-open-images-125f62b9141a

LSC PSD

The member of LSC Corp.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Start a blog