0. 目的
- 物体検出において畳み込みニューラルネットワークを用いた初期の手法である、R-CNNについて説明する。
1. 物体検出とは
- 画像に含まれる人や車などの物体を取り囲む四角い領域を特定することが目標。
- 物体を取り囲む領域を、バウンディングボックスという。
- 物体検出手法の多くにおいて、次の手順により、物体検出結果を得る。
1. 物体を囲む領域の候補群を提案。
2. 物体クラス認識の処理を行い、認識対象物体らしさを計算。
3. 同一物体に複数のバウンディングボックスが検出されないように、後処理を実施。 - 1枚の画像から提案される物体領域候補群はできるだけ検出対象の物体の領域を網羅しつつ、物体領域候補数が少ないことが望ましい。
- 物体領域候補数と物体クラスの認識処理の回数は比例するため、計算コストの低いクラス認識手法が望ましい。
2. R-CNN
2.0 R-CNNの概要
深層学習の成功以前は、計算コストが低いHOG特徴などが一般的に用いられていた。
- HOG特徴(本筋には関係ないため、読み飛ばしても良い。)
- 局所領域内の各画素に関して、次のように輝度勾配の強度と方向を計算する。
ノイズの影響を低減させるため、平滑化フィルタを適用した画像 $L(x,y)$ を利用する。この $x$ 方向と $y$ 方向の輝度勾配をそれぞれ $L_x(x,y)$、$L_y(x,y)$ とする。このとき次のように各画素において輝度勾配の強度と傾きを計算する。 $$m(x,y) = \sqrt{L_x^{2}(x,y)+L_y^{2}(x,y)}, \ θ(x,y)=\textrm{tan}^{-1}\frac{L_y(x,y)}{L_x(x,y)}$$ - $N_p\times N_p$ の画素を一つの領域として、輝度勾配ヒストグラムを計算する。一般に、$N_p=5$ が用いられ、輝度勾配ヒストグラムを計算する領域をセルと呼ぶ。輝度勾配の方向は量子化され、方向のビン数を $N_{θ}$ とする。HOG特徴の場合は $N_{θ}=9$ が用いられる。したがって一つのセルは9次元のベクトルで表される。
- 隣接する $N_c\times N_c$ のセルを1ブロックとする($N_c=3$ がよく用いられる)。このブロック $B_k$ 内を次の式を用いて正規化する。 $$\hat{v}_i^{(k)}=\frac{v_i^{(k)}}{\sqrt{\sum_{j\in B_k}|v_j^{(k)}|^{2}+ε^{2}}}$$
- ブロック内の各セルを表現するベクトルをすべて結合してブロックを一つのベクトルとして表現する。このベクトルは、 $$v^{(k)}=(\hat{v}_1^{(k)T}, \dots, \hat{v}_{N_c\times N_c}^{(k)T})$$
- 注目する局所領域に $N_x\times N_y$ 個のセルが含まれているとすると、1セルづつずらしながら、式 (5) に従いブロックの表現を計算する。これらのブロックの $v^{k}$ を記述したベクトルを、最終的なHOG特徴とする。 $$ \begin{pmatrix} v^{1} \\ \vdots \\ v^{(N_x-N_c+1)\times (N_y-N_c+1)} \end{pmatrix} $$ したがって、HOG特徴の次元数は、$(N_\theta\times N_c\times N_c)\times (N_x-N_c+1)\times (N_y - N_c +1)$
- 局所領域内の各画素に関して、次のように輝度勾配の強度と方向を計算する。
- HOG特徴(本筋には関係ないため、読み飛ばしても良い。)
R-CNNは、この特徴を畳み込みニューラルネットワークの中間層から得られる特徴量(CNN特徴)に置き換えた物体検出システムである。
- 次にR-CNNのパイプライン図を示す。
- 以下順に、物体領域候補の提案、CNNによる特徴の算出、検出領域の分類、について説明する。
2.1 物体領域候補の提案
- 画像中から、物体領域候補を提案する箇所は、物体検出の精度と速度を決める重要な部分。
- 物体領域候補の提案に失敗すると、物体検出も失敗する。
- 単純には、ある大きさのウィンドウを一定幅でストライドさせて、提案領域を探索すればよいが(スライディングウィンドウ法)計算コストが高い。そこで、R-CNNにおいては、選択的検索法を利用。
2.1.1 選択的検索法
- 入力画像中で、物体らしさをあらかじめ評価しておき、領域候補数を絞り込む手法。
- ①画像の領域分割、②画像セグメントの統合、の2段階により行う。
① 画像の領域分割
- アルゴリズムのイメージ
- 隣接画素の類似度を計算し、ある一定基準を満たした場合、結合して画像をいくつかの連結成分に分割する。
- 正確な定式化(参考文献 [2] 参照)
- グラフ $G=(V, E)$ とは、頂点集合 $V$ と頂点間を結ぶエッジ集合$E$からなるペアのことである。
- 画像 $I={x_i}$ に対して、各画素 $x_i$ を頂点、隣接する頂点間を結ぶ辺をエッジ集合とする。
- グラフGの spanning tree とは、グラフ $G$ のサブグラフ(頂点集合は同じで、エッジが部分集合であるもの)で、全ての頂点が連結されており、エッジの本数が最小となるグラフのことである。
例. https://www.geeksforgeeks.org/spanning-tree/ より引用
- グラフ G の Minimum spanning tree (MST) とは、spannig treeのうちエッジの重みの和が最小となるグラフのことである。
例. https://www.geeksforgeeks.org/spanning-tree/ より引用
グラフ G の頂点集合の部分集合 $C\subseteq V$ の internal difference を次のように定義する。
$$\begin{equation} \textrm{Int}(C) = \textrm{max}_{e\in \textrm{MST}(C, E)} w(e) \end{equation}$$ すなわち、minimum spanning tree の最大の重みである。
頂点集合の部分集合、$C_1, C_2$ に対し、$\textrm{MInt}(C_1, C_2)$ を次のように定義する。
$$\textrm{MInt}(C_1, C_2) = \textrm{min}(\textrm{Int}(C_1)+ τ(C_1), \textrm{Int}(C_2)+ τ(C_2)) $$ ここで、
$$τ(C) = k/|C|$$ で、kは定数パラメーターである(恐らく連結成分の分離の強さを決めるハイパーパラメーターと思われる)。
- 以上を準備して、画像の領域分割を次のようなアルゴリズムで実施する。
I/O: 入力をグラフ $G=(V, E)$ とし、$V$ の連結成分の列 $S=(C_1, \dots, C_r)$ を出力する。
- $E$を重みの昇順に並び替える。$\pi = (o_1,\dots, o_m)$とする。
- セグメンテーションを$S^{0}$より開始する。すなわち連結成分は画素数分ある。
- 次の手順を $ q=1,\dots, m $ に対して繰り返す。
$S^{q}$ を $ S^{q-1} $ から次のように構成する。
$o_q = (v_i, v_j)$ であったとする。$C_i^{q-1}$ を $v_i$ の連結成分、$C_j^{q-1}$ を $v_j$ の連結成分とする。$C_i^{q-1}\neq C_j^{q-1}$ かつ $w(o_q) \le \textrm{MInt}(C_i^{q-1}, C_j^{q-1})$ のとき、$C_i^{q-1}$ と $C_j^{q-1}$ を結合し、それを $S^{q}$ とする。そうでない場合は、 $S^{q}=S^{q-1}$ とする。 - $S = S^{m}$ を返却する。
- $E$を重みの昇順に並び替える。$\pi = (o_1,\dots, o_m)$とする。
- グラフ $G=(V, E)$ とは、頂点集合 $V$ と頂点間を結ぶエッジ集合$E$からなるペアのことである。
② 画像セグメントの統合
- アルゴリズムのイメージ
- 分割された画像領域に対し、各領域間の類似度を求めて、最も似ている領域を統合していき、最終的に一つの領域となるまで繰り返す。
- 正確な定式化
- 各領域間の類似度は、次式により算出する($\alpha_k$は0から1までの値をとる重み係数)。
$$s(C_i, C_j) = \alpha_1 s_c(C_i, C_j) + \alpha_2 s_t(C_i, C_j)+ \alpha_3 S_s(C_i, C_j) + \alpha_4 s_f(C_i, C_j)$$
- 色類似度
各領域$C_i$から、$L_1$ノルムで正規化されたヒストグラム$h_i = \{h_i^{1},\dots, h_i^{n} \}$ を算出する。色類似度$s_c$を次の式で定義する。 $$ s_c(C_i, C_j) = \sum_{k=1}^{n}\textrm{min}(h_i^{k}, h_j^{k}) $$ - テクスチャ類似度
各領域$C_i$にガウスカーネルによる畳み込み $$G^{s}(x, y)=\frac{1}{2\pi s^{2}} \textrm{exp}(-\frac{x^{2}+y^{2}}{2s^{2}})$$ を適用後、ヒストグラム $T_i=\{t_1,\dots, t_n\}$ を算出する。テクスチャ類似度 $s_t$ を次で定義する。 $$ s_t(C_i, C_j) = \sum_{k=1}^{n}\textrm{min}(t_i^{k}, t_j^{k}) $$ - 大きさ類似度
$\textrm{area(C)}$ を領域 $C$ の面積を算出する関数とすると、大きさ類似度 $s_s$ を次の式で定義する。 $$s_s(C_i, C_j) = 1- \frac{\textrm{area}(C_i)+\textrm{area}(C_i)}{\textrm{area}(I)}$$ 小さな領域を早い段階で統合するように促進する。 - 領域ギャップ類似度
領域 $C_i$ と領域 $C_j$ を囲むタイトなバウンディングボックスを $BB_{ij}$ とすると領域ギャップ類似度 $s_f$ を次の式で定義する。 $$s_f(C_i,C_j) = 1 - \frac{\textrm{area}(\textrm{BB}_{ij})-\textrm{area}(C_i)-\textrm{area}(C_i)}{\textrm{area}(I)}$$ 領域 $C_i$ が領域 $C_j$ に囲まれている場合は、これらを統合することが望ましいと考えられる。$s_f$ はこの状況にある2つの領域を統合するように働きかける。
- 色類似度
- 以上の準備から次の手順で、領域を統合し、物体領域候補を抽出する。
I/0: 初期セグメンテーション$R={C_1,\dots, C_r}$ を入力し、物体候補領域$L$を出力。
- 初期類似度集合を $S=\emptyset$ とする。
- 任意の隣接する領域ペア$(C_i, C_j)$に対して、類似度を算出して、$S$ に追加する。 $$s(C_i,C_j), S=S\cup s(C_i, C_j)$$
- $S\neq \emptyset$ となるまで、次の手続きを行う。
$S$ から最も類似度の高いペア $(C_i, C_j)$ を選択する。
領域を統合する: $C_t=C_i\cup C_j$
$C_i$に関する類似度を削除: $S=S\backslash s(C_i, C_{*})$
$C_j$に関する類似度を削除: $S=S\backslash s(C_j, C_*)$
$C_t$とその隣接領域の類似度$S_t$を算出。
$S$に類似度を追加し、セグメンテーション集合$R$に$C_t$を追加: $S=S\cup S_t, R=R\cup C_t$ - すべての領域 $R$ から物体領域候補 $L$ を抽出して結果を返却。
- 初期類似度集合を $S=\emptyset$ とする。
- 各領域間の類似度は、次式により算出する($\alpha_k$は0から1までの値をとる重み係数)。
$$s(C_i, C_j) = \alpha_1 s_c(C_i, C_j) + \alpha_2 s_t(C_i, C_j)+ \alpha_3 S_s(C_i, C_j) + \alpha_4 s_f(C_i, C_j)$$
2.2 CNNによる特徴量の算出
- R-CNNにおいて利用する畳み込みニューたるネットワークはImageNet (大規模なクラス分類画像データセット) により事前学習。
- ネットワーク構成としては、5層の畳み込み層と、2層の全結合層からなる(参考文献 [3] 参照)。
- 4096次元の特徴ベクトルを算出。
2.3 検出領域の分類
- ① 物体領域候補の物体クラスの予測、② バウンディングボックスへの回帰、の2種類の処理を行う。
① 物体候補の物体クラスの予測
- 2.2 において算出されたCNN特徴量をSVMに入力し、物体領域候補のクラスを予測する。
- 予測分類スコアを用いて、「非最大値の抑制」を行って、不要なバウンディングボックスを排除する。
- 非最大値の抑制
- 検出対象物体を中心として複数のバウンディングボックスが検出されることがある。
- 同一物体に複数のバウンディングボックスが検出されないようにするために、バウンディングボックスごとに検出の信頼度を表すスコアを計算し、局所的に最大スコアのバウンディングボックスのみ表示し、その他を表示しないようにする。
- 具体的には次の手順で行う。
- スコアが最も高い領域に「表示」とマークする。
- その領域と一定の割合以上の重なりをもつ領域に「非表示」とマークする。
- 次に、「表示」もしくは「非表示」のマークがついていない領域の中で、スコアの最も高い領域に「表示」とマークし、これと一定の割合以上の重なりのある領域に「非表示」のマークをする。
- この手順をすべての領域に「表示」または「非表示」のいずれかがマークされるまで繰り返す。「表示」とマークされた領域の集合が、検出の最終結果となる。
- 具体的には次の手順で行う。
- 同一物体に複数のバウンディングボックスが検出されないようにするために、バウンディングボックスごとに検出の信頼度を表すスコアを計算し、局所的に最大スコアのバウンディングボックスのみ表示し、その他を表示しないようにする。
- 検出対象物体を中心として複数のバウンディングボックスが検出されることがある。
- 非最大値の抑制
- バウンディングボックスの推定精度の向上のため、物体候補領域のCNN特徴から、バウンディングボックスのパラメーター(中心座標, 幅, 高さ)への回帰を行う。
② バウンディングボックスへの回帰
- 予測したバウンディングボックスを、$r=(r_x, r_y, r_w, r_h)^{T}$、真のバウンディングボックスを、$g=(g_x,g_y, g_w,g_h)^{T}$ とし、$N$個の訓練データ訓練データ集合 $\mathcal{D}={(r_n,g_n)}_{n=1}^N$ が与えられているとする。
- 目標は、$r$ から $g$ への回帰(変換)を予測するモデルを構築することである。
- 予測されたバウンディングボックス内のCNN特徴量 $f(r)$ から、$r$ から $g$ へ変換する回帰モデルを予測する、という意味で、次の最適化問題を解くことで目標が達せられる(モデルパラメーターを $W$ とする)。 $$W = \textrm{argmin}_{W}\sum_{n=1}^{N} (t_n - W^{T} f(r_n))^{2} + λ \|W\|_F^{2}$$ ここで、$t=(t_x,t_y,t_w,t_h)^{T}$ は次のように定義される。 $$t_x=(g_x-r_x)/r_w, t_y=(g_y-r_y),t_w=\textrm{log}(g_w/r_w), t_h=\textrm{log}(g_h/r_h)$$ $\|・\|_F$はフロベニウスノルム(行列の成分の2乗和)である。
3. 最近の物体検出手法
- 最近の物体検出手法としては、Facebook AI Researchが発表したDETRが挙げられる(参考文献 [4])。これはVision Transformerを物体検出タスクに応用した最初の手法である。さらに画像生成AIの手法であるdiffusion modelを模した、DiffusionDetなどがある(参考文献 [5])。これは、ランダムに生成したバウンディングボックスから正解バウンディングボックスを(ノイズを除去するが如く)予測することを学習する手法である。
参考文献
[1] 原田達也, "画像認識", 2017
- 本記事の本筋はこちらに従った。アルゴリズムの未記載事項、不明点に際して、原論文に当たった。
[2] J.R.R. Uijlings, K.E.A. van de Sande, T. Gevers, A.W.M. Smeulders, "Selective Search for Object Recognition", 2014
[3] Alex Krizhevsky, Ilya Sutskever, and Geoffrey E. Hinton, "ImageNet Classification with Deep
Convolutional Neural Networks", 2017
[4] Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko, "End-to-End Object Detection with Transformers", 2020
[5] Shoufa Chen, Peize Sun, Yibing Song, Ping Luo, "DiffusionDet: Diffusion Model for Object Detection", 2022