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

この記事では、Python+OpenCVでHoG SVM識別器(分類器)を実装し、画像から人を検出する方法をソースコード付きで解説します。

Haar SVM

HoG SVMは、HoG特徴とSVM(サポートベクターマシン)を使った識別器です。

HoG SVMの詳細
参考 HoG SVMによる人検出の原理

このアルゴリズムは、OpenCVを使うと簡単に実装できます。
今回はOpenCVの「cv2.HOGDepreor」を使って入力画像から人を検出してみました。

書式

hog = cv2.HOGDepreor()
hog.setSVMDetector(cv2.HOGDepreor_getDefaultPeopleDetector())
hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}
human, r = hog.detectMultiScale(gray, **hogParams)
パラメータ名 説明
cv2.HOGDepreor_getDefaultPeopleDetector() 人検出用のHoG特徴
gray 入力画像(グレースケール)
winStride ウィンドウの移動量
padding 入力画像の周囲の拡張範囲
scale スケール

ソースコード(Python3)

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import cv2


def main():

    # 入力画像の読み込み
    img = cv2.imread("input.jpg")

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # HoG特徴量 + SVMで人の識別器を作成
    hog = cv2.HOGDepreor()
    hog.setSVMDetector(cv2.HOGDepreor_getDefaultPeopleDetector())
    hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}

    # 作成した識別器で人を検出
    human, r = hog.detectMultiScale(gray, **hogParams)

    # 人の領域を赤色の矩形で囲む
    for (x, y, w, h) in human:
        cv2.rectangle(img, (x, y), (x + w, y+h), (0,0,200), 3)

    # 結果を出力
    cv2.imwrite("result.jpg",img)


if __name__ == '__main__':
    main()

※動作には、OpenCVとNumPyライブラリが必要です。
■ライブラリの導入方法は「【Python3】OpenCV3+NumPyをインストール(Windows編)」で紹介します。

実行結果

サンプルプログラムの実行結果です。

関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング

コメント

  1. 匿名 より:

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