概要
このpartでは物体検出の仕組みについて解説します。
物体検出
物体検出とは、1枚の画像内に含まれている複数の物体に対して、その位置とラベル、信頼度を計算するタスク。物体の位置を示す枠のことを「バウンディングボックス」という。
SSDによる物体検出
SSDは物体検出用のモデルであり、入力が300*300のものと、512*512のものがある。SSDではまず、デフォルトボックスと呼ばれる大きさの決まった枠を一定数用意し、それをどう動かせば物体を囲めるかという情報である「オフセット」を学習の対象とする。その後、一定以上の信頼度がでた枠のみを最終出力としている。
SSDモデル
前半はVGG16のモデルを流用しており、後半にextraと呼ばれるSSD特有の層が並ぶ。
SSDでは、ネットワーク途中の合計6箇所でさまざまな大きさの特徴量マップを抽出しており、それぞれはSorce1~6と呼ばれている。この大きさのことなる6枚の特徴量マップを、場所を特定するlocモジュールと信頼度を計算するconfモジュールに入力することになる。
SSDの順伝搬関数
SSDの順伝搬関数では、Non-Maximum Supressionという関数を使用する。これは、同じ物体に対して複数のバウンディングボックスが囲みに行っている場合、最も信頼度の高いものだけを残して他のボックスを消すという作業である。
この順伝搬関数には、vggモジュール、locモジュール、confモジュールを伝搬して作成された
1.デフォルトボックス(画像数,位置情報)=(8732,4)
2.オフセット情報(batch_num,DBox数,位置情報)=(batch_num,8732,4)
3.信頼度情報(batch_num,DBox数,ラベルごとの信頼度)=(batch_num,8732,21)
が入力される。
(画像枚数8732やクラス数21はVOCデータセットを利用した場合の数値。)
Detectクラス
上記1,2,3の情報とNon-Maximum Supression関数を利用し、所望の物体検出結果であるバウンディングボックスとそのラベル、信頼度が残る。これをDetectクラスとして実装する。
SSDクラス
phase=train(学習)の時は上記1,2,3まで、phase=inference(推論)の時はDetectクラス全体までが実行されるように実装する。
損失関数の定義
match関数:
あるDBoxがあるBBoxにかぶっていた時、そのかぶっている割合をjaccard係数と呼ぶ。どのBBoxにもかぶっていないDboxはjaccard係数は0である。また、jaccard係数が0.5以上のDBoxはポジティブDBoxと呼び、かぶっているBBoxまでの移動情報であるオフセットと物体のクラスを正解ラベルとして学習する。一方、jaccard係数が0.5未満のDBoxはネガティブDBoxと呼び、ラベル情報:backgroundのみを正解ラベルとして学習する。
この関数により、DBoxと正解のBBoxから、
ポジティブDboxには教師データとして「オフセット」と、「確信度」の情報が、
ネガティブDboxには教師データとして「確信度」のみの情報が、
それぞれ与えられる。
Hard Negative Mining:
物体検出に用いられる画像のほとんどの面積は物体ではなく背景で構成されている。そのため、必然的にDBoxの大半はネガティブDBoxに割り振られ、学習時ほとんどが背景クラスを学習することになってしまい、非常にアンバランスである。そこでHard Negative Miningと呼ばれる操作によって、ネガティブDBoxの数をポジティブDBoxの数の定数倍にする。(3倍などが一般的。)この時、もっとも損失値の大きいものから残すようにする。
損失関数:
オフセット情報と信頼度について、損失関数を定義する必要がある。
オフセット情報…オフセット情報はDBoxからポジティブBBoxへの変換補正値の予測であるため、回帰問題で用いられる平均二乗誤差を利用する。ただしSSDではこれに少し工夫を加えたSmooth L1 Lossというものを利用する。
これにより、予測誤差の絶対値が1より小さい場合は通常通りの二乗誤差を計算し、1以上の場合は予測誤差の絶対値から0.5を引いた値にする。 教師データと予測結果の差が大きい場合に二乗誤差を計算すると、学習が不安定になるためである。
信頼度…信頼度については通常通り交差エントロピー誤差を利用する。
以上のプログラムをまとめることで、SSDの学習と検証を実施することができる。