2013-04-16 52 views
1

我是新來的豬,我使用的是opencv2.4.4和visual studio 2010,我在包中運行示例peopledetect.cpp並編譯並運行,但我想詳細瞭解源代碼。在peopledetect .cpp是構建/已經爲人類檢測構建的描述符3780向量被輸入到svm分類器中?當我嘗試調試peopledetect.cpp我只能找到HOGDescriptor創建豬描述符和檢測器,我基本不明白這個API的作用HOGDescriptor因爲我看到peopledetect.cpp does not經過生豬處理的步驟,它將已經訓練好的載體加載到svm分類器來檢測人/沒有人,我錯了嗎?由於沒有關於這方面的文件。Hog描述符是在peopledetect.cpp中構造的嗎?

任何人都可以請介紹一下。

回答

1

訓練SVM包含查找正樣本和負樣本之間最大餘量的參數。

如果相同的特徵提取是針對1000+正負樣本進行的,那麼必須有數百萬個特徵符?

是的。這些係數是從訓練數據庫中提取的。你沒有他們。 SVM僅存儲足以表徵邊際的支持向量。例如,參見線性SVM的dual form

許多不同尺度的行人的窗口通常與該區域

真相關聯。合併功能適用。可以使用不同的方法(如groupRectangles(..))(請參閱here)並獲取給定的參數參數detectMultiScale(..)

+0

謝謝你的洞察力。我仍然對整個算法感到困惑。 1)peopledetect.cpp是否通過一步一步的生豬處理?因爲我沒有找到調試步驟。 2)hog.detectMultiScale是一個探測器窗口,它掃描圖像並通過窗口提取特徵並在所有位置運行窗口分類器? 3)它是否遵循比例空間金字塔法? peopledetect.cpp幾乎沒有文檔,這使得它很難理解源代碼。 – SharathNaidu

+0

它使用積分圖像或緩衝來計算每個窗口的特徵,以避免計算幾次相同的像素。請參閱Wiki獲取定向梯度直方圖(Histogram of Oriented Gradient)。然後應用svm預測。我不知道是否使用了尺度空間金字塔。你應該更深入的openCV源代碼。 – Eric

+0

感謝您的投入Eric。 – SharathNaidu

2

opencv中People Detection算法的實現基於HOG描述符作爲特徵,SVM作爲分類器。

1.訓練數據庫(正面樣本爲人,負面樣本爲非人)用於學習SVM參數(計算和存儲支持向量)。爲了優化軟邊界參數C和內核參數(它可以是線性內核),也執行交叉驗證(我假設)。

2.peopledetect.cpp加載預先學習的SVM,計算不同位置和尺度上的HOG描述符,然後合併具有高檢測分數(二進制SVM分類器的輸出)的窗口。

這是一個很好的paper(inria)開始。

+0

+1很好的答案。我想補充說的是,有些代碼可以構建HOG分類器@ home,如[this](https://github.com/DaHoC/trainHOG)。 – Acorbe

+0

@Eric我幾次閱讀你的答案,但不明白,但經過幾篇論文後,我想我已經更清楚地理解了peopledetect.cpp,如果我在下面的解釋中錯了,請糾正我。問題是樣本peopledetect.cpp是否通過逐步處理生豬,如圖所示。見下面的解釋。 – SharathNaidu

0

我從不同的論文中瞭解到,使用豬的特徵提取是使用多個正面和負面圖像完成的,這些提取的特徵被饋送到線性SVM以訓練它們,因此peopledetect.cpp使用這個訓練過的線性SVM樣本,所以這個特徵提取過程不是由peopledetect.cpp完成的,即HOGDescriptor :: getDefaultPeopleDetector()包括訓練用於人員檢測的分類器的係數。從生豬檢測/窗口(64x128)提取的特徵總共提供了長度3780(4個單元×9個單元×7×15個單元= 3780)的特徵。這些特徵然後用於訓練線性SVM分類器。如果對1000個以上的負樣本和正樣本進行相同的特徵提取,則必須有數百萬個特徵符? 我們如何獲得這些係數?

但是HOG描述符已知包含冗餘信息,因爲使用了不同的檢測窗口大小。因此,當支持向量機分類器將一個區域分類爲「行人」時,許多不同比例的行人窗口往往與該區域相關聯。什麼peopledetect.cpp主要做的是(hog.detectMultiScale(img,found,0,Size(8,8),Size(32,32),1.05,2);)檢測窗口掃描整個圖像的所有位置和尺度和常規非最大抑制運行在輸出金字塔上以檢測對象實例。

2

即將到來更清晰的答案,peopledetect.cpp經歷所有的生豬步驟。 深入挖掘我更清楚。基本上如果你調試peopledetect.cpp通過這些步驟。

enter image description here

最初圖像被劃分成幾個秤,scale0(1.05)是用於檢測窗口的增加係數。對於圖像的每個尺度,從窗口提取特徵並運行分類器窗口,如上所述,它遵循尺度空間金字塔方法。所以它非常大的計算過程非常昂貴,所以opencv團隊已經試圖爲每個規模進行並行化。 (0,(int)levelScale.size()),HOGInvoker())創建了幾個線程,每個線程在每個尺度上都可以工作,取決於多少線程或創建這樣的東西。 因爲這我不能夠調試,我所做的就是凍結所有線程並只調試主線程。對於圖像豬的不同尺度的處理步驟是

enter image description here

在這裏,在生豬peopledetect.cpp和分類器窗口都有點combined.In單個窗口(64x128)兩者的特徵提取和分類器運行發生。完成後,爲圖像的每個比例。有不同比例的行人窗戶往往與這個區域相關聯,這是使用grouprectangle()函數分組