HOG+SVMで物体認識(OpenCV3)
HOG+SVM
HOG : 局所領域 (セル) の輝度の勾配方向をヒストグラム化
2class の分類を行う
実行方法
python hog_svm_2class.py test.png
そうすると、0 or 1 で予測された結果が返ってくる
# -*- 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]
参考:
Nobutobook: 【Python × OpenCV】 歩行者検知でやってること
Nobutobook: 【Python × OpenCV】 はじめての歩行者検知
HOG特徴量を用いたポケモンのアイコン画像判別 - Qiita
メソッドまとめ
- cv2.moments : Notebook
- cv2.warpAffine : Python OpenCV3で画像のアフィン変換(回転とか移動とか) | from umentu import stupid
- cv2.cartToPolar : OpenCVでベクトルから長さと角度を計算する
- np.bincount: NumPyの使い方(19) 数え上げ - Remrinのpython攻略日記
- np.hstack: Numpy の vstack、hstack で配列を連結-python | コード7区
参考:
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!知恵袋
OpenCV 備忘録: OpenCVでHOG特徴量+SVMで人物検出を行う 1
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
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
↓この子すごい。要チェック。