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による標準の検出器よりも小さなサイズを検出できます。
そこで、以下のサイトから借用したコードを改造してみました。
# -*- 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)
Daimler
余計なものも一緒に検出されるようになってしましましたが、取り敢えず動いています。