.. _sec_rcnn: Region-based CNNs (R-CNNs) ========================== 単発マルチボックス検出 については :numref:`sec_ssd` で説明したが、 領域ベースの CNN、すなわち CNN 特徴を用いた領域(R-CNNs)も、 物体検出に深層学習を適用する先駆的な手法の一つです :cite:`Girshick.Donahue.Darrell.ea.2014`\ 。 この節では、R-CNN とその一連の改良版である fast R-CNN :cite:`Girshick.2015`\ 、faster R-CNN :cite:`Ren.He.Girshick.ea.2015`\ 、および mask R-CNN :cite:`He.Gkioxari.Dollar.ea.2017` を紹介する。 紙幅の都合上、これらのモデルの設計にのみ 焦点を当てる。 R-CNNs ------ *R-CNN* はまず、入力画像から多数(たとえば 2000 個)の *region proposals* を抽出し (たとえば、アンカーボックスも region proposals と見なせます)、 それらのクラスとバウンディングボックス(たとえばオフセット)をラベル付けする。 :cite:`Girshick.Donahue.Darrell.ea.2014` 次に、各 region proposal に対して CNN を用いて 順伝播を行い、その特徴を抽出す。 その後、各 region proposal の特徴を用いて、 この region proposal のクラスとバウンディングボックスを 予測する。 .. _fig_r-cnn: .. figure:: ../img/r-cnn.svg The R-CNN model. :numref:`fig_r-cnn` は R-CNN モデルを示している。より具体的には、R-CNN は次の 4 つのステップから構成される。 1. 入力画像上で複数の高品質な region proposals を抽出するために、\ *selective search* を実行する :cite:`Uijlings.Van-De-Sande.Gevers.ea.2013`\ 。これらの提案領域は通常、異なる形状やサイズを持つ複数のスケールで選択される。各 region proposal には、クラスと正解バウンディングボックスがラベル付けされる。 2. 学習済み CNN を選び、出力層の手前で切り取りる。各 region proposal をネットワークが要求する入力サイズにリサイズし、順伝播によってその region proposal の抽出特徴を出力する。 3. 抽出した特徴と各 region proposal のラベル付きクラスを例として用いる。複数のサポートベクターマシンを学習して物体を分類し、各サポートベクターマシンはその例に特定のクラスが含まれるかどうかを個別に判定する。 4. 抽出した特徴と各 region proposal のラベル付きバウンディングボックスを例として用いる。線形回帰モデルを学習して、正解バウンディングボックスを予測する。 R-CNN モデルは学習済み CNN を用いて画像特徴を効果的に抽出すが、 処理速度は遅いである。 1 枚の入力画像から 数千個の region proposals を選ぶことを考えてみよ。 これには、物体検出を行うために数千回の CNN 順伝播が必要になる。 この膨大な 計算負荷のため、R-CNN を実世界のアプリケーションで 広く使うことは現実的ではない。 Fast R-CNN ---------- R-CNN における主な性能上のボトルネックは、 計算を共有せずに各 region proposal ごとに 独立して CNN 順伝播を行う点にある。 これらの領域は通常 重なりを持つため、 独立した特徴抽出では 同じ計算が何度も繰り返される。 *fast R-CNN* における R-CNN からの主要な改良点の一つは、 CNN の順伝播を 画像全体に対してのみ行うことです :cite:`Girshick.2015`\ 。 .. _fig_fast_r-cnn: .. figure:: ../img/fast-rcnn.svg The fast R-CNN model. :numref:`fig_fast_r-cnn` は fast R-CNN モデルを示している。主な計算は次のとおりです。 1. R-CNN と比べると、fast R-CNN では特徴抽出のための CNN の入力は個々の region proposal ではなく、画像全体である。さらに、この CNN は学習可能である。入力画像が与えられたとき、CNN 出力の形状を :math:`1 \times c \times h_1 \times w_1` とする。 2. selective search が :math:`n` 個の region proposals を生成すると仮定する。これらの region proposals(形状はさまざま)は、CNN 出力上の region of interest(形状はさまざま)を示す。次に、これらの region of interest から、同じ形状(たとえば高さ :math:`h_2` と幅 :math:`w_2` が指定される)の特徴をさらに抽出し、連結しやすくする。これを実現するために、fast R-CNN は *region of interest (RoI) pooling* 層を導入する。CNN 出力と region proposals をこの層に入力し、形状 :math:`n \times c \times h_2 \times w_2` の連結特徴を出力して、すべての region proposals に対してさらに特徴抽出を行う。 3. 全結合層を用いて、連結特徴を形状 :math:`n \times d` の出力に変換する。ここで :math:`d` はモデル設計に依存する。 4. :math:`n` 個の region proposals それぞれについて、クラスとバウンディングボックスを予測する。より具体的には、クラス予測とバウンディングボックス予測において、全結合層の出力をそれぞれ形状 :math:`n \times q`\ (\ :math:`q` はクラス数)と形状 :math:`n \times 4` の出力に変換する。クラス予測には softmax 回帰を用いる。 fast R-CNN で提案された region of interest pooling 層は、 :numref:`sec_pooling` で導入した pooling 層とは異なる。 pooling 層では、 pooling ウィンドウ、パディング、ストライドのサイズを指定することで、 出力形状を間接的に制御する。 これに対して、 region of interest pooling 層では 出力形状を直接指定できる。 たとえば、 各領域の出力高さと幅をそれぞれ :math:`h_2` と :math:`w_2` に指定するとする。 形状 :math:`h \times w` の任意の region of interest ウィンドウに対して、 このウィンドウは :math:`h_2 \times w_2` のグリッド のサブウィンドウに分割され、 各サブウィンドウの形状はおおよそ :math:`(h/h_2) \times (w/w_2)` になる。 実際には、 任意のサブウィンドウの高さと幅は切り上げられ、最大要素がサブウィンドウの出力として用いられる。 したがって、region of interest pooling 層は、 region of interest の形状が異なっていても 同じ形状の特徴を抽出できる。 説明のための例として、 :numref:`fig_roi` では、 :math:`4 \times 4` の入力上で 左上の :math:`3\times 3` の region of interest が選択されている。 この region of interest に対して、 :math:`2\times 2` の region of interest pooling 層を用いて :math:`2\times 2` の出力を得る。 4 つに分割された各サブウィンドウには 要素 0, 1, 4, 5(最大値は 5)、 2, 6(最大値は 6)、 8, 9(最大値は 9)、 および 10 が含まれることに注意しよ。 .. _fig_roi: .. figure:: ../img/roi.svg A :math:`2\times 2` region of interest pooling layer. 以下では、region of interest pooling 層の計算を示す。CNN で抽出された特徴 ``X`` の高さと幅がともに 4 で、チャネルが 1 つだけであると仮定する。 .. raw:: html
pytorchmxnet
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python import torch import torchvision X = torch.arange(16.).reshape(1, 1, 4, 4) X .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output tensor([[[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.]]]]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python from mxnet import np, npx npx.set_np() X = np.arange(16).reshape(1, 1, 4, 4) X .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output [07:02:53] ../src/storage/storage.cc:196: Using Pooled (Naive) StorageManager for CPU .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output array([[[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.]]]]) .. raw:: html
.. raw:: html
さらに、 入力画像の高さと幅がともに 40 ピクセルであり、selective search がこの画像上で 2 つの region proposals を生成すると仮定しよう。 各 region proposal は 5 つの要素で表される。 すなわち、物体クラスに続いて、その左上隅と右下隅の :math:`(x, y)` 座標である。 .. raw:: html
pytorchmxnet
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python rois = torch.Tensor([[0, 0, 0, 20, 20], [0, 0, 10, 30, 30]]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python rois = np.array([[0, 0, 0, 20, 20], [0, 0, 10, 30, 30]]) .. raw:: html
.. raw:: html
``X`` の高さと幅は入力画像の高さと幅の :math:`1/10` なので、 2 つの region proposals の座標は、指定された ``spatial_scale`` 引数に従って 0.1 倍される。 すると、2 つの region of interest はそれぞれ ``X[:, :, 0:3, 0:3]`` と ``X[:, :, 1:4, 0:4]`` として ``X`` 上に示される。 最後に、\ :math:`2\times 2` の region of interest pooling では、 各 region of interest は サブウィンドウのグリッドに分割され、 同じ形状 :math:`2\times 2` の特徴をさらに抽出す。 .. raw:: html
pytorchmxnet
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python torchvision.ops.roi_pool(X, rois, output_size=(2, 2), spatial_scale=0.1) .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output tensor([[[[ 5., 6.], [ 9., 10.]]], [[[ 9., 11.], [13., 15.]]]]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python npx.roi_pooling(X, rois, pooled_size=(2, 2), spatial_scale=0.1) .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output array([[[[ 5., 6.], [ 9., 10.]]], [[[ 9., 11.], [13., 15.]]]]) .. raw:: html
.. raw:: html
Faster R-CNN ------------ 物体検出をより高精度にするために、 fast R-CNN モデルでは通常、 selective search によって 多数の region proposals を生成する必要がある。 精度を落とさずに region proposals を減らすために、 *faster R-CNN* は selective search を *region proposal network* に置き換えることを提案した :cite:`Ren.He.Girshick.ea.2015`\ 。 .. _fig_faster_r-cnn: .. figure:: ../img/faster-rcnn.svg The faster R-CNN model. :numref:`fig_faster_r-cnn` は faster R-CNN モデルを示している。fast R-CNN と比べると、 faster R-CNN が変更するのは region proposal の方法を selective search から region proposal network に変える点だけである。 モデルの残りの部分は 変更されない。 region proposal network は 次の手順で動作する。 1. パディング 1 の :math:`3\times 3` 畳み込み層を用いて、CNN 出力を :math:`c` チャネルの新しい出力に変換する。これにより、CNN で抽出された特徴マップの空間次元上の各ユニットは、長さ :math:`c` の新しい特徴ベクトルを持つようになる。 2. 特徴マップの各ピクセルを中心として、異なるスケールとアスペクト比を持つ複数のアンカーボックスを生成し、それらにラベルを付ける。 3. 各アンカーボックスの中心にある長さ :math:`c` の特徴ベクトルを用いて、二値クラス(背景または物体)と、このアンカーボックスのバウンディングボックスを予測する。 4. 予測されたクラスが物体であるバウンディングボックスを考える。non-maximum suppression を用いて重なりのある結果を除去する。残った物体の予測バウンディングボックスが、region of interest pooling 層に必要な region proposals である。 注目すべき点として、 faster R-CNN モデルの一部として、 region proposal network は モデルの残りの部分と同時に学習される。 言い換えると、faster R-CNN の目的関数には、 物体検出におけるクラスとバウンディングボックスの予測だけでなく、 region proposal network におけるアンカーボックスの二値クラスとバウンディングボックスの予測も含まれる。 エンドツーエンド学習の結果として、 region proposal network は 高品質な region proposals を生成する方法を学習し、 データから学習された少数の region proposals で 物体検出の精度を保てるようになる。 Mask R-CNN ---------- 学習データセットにおいて、 画像上の物体のピクセルレベルの位置もラベル付けされているなら、 *mask R-CNN* は そのような詳細なラベルを効果的に活用して、 物体検出の精度をさらに向上できる :cite:`He.Gkioxari.Dollar.ea.2017`\ 。 .. _fig_mask_r-cnn: .. figure:: ../img/mask-rcnn.svg The mask R-CNN model. :numref:`fig_mask_r-cnn` に示すように、 mask R-CNN は faster R-CNN を基に改良されている。 具体的には、 mask R-CNN は region of interest pooling 層を *region of interest (RoI) alignment* 層に置き換える。 この region of interest alignment 層は 双線形補間を用いて特徴マップ上の空間情報を保持し、ピクセルレベルの予測により適している。 この層の出力には、 すべての region of interest に対して同じ形状の特徴マップが含まれる。 それらは、 各 region of interest のクラスとバウンディングボックスを予測するだけでなく、 追加の全畳み込みネットワークを通じて物体のピクセルレベルの位置も予測するために用いられる。 画像のピクセルレベルの意味情報を予測するために全畳み込みネットワークを用いる詳細については、 この章の後続の節で説明する。 要約 ---- - R-CNN は入力画像から多数の region proposals を抽出し、CNN を用いて各 region proposal に順伝播を行って特徴を抽出し、その特徴を用いてこの region proposal のクラスとバウンディングボックスを予測する。 - fast R-CNN における R-CNN からの主要な改良点の一つは、CNN の順伝播を画像全体に対してのみ行うことである。また、region of interest pooling 層を導入し、形状の異なる region of interest に対して同じ形状の特徴をさらに抽出できるようにしている。 - faster R-CNN は、fast R-CNN で用いられる selective search を同時学習される region proposal network に置き換えることで、少数の region proposals でも物体検出の精度を保てるようにしている。 - faster R-CNN を基に、mask R-CNN はさらに全畳み込みネットワークを導入し、ピクセルレベルのラベルを活用して物体検出の精度をさらに向上させる。 演習 ---- 1. 物体検出を、バウンディングボックスとクラス確率の予測のような単一の回帰問題として定式化できるだろうか。 YOLO モデルの設計を参照してもよいです :cite:`Redmon.Divvala.Girshick.ea.2016`\ 。 2. 単発マルチボックス検出と、この節で紹介した手法を比較しよ。主な違いは何だろうか。 :cite:t:`Zhao.Zheng.Xu.ea.2019` の図 2 を参照してもよいである。