YOLO v1的詳解與復現

2022-05-18 18:52:11 字數 2290 閱讀 5937

yolov1是乙個快速的one-stage目標檢測器,獨樹一幟的用劃分網格的策略實現目標檢測,本文將詳細解釋yolov1演算法,並簡述如何用pytorch復現該演算法。pytorch-yolov1 github 本文屬於作者的理解,難免出現錯誤或者瑕疵,還請諒解與指正。

簡單回顧一下目標檢測的做法,1.採用滑動視窗,對每個視窗分類和位置修正;2.rpn的方式先提取候選區域,特徵圖對應候選區域範圍經過roipooling得到所需特徵;3.ssd繼承rpn類似的anchor機制,設定預設框並對每個預設框賦予groundtruth,全卷積網路訓練目標。

yolo將輸入影象劃分為 $ s\times s $ 的網格,物體的中心落在哪乙個網格內,這個網格就負責**該物體的置信度,類別以及位置。

網路最後的輸出是 $ s\times s\times 30 $ 的資料塊,yolov1是含有全連線層的,這個資料塊可以通過reshape得到。也就是說,輸出其實已經丟失了位置資訊(在v2,v3中用全卷積網路,每個輸出點都能有各自對應的感受野範圍)。這麼一看,yolov1根據每張影象的目標label,編碼出乙個 $ s\times s\times 30 $ 的資料塊,然後讓卷積網路去擬合這個target,簡單粗暴。

來看看 $ s\times s\times 30 $ 的資料塊的具體含義。

網路結構在分類網路的基礎上改進,v1的結構很簡單,在v2,v3中,或者其他檢測網路中,普遍會用特徵層跨層連線融合,分層檢測不同尺度大小目標的思路。主要是考慮淺層特徵語義資訊不充分,而小目標在深層特徵圖丟失的問題吧(個人理解)。

為了方便使用pytorch的預訓練模型,我採用了resnet50,刪除stage5後的全域性池化和全連線層,增加乙個帶有空洞卷積的網路block(模仿detnet網路,增加感受野而不改變輸出特徵圖大小)。

輸入影象大小為448時,輸出大小為14,所以我的網格設計要密集一點,這也是我增加空洞卷積block的原因,我擔心輸出點的感受野範圍不夠而影響大目標的檢測,實際情況可能不會,未驗證。

yolov1的損失函式全是均方誤差,需要理解的是其含義。

位置損失:容易理解,負責檢測的才有位置損失,其他的都不需回傳損失,也就不需要計算,此外小目標對於**wh的誤差更敏感,用開根的方法緩解。舉例來說,大小為10和大小為100的目標,**大小分別為20和110,損失一樣但是顯然小目標檢測的更差一些,開根後,\((\sqrt - \sqrt)^ = 1.7\),而\((\sqrt - \sqrt)^ = 0.24\),相當於強化了小目標的wh的損失。

類別損失:容易理解,含有目標的網格才有類別損失,其他都不需要回傳損失,也就不需要計算。預設網格只出現一種類別,這當然是有缺陷的。yolov1對於一些聚集的目標,檢測效果會不好。其實聚集目標本身也算很難檢測的情況吧。

有了yolov1的基本概念,就可以開始寫自己的檢測器了,我採用了pytorch0.2的框架(等待1.0中),下面介紹一些重要的點。

在resnet50基礎上按前文所述改進,輸出為(batch_size, c, h, w),為了與之後的yololoss匹配,改變一下順序為 (batch_size, h, w, c),c為30。

pred_tensor和target_tensor形狀一致,通過mask選取對應部分分別計算mesloss,最後按照公式相加起來。好在只需要寫出前向傳播過程就可以了。

資料塊在30個通道上的含義為(cx,cy,w,h,contain_obj,cx,cy,w,h,contain_obj,cls1,cls2,...,cls20)

網路的輸出是 $ s\times s\times 30 $ 的資料塊,首先用乙個閾值選取含有目標的box,再用乙個閾值篩選\(confidence\times p(cls)\),篩選後的框的cxcy從距離所在網格左上角的偏差解碼為相對於影象左上角的距離,最後由nms去除一些重疊的框。

nms是大部分深度學習目標檢測網路所需要的,大致演算法流程為:

1.對所有**框的置信度降序排序

2.選出置信度最高的**框,確認其為正確**(下次就沒有他了,已經被確認了),並計算他與其他**框的iou

3.根據2中計算的iou去除重疊度高的,iou>threshold就刪除

4.剩下的**框返回第1步,直到沒有剩下的為止

YOLOv1解讀筆記

當前最好系統相比,yolo目標區域定位誤差更大,但是背景 的假陽性優於當前最好的方法.注1 bounding box是怎麼來的呢?其實是在檢測每個grid cell時,若檢測到目標,則會將其標出來 圖中的紅色框 這就是bounding box。注2 設定多個anchor boxes幹嘛呢?是這樣的,...

YOLOv1學習筆記

大部分內容 補充 核心思想 rcnn系列核心思想是proposal 建議區域 分類 yolo系列核心思想是直接在輸出層回歸bounding box位置和bounding box的所屬類別 大致流程 resize resize成448 448,分割成7 7網格的cell cnn提取特徵和 卷積負責提取...

目標檢測之YOLOv1

you only look once unified,real time object detection yolo 一體化的,實時的物體檢測 翻譯 詳解 1 2 1 yolov1框架 步驟 1 resize成448 448,分割得到7 7網格 cell 2 cnn提取特徵和 卷積層負責提取特徵。全...