YOLO介紹?
YOLO,全稱為You Only Look Once: Unified, Real-Time Object Detection,是一種實時目標檢測算法。目標檢測是計算機視覺領域的一個重要任務,它不僅需要識別圖像中的物體類別,還需要確定它們的位置。與分類任務只關注對象是什么不同,目標檢測需要同時處理離散的類別數據和連續的位置數據。YOLO算法基于深度學習的回歸方法,它將目標檢測問題轉化為一個回歸問題,使用單個卷積神經網絡(CNN)直接從輸入圖像預測邊界框(bounding box)和類別概率。這種方法避免了傳統目標檢測算法中復雜的多階段處理流程,如區域提議、特征提取等。
- YOLO的網絡結構受到了GoogLeNet的啟發,包含24個卷積層和2個全連接層。在YOLO v1中,作者使用了1×1的降維層緊跟著3×3的卷積層來代替GoogLeNet的inception模塊。
- YOLO將輸入圖像分割成S×S的網格,每個網格單元負責檢測中心點落在該單元內的目標。這種策略簡化了目標的定位過程,并允許模型快速地對多個目標進行定位和分類。
- YOLO的設計強調實時性能,通過一次前向傳播就可以完成檢測任務,這使得它非常適合用于視頻流分析或其他需要快速響應的應用場合。
Yolo算法采用一個單獨的CNN模型實現end-to-end的目標檢測,核心思想就是利用整張圖作為網絡的輸入,直接在輸出層回歸 bounding box(邊界框) 的位置及其所屬的類別:
首先將輸入圖片resize到448x448,然后送入CNN網絡,最后處理網絡預測結果得到檢測的目標。相比R-CNN算法,其是一個統一的框架,其速度更快。
Yolo算法思想?:
Yolo模型采用預定義預測區域的方法來完成目標檢測,具體而言是將原始圖像劃分為 7x7=49 個網格(grid),每個網格允許預測出2個邊框(bounding box,包含某個對象的矩形框),總共 49x2=98 個bounding box。我們將其理解為98個預測區,很粗略的覆蓋了圖片的整個區域,就在這98個預測區中進行目標檢測。
?Yolo的網絡結構?
YOLO的結構非常簡單,就是單純的卷積、池化最后加了兩層全連接,從網絡結構上看,與前面介紹的CNN分類網絡沒有本質的區別,最大的差異是輸出層用線性函數做激活函數,因為需要預測bounding box的位置(數值型),而不僅僅是對象的概率。YOLO的整個結構就是輸入圖片經過神經網絡的變換得到一個輸出的張量?
- 網絡的輸入是原始圖像,唯一的要求是縮放到448x448的大小。主要是因為Yolo的網絡中,卷積層最后接了兩個全連接層,全連接層是要求固定大小的向量作為輸入,所以Yolo的輸入圖像的大小固定為448x448。
- 網絡的輸出就是一個7x7x30 的張量。
根據YOLO的設計,輸入圖像被劃分為 7x7 的網格(grid),輸出張量中的 7x7 就對應著輸入圖像的 7x7 網格。
Yolo模型的訓練?
?在進行模型訓練時,需要構造訓練樣本和設計損失函數,才能利用梯度下降對網絡進行訓練。
將一幅圖片輸入到yolo模型中,對應的輸出是一個7x7x30張量,構建標簽label時對于原圖像中的每一個網格grid都需要構建一個30維的向量。
- 20個對象分類的概率
對于輸入圖像中的每個對象,先找到其中心點。上圖中自行車,其中心點在黃色圓點位置,中心點落在黃色網格內,所以這個黃色網格對應的30維向量中,自行車的概率是1,其它對象的概率是0。所有其它48個網格的30維向量中,該自行車的概率都是0。這就是"中心點所在的網格對預測該對象負責"。
- 2個bounding box的位置
訓練樣本的bbox位置應該填寫對象真實的位置bbox,填哪一個需要根據網絡輸出的bbox與對象實際bbox的IOU來選擇。
Yolo先使用ImageNet數據集對前20層卷積網絡進行預訓練,然后使用完整的網絡,在PASCAL VOC數據集上進行對象識別和定位的訓練。
Yolo的最后一層采用線性激活函數,其它層都是Leaky ReLU。訓練中采用了drop out和數據增強來防止過擬合。
?yoloV4算法
YOLOv4是YOLO系列算法的第四代版本,它在YOLOv3的基礎上進行了一系列改進和優化,以實現更高的檢測精度和更快的處理速度,為了提高模型的泛化能力和防止過擬合,YOLOv4還引入了Dropblock正則化方法。這種方法在訓練過程中逐漸增加遮擋的比例,迫使網絡學習更加魯棒的特征表示。
YOLOv4的網絡結構由四個關鍵部分組成:Input、Backbone、Neck和Head。
- Input部分:這是網絡的輸入端,負責接收待處理的圖像數據。
- Backbone部分 (CSPDarknet53):這部分是整個網絡結構的主干,主要負責對輸入圖像進行特征提取。CSPDarknet53是一種殘差網絡,它通過CSP(Cross Stage Partial)模塊優化了梯度流和計算量,相較于DarkNet53,CSPDarknet53在保持準確率的同時減少了計算量。每個CSP模塊都會使輸出的特征圖大小減半而通道數增倍,有利于提取更深層的特征。
- Neck部分 (SPP和PANet):Neck部分緊隨Backbone,用于進一步加強特征提取。SPP(空間金字塔池化)可以融合不同尺寸的特征,增大模型的感受野,而PANet(路徑聚合網絡)則是FPN(特征金字塔網絡)的加強版,它融合了自底向上和自頂向下的特征信息,反復提取特征,以增強模型的表征能力。
- Head部分 (YOLOv3):最后是Head部分,也就是預測頭部,負責進行最終的邊界框預測和類別概率輸出。YOLOv4采用了YOLOv3作為其Head,利用前面提取的特征來執行實際的目標檢測任務。
yoloV4網絡的輸入依然要求是32的倍數,但大小不是固定的,在yoloV4中默認是608×608,在實際項目中也可以根據需要修改,比如320×320,一般是32的倍數。 輸入圖像的大小和最后的三個特征圖的大小也是對應的,比如416×416的輸入,最后的三個特征圖大小是13×13,26×26,52×52, 如果是608×608,最后的三個特征圖大小則是19×19,38×38,76×76。
yoloV4在輸入端除了采用常規的反轉、裁切、旋轉等方法外,主要采用了CutMix和馬賽克數據增強,馬賽克增強方式將4張訓練圖像按一定比例組合成1張。Mosaic增強方式使得模型能夠學習如何識別尺寸小的物體,還能夠幫助模型在圖像的不同部分定位不同類型的目標。
模型訓練?
yoloV4中的模型訓練與預測和YoloV3幾乎是一樣的,包括正負樣本的設置方式,損失函數的構成及訓練過程。唯一不同是在計算回歸值得損失時,V4中采用了IOU的損失。IOU損失非常簡單,直接使用檢測框與真實框的交并比并取對數作為回歸的損失函數?
GIOU損失是為了緩解IOU損失的問題提出來的,這種方式存在的問題是當檢測框在真實框內部或正式框在檢測框內部時,無法衡量差集,損失函數退化為1-IOU。
- 系統環境配置:確保您的計算機系統滿足訓練YOLOv4的要求。常見的配置包括Windows或Linux操作系統,以及安裝有CUDA和cuDNN的NVIDIA顯卡。
- 獲取YOLOv4代碼:從GitHub上克隆YOLOv4的官方代碼倉庫,該倉庫提供了訓練YOLOv4所需的所有腳本和配置文件。
- 數據集準備:準備用于訓練的目標檢測數據集。如果是視頻數據,需要先將視頻幀提取為圖片格式。此外,還需要對數據集進行標注,生成包含物體類別和位置信息的注釋文件。
- 修改配置文件:根據您的數據集和訓練需求,修改YOLOv4的配置文件。這些配置文件中定義了模型參數、訓練參數以及數據加載方式等重要信息。
- 模型訓練:使用準備好的數據集和配置文件開始訓練YOLOv4模型。訓練過程中,模型會學習識別和定位圖像中的物體。
- 模型評估:在訓練完成后,使用驗證集對模型的性能進行評估,檢查模型的準確率和召回率等指標。
- 模型部署:將訓練好的模型部署到實際應用中,如監控系統、自動駕駛車輛或其他需要實時目標檢測的場合。
- 優化調整:根據模型在實際應用場景中的表現,進一步調整模型參數或數據集,以提高模型的準確性和魯棒性。
?我們還需要參考YOLOv4的官方文檔、相關教程以及社區提供的經驗分享。