ルマンドの研究ブログ

先端と事業化の狭間で揺れる研究系エンジニアの日誌です。自動走行、自律走行、コンピュータビジョンなど。

OpenCVとDaimler Pedestrian Detection Datasetによる歩行者検知

OpenCVには HOG+SVM を用いた人検出器が含まれていますが、あまり小さな歩行者を検出することができません。 これは学習データが64x128画素のためのようです。

OpenCV 備忘録: OpenCVでHOG特徴量+SVMで人物検出を行う 1

あとドキュメント化されていないようだが、getDefaultPeopleDetectorの辞書に登録されている画像データのサイズは64x128画素であり、この大きさより、小さい人物を検出したい場合は、対象の画像を拡大しないといけない。

一方、あまり使われていませんが、実はOPENCVにはもう一つ検出器が同梱されています。 この検出器はDaimler Pedestrian Detection Benchmark Dataset の48x96画素データで学習されているため、INRIA Person Datasetによる標準の検出器よりも小さなサイズを検出できます。

そこで、以下のサイトから借用したコードを改造してみました。

python-gazo.blog.jp

# -*- coding: utf-8 -*-
import cv2
 
if __name__ == '__main__':
    # 画像の読み込み
    im = cv2.imread("test.jpg")
    # HoG特徴量の計算
    #hog = cv2.HOGDescriptor()
    hog = cv2.HOGDescriptor((48,96), (16,16), (8,8), (8,8), 9)
    # SVMによる人検出
    #hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
    hog.setSVMDetector(cv2.HOGDescriptor_getDaimlerPeopleDetector())
    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)
    # 画像保存
    cv2.imwrite('test2.jpg',im)
    cv2.destroyAllWindows()

実行結果 標準(INRIA) f:id:LUMONDE:20150526002700p:plain

Daimler f:id:LUMONDE:20150526002640p:plain

余計なものも一緒に検出されるようになってしましましたが、取り敢えず動いています。