當前位置:
首頁 > 新聞 > 喪屍目標檢測:和你分享Python 非極大值抑制方法運行得飛快的秘訣

喪屍目標檢測:和你分享Python 非極大值抑制方法運行得飛快的秘訣

雷鋒網按:本文為AI研習社編譯的技術博客,原標題 (Faster) Non-Maximum Suppression in Python,作者為 Adrian Rosebrock 。

翻譯 | 陶玉龍      校對 | 吳桐      整理 | MY

我有一個困惑:我不能停止對目標檢測的思考。

你知道的,昨晚在我在看《行屍走肉》時,不是享受殭屍野蠻和被迫吃人,或引人入勝的故事情節,我只想建立一個目標檢測系統來對殭屍進行識別。

這個檢測系統會很有用嗎?可能不會。

我是說,如果一個殭屍跟在你後面那將是很明顯的:光是那陣惡臭就會告訴你這是一個死人(嘿,看看這個一語雙關)散發出來的,更不用說猙獰的牙齒和揮動的手臂。我們也可能會陷入那些從殭屍喉嚨里發出的「腦子.... 腦子...」呻吟聲中。

就像我說的,如果有一個殭屍在你身後,你當然不需要計算機視覺系統來告訴你這件事。但這只是一個每天都在我腦海里流淌的例子罷了。

為了給你一些相關信息,兩個星期前,我在帖子中展示了如何使用直方圖的方向梯度和線性支持向量機來建立一個目標檢測系統。厭倦了 OpenCV Haar 複雜的結構和糟糕的性能,更不要說那麼長的訓練時間,因此我自己動手編寫了自己的 Python 目標檢測框架。

到目前為止,它運行得非常好,而且實現起來非常有趣。

但是在構建目標檢測系統——重疊候選框這個不可迴避的問題你必須處理。這是會發生的,沒有任何辦法可以繞過它。但事實上,這是一個很好的跡象,表明你的目標檢測器正在進行合理的微調,所以我甚至不說它是一個「問題」。

為了處理這些需要移除的重疊候選框(對同一個對象而言),我們可以對 Mean Shift 演算法進行非極大值抑制。雖然 Dalal 和 Triggs 更喜歡 Mean-Shift 演算法,我卻發現 Mean Shift 給出了低於平均值的結果。

在收到我朋友 Tomasz Malisiewicz 博士(目標檢測方面的專家)的建議之後,我決定將他 Matlab 上實現的非最大抑制方法移植到 Python 上。

上周我向你們展示了如何實施 FelZeZZWalb 等方法。這周我要向你們展示 MalISIEWICZ 這種運行速度快 100 倍的方法。

註:我本來打算在十一月發布這篇博客,但由於我糟糕的拖延症,我花了很多時間才把這篇文章寫出來。不過無論如何,它現在已經在網上了!

那麼提速是從哪裡來的呢?我們是如何獲得這麼快的抑制時間的呢?

繼續閱讀去找出答案。

(更快的)在Python上的非極大值抑制方法

在我們開始之前,如果你還沒有讀過上周關於非極大值抑制的帖子,我建議你先看一下那個帖子。

如果你已經看過那個帖子,那麼在你最喜歡的編輯器中新建一個文件,命名為 nms.py,讓我們開始創建一個更快的非極大值抑制實現方法:

請花幾秒鐘時間仔細檢查這個代碼,將其與上周提出的 FelZeZZWalb 方法進行比較。

代碼看起來幾乎一樣,對吧?

所以你可能會問自己:「這 100 倍加速是從哪裡來的?」

答案是我們移除了一個內部循環結構。

上周提出的實現方法需要一個額外的內部循環來計算邊界區域的大小和重疊區域的比率。

在本文中取而代之的是,Malisiewicz 博士用矢量化代碼替換了這個內部循環,這就是我們在應用非極大值抑制時能夠實現更快速度的原因。

與其像上周那樣我一個人逐行逐行地閱讀代碼,不如讓我們一起來看一下其中關鍵的部分。

我們這個更快的非極大值抑制函數第 6-22 行基本與上周相同。我們通過抓取檢測框的(x,y)坐標,計算它們的面積,並根據每個框的右下 y 坐標將他們分類到框列表中。

第 31-55 行包含我們的加速過程,其中第 41-55 行特別重要。我們不再使用內部 for 循環來對單獨對每個框進行循環,而是使用 np.maximum 和 np.minimum 對代碼進行矢量化,這使得我們能夠在坐標軸上找到最大值和最小值而不僅僅是一個數。

注意:你在這裡必須使用 np.maximum 和 np.minimum——它們允許您混合標量和向量。然而 np.max 和 np.min 函數就沒有這樣的功能,當你使用它們時,你會發現有一些非常嚴重的 bug 需要查找和修復。當我把演算法從 Matlab 移植到 Python 時,我花了很長時間來解決這個問題。第 47 行和第 48 行也被矢量化,在這裡我們計算每個矩形的寬度和高度來進行檢查。相似的,第 51 行上的重疊率也被矢量化。從那裡,我們只需刪除我們的 IDX 列表中的所有條目,這些條目都大於我們提供的重疊閾值。通常重疊閾值在 0.3-0.5 之間。

Malisiewicz 等人提出的方法與 FelZeZnZWalb 等的基本相同。但通過使用矢量化代碼,我們能夠在非極大值抑制上實現100 倍加速!

運行更快的非極大值抑制方法

讓我們繼續並研究幾個例子。我們從這張照片的頂部的一個恐怖的小女孩殭屍開始:

圖 1:圖像中有 3 個檢測邊界框,但非極大值抑制方法讓其中的兩個重疊框消失。

......


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雷鋒網 的精彩文章:

上海經信委爭取Waymo落戶上海,Waymo入華打開了敲門磚
卷積神經網路做簡單任務原來有 BUG?UBER AI Lab 來支招

TAG:雷鋒網 |