Pythonライブラリ「OpenCV」でHoG SVM識別器(分類器)を実装し、画像から人を検出する方法をソースコード付きで解説します。
HOG + SVM による人検出
HOG + SVMは、画像から輝度の勾配方向を抽出するHOG特徴量と、パターン識別を行うSVM(サポートベクターマシン)を組み合わせた識別器です。この識別機は、画像から人を検出するのに使用することができ、Pythonの画像処理ライブラリOpenCVを使用することで簡単に実装できます。今回はOpenCVに用意されているcv2.HOGDescriptorを利用し、入力画像から人を検出する方法を紹介します。
サンプルコード
サンプルプログラムのソースコードです。
実行結果
■入力画像(input.jpg)と出力画像(output.jpg)


コードのポイント解説
# HOG特徴量 + SVMで人の識別器を作成 hog = cv2.HOGDescriptor()
cv2.HOGDescriptor() で、画像内の輝度勾配(明るさの変化方向)を解析するためのインスタンスを生成します。
# getDefaultPeopleDetector() を使用 hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
setSVMDetector() メソッドに cv2.HOGDescriptor_getDefaultPeopleDetector() を渡すことで、OpenCVが公式に提供している「人の形」を学習済みのデータセットを読み込みます。
# パラメータ設定
hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}
# 作成した識別器で人を検出
human, r = hog.detectMultiScale(gray, **hogParams)
detectMultiScaleは画像内の人物がどのサイズで写っていても検知できるようにするための処理です。hog.detectMultiScale() を実行すると、画像を少しずつ縮小しながらスキャンを繰り返し、矩形(四角枠)の座標を返します。hogParams で指定している scale は画像を縮小する倍率を指し、winStride はスキャンする窓を動かすピクセル間隔を制御します。これらを調整することで、検出精度と処理速度のバランスを調整できます。
# 人の領域を赤色の矩形で囲む
for (x, y, w, h) in human:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 200), 3)
最後に、計算された座標を画像上に可視化します。human 変数には検出された複数の矩形情報 (x, y, w, h) がリスト形式で格納されています。これを for 文で回し、cv2.rectangle() を使って元の画像に赤色の枠を描き込みます。
関連コンテンツ
画像処理ライブラリ「OpenCV」のインストールから基本操作まで、以下ページにすべて掲載しています。

Pythonのインストールから基礎、応用例まで以下ページにすべて掲載しています。


コメント
参考の「HoG + SVMによる顔検出の原理」がリンク切れしています。
※匿名様
コメントありがとうございます。
リンク切れを修正いたしました。