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

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

Haar SVM

HoG SVMは、HoG特徴とSVM(サポートベクターマシン)を使った識別器です。
HoG SVMの詳細は下記事で解説しています。
【参考】HoG + SVMによる顔検出の原理

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

書式

hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}
human, r = hog.detectMultiScale(gray, **hogParams)
パラメータ名 説明
cv2.HOGDescriptor_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.HOGDescriptor()
    hog.setSVMDetector(cv2.HOGDescriptor_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編)」で紹介します。

実行結果

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

【おすすめ記事】
PythonでOpenCV入門 サンプル集
【Python】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!