【Python/OpenCV】人の検出(HoG + SVM識別器)

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とOpenCVで画像処理プログラミング超入門
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。

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

【Python超入門】基礎から応用例まで幅広く解説
PythonについてPythonは、統計処理や機械学習、ディープラーニングといった数値計算分野を中心に幅広い用途で利用されているプログラミング言語です。他のプログラミング言語と比較して「コードが短くて読みやすい、書きやすい」「ライブラリが豊...
記事の監修者
西住技研

プログラミング言語「Python」を研究、仕事、趣味でデータ分析や作業自動化などに活用してきたノウハウを情報発信しています。
筆者の詳しいプロフィールやお問合せはこちらのページまで。
YoutubeX(旧Twitter)でも情報発信中です!

西住技研をフォローする
OpenCV

コメント

  1. 匿名 より:

    参考の「HoG + SVMによる顔検出の原理」がリンク切れしています。