opencv SVM 訓練行人檢測器注意事項

2021-07-08 16:51:52 字數 3379 閱讀 2855

[cpp]view plain

copy

"color: rgb(255, 0, 0); font-size: 18px; font-weight: bold; font-family: arial, helvetica, sans-serif; background-color: rgb(255, 255, 255);"

>事項1:支援向量乙個的原因?

如下的解答:用opencv2.49的我是這麼理解的:對於線性svm,在opencv\sources\modules\ml\src\svm.cpp這個原始碼的optimize_linear_svm()函式中opencv的作者已經解釋很很清楚了,「we optimize only linear svm: compress all the support vectors into one.」,support_vector*alpha的工作他已經做了,直接拿生成的+應該就可以作為分類器拿去用了,代表-w,代表b,而線性分類器不就是wx+b=0嗎?(只有線性分類器做了此項優化,其他非線性svm請按照原來的步驟操作)

事項2:

一般訓練應該包括以下幾步:

1、提取正負樣本hog特徵

2、投入svm分類器訓練,得到model

3、由model生成檢測子

4、利用檢測子檢測負樣本,得到hardexample

5、提取hardexample的hog特徵並結合第一步中的特徵一起投入訓練,得到最終檢測子。

經過以上步驟,檢測效果會有大的提公升。

事項3:如何得到w,並將其轉化為opencv中的檢測器

假設線性分類器是wx+b=0,這裡得到的*相當於-w,得到的rho相當於b,所以這裡相當於將*得到的結果每一項都取負,得到w,與b組成新的mat後代入到detectmultiscale()中進行識別。

[cpp]view plain

copy

"font-size:14px;"

>

//繼承自cvsvm的類,因為生成setsvmdetector()中用到的檢測子引數時,需要用到訓練好的svm的decision_func引數,

//但通過檢視cvsvm原始碼可知decision_func引數是protected型別變數,無法直接訪問到,只能繼承之後通過函式訪問

class

mysvm : 

public

cvsvm  

intget_alpha_count()  

//獲得svm的決策函式中的rho引數,即偏移量

float

get_rho()  

intget_sv_dim()  

intget_sv_count()  

float

** get_sv()  

};  

將訓練好的svm轉化為檢測運算元

[cpp]view plain

copy

"font-size:12px;"

>vector<

float

> getsvmdetector(mysvm svm)  

}  //將alpha向量的資料複製到alphamat中

double

* palphadata = svm.get_alpha_vector();

//返回svm的決策函式中的alpha向量

for(

inti=0; i

//計算-(alphamat * supportvectormat),結果放到resultmat中

//gemm(alphamat, supportvectormat, -1, 0, 1, resultmat);//不知道為什麼加負號?

resultmat = -1 * alphamat * supportvectormat;  

//得到最終的setsvmdetector(const vector& detector)引數中可用的檢測子

vector> mydetector;  

//將resultmat中的資料複製到陣列mydetector中

for(

inti=0; i

//最後新增偏移量rho,得到檢測子

mydetector.push_back(svm.get_rho());  

cout<<"檢測子維數:"

<

//儲存檢測子引數到檔案

//      ofstream fout("hogdetectorforopencv_2400posinria_12000neg.txt");

//      for(int i=0; i

//      

return

mydetector;  }

呼叫檢測運算元,並轉化為opencv格式,進行多尺度檢測

[cpp]view plain

copy

vector<

float

> mydetector = getsvmdetector(svm);  

//設定hogdescriptor的檢測子

hogdescriptor myhog;  

myhog.setsvmdetector(mydetector);  

[cpp]view plain

copy

"font-size: 18px;"

>"font-size:14px;"

>mat src = imread(

"5.png"

);  

vectorfound, found_filtered;//矩形框陣列

cout<<"進行多尺度hog人體檢測"

<

myhog.detectmultiscale(src, found, 0, size(8,8), size(32,32), 1.05, 2);//對進行多尺度行人檢測

cout<<"找到的矩形框個數:"

<

//畫矩形框,因為hog檢測出的矩形框比實際人體框要稍微大些,所以這裡需要做一些調整

for(

inti=0; i

namedwindow("src"

,0);  

imshow("src"

,src);  

waitkey();  

**:

自己訓練的Hog Svm 行人檢測

cpp view plaincopyprint include cv.h include highgui.h include stdafx.h include include include include include using namespace cv using namespace std...

PCL行人檢測

首先我們知道hog特徵結合svm分類器已經被廣泛應用於影象識別中,尤其在行人檢測中獲得了極大的成功 hog svm進行行人檢測的方法是法國研究人員dalal在2005的cvpr上提出的,而如今雖然有很多行人檢測演算法不斷提出,但基本都是以hog svm的思路為主,那麼pcl中也是利用這一思想來進行行...

行人檢測OpenCV ICF

最近專案中需要用到行人檢測,對比了幾種常用的演算法後,果斷選擇出自大神piotr dollar的icf integral channel features 下面開始了苦逼之旅。由於從網上down的 都是matlab版的,如果翻譯成c 的話,勞民傷財。以前就聽說opencv contrib裡整合了該演...