Python OpenCVでHOG人型特徴量の検出 

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

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したもの

f:id:letitride:20200718234330p:plain:w500


コード全体

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()