1
本文作者: AI研習(xí)社-譯站 | 2018-08-06 15:59 |
雷鋒網(wǎng)按:本文為AI研習(xí)社編譯的技術(shù)博客,原標題 (Faster) Non-Maximum Suppression in Python,作者為 Adrian Rosebrock 。
翻譯 | 陶玉龍 校對 | 吳桐 整理 | MY
我有一個困惑:我不能停止對目標檢測的思考。
你知道的,昨晚在我在看《行尸走肉》時,不是享受僵尸野蠻和被迫吃人,或引人入勝的故事情節(jié),我只想建立一個目標檢測系統(tǒng)來對僵尸進行識別。
這個檢測系統(tǒng)會很有用嗎?可能不會。
我是說,如果一個僵尸跟在你后面那將是很明顯的:光是那陣惡臭就會告訴你這是一個死人(嘿,看看這個一語雙關(guān))散發(fā)出來的,更不用說猙獰的牙齒和揮動的手臂。我們也可能會陷入那些從僵尸喉嚨里發(fā)出的「腦子.... 腦子...」呻吟聲中。
就像我說的,如果有一個僵尸在你身后,你當然不需要計算機視覺系統(tǒng)來告訴你這件事。但這只是一個每天都在我腦海里流淌的例子罷了。
為了給你一些相關(guān)信息,兩個星期前,我在帖子中展示了如何使用直方圖的方向梯度和線性支持向量機來建立一個目標檢測系統(tǒng)。厭倦了 OpenCV Haar 復(fù)雜的結(jié)構(gòu)和糟糕的性能,更不要說那么長的訓(xùn)練時間,因此我自己動手編寫了自己的 Python 目標檢測框架。
到目前為止,它運行得非常好,而且實現(xiàn)起來非常有趣。
但是在構(gòu)建目標檢測系統(tǒng)——重疊候選框這個不可回避的問題你必須處理。這是會發(fā)生的,沒有任何辦法可以繞過它。但事實上,這是一個很好的跡象,表明你的目標檢測器正在進行合理的微調(diào),所以我甚至不說它是一個「問題」。
為了處理這些需要移除的重疊候選框(對同一個對象而言),我們可以對 Mean Shift 算法進行非極大值抑制。雖然 Dalal 和 Triggs 更喜歡 Mean-Shift 算法,我卻發(fā)現(xiàn) Mean Shift 給出了低于平均值的結(jié)果。
在收到我朋友 Tomasz Malisiewicz 博士(目標檢測方面的專家)的建議之后,我決定將他 Matlab 上實現(xiàn)的非最大抑制方法移植到 Python 上。
上周我向你們展示了如何實施 FelZeZZWalb 等方法。這周我要向你們展示 MalISIEWICZ 這種運行速度快 100 倍的方法。
注:我本來打算在十一月發(fā)布這篇博客,但由于我糟糕的拖延癥,我花了很多時間才把這篇文章寫出來。不過無論如何,它現(xiàn)在已經(jīng)在網(wǎng)上了!
那么提速是從哪里來的呢?我們是如何獲得這么快的抑制時間的呢?
繼續(xù)閱讀去找出答案。
(更快的)在Python上的非極大值抑制方法
在我們開始之前,如果你還沒有讀過上周關(guān)于非極大值抑制的帖子,我建議你先看一下那個帖子。
如果你已經(jīng)看過那個帖子,那么在你最喜歡的編輯器中新建一個文件,命名為 nms.py,讓我們開始創(chuàng)建一個更快的非極大值抑制實現(xiàn)方法:
請花幾秒鐘時間仔細檢查這個代碼,將其與上周提出的 FelZeZZWalb 方法進行比較。
代碼看起來幾乎一樣,對吧?
所以你可能會問自己:「這 100 倍加速是從哪里來的?」
答案是我們移除了一個內(nèi)部循環(huán)結(jié)構(gòu)。
上周提出的實現(xiàn)方法需要一個額外的內(nèi)部循環(huán)來計算邊界區(qū)域的大小和重疊區(qū)域的比率。
在本文中取而代之的是,Malisiewicz 博士用矢量化代碼替換了這個內(nèi)部循環(huán),這就是我們在應(yīng)用非極大值抑制時能夠?qū)崿F(xiàn)更快速度的原因。
與其像上周那樣我一個人逐行逐行地閱讀代碼,不如讓我們一起來看一下其中關(guān)鍵的部分。
我們這個更快的非極大值抑制函數(shù)第 6-22 行基本與上周相同。我們通過抓取檢測框的(x,y)坐標,計算它們的面積,并根據(jù)每個框的右下 y 坐標將他們分類到框列表中。
第 31-55 行包含我們的加速過程,其中第 41-55 行特別重要。我們不再使用內(nèi)部 for 循環(huán)來對單獨對每個框進行循環(huán),而是使用 np.maximum 和 np.minimum 對代碼進行矢量化,這使得我們能夠在坐標軸上找到最大值和最小值而不僅僅是一個數(shù)。
注意:你在這里必須使用 np.maximum 和 np.minimum——它們允許您混合標量和向量。然而 np.max 和 np.min 函數(shù)就沒有這樣的功能,當你使用它們時,你會發(fā)現(xiàn)有一些非常嚴重的 bug 需要查找和修復(fù)。當我把算法從 Matlab 移植到 Python 時,我花了很長時間來解決這個問題。第 47 行和第 48 行也被矢量化,在這里我們計算每個矩形的寬度和高度來進行檢查。相似的,第 51 行上的重疊率也被矢量化。從那里,我們只需刪除我們的 IDX 列表中的所有條目,這些條目都大于我們提供的重疊閾值。通常重疊閾值在 0.3-0.5 之間。
Malisiewicz 等人提出的方法與 FelZeZnZWalb 等的基本相同。但通過使用矢量化代碼,我們能夠在非極大值抑制上實現(xiàn) 100 倍加速!
運行更快的非極大值抑制方法
讓我們繼續(xù)并研究幾個例子。我們從這張照片的頂部的一個恐怖的小女孩僵尸開始:
圖 1:圖像中有 3 個檢測邊界框,但非極大值抑制方法讓其中的兩個重疊框消失。
......
想要繼續(xù)閱讀,請移步至我們的AI研習(xí)社社區(qū):https://club.leiphone.com/page/TextTranslation/626
更多精彩內(nèi)容盡在 AI 研習(xí)社。
不同領(lǐng)域包括計算機視覺,語音語義,區(qū)塊鏈,自動駕駛,數(shù)據(jù)挖掘,智能控制,編程語言等每日更新。
手機端可以掃描二維碼訪問
雷鋒網(wǎng)雷鋒網(wǎng)
雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。