OpenCVは学習済みHOG人型特徴量を持っているので簡易的に画像内の人型物体を検出できます。精度はお察し(^_^;)
OpenCVのインストール
$ pip install opencv-python
人型検出を行う
HOGの設定
"ヒト"のHOG特徴量を設定
import cv2 from matplotlib import pyplot as plt hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
パラメータの設定
パラメータについてはこちらの記事が参考になります。
Nobutobook: 【Python × OpenCV】 歩行者検知でやってること
Nobutobook: 【Python × OpenCV】 はじめての歩行者検知
画像は元画像をモノクロGRAYにしたものを解析します。
hogParams = {
}
img = cv2.imread("img/man-983977_640.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
一応、以下の値が推奨値っぽい。けど、指定しないほうが精度が出る場合もある。
hogParams = { "winStride":(8,8), # 多分、rectのmargin? "padding":(0,0), # 画像の解析範囲 pddingを取ると狭くなる? "scale":1.05, "hitThreshold":0, "finalThreshold":1 }
特徴量の検出
detectMultiScaleで解析結果が返されます。また、検出した範囲をrectangleで書き出しを行っています。なお、複数の検出があった場合、humanに複数の結果が返される。
human, r = hog.detectMultiScale(gray, **hogParams) if (len(human)>0): for (x, y, w, h) in human: cv2.rectangle(img, (x, y), (x+w, y+h), (255,255,255), 3) plt.imshow(img) plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis plt.show()
解析結果をplotしたもの
コード全体
import cv2 from matplotlib import pyplot as plt hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) hogParams = { } img = cv2.imread("img/man-983977_640.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) human, r = hog.detectMultiScale(gray, **hogParams) if (len(human)>0): for (x, y, w, h) in human: cv2.rectangle(img, (x, y), (x+w, y+h), (255,255,255), 3) plt.imshow(img) plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis plt.show()
リンク