画像の特徴量を抽出するHOGについて

Pythonデータサイエンスハンドブックの最後、5.14節で、HOGを使って顔画像を検出している。
HOGが何なのかよく分かってなかったので、軽くメモ。

HOGの概要

HOGというのはHistogram of Oriented Gradientsの略だ。画像の特徴量を抽出する方法の1つである。
下記サイトによれば、実際に使う場合は、scikit-learn、もしくはOpenCVのライブラリが必要らしい。以下ではscikit-learnについて書く。
HOG特徴量 [いかたこのたこつぼ]

HOGの次元

Scikit-ImageのHOGの出力について - Qiita でも解説がされているが、この記事はちょっと情報が古い。

scikit-image公式ドキュメント内のAPI解説がこちら。
Module: feature — skimage v0.15.0 docs
関数の引数にfeature_vectorというパラメータがある。
defaultではTrueである。Trueだと関数の出力が一次元ベクトルになり、Falseだと出力は5次元の配列になる。
では5次元の配列の、各次元のサイズは何かということになるが、それにはセルとブロックという概念が必要になる。

画像からHOG特徴量の抽出 - Qiita
ある一定サイズのピクセルをセルと呼ぶ。デフォルトだと、1つのセルは8×8ピクセルである。
そしてセルを更にまとめたものをブロックと呼ぶ。デフォルトだと、1つのブロックは3×3セル、すなわち24×24ピクセルである。
(本当は図があれば一発でわかりやすいんだけど……上の記事にいい図があるので参照)

5次元の配列の、各次元のサイズは以下の通り。

  • 行方向の、ブロックの置き方の数
  • 列方向の、ブロックの置き方の数
  • ブロックの1行にあるセルの数 (デフォルトでは3)
  • ブロックの1列にあるセルの数 (デフォルトでは3)
  • 調べる方向の数(デフォルトでは9)

feature_vectorパラメータがTrueの場合には、出力配列のサイズは以上の5つの積になる。


「ブロックの置き方は互いに重なり合うから、特定のセルについての情報が複数回含まれているはずだけど、それで良いの?」がよく分からない。
あるセルの勾配の情報は1回含めれば十分な気がするんだけど。