キカベン
機械学習でより便利な世の中へ
G検定対策
お問い合わせ
   

Fast R-CNN:R-CNNより高精度で速度が213倍になれた理由とは

thumb image

2014年にRoss Girshickが発表したR-CNNは、物体検出にディープラーニングを導入し、それまでの記録を塗り替えました。当時は画期的だったモデルですが、2015年にはRoss Girshick自身により開発されたFast R-CNNが記録を塗り替えました。精度が高くなっただけでなく、推論速度が213倍にもなりました。もちろん、何と何を比較しているのかによって意味が異なるので、論文で発表された実験結果などの詳細も解説します。

1. R-CNNのどこがそんなに遅かったのか🔝

R-CNNのスピードに関してはRoss Girshickも気にしていたようです。論文の中でYann LeCun率いる研究チームによるOverfeatと比較して精度が高いことを解説したあと、Overfeatの方がR-CNNよりも9倍速いことに言及しています。「R-CNNをより高速にする方法はいろいろとあるはずなので今後の課題です」と語っていました。

Speeding up R-CNN should be possible in a variety of ways and remains as future work.

R-CNNの論文より引用

よってFast R-CNNの名前が示す通り、彼は実行速度の向上を追求しその成果を発表しました。

ちなみに、当時はMicrosoftの研究チームに所属していたRoss Girshickですが、後にYann LeCunが主任研究者を務めるFAIR(Facebook AI Research)に移籍しました。研究論文では関連する文献を引用したり実験結果を比較するのは自然なことですが、こういったことが採用する側の目に留まることもあるのかと思うと人間ぽくて興味深いですね。

さて、Ross GirshickはR-CNNの問題として3つ上げています。

問題点詳細
訓練が複数の段階に分かれている領域選定された場所から特徴量を引き出す畳み込みの訓練。
特徴量によって物体の種別を判定するためにSVMを訓練。
矩形領域(Bounding Box)を調整する回帰モデルの訓練。
訓練に時間とデータ格納の場所をとる抽出した特徴量を各画像ごとにディスクに収納。
VGG16を使った場合だとPascal VOCからの訓練画像
5000個で2.5GPU日(*1)かかるしデータ量が何百ギガにもなる。
物体検出が遅い2000個の選定領域を227×227画素の大きさに変形(warp)し
畳み込みで特徴量を抽出している。VGG16を使った場合だと
テスト推論時(GPU使用)で画像ごとに47秒もかかる。

(*1)GPU日とは学習にかかった日にちに使用したGPUの数を掛け合わせたもの。例えば、半日の訓練を5個のGPUで行った場合、$0.5 \,\text{Days} \times 5 \,\text{GPUs} = 2.5 \,\text{GPU-days}$となる。

下図はR-CNNの論文から引用したものですが、2021年の知識を持って眺めるとその複雑さがよくわかります。

R-CNN
引用元:論文

2. 畳み込み処理を1回にするだけでは足りない🔝

領域選定された場所は互いに重なり合っており、その全てに対して別々に畳み込みを行うので重なった場所に関しては何度も畳み込みを行うことになり無駄が生じます。ここで「畳み込み」と言っているのは複数の畳み込み層による処理です。高精度を達成するために導入された畳み込みによる特徴量の抽出ですが、同時にR-CNNを遅くする1番の原因でした。

ただし、この問題自体は、同じ年に発表されたSPPnets(Spatial pyramid pooling networks)の論文でも言及され解決方法も明らかになっていました。それは画像全体に1回だけ畳み込みを行い抽出した特徴量を選定領域ごとに取り出して画像分類を行うという解決方法です。これで最大2000回の畳み込みが1回で済むことになり、訓練の時間が3分の1で済むようになりました。また、推論時において10倍から100倍の高速化が実現されました。

SPPnetsの論文を発表したKaiming HeHeの初期値で有名です。Kaiming HeらによるSPPnetsの論文はRoss GirshickのFast R-CNNの論文とほぼ同じ時期に発表されています。Kaiming Heも当時Microsoftの研究チームに所属しており、Ross Girshickはその研究を論文が発表される以前から知っていたと思われます。その後、彼らは共同でFaster R-CNNの論文を発表しました。そしてKaiming Heも後にFAIRに移籍します。そのFAIRにおいてKaiming HeとRoss GirshickはMask R-CNNを発表することになります。

畳み込みによる無駄を排除したSPPnetsですが、R-CNNと同様で訓練が複数に分かれており、まだ改善の余地を残していました。そこで、Fast R-CNNでは複数の段階に分かれていた訓練を一つにまとめることが考案されました。

画像元:論文

まず、Fast R-CNNは画像全体に畳み込みと最大値プーリングを施し特徴量を抽出します。領域選定された場所に相当する特徴量をRoIプーリングによって固定長のベクトルに変換します。これを一連の完全結合層(Fully connected layer、FC)に通してから画像分類を行うネットワークと矩形領域の回帰を行うネットワークに渡します。つまり、画像と領域選定された場所のリストを受け取ったFast R-CNNはその後の処理を連続して行います。訓練の際には画像のバッチと各画像ごとの選定領域のリストが入力となります。

2.1. RoIプーリング🔝

RoI(Region of Interest)プーリングは領域選定された場所を最大値プーリングで縮小する手法です。

以前は領域選定された画像を変形(warp)して227×227画素にしていました。Fast R-CNNでは、すでに特徴量になった選定領域を指定された大きさに変換する必要があります。そこで最大値プーリングを使った手法が考えられました。例えば、ある領域が縦$h$横$w$ピクセルだとします。これを指定の大きさ$H \times W$にしたい場合、特徴量の面積を$\frac{h}{H} \times \frac{w}{W}$のセルからなるグリッドに分割して各セルにおいて最大値プーリングを行います。

なお、RoIプーリングは通常の最大値プーリングと同様に特徴量のチャンネルごとに行います。

2.2. 物体位置(矩形領域)の調整🔝

領域選定による物体位置は矩形領域であり$(r, c, h, w)$として左上$(r, c)$と縦$h$横$w$で与えられます。以前のR-CNNではクラスごとに訓練された回帰モデルに通すことで矩形領域の調整を行っていました。領域選定からの矩形領域をそのまま使うと精度が良くなかったからです。

クラスごとに訓練したモデルを使うのは、物体によって形状に特徴があり領域選定の手法では捉えきれていなかったためと思われます。例えば、キリンだったら首が縦長が多いなどの特徴があり、そのようなクラスごとにある違いを考慮するためでした。もちろん、上述のキリンの首の例えは想像でしかなく、実際のモデルが何によって判断をしているのかはわかりません。

Fast R-CNNでは矩形領域の調節を同じ一つのネットワークで行います。これによって推論の処理がクラスによって分断されることもなく、また訓練時間も短縮されました。

2.3. ロバスト損失🔝

物体位置(矩形領域)予測の損失の計算はロバスト損失(smooth $L_1$ loss)を使います。

$L_{loc}(t^u, v) = \sum_{i \in \{x, y, w, h\}} \text{smooth}_{L_1}(t^u_i – v_i)$

$\text{smooth}_{L_1}(x) = \begin{cases}0.5x^2 \ \text{if } |x| < 1 \\ |x| – 0.5 \ \text{otherwise}\end{cases}$

  • $v = (v_x, v_y, v_w, v_h)$はクラス$u$に対する正解の矩形領域
  • $t^u = (t^u_x, t^u_y, t^u_w, t^u_h)$は予測の物体位置
  • $\sum_{i \in \{x, y, w, h\}}$となっているのは各要素$x, y, w, h$に対してロバスト損失を計算した総和という意味

ロバスト損失を使う理由はL2損失を使うと損失が大きくなりすぎたりして学習率の調節が難しいからです。

よって、誤差が大きいところはL1損失を使い、誤差がゼロ付近ならL2損失を使います。

ロバスト損失(smooth L1 loss)

この損失関数は連続で微分も可能です。

3. 実験結果🔝

実験結果をまとめると以下になります。

  • Pascal VOC07、2010、2012でmAPがこれまで以上に精度が高くなった。
  • R-CNNやSPPnetsと比べてずっと速くなった。
  • VGG16の畳み込み層をファインチューニングすることで精度が良くなった。

以前のR-CNNではVGG16では遅すぎるのでAlexNetを使っていましたが、Fast R-CNNではスピードが速くなったので精度が高いVGG16を特徴量抽出に主要なモデルとして使用しています。よって比較している対象がそもそも遅いバージョンのR-CNNということもできます。そのこと自体は問題ではありませんし、論文にも明確に書かれています。ただし、論文の最初の導入の部分だけ読んでいると気づきにくいかもしれません。

さらに、Fast R-CNNが213倍になったケースでは、全結合層をTruncted SVDの手法により二つのより小さい全結合層の分割することでパラメータの数を減らし実行速度を向上させています。全結合層は全ての選択領域に繰り返し施されるため、多少でも実行速度をよくすることでトータルでの時間を大幅に削減できる効果があります。ただし、Truncated SVDは次元削減の手法なので精度も多少下がります。

以下は論文から引用された実験結果の表です。

画像元:論文

S、M、Lはそれぞれsmall、medium、largeの略で、モデルのパラメータ(重さ)の数の大きさを表しています。LがVGG16を特徴量抽出に使用したバージョンに相当します。

以上より、Fast R-CNNのLモデルでは推論(テスト)時のスピードがSVDによる全結合層の次元削減がある場合にR-CNNの213倍という結果になりました。1画像につき約47秒だったものが0.22秒になりました。

よって、R-CNNと比べればとても速くなったFast R-CNNですが、上記の時間計測では領域選定の処理が含まれていません。実は、領域選定だけで2秒かかるのでまだまだリアルタイム処理とは言えませんでした。よって領域選定の処理の遅さが浮き彫りになり、その部分はFaster R-CNNの登場により解決されます。

4. 最後のこぼれ話🔝

R-CNNのコードはMATLABとCafe(C++)を使って書かれていましたが、Fast R-CNNのコードはPythonとCafeで書かれています。もしかしたら、これも速度向上に多少は貢献したのかもしれません(そこまでは、よくわかりませんでした)。

ちなみに、このCafeはBVLC(Berkeley Vision and Learning Center)によるオープンソースのプロジェクトでRoss Girshickもその研究開発に参加していました。Cafeは後にFacebookで採用されCafe2になり、Cafe2はPyTorchへと統合されました。また、PyTorchはPreferred Networksが開発していたChainerからのフォークとしてスタートしたプロジェクトであるのは有名な話です。



コメントを残す

メールアドレスは公開されません。