ysku's blog

ウェブ・無線通信・組み込みとか

HOG + SVMで人物検出【OpenCV & Python】

OpenCVで人物検出を行ってみました。
以下のサイトを参考にさせて頂きました
http://python-gazo.blog.jp/opencv/%E4%BA%BA%E6%A4%9C%E5%87%BA
http://python-gazo.blog.jp/opencv/%E4%BA%BA%E6%A4%9C%E5%87%BA

用語の確認
HOG
Histogram of Oriented Gradientsの略で、局所領域の輝度の勾配方向をヒストグラム化した特徴量
SVM
教師あり学習を用いる識別手法の1つであり、線形分離可能なN次元のデータを2クラスに分類する分類器

検出プログラム
以下のプログラムがHOGSVMを利用したプログラムです

$ python [以下のプログラム] [人物検出をしたい画像名]

とすることで実行出来ます

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

dataset_dir = u"/path/to/dataset/"
 
def hog_func():
    argv = sys.argv
    argc = len(argv)
    if (argc != 2):
        #引数がちゃんとあるかチェック
        #正しくなければメッセージを出力して終了
        print 'Usage: python %s arg1' %argv[0]
        quit()
    # 画像の読み込み
    img_name = dataset_dir + argv[1]
    im = cv2.imread(img_name)
    # HoG特徴量の計算
    hog = cv2.HOGDescriptor()
    # SVMによる人検出
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
    hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}
    # 人を検出した座標
    human, r = hog.detectMultiScale(im, **hogParams)
    # 長方形で人を囲う
    for (x, y, w, h) in human:
        cv2.rectangle(im, (x, y),(x+w, y+h),(0,50,255), 3)
    # 人を検出した座標
    cv2.imshow("Human detection",im)
    cv2.waitKey(0)
    # 画像保存
    out_file_name = "after" + argv[1]
    cv2.imwrite(out_file_name,im)
    print u"saved"

if __name__ == '__main__':
    hog_func()

プログラムの説明
以下のサイトから引用しています
Object Detection — OpenCV 2.4.13.7 documentation

・HOGDescriptor:HOGディスクリプタおよび検出器を作成
・setSVMDetector:線形SVM分類器に,係数をセットします
・detectMultiScale:検出窓サイズ可変で,物体検出を行います

以上が簡単なOpenCV + Pythonにおいての、HOG + SVMの人物検出の説明になります