空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

HOG+SVMで物体認識(OpenCV3)

HOG+SVM

HOG : 局所領域 (セル) の輝度の勾配方向をヒストグラム

SVM : サポートベクターマシン(SVM)

2class の分類を行う

  • sample1とsample2ディレクトリに分類したい画像を同じ枚数用意
  • 予測したい画像を用意(test.png

実行方法

python hog_svm_2class.py test.png

そうすると、0 or 1 で予測された結果が返ってくる

hog_svm_2class.py

# -*- coding: utf-8 -*

import os
import glob
import sys

import cv2
import numpy as np

bin_n = 32 # need adjustment

# 画像が存在するディレクトリの代入
images_1 = glob.glob('sample1/*.*')
images_2 = glob.glob('sample2/*.*')

hist_list1 = []
hist_list2 = []

def hog(img):
    gx = cv2.Sobel(img, cv2.CV_32F, 1, 0)
    gy = cv2.Sobel(img, cv2.CV_32F, 0, 1)
    mag, ang = cv2.cartToPolar(gx, gy)
    bins = np.int32(bin_n*ang/(2*np.pi))    # quantizing binvalues in (0...16)
    hists = np.bincount(bins.ravel(), mag.ravel(), bin_n)
    return hists

for image1, image2 in zip(images_1 , images_2):
    img1 = cv2.imread(image1, 0)
    img1_roi = img1[160:320, 120:320]
    hist1 = hog(img_roi)
    hist_list1.append(hist1)

    img2 = cv2.imread(image2, 0)
    img2_roi = img2[160:320, 120:320]
    hist2 = hog(img_roi)
    hist_list2.append(hist2)

train_data1 = np.array(hist_list1, np.float32)
train_data2 = np.array(hist_list2, np.float32)
trainingDataMat = np.r_[train_data1, train_data2]

label_list = [0]*(len(images_1)+len(images_2))
label_list[len(images_1):] = [1]*len(images_2)
labelsMat = np.array([label_list], np.int32)

# Train the SVM
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_RBF)  # RBF1が良さげ
#svm.setDegree(0.0)
svm.setGamma(5.4)
#svm.setCoef0(0.0)
svm.setC(2.7)
#svm.setNu(0.0)
#svm.setP(0.0)
#svm.setClassWeights(None)
svm.setTermCriteria((cv2.TERM_CRITERIA_COUNT, 100, 1.e-06))
svm.train(trainingDataMat, cv2.ml.ROW_SAMPLE, labelsMat)

# TEST 
test_hist_list = []
img = cv2.imread(sys.argv[1], 0)
img_roi = img[160:320, 120:320]
hist = hog(img_roi)
test_hist_list.append(hist)

test_data = np.array(test_hist_list, np.float32)
testDataMat = test_data
response = svm.predict(testDataMat)
print response[1]

参考:

画像からHOG特徴量の抽出 - Qiita

 Nobutobook: 【Python × OpenCV】 歩行者検知でやってること

 Nobutobook: 【Python × OpenCV】 はじめての歩行者検知

HOG特徴量を用いたポケモンのアイコン画像判別 - Qiita

メソッドまとめ

参考:

opencv 3.1.0 SVMのサンプルのPython版 - sieste31の日記

HOG + SVMで人物検出【OpenCV & Python】 - ysku's blog

SVMを使った手書き文字の文字認識 — OpenCV-Python Tutorials 1 documentation

OpenCV-Python Tutorials (6) ~Image Processing in OpenCV~ - 脱初心者を目指す

opencv チュートリアル チャレンジ9 OpenCVにおける輪郭(領域) - 機械学習備忘録

opencv/digits.py at master · npinto/opencv · GitHub

OpenCVでHSV変換を行い黒検出をしたいのですがなかなか上手く... - Yahoo!知恵袋

HOG特徴とSVMによる物体検出

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

HOG特徴量とSVMを使った自動車の検出 - くーろんログ

HOGとSVMを使った人物検出 - ニートがプログラミングするブログ

dlibによるHOG特徴を用いた物体検出がすごい - kivantium活動日記

http://www.vision.cs.chubu.ac.jp/sift/PDF/pcsjimps2008_ppt.pdf

PSA(ピクセル状態分析)+Joint HOG + AdaBoost

http://www.vision.cs.chubu.ac.jp/ssii08/ssii08-yamashita.pdf

GitHub - bikz05/object-detector: Object Detection Framework using HOG as descriptor and Linear SVM as classifier.

MPRG : 機械知覚&ロボティクスグループ/中部大学

MPRG : 機械知覚&ロボティクスグループ/中部大学

http://www.vision.cs.chubu.ac.jp/joint_hog/pdf/HOG+Boosting_LN.pdf

openCVで物体認識 by traincascade - Qiita

http://www.mi.t.u-tokyo.ac.jp/harada/lectures/IIT/internal/09_object_detection_20160713.pdf

CVPR 2017 速報 - SSSSLIDE

↓この子すごい。要チェック。

輪郭検出でマスクを自動生成する | OpenCV画像解析入門

画像の明るさを正規化する | OpenCV画像解析入門