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クラスに分類する分類器
検出プログラム
以下のプログラムがHOGとSVMを利用したプログラムです
$ 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:検出窓サイズ可変で,物体検出を行います