OpenCV實戰 | 八種目標跟蹤算法

電腦雜談  發布時間:2020-02-14 10:01:14  來源:網絡整理

opencv車輛識別模型_opencv python 識別_opencv目標識別程序

2018-8-6 10:36|發布者: 煉數成金_小數|查看: 34245|評論: 0|原作者: Adrian Rosebrock|來自: CVer

摘要: 雖然我們了解的的質心追蹤器表現得很高,但它必須我們在輸入的視頻上的每一幀運行一個目標探測器。對大多數環境來說,在每幀上進行測試比較浪費計算力。所以,我們想應用一種一次性的目標評估方式,然后在隨后的幀上 ...

網絡工具模型算法OpenCV

雖然我們了解的的質心追蹤器表現得很高,但它必須我們在輸入的視頻上的每一幀運行一個目標探測器。對大多數環境來說,在每幀上進行測試比較消耗計算力。

所以,我們想應用一種一次性的目標評估方式,然后在隨后的幀上都可進行目標追蹤,使這一任務變得迅速、更高效。

這里的難題是:OpenCV可給我們超過這些目標追蹤的目的嗎?

答案是顯然的。

OpenCV目標追蹤

首先,我們會大概介紹八種建立在OpenCV上的目標跟蹤算法。之后我會講解怎樣運用這種算法進行即時目標跟蹤。最后,我們會非常各個OpenCV目標追蹤的效果,總結各種方式才能適應的環境。

八種OpenCV目標追蹤安裝

無人機拍攝的視頻,用MedianFlow進行目標追蹤

你可能會驚訝OpenCV竟然有八種不同的目標追蹤軟件,他們都可以利用到計算機視覺領域中。

這八種工具比如:

BOOSTING Tracker:和Haar cascades(AdaBoost)背后所用的機器學習算法相同,但是距其問世已有十多年了。這一追蹤器速度較慢,并且體現不好,但是成為大佬還是有必要提及的。(較低支持OpenCV 3.0.0)

MIL Tracker:比上一個追蹤器更較準確,但是失敗率比較高。(較低支持OpenCV 3.0.0)

KCF Tracker:比BOOSTING和MIL都快,但是在有遮擋的狀況下體現不佳。(較低支持OpenCV 3.1.0)

CSRT Tracker:比KCF稍較準確,但速度不如后者。(較低支持OpenCV 3.4.2)

opencv目標識別程序_opencv車輛識別模型_opencv python 識別

MedianFlow Tracker:在報錯方面體現得很高,但是針對迅速跳動或急速移動的物體,模型會失效。(較低支持OpenCV 3.0.0)

TLD Tracker:我不確定是不是OpenCV和TLD有哪些不兼容的弊端,但是TLD的誤報非常多,所以不推薦。(較低支持OpenCV 3.0.0)

MOSSE Tracker:速度實在快,但是不如CSRT和KCF的準確率那么高,如果追求速度選它準沒錯。(較低支持OpenCV 3.4.1)

GOTURN Tracker:這是OpenCV中一深度學習為基礎的目標檢測器。它必須額外的模型能夠運行,本文不具體講解。(較低支持OpenCV 3.2.0)

我個人的建議:

如果追求高準確度,又可忍受慢一些的速度,那么就用CSRT

如果對準確度的規定不嚴格,想追求速度,那么就選KCF

純粹想節省時間就用MOSSE

從OpenCV 3開始,目標檢測器得到了迅速發展,下表總結了不同版本的OpenCV中能食用的追蹤器:

開始動手

想要用OpenCV進行目標追蹤,首先開啟一個新文件,將它命名為opencv_object_tracker.py,然后插入以下代碼:

我們開始輸入需要的安裝包,確保你終于安裝了OpenCV(我推薦3.4以上的版本),其次你應安裝imutils:

輸入安裝包后,我們開始分析命令行參數:

我們的命令行參數包括:

opencv目標識別程序_opencv車輛識別模型_opencv python 識別

--video:到達輸入視頻文件的代替路線。如果該參數失效,那么腳本將會使用你的網絡。

--tracker:假設默認追蹤器設置的是kcf,一整列可能的追蹤器代碼表示下一個代碼塊或下方的個別。

讓我們處理追蹤器的不同類別:

圖2中我們看到,并不是所有追蹤器都使用OpenCV 3以上的版本。在3.3版本上,同樣出現了安裝上的差異,在3.3之前,追蹤器必須用cv2. Tracker_create創造,并且要在追蹤器的名字上用小寫字符串標注(22和23行)。

對于3.3以上的版本,每個追蹤器可以用各自的變量創造,如cv2. TrackerKCF_create。詞典OPENCV_OBJECT_TRACKERS包含了7種OpenCV的目標追蹤器(30—38行)。它將目標追蹤器的命令行參數字符串映射到實際的OpenCV追蹤器函數上。

其中42行里的tracker目的是按照追蹤器命令行參數以及從OPENCV_OBJECT_TRACKERS得來的相關重要信息。

注意:這里我沒有將GOTURN加入至追蹤器設置中由于它還必須額外的模型文件。

我們還對initBB進行初始化(46行),當我們用鼠標選中目標物體時,該變量會顯示目標物體的界限框坐標。

接下來,讓我們對視頻流和FPS進行初始化:

49—52行是訪問網絡的方法,這里我們設置一個一秒鐘的暫停時間,好令傳感器進行“熱身”。

接著--video命令行參數會出現,所以我們可以從視頻文件中對視頻流進行初始化(55—56行)。

下面是從視頻流中進行幀數迭代循環的流程:

在65和66行中我們提取一個frame,同時在69和70行處理視頻文件中沒有幀數的狀況。

為了使我們的算法處理幀數的速率很快,我們用resize將輸入的視頻幀調整為50像素(74行),這里處理的數據越少,速度才會越快。

之后,我們提取視頻幀的長度跟高度,之后我們會用到高度(75行)。

opencv車輛識別模型_opencv python 識別_opencv目標識別程序

目標物體選定以后,我們就可以用下面代碼進行處理:

如果目標物體已經被選定,我們必須不斷更新目標物體的位置,為了做到這一點,我們在80行使用update方法,它會定位目標物體的新位置以及返回一個success和box值。

如果順利的話,我們可以在frame中受到更新后的邊界框位置。注意,追蹤器可能會跟丟目標物并且報錯,所以success可能不會一直是True。接著更新FPS估計器。

接著,讓我們展現一下frame,以及用鼠標選取目標物體:

我們將展現frame,并且再次迭代循環,鍵入其他指令能夠停止。

當輸入“s”后,我們用cv2.selectROI“選擇”一個目標ROI。這一函數可以使你在視頻暫停的之后自動選擇一個ROI:

用戶需要畫出邊界框后按回車或空格鍵來確認所選區域。如果你必須再次選擇,就按“ESCAPE”鍵。

同樣,我們能夠用真實的目標探測器來進行自動選擇。

最后,如果視頻有更多的幀,或者發生了“quit”的狀況,如何退出這一循環:

最后一個模塊展示了我們怎么停止循環,這時所有的指標都輸出以及窗口關閉。

目標追蹤結果

提示:為了保證你跟上本文的進度,并且用到了文章中的OpenCV方法,請先保證你在“下載資料”中下載了代碼跟視頻。

之后,打開一個終端并執行下面命令:

opencv目標識別程序_opencv python 識別_opencv車輛識別模型

如果你下載了本教程的源代碼和視頻,那么--video的只用參數在下面文件中:

american_pharoah.mp4

dashcam_boston.mp4

drone.mp4

nascar_01.mp4

nascar_02.mp4

race.mp4

……

--tracker中的參數在:

boosting

medianflow

mosse

你也可以用計算機的:

總結

這篇文章講解了怎樣用OpenCV進行目標物體追蹤。具體來說opencv目標識別程序opencv目標識別程序,我們解讀了庫里的八種算法:

Boosting

MedianFlow

MOSSE

GOTURN

我們可以將OpenCV的這八種追蹤器用于不同的任務,包括田徑賽事、賽馬、賽車、無人機追蹤等高速視頻上。如必須文中的代碼跟視頻,請點擊下方原文地址獲取。

原文地址:


本文來自電腦雜談,轉載請注明本文網址:
http://www.772070.live/a/jisuanjixue/article-140723-1.html

    發表評論  請自覺遵守互聯網相關的政策法規,嚴禁發布、暴力、反動的言論

    熱點圖片
    拼命載入中...
    天津快乐十分20选8技巧