❶ 經典目標檢測演算法介紹
姓名:牛曉銀;學號:20181213993;學院:計算機科學與技術
轉自:https://zhuanlan.hu.com/p/34142321
【嵌牛導讀】:目標檢測,也叫目標提取,是一種基於目標幾何和統計特徵的圖像分割。隨著計算機技術的發展和計算機視覺原理的廣泛應用,利用計算機圖像處理技術對目標進行實時跟蹤研究越來越熱門,對目標進行動態實時跟蹤定位在智能化交通系統、軍事目標檢測及醫學導航手術中手術器械定位等方面具有廣泛的應用價值。
【嵌牛鼻子】:目標檢測、檢測模型、計算機視覺
【嵌牛提問】:你知道或者用過哪些目標檢測演算法?
【嵌牛正文】:
(一)目標檢測經典工作回顧
本文結構
兩階段模型因其對圖片的兩階段處理得名,也稱為基於區域(Region-based)的方法,我們選取R-CNN系列工作作為這一類型的代表。
R-CNN: R-CNN系列的開山之作
論文鏈接: Rich feature hierarchies for accurate object detection and semantic segmentation
本文的兩大貢獻:1)CNN可用於基於區域的定位和分割物體;2)監督訓練樣本數緊缺時,在額外的數據上預訓練的模型經過fine-tuning可以取得很好的效果。第一個貢獻影響了之後幾乎所有2-stage方法,而第二個貢獻中用分類任務(Imagenet)中訓練好的模型作為基網路,在檢測問題上fine-tuning的做法也在之後的工作中一直沿用。
傳統的計算機視覺方法常用精心設計的手工特徵(如SIFT, HOG)描述圖像,而深度學習的方法則倡導習得特徵,從圖像分類任務的經驗來看,CNN網路自動習得的特徵取得的效果已經超出了手工設計的特徵。本篇在局部區域應用卷積網路,以發揮卷積網路學習高質量特徵的能力。
R-CNN將檢測抽象為兩個過程,一是基於圖片提出若干可能包含物體的區域(即圖片的局部裁剪,被稱為Region Proposal),文中使用的是Selective Search演算法;二是在提出的這些區域上運行當時表現最好的分類網路(AlexNet),得到每個區域內物體的類別。
另外,文章中的兩個做法值得注意。
一是數據的准備。輸入CNN前,我們需要根據Ground Truth對提出的Region Proposal進行標記,這里使用的指標是IoU(Intersection over Union,交並比)。IoU計算了兩個區域之交的面積跟它們之並的比,描述了兩個區域的重合程度。
文章中特別提到,IoU閾值的選擇對結果影響顯著,這里要談兩個threshold,一個用來識別正樣本(如跟ground truth的IoU大於0.5),另一個用來標記負樣本(即背景類,如IoU小於0.1),而介於兩者之間的則為難例(Hard Negatives),若標為正類,則包含了過多的背景信息,反之又包含了要檢測物體的特徵,因而這些Proposal便被忽略掉。
另一點是位置坐標的回歸(Bounding-Box Regression),這一過程是Region Proposal向Ground Truth調整,實現時加入了log/exp變換來使損失保持在合理的量級上,可以看做一種標准化(Normalization)操作。
小結
R-CNN的想法直接明了,即將檢測任務轉化為區域上的分類任務,是深度學習方法在檢測任務上的試水。模型本身存在的問題也很多,如需要訓練三個不同的模型(proposal, classification, regression)、重復計算過多導致的性能問題等。盡管如此,這篇論文的很多做法仍然廣泛地影響著檢測任務上的深度模型革命,後續的很多工作也都是針對改進這一工作而展開,此篇可以稱得上"The First Paper"。
Fast R-CNN: 共享卷積運算
論文鏈接: Fast R-CNN
文章指出R-CNN耗時的原因是CNN是在每一個Proposal上單獨進行的,沒有共享計算,便提出將基礎網路在圖片整體上運行完畢後,再傳入R-CNN子網路,共享了大部分計算,故有Fast之名。
上圖是Fast R-CNN的架構。圖片經過feature extractor得到feature map, 同時在原圖上運行Selective Search演算法並將RoI(Region of Interset,實為坐標組,可與Region Proposal混用)映射到到feature map上,再對每個RoI進行RoI Pooling操作便得到等長的feature vector,將這些得到的feature vector進行正負樣本的整理(保持一定的正負樣本比例),分batch傳入並行的R-CNN子網路,同時進行分類和回歸,並將兩者的損失統一起來。
RoI Pooling 是對輸入R-CNN子網路的數據進行准備的關鍵操作。我們得到的區域常常有不同的大小,在映射到feature map上之後,會得到不同大小的特徵張量。RoI Pooling先將RoI等分成目標個數的網格,再在每個網格上進行max pooling,就得到等長的RoI feature vector。
文章最後的討論也有一定的借鑒意義:
multi-loss traing相比單獨訓練classification確有提升
multi-scale相比single-scale精度略有提升,但帶來的時間開銷更大。一定程度上說明CNN結構可以內在地學習尺度不變性
在更多的數據(VOC)上訓練後,精度是有進一步提升的
Softmax分類器比"one vs rest"型的SVM表現略好,引入了類間的競爭
更多的Proposal並不一定帶來精度的提升
小結
Fast R-CNN的這一結構正是檢測任務主流2-stage方法所採用的元結構的雛形。文章將Proposal, Feature Extractor, Object Classification&Localization統一在一個整體的結構中,並通過共享卷積計算提高特徵利用效率,是最有貢獻的地方。
Faster R-CNN: 兩階段模型的深度化
論文鏈接: Faster R-CNN: Towards Real Time Object Detection with Region Proposal Networks
Faster R-CNN是2-stage方法的奠基性工作,提出的RPN網路取代Selective Search演算法使得檢測任務可以由神經網路端到端地完成。粗略的講,Faster R-CNN = RPN + Fast R-CNN,跟RCNN共享卷積計算的特性使得RPN引入的計算量很小,使得Faster R-CNN可以在單個GPU上以5fps的速度運行,而在精度方面達到SOTA(State of the Art,當前最佳)。
本文的主要貢獻是提出Regional Proposal Networks,替代之前的SS演算法。RPN網路將Proposal這一任務建模為二分類(是否為物體)的問題。
第一步是在一個滑動窗口上生成不同大小和長寬比例的anchor box(如上圖右邊部分),取定IoU的閾值,按Ground Truth標定這些anchor box的正負。於是,傳入RPN網路的樣本數據被整理為anchor box(坐標)和每個anchor box是否有物體(二分類標簽)。RPN網路將每個樣本映射為一個概率值和四個坐標值,概率值反應這個anchor box有物體的概率,四個坐標值用於回歸定義物體的位置。最後將二分類和坐標回歸的損失統一起來,作為RPN網路的目標訓練。
由RPN得到Region Proposal在根據概率值篩選後經過類似的標記過程,被傳入R-CNN子網路,進行多分類和坐標回歸,同樣用多任務損失將二者的損失聯合。
小結
Faster R-CNN的成功之處在於用RPN網路完成了檢測任務的"深度化"。使用滑動窗口生成anchor box的思想也在後來的工作中越來越多地被採用(YOLO v2等)。這項工作奠定了"RPN+RCNN"的兩階段方法元結構,影響了大部分後續工作。
單階段(1-stage)檢測模型
單階段模型沒有中間的區域檢出過程,直接從圖片獲得預測結果,也被成為Region-free方法。
YOLO
論文鏈接: You Only Look Once: Unified, Real-Time Object Detection
YOLO是單階段方法的開山之作。它將檢測任務表述成一個統一的、端到端的回歸問題,並且以只處理一次圖片同時得到位置和分類而得名。
YOLO的主要優點:
快。
全局處理使得背景錯誤相對少,相比基於局部(區域)的方法, 如Fast RCNN。
泛化性能好,在藝術作品上做檢測時,YOLO表現比Fast R-CNN好。
YOLO的工作流程如下:
1.准備數據:將圖片縮放,劃分為等分的網格,每個網格按跟Ground Truth的IoU分配到所要預測的樣本。
2.卷積網路:由GoogLeNet更改而來,每個網格對每個類別預測一個條件概率值,並在網格基礎上生成B個box,每個box預測五個回歸值,四個表徵位置,第五個表徵這個box含有物體(注意不是某一類物體)的概率和位置的准確程度(由IoU表示)。測試時,分數如下計算:
等式左邊第一項由網格預測,後兩項由每個box預測,以條件概率的方式得到每個box含有不同類別物體的分數。 因而,卷積網路共輸出的預測值個數為S×S×(B×5+C),其中S為網格數,B為每個網格生成box個數,C為類別數。
3.後處理:使用NMS(Non-Maximum Suppression,非極大抑制)過濾得到最後的預測框
損失函數的設計
損失函數被分為三部分:坐標誤差、物體誤差、類別誤差。為了平衡類別不均衡和大小物體等帶來的影響,損失函數中添加了權重並將長寬取根號。
小結
YOLO提出了單階段的新思路,相比兩階段方法,其速度優勢明顯,實時的特性令人印象深刻。但YOLO本身也存在一些問題,如劃分網格較為粗糙,每個網格生成的box個數等限制了對小尺度物體和相近物體的檢測。
SSD: Single Shot Multibox Detector
論文鏈接: SSD: Single Shot Multibox Detector
SSD相比YOLO有以下突出的特點:
多尺度的feature map:基於VGG的不同卷積段,輸出feature map到回歸器中。這一點試圖提升小物體的檢測精度。
更多的anchor box,每個網格點生成不同大小和長寬比例的box,並將類別預測概率基於box預測(YOLO是在網格上),得到的輸出值個數為(C+4)×k×m×n,其中C為類別數,k為box個數,m×n為feature map的大小。
小結
SSD是單階段模型早期的集大成者,達到跟接近兩階段模型精度的同時,擁有比兩階段模型快一個數量級的速度。後續的單階段模型工作大多基於SSD改進展開。
檢測模型基本特點
最後,我們對檢測模型的基本特徵做一個簡單的歸納。
檢測模型整體上由基礎網路(Backbone Network)和檢測頭部(Detection Head)構成。前者作為特徵提取器,給出圖像不同大小、不同抽象層次的表示;後者則依據這些表示和監督信息學習類別和位置關聯。檢測頭部負責的類別預測和位置回歸兩個任務常常是並行進行的,構成多任務的損失進行聯合訓練。
相比單階段,兩階段檢測模型通常含有一個串列的頭部結構,即完成前背景分類和回歸後,把中間結果作為RCNN頭部的輸入再進行一次多分類和位置回歸。這種設計帶來了一些優點:
對檢測任務的解構,先進行前背景的分類,再進行物體的分類,這種解構使得監督信息在不同階段對網路參數的學習進行指導
RPN網路為RCNN網路提供良好的先驗,並有機會整理樣本的比例,減輕RCNN網路的學習負擔
這種設計的缺點也很明顯:中間結果常常帶來空間開銷,而串列的方式也使得推斷速度無法跟單階段相比;級聯的位置回歸則會導致RCNN部分的重復計算(如兩個RoI有重疊)。
另一方面,單階段模型只有一次類別預測和位置回歸,卷積運算的共享程度更高,擁有更快的速度和更小的內存佔用。讀者將會在接下來的文章中看到,兩種類型的模型也在互相吸收彼此的優點,這也使得兩者的界限更為模糊。
❷ 目標檢測演算法之常見評價指標(mAP)的詳細計算方法及代碼解析
一個經典例子是存在一個測試集合,測試集合只有大雁和飛機兩種圖片組成,假設你的分類系統最終的目的是:能取出測試集中所有飛機的圖片,而不是大雁的圖片。然後就可以定義:
要得到Precision-Recall曲線(以下簡稱PR)曲線,首先要對檢測模型的預測結果按照目標置信度降序排列。然後給定一個rank值,Recall和Precision僅在置信度高於該rank值的預測結果中計算,改變rank值會相應的改變Recall值和Precision值。這里選擇了11個不同的rank值,也就得到了11組Precision和Recall值,然後AP值即定義為在這11個Recall下Precision值的平均值,其可以表徵整個PR曲線下方的面積。即:
還有另外一種插值的計算方法,即對於某個Recall值r,Precision取所有Recall值大於r中的最大值,這樣保證了PR曲線是單調遞減的,避免曲線出現搖擺。另外需要注意的一點是在2010年後計算AP值時是取了所有的數據點,而不僅僅只是11個Recall值。我們在計算出AP之後,對所有類別求平均之後就是mAP值了,也是當前目標檢測用的最多的評判標准。
❸ 目標檢測演算法---faster rcnn 知識簡要回顧(測試篇)
Faster RCNN檢測部分主要可以分為四個模塊:
1.特徵抽取:用於抽取圖像特徵,一般可以使用vgg、resnet和mobilenet等backbone;
2.RPN(Region Proposal Network):用於產生候選框,主要做一些粗糙的分類和回歸操作;
3.RoI Pooling:主要是為了解決全連接層需要固定尺寸輸入,而實際輸入大小不一的問題;
4.Classification and Regression:精細化分類和回歸。
faster rcnn演算法大致流程如下:
彩色圖像通過backbone進行特徵提取,輸出最後一層的feature map。接著將這些feature map進一步做基於3x3卷積核的特徵提取,該目的是增強模型的魯棒性。將輸出送入兩個分支,第一個分支跟類別有關,這里主要是用於簡單分類,區分是背景還是物體,這是針對anchor而言的;第二個分支則是用於初步預測候選框的偏移量,這個也是基於anchor而言的;再將前兩個分支的結果送入圖中的proposal中,首先會根據positive類的score篩選前6000個候選框,再將anchor的坐標和得到的偏移進行整合,得到初步候選框坐標,接著在做NMS,除去重疊嚴重的框,再經過了NMS後的框中,根據類別score取前300個框。然後將結果送入roi pooing層,用於生成固定尺寸的特徵區域,以方便後邊的全連接層接受信息;全連接層用於最後提取特徵,得到精細的類別和框的偏移量。
❹ R-CNN, Fast R-CNN, Faster R-CNN, YOLO:目標檢測演算法總結
參考鏈接
以下是文中涉及的演算法的最原始的文章:
一個最直接的解決辦法是從圖中取不同的感興趣區域,然後對這些區域用CNN進行分類,檢測這些區域中是否有物體的存在。
但是待檢測物體可能存在於圖片的不同位置而且有不同的長寬比例。所以以上方法需要選取量非常大的區域並需要非常大的計算量。
因此,R-CNN, Fast R-CNN, Faster R-CNN, YOLO被開發去又快又准地找物體。
為了解決上述提到的有大量區域被選擇的問題, Ross Girshick et al 提出了一種方法:用了選擇性搜索從圖片提取了2000個區域,這些區域被稱為」region proposals「。
用這種辦法,我們不需要去分類巨大數量的區域了,我們只需要去處理2000個區域。這2000個區域是用如下的選擇性搜索演算法(selective search algorithm)來找到的:
這篇文章 介紹了更多關於選擇性搜索演算法(selective search algorithm)的內容。
RCNN步驟:
R-CNN存在的問題:
Fast R-CNN的幾個改進:
The same author of the previous paper(R-CNN) solved some of the drawbacks of R-CNN to build a faster object detection algorithm and it was called Fast R-CNN. The approach is similar to the R-CNN algorithm.
Fast R-CNN更快的原因是:
Fast R-CNN更快:
From the above graphs, you can infer that Fast R-CNN is significantly faster in training and testing sessions over R-CNN. When you look at the performance of Fast R-CNN ring testing time, including region proposals slows down the algorithm significantly when compared to not using region proposals. Therefore, region proposals become bottlenecks in Fast R-CNN algorithm affecting its performance.
上面兩個演算法的缺點:
selective search耗時
Both of the above algorithms(R-CNN & Fast R-CNN) uses selective search to find out the region proposals . Selective search is a slow and time-consuming process affecting the performance of the network.
Faster R-CNN的改進:
不用selective search去找region proposals;
用network去找region proposals;
Therefore, Shaoqing Ren et al . came up with an object detection algorithm that eliminates the selective search algorithm and lets the network learn the region proposals .
Faster R-CNN的步驟:
時間上的對比:
Faster R-CNN最快並且能用作實時目標檢測
之前幾種演算法的缺點:
產生region的時候沒有縱覽整幅圖。其實圖的某些部分有更高的可能性包含物體。
All of the previous object detection algorithms use regions to localize the object within the image. The network does not look at the complete image. Instead, parts of the image which have high probabilities of containing the object .
YOLO的思想:
用一個單獨的網路去預測bounding boxes和bounding boxes中存在物體的概率
YOLO or You Only Look Once is an object detection algorithm much different from the region based algorithms seen above.
In YOLO, a single convolutional network predicts (1) the bounding boxes and (2)the class probabilities for these boxes.
YOLO的具體步驟:
How YOLO works is that:
YOLO的優缺點:
❺ YOLO 目標檢測實戰項目『原理篇』
在目標檢測中,IoU 為預測框 (Prediction) 和真實框 (Ground truth) 的交並比。如下圖所示,在關於小貓的目標檢測中,紫線邊框為預測框 (Prediction),紅線邊框為真實框 (Ground truth)。
在目標檢測任務中,通常取 IoU≥0.5,認為召回。如果 IoU 閾值設置更高,召回率將會降低,但定位框則更加精確。
理想的情況,當然是預測框與真實框重疊越多越好,如果兩者完全重疊,則交集與並集面積相同,此時 IoU 等於 1。
之前的目標檢測方法需要先產生候選區再檢測的方法雖然有相對較高的檢測准確率,但運行速度較慢。
YOLO 將識別與定位合二為一,結構簡便,檢測速度快,更快的 Fast YOLO 可以達到 155FPS。
YOLO 網路借鑒了 GoogLeNet 分類網路結構,不同的是 YOLO 使用 1x1 卷積層和 3x3 卷積層替代 inception mole。如下圖所示,整個檢測網路包括 24 個卷積層和 2 個全連接層。其中,卷積層用來提取圖像特徵,全連接層用來預測圖像位置和類別概率值。
如上圖所示,損失函數分為坐標預測(藍色框)、含有物體的邊界框的 confidence 預測(紅色框)、不含有物體的邊界框的 confidence 預測(黃色框)、分類預測(紫色框)四個部分。
由於不同大小的邊界框對預測偏差的敏感度不同,小的邊界框對預測偏差的敏感度更大。為了均衡不同尺寸邊界框對預測偏差的敏感度的差異。作者巧妙的對邊界框的 w,h 取均值再求 L2 loss. YOLO 中更重視坐標預測,賦予坐標損失更大的權重,記為 coord,在 pascal voc 訓練中 coodd=5 ,classification error 部分的權重取 1。
某邊界框的置信度定義為:某邊界框的 confidence = 該邊界框存在某類對象的概率 pr (object)* 該邊界框與該對象的 ground truth 的 IOU 值 ,若該邊界框存在某個對象 pr (object)=1 ,否則 pr (object)=0 。由於一幅圖中大部分網格中是沒有物體的,這些網格中的邊界框的 confidence 置為 0,相比於有物體的網格,這些不包含物體的網格更多,對梯度更新的貢獻更大,會導致網路不穩定。為了平衡上述問題,YOLO 損失函數中對沒有物體的邊界框的 confidence error 賦予較小的權重,記為 noobj,對有物體的邊界框的 confidence error 賦予較大的權重。在 pascal VOC 訓練中 noobj=0.5 ,有物體的邊界框的 confidence error 的權重設為 1.
YOLOv1 雖然檢測速度快,但在定位方面不夠准確,並且召回率較低。為了提升定位準確度,改善召回率,YOLOv2 在 YOLOv1 的基礎上提出了幾種改進策略
YOLOv2 中在每個卷積層後加 Batch Normalization (BN) 層,去掉 dropout. BN 層可以起到一定的正則化效果,能提升模型收斂速度,防止模型過擬合。YOLOv2 通過使用 BN 層使得 mAP 提高了 2%。
目前的大部分檢測模型都會使用主流分類網路(如 vgg、resnet)在 ImageNet 上的預訓練模型作為特徵提取器,而這些分類網路大部分都是以小於 256x256 的圖片作為輸入進行訓練的,低解析度會影響模型檢測能力。YOLOv2 將輸入圖片的解析度提升至 448x448,為了使網路適應新的解析度,YOLOv2 先在 ImageNet 上以 448x448 的解析度對網路進行 10 個 epoch 的微調,讓網路適應高解析度的輸入。通過使用高解析度的輸入,YOLOv2 的 mAP 提升了約 4%。
YOLOv1 利用全連接層直接對邊界框進行預測,導致丟失較多空間信息,定位不準。YOLOv2 去掉了 YOLOv1 中的全連接層,使用 Anchor Boxes 預測邊界框,同時為了得到更高解析度的特徵圖,YOLOv2 還去掉了一個池化層。由於圖片中的物體都傾向於出現在圖片的中心位置,若特徵圖恰好有一個中心位置,利用這個中心位置預測中心點落入該位置的物體,對這些物體的檢測會更容易。所以總希望得到的特徵圖的寬高都為奇數。YOLOv2 通過縮減網路,使用 416x416 的輸入,模型下采樣的總步長為 32,最後得到 13x13 的特徵圖, 然後對 13x13 的特徵圖的每個 cell 預測 5 個 anchor boxes ,對每個 anchor box 預測邊界框的位置信息、置信度和一套分類概率值。使用 anchor boxes 之後,YOLOv2 可以預測 13x13x5=845 個邊界框,模型的召回率由原來的 81% 提升到 88%,mAP 由原來的 69.5% 降低到 69.2%. 召回率提升了 7%,准確率下降了 0.3%。
YOLOv2 採用 Darknet-19,其網路結構如下圖所示,包括 19 個卷積層和 5 個 max pooling 層,主要採用 3x3 卷積和 1x1 卷積, 這里 1x1 卷積可以壓縮特徵圖通道數以降低模型計算量和參數 ,每個卷積層後使用 BN 層 以加快模型收斂同時防止過擬合。最終採用 global avg pool 做預測。採用 YOLOv2,模型的 mAP 值沒有顯著提升,但計算量減少了。
在 Faster R-CNN 和 SSD 中,先驗框都是手動設定的,帶有一定的主觀性。YOLOv2 採用 k-means 聚類演算法對訓練集中的邊界框做了聚類分析,選用 boxes 之間的 IOU 值作為聚類指標。綜合考慮模型復雜度和召回率,最終選擇 5 個聚類中心,得到 5 個先驗框,發現其中中扁長的框較少,而瘦高的框更多,更符合行人特徵。通過對比實驗,發現用聚類分析得到的先驗框比手動選擇的先驗框有更高的平均 IOU 值,這使得模型更容易訓練學習。
Faster R-CNN 使用 anchor boxes 預測邊界框相對先驗框的偏移量,由於沒有對偏移量進行約束,每個位置預測的邊界框可以落在圖片任何位置,會導致模型不穩定,加長訓練時間。YOLOv2 沿用 YOLOv1 的方法,根據所在網格單元的位置來預測坐標,則 Ground Truth 的值介於 0 到 1 之間。網路中將得到的網路預測結果再輸入 sigmoid 函數中,讓輸出結果介於 0 到 1 之間。設一個網格相對於圖片左上角的偏移量是 cx,cy。先驗框的寬度和高度分別是 pw 和 ph,則預測的邊界框相對於特徵圖的中心坐標 (bx,by) 和寬高 bw、bh 的計算公式如下圖所示。
YOLOv2 結合 Dimention Clusters, 通過對邊界框的位置預測進行約束,使模型更容易穩定訓練,這種方式使得模型的 mAP 值提升了約 5%。
YOLOv2 借鑒 SSD 使用多尺度的特徵圖做檢測,提出 pass through 層將高解析度的特徵圖與低解析度的特徵圖聯系在一起,從而實現多尺度檢測。YOLOv2 提取 Darknet-19 最後一個 max pool 層的輸入,得到 26x26x512 的特徵圖。經過 1x1x64 的卷積以降低特徵圖的維度,得到 26x26x64 的特徵圖,然後經過 pass through 層的處理變成 13x13x256 的特徵圖(抽取原特徵圖每個 2x2 的局部區域組成新的 channel,即原特徵圖大小降低 4 倍,channel 增加 4 倍),再與 13x13x1024 大小的特徵圖連接,變成 13x13x1280 的特徵圖,最後在這些特徵圖上做預測。使用 Fine-Grained Features,YOLOv2 的性能提升了 1%.
YOLOv2 中使用的 Darknet-19 網路結構中只有卷積層和池化層,所以其對輸入圖片的大小沒有限制。YOLOv2 採用多尺度輸入的方式訓練,在訓練過程中每隔 10 個 batches , 重新隨機選擇輸入圖片的尺寸,由於 Darknet-19 下采樣總步長為 32,輸入圖片的尺寸一般選擇 32 的倍數 {320,352,…,608}。採用 Multi-Scale Training, 可以適應不同大小的圖片輸入,** 當採用低解析度的圖片輸入時,mAP 值略有下降,但速度更快,當採用高解析度的圖片輸入時,能得到較高 mAP 值,但速度有所下降。**
YOLOv2 借鑒了很多其它目標檢測方法的一些技巧,如 Faster R-CNN 的 anchor boxes, SSD 中的多尺度檢測。除此之外,YOLOv2 在網路設計上做了很多 tricks, 使它能在保證速度的同時提高檢測准確率,Multi-Scale Training 更使得同一個模型適應不同大小的輸入,從而可以在速度和精度上進行自由權衡。
YOLO v2 對 YOLO v1 的缺陷進行優化,大幅度高了檢測的性能,但仍存在一定的問題, 如無法解決重疊問題的分類等 。
將 256x256 的圖片分別輸入以 Darknet-19,ResNet-101,ResNet-152 和 Darknet-53 為基礎網路的分類模型中,實驗得到的結果如下圖所示。可以看到 Darknet-53 比 ResNet-101 的性能更好,而且速度是其 1.5 倍,Darknet-53 與 ResNet-152 性能相似但速度幾乎是其 2 倍。注意到,Darknet-53 相比於其它網路結構實現了每秒最高的浮點計算量,說明其網路結構能更好的利用 GPU。
YOLOv3 借鑒了 FPN 的思想,從不同尺度提取特徵。相比 YOLOv2,YOLOv3 提取最後 3 層特徵圖,不僅在每個特徵圖上分別獨立做預測,同時通過將小特徵圖上采樣到與大的特徵圖相同大小,然後與大的特徵圖拼接做進一步預測。用維度聚類的思想聚類出 9 種尺度的 anchor box,將 9 種尺度的 anchor box 均勻的分配給 3 種尺度的特徵圖 .
在實際應用場合中,一個物體有可能輸入多個類別,單純的單標簽分類在實際場景中存在一定的限制。舉例來說,一輛車它既可以屬於 car(小汽車)類別,也可以屬於 vehicle(交通工具),用單標簽分類只能得到一個類別。因此在 YOLO v3 在網路結構中把原先的 softmax 層換成了邏輯回歸層,從而實現把單標簽分類改成多標簽分類。用多個 logistic 分類器代替 softmax 並不會降低准確率,可以維持 YOLO 的檢測精度不下降。
對於對象檢測,不僅要考慮精度,還要考慮實時運行的性能,雖然現在算力大幅度上升,但是普通的設備跑起來還是有點吃力。提高精度和加快速率仍是目標檢測的重大課題,道阻且長!
參考:
YOLOv1 參考
YOLOv2 參考
YOLOv3 參考
https://mp.weixin.qq.com/s/yccBloK5pOVxDIFkmoY7xg :非極大抑制
❻ 計算機視覺——典型的目標檢測演算法(OverFeat演算法)(二)
【嵌牛導讀】目標檢測在現實中的應用很廣泛,我們需要檢測數字圖像中的物體位置以及類別,它需要我們構建一個模型,模型的輸入一張圖片,模型的輸出需要圈出圖片中所有物體的位置以及物體所屬的類別。在深度學習浪潮到來之前,目標檢測精度的進步十分緩慢,靠傳統依靠手工特徵的方法來提高精度已是相當困難的事。而ImageNet分類大賽出現的卷積神經網路(CNN)——AlexNet所展現的強大性能,吸引著學者們將CNN遷移到了其他的任務,這也包括著目標檢測任務,近年來,出現了很多目標檢測演算法。
【嵌牛鼻子】計算機視覺
【嵌牛提問】如何理解目標檢測演算法——OverFeat
【嵌牛正文】
一、深度學習的典型目標檢測演算法
深度學習目標檢測演算法主要分為 雙階段檢測演算法 和 單階段檢測演算法 ,如圖1所示。
雙階段目標檢測演算法先對圖像提取候選框,然後基於候選區域做二次修正得到檢測結果,檢測精度較高,但檢測速度較慢;單階段目標驗測演算法直接對圖像進行計算生成檢測結果,檢測速度快,但檢測精度低。
1、雙階段目標檢測演算法
雙階段目標檢測方法主要通過選擇性搜索(Selective Search)或者Edge Boxes等演算法對輸入圖像選取可能包含檢測目標的候選區域(Region Proposal),再對候選區域進行分類和位置回歸以得到檢測結果。
1.1 OverFeat 演算法
《OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks》
Sermanet 等改進AlexNet 提出 OverFeat 演算法。該演算法結合AlexNet通過多尺度滑動窗口實現特徵提取功能,並且共享特徵提取層,應用於圖像分類、定位和目標檢測等任務。
關鍵技術:
1、FCN( 全卷積神經網路 )
對於一個各層參數結構都設計好的網路模型,要求輸入圖片的尺寸是固定的(例如,Alexnet要求輸入圖片的尺寸為227px*227px)。如果輸入一張500*500的圖片,希望模型仍然可以一直前向傳導,即一個已經設計完畢的網路,可以輸入任意大小的圖片,這就是FCN。
FCN的思想在於:
1、從卷積層到全連接層,看成是對一整張圖片的卷積層運算。
2、從全連接層到全連接層,看成是採用1*1大小的卷積核,進行卷積層運算。
如上圖所示,綠色部分代表卷積核大小。假設一個CNN模型,其輸入圖片大小是14*14,通過第一層卷積後得到10*10大小的圖片,然後接著通過池化得到了5*5大小的圖片。像但是對於像素值為5*5的圖片到像素值為1*1的圖片的過程中:
(1)傳統的CNN:如果從以前的角度進行理解的話,那麼這個過程就是全連接層,我們會把這個5*5大小的圖片,展平成為一維向量進行計算。
(2)FCN:FCN並不是把5*5的圖片展平成一維向量再進行計算,而是直接採用5*5的卷積核,對一整張圖片進行卷積運算。
二者本質上是相同的,只是角度不同,FCN把這個過程當成了對一整張特徵圖進行卷積,同樣,後面的全連接層也是把它當做是以1*1大小的卷積核進行卷積運算。
當輸入一張任意大小的圖片,就需要利用以上所述的網路,例如輸入一張像素為16*16的圖片:
根據上圖,該網路最後的輸出是一張2*2的圖片。可見採用FCN網路可以輸入任意大小的圖片。同時需要注意的是網路最後輸出的圖片大小不在是一個1*1大小的圖片,而是一個與輸入圖片大小息息相關的一張圖片。
Overfeat就是把採用FCN的思想把全連接層看成了卷積層,在網路測試階段可以輸入任意大小的圖片。
2、offset max-pooling
簡單起見,不用二維的圖像作為例子,而是採用一維作為示例:
如上圖所示,在X軸上有20個神經元,並且選擇池化size=3的非重疊池化,那麼根據之前所學的方法應該是:對上面的20個神經元,從1位置開始進行分組,每3個連續的神經元為一組,然後計算每組的最大值(最大池化),19、20號神經元將被丟棄,如下圖所示:
或者可以在20號神經元後面,添加一個數值為0的神經元編號21,與19、20成為一組,這樣可以分成7組:[1,2,3],[4,5,6]……,
[16,17,18],[19,20,21],最後計算每組的最大值。
如果只分6組,除了以1作為初始位置進行連續組合之外,也可以從位置2或者3開始進行組合。也就是說其實有3種池化組合方法:
A、△=0分組:[1,2,3],[4,5,6]……,[16,17,18];
B、△=1分組:[2,3,4],[5,6,7]……,[17,18,19];
C、△=2分組:[3,4,5],[6,7,8]……,[18,19,20];
對應圖片如下:
以往的CNN中,一般只用△=0的情況,得到池化結果後,就送入了下一層。但是該文獻的方法是,把上面的△=0、△=1、△=2的三種組合方式的池化結果,分別送入網路的下一層。這樣的話,網路在最後輸出的時候,就會出現3種預測結果了。
前面所述是一維的情況,如果是2維圖片的話,那麼(△x,△y)就會有9種取值情況(3*3);如果我們在做圖片分類的時候,在網路的某一個池化層加入了這種offset 池化方法,然後把這9種池化結果,分別送入後面的網路層,最後的圖片分類輸出結果就可以得到9個預測結果(每個類別都可以得到9種概率值,然後我們對每個類別的9種概率,取其最大值,做為此類別的預測概率值)。
演算法原理:
文獻中的演算法,就是把這兩種思想結合起來,形成了文獻最後測試階段的演算法。
1、論文的網路架構與訓練階段
(1)網路架構
對於網路的結構,文獻給出了兩個版本——快速版、精確版,一個精度比較高但速度慢;另外一個精度雖然低但是速度快。下面是高精度版本的網路結構表相關參數:
表格參數說明:
網路輸入:圖片大小為221px*221px;
網路結構方面基本上和AlexNet相同,使用了ReLU激活,最大池化。不同之處在於:(a)作者沒有使用局部響應歸一化層;(b)然後也沒有採用重疊池化的方法;(c)在第一層卷積層,stride作者是選擇了2,這個與AlexNet不同(AlexNet選擇的跨步是4,在網路中,如果stride選擇比較大得話,雖然可以減少網路層數,提高速度,但是卻會降低精度)。
需要注意的是把f7這一層,看成是卷積核大小為5*5的卷積層,總之就是需要把網路看成前面所述的FCN模型,去除了全連接層的概念,因為在測試階段可不是僅僅輸入221*221這樣大小的圖片,在測試階段要輸入各種大小的圖片,具體請看後面測試階段的講解。
(2)網路訓練
訓練輸入:對於每張原圖片為256*256,然後進行隨機裁剪為221*221的大小作為CNN輸入,進行訓練。
優化求解參數設置:訓練的min-batchs選擇128,權重初始化選擇高斯分布的隨機初始化:
然後採用隨機梯度下降法,進行優化更新,動量項參數大小選擇0.6,L2權重衰減系數大小選擇10-5次方。學習率初始化值為0.05,根據迭代次數的增加,每隔幾十次的迭代後,就把學習率的大小減小一半。
然後就是DropOut,這個只有在最後的兩個全連接層,才採用dropout,dropout比率選擇0.5。
2、網路測試階段
在Alexnet的文獻中,預測方法是輸入一張圖片256*256,然後進行multi-view裁剪,也就是從圖片的四個角進行裁剪,還有就是一圖片的中心進行裁剪,這樣可以裁剪到5張224*224的圖片。然後把原圖片水平翻轉一下,再用同樣的方式進行裁剪,又可以裁剪到5張圖片。把這10張圖片作為輸入,分別進行預測分類,在後在softmax的最後一層,求取個各類的總概率,求取平均值。
然而Alexnet這種預測方法存在兩個問題:
一方面這樣的裁剪方式,把圖片的很多區域都給忽略了,這樣的裁剪方式,剛好把圖片物體的一部分給裁剪掉了;
另一方面,裁剪窗口重疊存在很多冗餘的計算,像上面要分別把10張圖片送入網路,可見測試階段的計算量還是較大的。
Overfeat演算法:
訓練完上面所說的網路之後,在測試階段不再是用一張221*221大小的圖片了作為網路的輸入,而是用了6張大小都不相同的圖片,也就是所謂的多尺度輸入預測,如下表格所示:
當網路前向傳導到layer 5的時候,就利用了前面所述的FCN、offset pooling這兩種思想的相結合。現以輸入一張圖片為例(6張圖片的計算方法都相同),講解layer 5後面的整體過程,具體流程示意圖如下:
步驟一:
對於某個尺度的圖片,經過前五層的卷積後得到特徵圖。上圖中特徵圖的解析度是20x23,256個通道。
步驟二:
對於該特徵圖,重復多次使用非重疊的池化,每次池化的偏置不同,有行偏置和列偏置。上圖中偏置池化3次,偏置分別為為(0,1,2)。這就是offset pooling,也被稱為fine stride。offset pooling得到的特徵圖的維度為6x7x3x3xD,其中6x7是特徵圖的解析度,3x3是偏置池化的次數,D是通道數。上圖中是以1維顯示的。
步驟三:
池化後得到的特徵圖將被送入分類器。
步驟四:
分類器的輸入是的5x5xD,輸出是C(類別數)維向量。但是offset pooling後得到的特徵圖並不是5x5xD,比如上圖中的特徵圖大小為6x7xD,因此分類器以滑動窗口的方式應用在特徵圖上,每個滑動窗口經過分類器輸出一個C維向量。比如上圖中輸入的6x7xD的特徵圖最終得到2x3xC的輸出,其中2x3是滑動窗口的個數。
步驟五:
而2x3xC只是一組偏置池化的輸出,總的輸出為2x3x3x3xC,將輸出的張量reshape,得到6x9xC輸出張量。最終輸出分類張量為3d張量,即兩個解析度維度 x C維。
然後需要在後面把它們拉成一維向量,這樣在一個尺度上,可以得到一個C*N個預測值矩陣,每一列就表示圖片屬於某一類別的概率值,並且求取每一列的最大值,作為本尺度的每個類別的概率值。
最後一共用了6種不同尺度(文獻使用了12張,另外6張是水平翻轉的圖片)進行做預測,然後把這六種尺度結果再做一個平均,作為最最後的結果。
從上面過程可以看到整個網路分成兩部分:layer 1~5這五層稱之為特徵提取層;layer 6~output稱之為分類層。
六、定位任務
用於定位任務的時候,就把分類層(上面的layer 6~output)給重新設計一下,把分類改成回歸問題,然後在各種不同尺度上訓練預測物體的bounding box。
❼ 目標跟蹤檢測演算法(一)——傳統方法
姓名:劉帆;學號:20021210609;學院:電子工程學院
https://blog.csdn.net/qq_34919792/article/details/89893214
【嵌牛導讀】目標跟蹤演算法研究難點與挑戰在於實際復雜的應用環境 、背景相似干擾、光照條件的變化、遮擋等外界因素以及目標姿態變化,外觀變形,尺度變化、平面外旋轉、平面內旋轉、出視野、快速運動和運動模糊等。而且當目標跟蹤演算法投入實際應用時,不可避免的一個問題——實時性問題也是非常的重要。正是有了這些問題,才使得演算法研究充滿著難點和挑戰。
【嵌牛鼻子】目標跟蹤演算法,傳統演算法
【嵌牛提問】利用目標跟蹤檢測演算法要達到何目的?第一階段的單目標追蹤演算法包括什麼?具體步驟有哪些?它們有何特點?
【嵌牛正文】
第一階段
目標跟蹤分為兩個部分,一個是對指定目標尋找可以跟蹤的特徵,常用的有顏色,輪廓,特徵點,軌跡等,另一個是對目標特徵進行跟蹤。
1、靜態背景
1)背景差: 對背景的光照變化、雜訊干擾以及周期性運動等進行建模。通過當前幀減去背景圖來捕獲運動物體的過程。
2)幀差: 由於場景中的目標在運動,目標的影像在不同圖像幀中的位置不同。該類演算法對時間上連續的兩幀或三幀圖像進行差分運算,不同幀對應的像素點相減,判斷灰度差的絕對值,當絕對值超過一定閾值時,即可判斷為運動目標,從而實現目標的檢測功能。
與二幀差分法不同的是,三幀差分法(交並運算)去除了重影現象,可以檢測出較為完整的物體。幀間差分法的原理簡單,計算量小,能夠快速檢測出場景中的運動目標。但幀間差分法檢測的目標不完整,內部含有「空洞」,這是因為運動目標在相鄰幀之間的位置變化緩慢,目標內部在不同幀圖像中相重疊的部分很難檢測出來。幀間差分法通常不單獨用在目標檢測中,往往與其它的檢測演算法結合使用。
3)Codebook
演算法為圖像中每一個像素點建立一個碼本,每個碼本可以包括多個碼元(對應閾值范圍),在學習階段,對當前像素點進行匹配,如果該像素值在某個碼元的學習閾值內,也就是說與之前出現過的某種歷史情況偏離不大,則認為該像素點符合背景特徵,需要更新對應點的學習閾值和檢測閾值。
如果新來的像素值與每個碼元都不匹配,則可能是由於動態背景導致,這種情況下,我們需要為其建立一個新的碼元。每個像素點通過對應多個碼元,來適應復雜的動態背景。
在應用時,每隔一段時間選擇K幀通過更新演算法建立CodeBook背景模型,並且刪除超過一段時間未使用的碼元。
4)GMM
混合高斯模型(Gaussian of Micture Models,GMM)是較常用的背景去除方法之一(其他的還有均值法、中值法、滑動平均濾波等)。
首先我們需要了解單核高斯濾波的演算法步驟:
混合高斯建模GMM(Gaussian Mixture Model)作為單核高斯背景建模的擴展,是目前使用最廣泛的一種方法,GMM將背景模型描述為多個分布,每個像素的R、G、B三個通道像素值的變化分別由一個混合高斯模型分布來刻畫,符合其中一個分布模型的像素即為背景像素。作為最常用的一種背景建模方法,GMM有很多改進版本,比如利用紋理復雜度來更新差分閾值,通過像素變化的劇烈程度來動態調整學習率等。
5)ViBe(2011)
ViBe演算法主要特點是隨機背景更新策略,這和GMM有很大不同。其步驟和GMM類似。具體的思想就是為每個像素點存儲了一個樣本集,樣本集中采樣值就是該像素點過去的像素值和其鄰居點的像素值,然後將每一個新的像素值和樣本集進行比較來判斷是否屬於背景點。
其中pt(x)為新幀的像素值,R為設定值,p1、p2、p3….為樣本集中的像素值,以pt(x)為圓心R為半徑的圓被認為成一個集,當樣本集與此集的交集大於設定的閾值#min時,可認為此為背景像素點(交集越大,表示新像素點與樣本集越相關)。我們可以通過改變#min的值與R的值來改變模型的靈敏度。
Step1:初始化單幀圖像中每個像素點的背景模型。假設每一個像素和其鄰域像素的像素值在空域上有相似的分布。基於這種假設,每一個像素模型都可以用其鄰域中的像素來表示。為了保證背景模型符合統計學規律,鄰域的范圍要足夠大。當輸入第一幀圖像時,即t=0時,像素的背景模型。其中,NG(x,y)表示空域上相鄰的像素值,f(xi,yi)表示當前點的像素值。在N次的初始化的過程中,NG(x,y)中的像素點(xi,yi)被選中的可能次數為L=1,2,3,…,N。
Step2:對後續的圖像序列進行前景目標分割操作。當t=k時,像素點(x,y)的背景模型為BKm(x,y),像素值為fk(x,y)。按照下面判斷該像素值是否為前景。這里上標r是隨機選的;T是預先設置好的閾值。當fk(x,y)滿足符合背景#N次時,我們認為像素點fk(x,y)為背景,否則為前景。
Step3:ViBe演算法的更新在時間和空間上都具有隨機性。每一個背景點有1/ φ的概率去更新自己的模型樣本值,同時也有1/ φ的概率去更新它的鄰居點的模型樣本值。更新鄰居的樣本值利用了像素值的空間傳播特性,背景模型逐漸向外擴散,這也有利於Ghost區域的更快的識別。同時當前景點計數達到臨界值時將其變為背景,並有1/ φ的概率去更新自己的模型樣本值(為了減少緩慢移動物體的影響和攝像機的抖動)。
可以有如下總結,ViBe中的每一個像素點在更新的時候都有一個時間和空間上隨機影響的范圍,這個范圍很小,大概3x3的樣子,這個是考慮到攝像頭抖動時會有坐標的輕微來回變化,這樣雖然由於ViBe的判別方式仍認為是背景點,但是也會對後面的判別產生影響,為了保證空間的連續性,隨機更新減少了這個影響。而在樣本值保留在樣本集中的概率隨著時間的增大而變小,這就保證了像素模型在時間上面的延續特性。
6)光流
光流是由物體或相機的運動引起的圖像對象在兩個連續幀之間的視在運動模式。它是2D矢量場,其中每個矢量是一個位移矢量,顯示點從第一幀到第二幀的移動。
光流實際上是一種特徵點跟蹤方法,其計算的為向量,基於三點假設:
1、場景中目標的像素在幀間運動時亮度(像素值或其衍生值)不發生變化;2、幀間位移不能太大;3、同一表面上的鄰近點都在做相同的運動;
光流跟蹤過程:1)對一個連續視頻幀序列進行處理;2)對每一幀進行前景目標檢測;3)對某一幀出現的前景目標,找出具有代表性的特徵點(Harris角點);4)對於前後幀做像素值比較,尋找上一幀在當前幀中的最佳位置,從而得到前景目標在當前幀中的位置信息;5)重復上述步驟,即可實現目標跟蹤
2、運動場(分為相機固定,但是視角變化和相機是運動的)
1)運動建模(如視覺里程計運動模型、速度運動模型等)
運動學是對進行剛性位移的相機進行構型,一般通過6個變數來描述,3個直角坐標,3個歐拉角(橫滾、俯仰、偏航)。
Ⅰ、對相機的運動建模
由於這個不是我們本次所要討論的重點,但是在《概率機器人》一書中提出了很多很好的方法,相機的運動需要對圖像內的像素做位移矩陣和旋轉矩陣的坐標換算。除了對相機建立傳統的速度運動模型外,也可以用視覺里程計等通關過置信度的更新來得到概率最大位置。
Ⅱ、對於跟蹤目標的運動建模
該方法需要提前通過先驗知識知道所跟蹤的目標對象是什麼,比如車輛、行人、人臉等。通過對要跟蹤的目標進行建模,然後再利用該模型來進行實際的跟蹤。該方法必須提前知道要跟蹤的目標對象是什麼,然後再去跟蹤指定的目標,這是它的局限性,因而其推廣性相對比較差。(比如已知跟蹤的物體是羽毛球,那很容易通過前幾幀的取點,來建立整個羽毛球運動的拋物線模型)
2)核心搜索演算法(常見的預測演算法有Kalman(卡爾曼)濾波、擴展卡爾曼濾波、粒子濾波)
Ⅰ、Kalman 濾波
Kalman濾波器是通過前一狀態預測當前狀態,並使用當前觀測狀態進行校正,從而保證輸出狀態平穩變化,可有效抵抗觀測誤差。因此在運動目標跟蹤中也被廣泛使用。
在視頻處理的運動目標跟蹤里,每個目標的狀態可表示為(x,y,w,h),x和y表示目標位置,w和h表示目標寬高。一般地認為目標的寬高是不變的,而其運動速度是勻速,那麼目標的狀態向量就應該擴展為(x,y,w,h,dx,dy),其中dx和dy是目標當前時刻的速度。通過kalman濾波器來估計每個時刻目標狀態的大致過程為:
對視頻進行運動目標檢測,通過簡單匹配方法來給出目標的第一個和第二個狀態,從第三個狀態開始,就先使用kalman濾波器預測出當前狀態,再用當前幀圖像的檢測結果作為觀測值輸入給kalman濾波器,得到的校正結果就被認為是目標在當前幀的真實狀態。(其中,Zt為測量值,為預測值,ut為控制量,Kt為增益。)
Ⅱ、擴展卡爾曼濾波(EKF)和無跡卡爾曼濾波(UKF)
由於卡爾曼濾波的假設為線性問題,無法直接用在非線性問題上,EKF和UKF解決了這個問題(這個線性問題體現在用測量量來計算預測量的過程中)。EKF是通過構建線性函數g(x),與非線性函數相切,並對每一時刻所求得的g(x)做KF,如下圖所示。
UKF與EKF去求解雅可比矩陣擬合線性方程的方法不同,通過對那個先驗分布中的採集點,來線性化隨機變數的非線性函數。與EKF所用的方法不同,UKF產生的高斯分布和實際高斯分布更加接近,其引起的近似誤差也更小。
Ⅲ、粒子濾波
1、初始狀態:基於粒子濾波的目標追蹤方法是一種生成式跟蹤方法,所以要有一個初始化的階段。對於第一幀圖像,人工標定出待檢測的目標,對該目標區域提出特徵;
2、搜索階段:現在已經知道了目標的特徵,然後就在目標的周圍撒點(particle), 如:a)均勻的撒點;b)按高斯分布撒點,就是近的地方撒得多,遠的地方撒的少。論文里使用的是後一種方法。每一個粒子都計算所在區域內的顏色直方圖,如初始化提取特徵一樣,然後對所有的相似度進行歸一化。文中相似性使用的是巴氏距離;
3、重采樣:根據粒子權重對粒子進行篩選,篩選過程中,既要大量保留權重大的粒子,又要有一小部分權重小的粒子;
4、狀態轉移:將重采樣後的粒子帶入狀態轉移方程得到新的預測粒子;
5、測量及更新:對目標點特徵化,並計算各個粒子和目標間的巴氏距離,更新粒子的權重;
6、決策階段:每個粒子都獲得一個和目標的相似度,相似度越高,目標在該范圍出現的可能性越高,將保留的所有粒子通過相似度加權後的結果作為目標可能的位置。
3)Meanshift演算法
MeanShift演算法屬於核密度估計法,它不需要任何先驗知識而完全依靠特徵空間中樣本點的計算其密度函數值。對於一組采樣數據,直方圖法通常把數據的值域分成若干相等的區間,數據按區間分成若干組,每組數據的個數與總參數個數的比率就是每個單元的概率值;核密度估計法的原理相似於直方圖法,只是多了一個用於平滑數據的核函數。採用核函數估計法,在采樣充分的情況下,能夠漸進地收斂於任意的密度函數,即可以對服從任何分布的數據進行密度估計。
Meanshift演算法步驟
1、通過對初始點(或者上一幀的目標點)為圓心,繪制一個半徑為R的圓心,尋找特徵和該點相似的點所構成的向量;
2、所有向量相加,可以獲得一個向量疊加,這個向量指向特徵點多的方向;
3、取步驟二的向量終點為初始點重復步驟一、二,直到得到的向量小於一定的閾值,也就是說明當前位置是特徵點密度最密集的地方,停止迭代,認為該點為當前幀的目標點;
4)Camshift演算法
Camshift演算法是MeanShift演算法的改進,稱為連續自適應的MeanShift演算法。Camshift 是由Meanshift 推導而來 Meanshift主要是用在單張影像上,但是獨立一張影像分析對追蹤而言並無意義,Camshift 就是利用MeanShift的方法,對影像串列進行分析。
1、首先在影像串列中選擇目標區域。
2、計算此區域的顏色直方圖(特徵提取)。
3、用MeanShift演演算法來收斂欲追蹤的區域。
4、通過目標點的位置和向量信息計算新的窗口大小,並標示之。
5、以此為參數重復步驟三、四。
Camshift 關鍵就在於當目標的大小發生改變的時候,此演算法可以自適應調整目標區域繼續跟蹤。
3、小結
第一階段的單目標追蹤演算法基本上都是傳統方法,計算量小,在嵌入式等設備中落地較多,opencv中也預留了大量的介面。通過上面的兩節的介紹,我們不難發現,目標檢測演算法的步驟分為兩部分,一部分是對指定目標尋找可以跟蹤的特徵,常用的有顏色,輪廓,特徵點,軌跡等,另一部分是對目標特徵進行跟蹤,如上文所提及的方法。所以目標檢測方法的發展,也可總結為兩個方面,一個是如何去獲得更加具有區分性的可跟蹤的穩定特徵,另一個是如何建立幀與幀之間的數據關聯,保證跟蹤目標是正確的。
隨著以概率為基礎的卡爾曼濾波、粒子濾波或是以Meanshift為代表向量疊加方法在目標檢測的運用,使得目標檢測不再需要假設自身的一個狀態為靜止的,而是可以是運動的,更加符合復雜場景中的目標跟蹤。