概要
今回はopenCVを用いた物体検出を試してみます。
HOG特徴量+サポートベクターマシン(SVM)
HOG(Histgram Of Gradient) とはおおまかに説明すると、画像の輝度勾配の分布のことです。
輝度の変化が大きい部分を特徴としてとらえるので、物体の輪郭等を検出することができます。
アルゴリズムについてはこちらで詳しく説明されています。
openCVではHOG特徴とサポートベクターマシン(データを2クラスに分類する分類器)を使った識別器を簡単に使用することが出来ます。
ソースコードの一例
import cv2 # 入力画像の読み込み img = cv2.imread("input.jpg") # HoG特徴量 + SVMで人の識別器を作成 hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05} # 検出の実行 human, r = hog.detectMultiScale(img, **hogParams) # 検出した人を囲む矩形の作成 for (x, y, w, h) in human: cv2.rectangle(img, (x, y), (x + w, y+h), (0,255,0), 2) # 結果を出力 cv2.imwrite("result.jpg",img)
実行結果
全然うまくいかない結果となりました...。
Haar-like特徴量分類器
Haar-Like特徴は、画像の明暗差を特徴として捉えます。
Haar-like特徴量分類器では画像の一部を切り出して局所的な明暗差を算出していき、いくつもの処理結果を組み合わせることで物体を判別します。
openCVにはHaar-like特徴分類器があらかじめ用意されており、今回は人間を検出するので「haarcascade_fullbody.xml」を使用します。
ソースコードの一例
import cv2 # 入力画像の読み込み img = cv2.imread("input.jpg") # 分類器の特徴量を取得する faceCascade = cv2.CascadeClassifier('./haarcascade_fullbody.xml') # 検出の実行 facerect = faceCascade.detectMultiScale(image, scaleFactor=1.01, minNeighbors=1, minSize=(30, 30)) # 検出した人を囲む矩形の作成 for x, y, w, h in facerect: cv2.rectangle(img, (x, y),(x+w, y+h),(0,255,0), 2) # 結果を出力 cv2.imwrite("result.jpg",img)
実行結果
HOG特徴量+SVMに対して幾分かマシな気はしますが、うまくいってるとは言えない結果となりました。
まとめ
openCVのみでの物体検出は、R-CNNやYOLOのようなディープラーニングを使用する手法にはかなわないということがわかりました。
ということで、次回以降はディープラーニングを用いた手法での物体検出にフォーカスを当てて進めていきたいと思います。