概要
Q.66〜69では、物体の輪郭や形状を表すHOG(Histogram of Oriented Gradients)特徴量を 4段階で実装します。後半の画像認識と物体検出でも再利用する重要な特徴量です。
勾配強度と角度(Q.66)
x方向とy方向の輝度差から勾配を求めます。
const magnitude = Math.sqrt(gx * gx + gy * gy);
const angle = (Math.atan2(gy, gx) * 180) / Math.PI;
向きの反転を同じ輪郭として扱うため角度を0〜180度へ収め、20度刻みの9方向へ量子化します。
セルごとの方向ヒストグラム(Q.67)
画像を8×8画素のセルに分けます。各画素の勾配強度を、その角度に対応するビンへ加算します。 これにより64画素の情報を「どの向きの輪郭がどれだけ強いか」という9次元の値へ要約します。
ブロック正規化(Q.68)
周囲3×3セルのヒストグラムを使ってL2正規化します。
normalized = value / sqrt(sum(value²) + ε)
局所的な明るさやコントラストが変わっても、輪郭方向の比率を比較しやすくなります。
特徴量を描画する(Q.69)
各セルの中心から、9方向のヒストグラム値に比例した長さの線を描きます。数値配列だけでは 分かりにくいHOGが、物体の輪郭に沿った線の集合として見えるようになります。
HOGが後続処理で果たす役割
RGB画素をそのまま学習器へ入れる代わりに、HOGで形状を表す特徴ベクトルへ変換します。 Q.96のニューラルネットワーク学習とQ.97以降のスライディングウィンドウでは、同じHOG実装を 使って顔らしさを判定します。
勾配をヒストグラムへ入れる
各画素でgxとgyを求め、強度m = sqrt(gx² + gy²)と方向
θ = atan2(gy, gx)へ変換します。明暗が反転しても同じ輪郭として扱うHOGでは、方向を
0〜180度へ正規化します。
方向を最も近いビンへ丸めるだけでなく、隣接する2ビンへ角度距離に応じて強度を分配すると、 ビン境界付近で特徴量が急変しにくくなります。セル境界についても周囲へ補間する実装があります。
ブロック正規化の実装
隣接セルをブロックとして連結し、L2正規化する例は次の式です。
v' = v / sqrt(Σv² + ε²)
εは一様領域で分母が0になることを防ぎます。ブロックを重ねながら走査するため、1つのセルが
複数回正規化される点がHOGの特徴です。セル数、方向ビン数、ブロックサイズから最終ベクトルの
次元数を計算し、配列長をテストすると走査漏れを見つけやすくなります。
セルを小さくすれば細かな形状を表せますが、次元数と計算量が増え、位置ずれにも敏感になります。 分類器まで含めて精度と処理時間を比較してパラメータを決めます。