ディープラーニングについてディープにラーニング。

思いっきり、自分が学んだことのアウトプットしていきますが、何分初心者。もし何かアドバイス等頂けましたら幸いです!

SSDについて

セミナーではSSDについて触れるので、
SSDについて深堀する

ニューラルネットワークの訓練とは、おなじみの Y = F(x)に大量の訓練データ(x,y)総じてXを入力して、
最小のパラメータの値を見つけていくって方法。


SSDで言うと、正解クラス(y) = Conv層(画像データ)の式が成り立つ
こんな感じで、
Net(Pytorchのモデル名)を通ってバウンディングボックス(位置と推定)を囲ったものが表示される

f:id:kawam0t0:20191223084238p:plain

では、どうやってこのバウンディングボックスの位置を推定しているのか?

バウンディングボックスの決め方

まず、各層の1つのセルに対して、4から6個のデフォルトボックスを敷き詰める(敷き詰められている)
SSDの場合は6層あって、それぞれの層が持ってるアンカーボックスの数がちょっと異なる(後述)が、
全部のアンカーボックス(デフォルトボックス)の数は8732個。

まずはデフォルトですべての画像にデフォルトボックスを用意。

ここでバウンディングボックスの求め方の数式を書いておく。

バウンディングボックス座標(cx + ▵cx , cy + ▵cy , w + ▵w , h + ▵h)
=デフォルトボックス(cx , cy , w , h) + オフセット(▵cx , ▵cy , ▵w , ▵h)

f:id:kawam0t0:20191223123247p:plain


オフセットとは、
デフォルトボックスと実際に映る実際の物体が移っている箇所の差分を意味する。
つまり、
デフォルトボックスでざっくり位置を把握。

オフセットで修正された座標を求める。

バウンディングボックスをデフォルトボックス+オフセットで求める。


では、最初の第1層に注目して、デフォルトボックスを見てみる。

第一層目のデフォルトボックスを見る

f:id:kawam0t0:20191223123311p:plain

第一層目が一つのセルに持つデフォルトボックスの数は4つ。
特徴マップのセルの数が、38×38だから
合計のデフォルトボックスの数はなんと、5776個にも。
しかも画像に対して、38×38個のセルにてはめるので、
細かい物体の検知が見込める。


このように各層の
セルの数とそこに付随するデフォルトボックスの値で
小さい物体の検知が得意なのか、大きい物体の検知が得意なのかを判別する。
SSDの場合は小さな物体から深い層にかけて大きい物体の検知に努める。

出力層の1セルのチャネル数も見ておこう。

各特徴マップのセルはそれぞれのデフォルトボックスの値を作成するのはOKだ。

このデフォルトボックス1つは、もちろん、上記の通り、座標を
保持している。
→デフォルトボックス座標(cx , cy , w , h)

また、忘れちゃいけないのが、位置情報だけでなく、デフォルトボックスに映っているのは、何か?という推論情報(クラス確信度)も保持している。
→クラス数をCとする。

そうすると、
図のようにM×Nの各セルっていうのはチャネル方向に
デフォルトボックスの数×(オフセット(差分)+クラス分類数)で畳み込まれる。

ちょっとややこしなってきた笑
全体図を見ておこう。

f:id:kawam0t0:20191224083451p:plain

ネットワークの出力(特徴マップ)は縦叔母、
デフォルトボックス1個で座標数は必ず4つになる。
なぜなら、中心座標XとY、更にバウンディングボックスとの佐野w、Hが入ってくるから。

そして、SSDがある程度精度高く、注目されているのは、図の通り、縦の動きでまたもや畳み込みを行っていくから。
この縦の畳み込みっているのは、
一つの特徴マップは位置情報の推定。
もう一つはクラス分類に使われている。
そして、その二つの出力をがっちゃんこして、どこに何が移っているのかを把握する。
それを横の動きの特徴マップの大きさと、セルの数で大きい物体の検知か、小さい物体の検知かを読み取る。

f:id:kawam0t0:20191224122034p:plain

このように、
セルがM×N個あったときにそれぞれのセルっているのは、
セルに対して4個の(6個の場合もある)デフォルトボックス分の、座標数(推定値:オフセット)と、クラス分類をそれぞれ行うので、
数式は、バウンディングボックス数×(4 + クラス数)で表され、数式のY=F(X)のYとなる。
*4は座標の数

下の図は各特徴マップの位置想定とクラス分類のマップの出力イメージです。

f:id:kawam0t0:20191224122548p:plain

隠れたクラス分類カラム

f:id:kawam0t0:20191224122745p:plain


ここまでのおさらい。
SSDのネットワークの考え方は、入力画像に対して、
全部で8732個のデフォルトボックスを作成する。
そのデフォルトボックスごとにオフセット(デフォルトボックス座標)とクラス確信度(何が移っているのかの確率度)を推論して、2次元のTensorで出力される。

この上の図を見ると、C0というカラムがある。
こいつは実際にクラス分類のなかにあるやつではなく、
単純に、セルの中に物体が移っているのか、そうじゃないのかを判断するだけのCなので、デフォルトで入っている。
1に近くなると何も映ってない可能性が高くなり、
0に近くなっていけばいくほど何か映っている可能性が高くなる。

図はクラス自体は20だけど、実際に畳み込みをさせるときはc=20+1になる。
そして推論した結果、確信度が一番高いバウンディングボックスのみを表示して、2位以下は非表示にする。(閾値を上げたり下げたりすると、表示されるバウンディングボックスの数も変わる)