導航:首頁 > 源碼編譯 > 網下下載的目標檢測源碼如何預測

網下下載的目標檢測源碼如何預測

發布時間:2024-11-08 15:30:35

1. 目標檢測 YOLO系列——YOLO v1

YOLO v1:You Only Look Once: Unified, Real-Time Object Detection
YOLO v2:YOLO9000:Better,Faster,Stronger
YOLO v3:YOLOv3: An Incremental Improvement

近幾年來,目標檢測演算法取得了很大的突破。比較流行的演算法可以分為兩類,一類是基於Region Proposal的R-CNN系演算法(R-CNN,Fast R-CNN, Faster R-CNN),它們是two-stage的,需要先使用啟發式方法(selective search)或者CNN網路(RPN)產生Region Proposal,然後再在Region Proposal上做分類與回歸。而另一類是Yolo,SSD這類one-stage演算法,其僅僅使用一個CNN網路直接預測不同目標的類別與位置。第一類方法是准確度高一些,但是速度慢,但是第二類演算法是速度快,但是准確性要低一些。這里我們談的是Yolo-v1版本演算法,其性能是差於後來的SSD演算法的,但是Yolo後來也繼續進行改進,產生了Yolo9000、YOLO v3演算法。

傳統方法常採用滑動窗口法,滑動窗口的目標檢測演算法思路非常簡單,它將檢測問題轉化為了圖像分類問題。其基本原理就是採用不同大小和比例(寬高比)的窗口在整張圖片上以一定的步長進行滑動,然後對這些窗口對應的區域做圖像分類,這樣就可以實現對整張圖片的檢測了,如 DPM 就是採用這種思路。但是這個方法有致命的缺點,就是你並不知道要檢測的目標大小是什麼規模,所以你要設置不同大小和比例的窗口去滑動,而且還要選取合適的步長。但是這樣會產生很多的子區域,並且都要經過分類器去做預測,這需要很大的計算量,所以你的分類器不能太復雜,因為要保證速度。解決思路之一就是減少要分類的子區域,這就是R-CNN的一個改進策略,其採用了 selective search 方法來找到最有可能包含目標的子區域(Region Proposal),其實可以看成採用啟發式方法過濾掉很多子區域,這會提升效率。

如果你使用的是CNN分類器,那麼滑動窗口是非常耗時的。但是結合卷積運算的特點,我們可以使用CNN實現更高效的滑動窗口方法。這里要介紹的是一種全卷積的方法,簡單來說就是網路中用卷積層代替了全連接層,如圖所示。輸入圖片大小是16x16,經過一系列卷積操作,提取了2x2的特徵圖,但是這個2x2的圖上每個元素都是和原圖是一一對應的,如圖上藍色的格子對應藍色的區域,這不就是相當於在原圖上做大小為14x14的窗口滑動,且步長為2,共產生4個字區域。最終輸出的通道數為4,可以看成4個類別的預測概率值,這樣一次CNN計算就可以實現窗口滑動的所有子區域的分類預測。這其實是overfeat演算法的思路。之所可以CNN可以實現這樣的效果是因為卷積操作的特性,就是圖片的空間位置信息的不變性,盡管卷積過程中圖片大小減少,但是位置對應關系還是保存的。這個思路也被R-CNN借鑒,從而誕生了Fast R-cNN演算法。

上面盡管可以減少滑動窗口的計算量,但是只是針對一個固定大小與步長的窗口,這是遠遠不夠的。Yolo演算法很好的解決了這個問題,它不再是窗口滑動了,而是直接將原始圖片分割成互不重合的小方塊,然後通過卷積最後生產這樣大小的特徵圖,基於上面的分析,可以認為特徵圖的每個元素也是對應原始圖片的一個小方塊,然後用每個元素來可以預測那些中心點在該小方格內的目標,這就是Yolo演算法的樸素思想。

整體來看,Yolo演算法採用一個單獨的CNN模型實現end-to-end的目標檢測,整個系統如圖所示:首先將輸入圖片resize到448x448,然後送入CNN網路,最後處理網路預測結果得到檢測的目標。相比R-CNN演算法,其是一個統一的框架,其速度更快,而且Yolo的訓練過程也是end-to-end的。

具體來說,Yolo的CNN網路將輸入的圖片分割成 網格,然後每個單元格負責去檢測那些中心點落在該格子內的目標,如圖所示,可以看到狗這個目標的中心落在左下角一個單元格內,那麼該單元格負責預測這個狗。每個單元格會預測B個邊界框(bounding box)以及邊界框的 置信度 (confidence score)。所謂置信度其實包含兩個方面,一是這個邊界框含有目標的可能性大小,二是這個邊界框的准確度。前者記為 ,當該邊界框是背景時(即不包含目標),此時 。而當該邊界框包含目標時, 。邊界框的准確度可以用預測框與實際框(ground truth)的 IOU (intersection over union,交並比)來表徵,記為 IOU 。因此置信度可以定義為 。

很多人可能將Yolo的置信度看成邊界框是否含有目標的概率,但是其實它是兩個因子的乘積,預測框的准確度也反映在裡面。邊界框的大小與位置可以用4個值來表徵:(x,y,h,w),其中(x,y)是邊界框的中心坐標,而w和h是邊界框的寬與高。還有一點要注意,中心坐標的預測值(x,y)是相對於每個單元格左上角坐標點的偏移值,並且單位是相對於單元格大小的,單元格的坐標定義如圖所示。而邊界框的w和h預測值是相對於整個圖片的寬與高的比例,這樣理論上4個元素的大小應該在[0,1]范圍。這樣,每個邊界框的預測值實際上包含5個元素:(x,y,w,h,c),其中前4個表徵邊界框的大小與位置,而最後一個值是置信度。

值得注意的是,不管一個單元格預測多少個邊界框,其只預測一組類別概率值,這是Yolo演算法的一個缺點,在後來的改進版本中,Yolo9000是把類別概率預測值與邊界框是綁定在一起的。同時,我們可以計算出各個邊界框類別置信度(class-specificconfidence scores):

邊界框類別置信度表徵的是該邊界框中目標屬於各個類別的可能性大小以及邊界框匹配目標的好壞。後面會說,一般會根據類別置信度來過濾網路的預測框。

總結一下,每個單元格需要預測 個值。如果將輸入圖片劃分為 網格,那麼最終預測值為 大小的張量。整個模型的預測值結構如下圖所示。對於PASCALVOC數據,其共有20個類別,如果使用S=7,B=2,那麼最終的預測結果就是 大小的張量。在下面的網路結構中我們會詳細講述每個單元格的預測值的分布位置。

Yolo採用卷積網路來提取特徵,然後使用全連接層來得到預測值。網路結構參考GooLeNet模型,包含24個卷積層和2個全連接層,如圖所示。對於卷積層,主要使用1x1卷積來做channle rection,然後緊跟3x3卷積。對於卷積層和全連接層,採用Leaky ReLU激活函數:max(x,0)。但是最後一層卻採用線性激活函數。除了上面這個結構,文章還提出了一個輕量級版本Fast Yolo,其僅使用9個卷積層,並且卷積層中使用更少的卷積核。

可以看到網路的最後輸出為 大小的張量。這和前面的討論是一致的。這個張量所代表的具體含義如圖所示。對於每一個單元格,前20個元素是類別概率值,然後2個元素是邊界框置信度,兩者相乘可以得到類別置信度,最後8個元素是邊界框的(x,y,w,h)。大家可能會感到奇怪,對於邊界框為什麼把置信度c和(x,y,w,h)都分開排列,而不是按照(x,y,w,h,c)這樣排列,其實純粹是為了計算方便,因為實際上這30個元素都是對應一個單元格,其排列是可以任意的。但是分離排布,可以方便地提取每一個部分。這里來解釋一下,首先網路的預測值是一個二維張量P,其shape為 。

採用切片,那麼 就是類別概率部分; 是置信度部分; 是邊界框的預測結果。這樣,提取每個部分是非常方便的,這會方面後面的訓練及預測時的計算。

在訓練之前,先在ImageNet上進行了預訓練,其預訓練的分類模型採用圖中前20個卷積層,然後添加一個average-pool層和全連接層。預訓練之後,在預訓練得到的20層卷積層之上加上隨機初始化的4個卷積層和2個全連接層。由於檢測任務一般需要更高清的圖片,所以將網路的輸入從224x224增加到了448x448。整個網路的流程如下圖所示:

損失函數計算如下:

其中第一項是邊界框中心坐標的誤差項, 指的是第i個單元格存在目標,且該單元格中的第j個邊界框負責預測該目標。第二項是邊界框的高與寬的誤差項。第三項是包含目標的邊界框的置信度誤差項。第四項是不包含目標的邊界框的置信度誤差項。而最後一項是包含目標的單元格的分類誤差項, 指的是第i個單元格存在目標。

在說明Yolo演算法的預測過程之前,這里先介紹一下非極大值抑制演算法(non maximum suppression, NMS),這個演算法不單單是針對Yolo演算法的,而是所有的檢測演算法中都會用到。NMS演算法主要解決的是一個目標被多次檢測的問題,如圖中人臉檢測,可以看到人臉被多次檢測,但是其實我們希望最後僅僅輸出其中一個最好的預測框,比如對於美女,只想要紅色那個檢測結果。那麼可以採用NMS演算法來實現這樣的效果:首先從所有的檢測框中找到置信度最大的那個框,然後挨個計算其與剩餘框的IOU,如果其值大於一定閾值(重合度過高),那麼就將該框剔除;然後對剩餘的檢測框重復上述過程,直到處理完所有的檢測框。

下面就來分析Yolo的預測過程,這里我們不考慮batch,認為只是預測一張輸入圖片。根據前面的分析,最終的網路輸出是 ,但是我們可以將其分割成三個部分:類別概率部分為 ,置信度部分為 ,而邊界框部分為 (對於這部分不要忘記根據原始圖片計算出其真實值)。然後將前兩項相乘可以得到 類別置信度值為 ,這里總共預測了 邊界框。

所有的准備數據已經得到了,那麼先說第一種策略來得到檢測框的結果。首先,對於每個預測框根據類別置信度選取置信度最大的那個類別作為其預測標簽,經過這層處理我們得到各個預測框的預測類別及對應的置信度值,其大小都是[7,7,2]。一般情況下,會設置置信度閾值,就是將置信度小於該閾值的box過濾掉,所以經過這層處理,剩餘的是置信度比較高的預測框。最後再對這些預測框使用NMS演算法,最後留下來的就是檢測結果。一個值得注意的點是NMS是對所有預測框一視同仁,還是區分每個類別,分別使用NMS。Ng在deeplearning.ai中講應該區分每個類別分別使用NMS,但是看了很多實現,其實還是同等對待所有的框,可能是不同類別的目標出現在相同位置這種概率很低吧。

上面的預測方法應該非常簡單明了,但是對於Yolo演算法,其卻採用了另外一個不同的處理思路(至少從C源碼看是這樣的),其區別就是先使用NMS,然後再確定各個box的類別。其基本過程如圖所示。對於98個boxes,首先將小於置信度閾值的值歸0,然後分類別地對置信度值採用NMS,這里NMS處理結果不是剔除,而是將其置信度值歸為0。最後才是確定各個box的類別,當其置信度值不為0時才做出檢測結果輸出。這個策略不是很直接,但是貌似Yolo源碼就是這樣做的。Yolo論文裡面說NMS演算法對Yolo的性能是影響很大的,所以可能這種策略對Yolo更好。

總結一下Yolo的優缺點。首先是優點,Yolo採用一個CNN網路來實現檢測,是單管道策略,其訓練與預測都是end-to-end,所以Yolo演算法比較簡潔且速度快。第二點由於Yolo是對整張圖片做卷積,所以其在檢測目標有更大的視野,它不容易對背景誤判。另外,Yolo的泛化能力強,在做遷移時,模型魯棒性高。

Yolo的缺點,首先Yolo各個單元格僅僅預測兩個邊界框,而且屬於一個類別。對於小物體,Yolo的表現會不如人意。這方面的改進可以看SSD,其採用多尺度單元格。也可以看Faster R-CNN,其採用了anchor boxes。Yolo對於在物體的寬高比方面泛化率低,就是無法定位不尋常比例的物體。當然Yolo的定位不準確也是很大的問題。

參考鏈接
YOLO演算法的原理與實現
https://cloud.tencent.com/developer/article/1058057

2. 單目3D目標檢測

單目3D目標檢測是計算機視覺領域中的一項重要任務,旨在識別出目標的類別以及在相機坐標系下的精確位置。這個過程通常分為三個關鍵部分:確定目標類別、獲取邊界框信息(高度、寬度、長度、位置坐標、朝向角度)和回歸目標的八個關鍵點坐標。本文將詳細闡述這一技術的實現流程和關鍵組件。

首先,單目3D目標檢測系統通常包含一個主幹網路(如DLA-34),該網路用於提取特徵並生成目標中心點的熱力圖,這是檢測的基礎。熱力圖的生成基於高斯核函數,其半徑大小根據目標的實際寬度和高度確定,確保即使存在中心點微小偏移,也能正確檢測目標。然後,通過約束處理,將熱力圖結果轉換為概率值,范圍在0到1之間。

接下來,進行3D邊界框回歸,這一過程涉及到深度偏移、中心點偏移、尺寸偏移、方向角等參數的預測。預測結果經過變換調整,例如將深度偏移范圍調整至(-0.5, 0.5),方向角歸一化至(sin, cos)形式,以適應後續處理。這些預測值經過解碼,計算目標在相機坐標系下的實際位置,其中關鍵一步是利用相機成像原理計算目標的全局方位角。

在訓練階段,採用GaussianFocalLoss和L1Loss作為損失函數。GaussianFocalLoss在正樣本附近引入額外的約束,以減少對中心點附近的負樣本損失的影響。L1Loss用於衡量預測值與實際值之間的差異,確保回歸結果的精確性。

為了進一步提升檢測性能,引入了fcos3D模型,該模型通過共享權重的頭部網路預測目標中心點位置(centerness)和3D邊界框參數。其中,centerness分支用於衡量預測點與真實目標中心點的相對距離,通過計算目標中心點與預測框中心點之間的距離,使用特定公式進行計算。此外,fcos3D模型還通過FocalLoss進行損失計算,並採用SmoothL1loss、CrossEntropyLoss等損失函數,以平衡不同尺度的目標檢測和分類任務。

除了上述模型外,還存在如3D BBox Estimation Using Deep Learning and Geometry的論文,該方法利用目標的2D邊界框和相機幾何關系來推測目標的中心點位置,同時設計網路回歸目標的三維尺寸和偏航角。通過將360°角度分解為方向分類和角度回歸,得到目標的全局偏航角,並結合先驗尺寸信息,最終通過相機投影反向計算目標的3D中心點。

在實現過程中,可變形卷積(DCN)被廣泛應用於這些模型中。DCN相比傳統卷積,引入了偏移量(offset)概念,通過學習這些偏移量,可變形卷積能夠更加精準地定位目標,減少背景干擾,提升檢測效果。理解DCN的原理和應用,需要參考相關源碼和教程,如Deformable ConvNets v2 Pytorch版源碼講解。

總結而言,單目3D目標檢測技術通過復雜的特徵提取、多參數回歸和損失函數優化,實現了對目標的精確識別和定位。其中,可變形卷積的引入顯著提升了檢測的准確性,使得這一技術在自動駕駛、機器人視覺等領域展現出巨大的應用潛力。

閱讀全文

與網下下載的目標檢測源碼如何預測相關的資料

熱點內容
碳酸銀的分解壓力是多少 瀏覽:108
高級語言都是編譯程序嗎 瀏覽:64
考研c語言常見演算法 瀏覽:751
怎麼進入tty1命令行 瀏覽:971
識貨app買衣服為什麼跳轉淘寶 瀏覽:613
手機dns加密打開好還是關閉好 瀏覽:425
手機如何安裝googleplay伺服器 瀏覽:644
程序員面試寶典epub 瀏覽:283
python百套源碼案例下載 瀏覽:969
psd源碼分享 瀏覽:997
xp系統定時關機命令 瀏覽:739
文件夾更名為另一個文件夾的操作 瀏覽:984
往復式壓縮機氣閥工作原理 瀏覽:916
50萬人用什麼伺服器好 瀏覽:796
如何用命令方塊提醒全部人 瀏覽:228
電腦nc命令 瀏覽:397
葯典app哪個好 瀏覽:40
29歲程序員未來規劃 瀏覽:225
線上出租民宿下載什麼app 瀏覽:413
售前程序員 瀏覽:526