[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裡整合了該演...