2014-10-28 108 views
12

我正在一個項目中工作。項目的一部分包括將OpenCV的HOG人員檢測器與相機流式傳輸集成。提高精度OpenCV HOG人員探測器

目前它正在使用攝像頭和基本的HOG檢測器(CPP detectMultiScale - >http://docs.opencv.org/modules/gpu/doc/object_detection.html)。但是不能很好地工作...檢測結果非常噪音,算法不是很準確...

爲什麼?

我的相機圖像是640 x 480像素。

我正在使用的代碼片段是:

std::vector<cv::Rect> found, found_filtered; 
cv::HOGDescriptor hog; 
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); 
hog.detectMultiScale(image, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2); 

爲什麼不能正常工作?有什麼需要提高準確度?是否需要特定的圖像大小?

PS:你知道一些精確的人檢測算法,更快,並在cpp?

+0

圖像中的人必須至少具有HOG描述符的大小(儘管少一些),並且只有detectMultiScale(afaik)才能找到更大的人。你不能期望這樣的一般「對象」的生豬檢測率接近100%,但在一個流中,你應該至少檢測一次真實的人。您可以嘗試追蹤這些人並驗證/拒絕以前檢測到的人。 – Micka 2014-10-28 11:49:15

+0

謝謝你的回答Micka! 你是否說:「至少HOG描述符的大小」......但**這是什麼尺寸?** 你知道別人的位置或只存在「getDefaultPeopleDetector」? 非常感謝你! – Ricardo 2014-10-28 13:08:41

+0

這個網站可能會幫助你:http://www.geocities.ws/talh_davidc/ – SomethingSomething 2016-01-07 19:40:30

回答

32

默認人員檢測器的大小爲64x128,這意味着您希望檢測的人員必須至少爲64x128。對於你的相機分辨率來說,這意味着一個人在得到正確檢測之前將不得不佔用相當多的空間。

根據您的具體情況,您可以嘗試使用較小的尺寸訓練您自己的HOG描述符。如果你想訓練你自己的HOG描述符,你可以看看this answerreferenced library

的參數爲:

win_stride: 鑑於你的輸入圖像的大小爲640×480,而defaultpeopleDetector有64x128的窗口大小,可以適應HOG檢測窗口(64x128窗口)在輸入圖像中多次。 winstride告訴HOG每次移動一定量的檢測窗口。 這是如何工作的: Hog將檢測窗口放置在輸入圖像的左上角。 並每次由win_stride移動檢測窗口。

像這樣(小win_stride): enter image description here

或像這樣(大win_stride) enter image description here

較小winstride應該提高精確度,但會降低性能與特點,和周圍的其他方式

填充 填充在輸入圖像的每一面添加一定數量的額外像素。這樣,檢測窗口位於輸入圖像的外面。這是因爲HOG可以檢測到非常接近輸入圖像邊緣的人。

group_threshold group_treshold決定檢測到的零件應該放在一個組中的值。 低值不提供結果分組,如果在檢測窗口內找到閾值量,則較高的值將提供結果分組。(以我自己的經驗,我從來沒有需要改變默認值)

我希望這對你有一點意義。 我在過去的幾個星期一直和HOG一起工作,並且閱讀了大量的論文,但是我失去了一些參考文獻,所以我無法將這些信息從哪個網頁鏈接到您,對不起。

+1

你也可以調整(增加)你的圖片來找到更小的人。 – Micka 2014-10-28 21:10:15

+0

非常感謝您的回答Timmynator0! 你怎麼知道它?你知道關於這個算法及其參數的一些文檔嗎? 現在我不想培養我自己的HOG描述符。 非常感謝! :) – Ricardo 2014-10-29 09:35:00

+0

@Ricardo我更新了我的答案,以反映你關於參數的新問題。如果這有幫助,請將我的答案標記爲正確的答案。 – Timmynator0 2014-10-29 11:47:23