原創技術文章,第一時間獲取 小編推薦: DeepAction七期飛躍計劃還剩2個名額,聯系小編,獲取你的專屬算法工程師學習計劃(聯系小編SIGAI_NO1) SIGAI特約作者 TankZhou 復旦大學 研究方向:深度學習、計算機視覺 引入 R-CNN 基本結構和原理 R-CNN 的不足與改進 SPP 和 ROI Fast R-CNN Faster R-CNN YOLO V1 主要貢獻和優勢 基本原理 Anchor box 的設計 Ground truth 的生成 confidence score 坐標值換算 類別概率 映射到 bounding box 推理過程 計算 loss 實用過程 網絡結構 Yolo V2 主要貢獻 關鍵改進 重新定義 Anchor box 坐標變換方式 多尺度融合 Darknet-19 Yolo V3 引入 目標檢測算法是計算機視覺三大基礎任務之一,其包括目標定位和目標分類兩部分。 在 yolo 系列出來之前,主流的做法是分段式的 R-CNN 系列,主要包括 R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN 等。 R-CNN 基本結構和原理 R-CNN 的基本結構如下圖所示: R-CNN 主要分為候選區提取和候選區分類兩個階段,并且兩階段分開訓練。其主要思想如下。 首先通過選擇性搜索(Selective Search)對輸入進行超像素合并,產生基礎的子區域。然后將小的子區域不斷合并成大區域,并從中找出可能存在物體的區域,這個過程即候選區提?。≧egion Proposal)。 提取出包含目標的候選區之后,需要對其進行分類,判定目標屬于哪一類。可以通過 SVM 或 CNN 等算法進行分類。 R-CNN 的不足與改進 SPP 和 ROI 要實現較為實用的 R-CNN 網絡,往往需要對輸入樣張提取上千個候選區,并對每個候選區進行一次分類運算。于是,后續出現空間金字塔池化(SPP) 和 region of interest(`ROI)等方式進行改進。 其基本思想是,輸入圖片中的目標區域,經過 CNN 后,得到的特征圖中,往往也存在著對應的目標區域,此即 ROI。后續對該特征圖(多種尺度)上的 ROI 進行分類,此即 SPP。 通過這種方式,可以共用特征提取部分,只對最后的特征圖進行候選區提取和分類。這樣就可以極大地減少總的計算量,并提升性能。 Fast R-CNN 但是,SPP 和 ROI 方式,仍舊需要分段訓練。其不僅麻煩,同時還分割了 bounding box 回歸訓練與分類網絡的訓練。這使得整個函數的優化過程不一致,從而限制了更高精度的可能。 于是,再次對其進行改進: 1.進行 ROI 特征提取之后,將兩種損失進行合并,統一訓練。這樣相對易于訓練,且效率更高 2.將 SPP 換做 ROI Pooling 3.對于 bounding box 部分的 loss,使用 Smooth l1 函數,可以提升穩定性 Faster R-CNN 在 Fast R-CNN 中,對 ROI 而非原圖的候選區進行分類,提升速度。因此,下一步可以對候選區提取部分進行優化,提升性能。 因此,在 Faster R-CNN 中,不再對原圖進行候選區提取,而是直接對經過 CNN 后的特征圖進行候選區提取,這部分網絡,即 Region Proposal Networks(RPN)。 之后,將候選區分別送入兩個子網絡,分別用與計算 bounding box 的坐標和候選區的類別。如圖 1 所示。 通過這種方式,可以進一步減少計算量,合并兩個階段,并提升精度。 YOLO V1 主要貢獻和優勢 雖然 Fast R-CNN 已經相當優秀,但是其仍舊不是真正意義上的一體式目標檢測網絡,其性能仍有提升的空間。 針對 R-CNN 系列的分段式設計的問題,YOLO 提出一種全新的 loss 計算方式,重新定義了目標檢測問題,將其定義為回歸問題進行訓練,同時進行定位和分類的學習。 YOLO 的核心,在于其損失函數的設計。其一體式架構設計,計算量更少,速度更快,易于優化,且滿足實時檢測的需求。 YOLO V1 具有以下優勢: 1.速度極快,易于優化:只需讀取一次圖像,就可進行端對端優化,可滿足實時需求 2.背景誤識別率低:對全圖進行卷積學習,綜合考慮了全圖的上下文信息 3.泛化性能好:也是由于綜合考慮了圖片全局,因此能夠更好地學習數據集的本質表達,泛化性能更好 4.識別精度高 當然,相較于 Faster R-CNN ,YOLO v1 存在明顯不足: 1.定位精度不夠,尤其是小目標 2.對密集目標的識別存在不足 3.異常寬長比的目標識別不佳 基本原理 深度學習任務中,合理的目標設定,是成功的關鍵因素之一。 Anchor box 的設計 在 R-CNN 系列中,需要先提取候選區,然后再將候選區進行回歸微調,使之更接近 groung truth。而 YOLO 直接將其合并為一步,即:回歸。但是,YOLO 保留了候選區的思想,只是將其演變為了 anchor box。 在 YOLO V1 中,首先設定 B 個不同尺寸,寬長比的 anchor box。然后將每張圖片劃分成S×S的格點,每個格點對應有 B 個 anchor box,共S×S×B個 anchor box,其粗略的覆蓋了整張圖片。 對于每張圖片,均存在初始的S×S×B 個 anchor box,作為初始 bounding box?,F在需要做的是,通過學習,不斷判定哪些 bounding box 內存在目標,存在什么樣的目標,同時不斷調整可能存在目標的 bounding box 的寬長比和尺寸,使之與 ground truth 更接近。 那么,ground truth 又是如何定義的呢? Ground truth 的生成 目標檢測任務,首先需要做的是判定是否包含目標,然后才是判定目標的位置以及類別。 以下圖為例,詳細講解從一張圖片,生成 ground truth 的過程。 confidence score 如上圖所示,首先要做的,就是判定哪些 bounding box 內包含目標。我們可以通過一個置信度得分 confidence score,來判定某個 bounding box 內是否包含目標。 對于上圖,我們設定目標中心所在的格點,包含目標。顯然,對于圖片中目標的 ground truth,該值為 1。 坐標值換算 對于不包含目標的 anchor box,不用計算其坐標。對于包含目標的 anchor box,需要獲取其坐標。 在 yolo 中,通過中心位置和尺寸表示坐標,即:(x,y,w,h) 圖片的 label 與 groung truth 之間,通過如下方式換算。 如上圖所示,狗狗的原始坐標(label)為 ?,F在需要將其變換為 ground truth。 x,y表示目標中心距離對應格點邊界(左上角)的位置,數值相對于格點單元尺寸進行過歸一化。w,h為目標邊框的尺寸,相對于整圖尺寸進行過歸一化。 因此,上圖狗狗的坐標對應的 ground truth 計算方式為(每個格點尺寸為 1): 類別概率 目標位置定義完畢后,需要定義目標的類別對應的 ground truth。在 YOLO V1 中,存在如下設定: 每個格點最多只能預測一個目標,即使是共有 B 個 anchor box,因此最多只能包含一個類別。 這一設定,將會導致,對于密集的目標,YOLO 的表現較差。 對于每個目標(每個格點內只允許存在一個),其對應的類別 ground truth 為 one-hot 編碼。 映射到 bounding box 由于每張圖片初始對應S×S×B個 bounding box,因此需要將上面的 ground truth 進行映射,使之與 bounding box 尺寸對應一致,才能進行比較,計算誤差,進行優化。步驟如下: 1.初始化每個格點上的 bounding box 為 0 2.對于存在目標的格點,將于 ground truth 之間 IOU 最大的 bounding box 對應的 confidence score 填充為 1,表示包含目標 3.將包含目標的 bounding box ,填充對應的的 ground box 的坐標和類別值 到這里,就從 label ,得到了用于比較的 target。 推理過程 推理過程較為簡單,輸入圖片,得到一個尺寸為 S×S的特征圖,通道數為B×(1+4)+C,其中,B 為每個格點的 bounding box 數目,C 為到預測的目標類別數,1 和 4 分別表示包含目標的置信度和對應的坐標。 由于每個格點只負責預測一個目標,因此只需要包含一個類別向量即可。 在原論文中,S=7,B=2,C=20,因此最后輸出尺寸為7×7×30 。 計算 loss 對于每張圖片,大多數格點單元不包含目標,其對應的置信度得分為 0。這種目標存在與否的失衡,將會影響最后 loss 的計算,從而影響包含目標的格點單元的梯度,導致模型不穩定,訓練容易過早收斂。 因此,我們增加 bounding box 坐標對應的 loss,同時對于不包含目標的 box,降低其置信度對應的 loss。我們用 和 來實現這一功能,且: 。 同時,sum-squared error 還會同等看待 large boxes 和 small boxes 的 loss 。而同等的 loss 對于 large boxes 和 small boxes 的影響是不同的。 為了減緩這種空間上的不均衡,我們選擇預測 w 和 h 的平方根,可以降低這種敏感度的差異,使得較大的對象和較小的對象在尺寸誤差上有相似的權重。 綜上所述,完整的 loss 計算方式如下所示: 其中(以 ground truth 為判定依據): · ![]() 表示是否格點單元i中包含目標; · ![]() 表示格點單元i中,第j個預測的 bounding box 包含目標 · ![]() 意思是網格 i 的第 j 個 bounding box 中不存在對象 因此,上面的 loss 中: · 第一行表示:當第 i 個格點中第 j 個 box 中存在目標 (IOU 比較大的 bounding box) 時,其坐標誤差 · 公示的第二行表示:第 i 個格點中第 j 個 box 中存在目標時,其尺寸誤差 · 公示的第三行表示:第 i 個格點中第 j 個 box 中存在目標時,其置信度誤差 · 公示的第四行表示:第 i 個格點中第 j 個 box 中不存在目標時,其置信度誤差 · 公示的第五行表示:第 i 個格點中存在目標時,其類別判定誤差 實用過程 在實際使用中,需要預測實際的邊框和類別。通常,可能存在多個 bounding box 預測一個目標,存在冗余,需要使用非極大抑制(MNS)來剔除冗余 bounding box。其核心思想是:選擇置信度得分最高的作為輸出,去掉與該輸出重疊較高的預測框,不斷重復這一過程直到處理完所有備選框(共 S×S×B個)。 具體步驟如下所示: 1. 過濾掉 confidence score 低于閾值的 bounding box 2. 遍歷每一個類別 1. 找到置信度最高的 bounding box,將其移動到輸出列表 2. 對每個 Score 不為 0 的候選對象,計算其與上面輸出對象的 bounding box 的 IOU 3. 根據預先設置的 IOU 閾值,所有高于該閾值(重疊度較高)的候選對象排除掉 4. 當剩余列表為 Null 時, 則表示該類別刪選完畢,繼續下一個類別的 NMS 3. 輸出列表即為預測的對象 ![]() 網絡結構 ![]() Yolo V2 主要貢獻 Yolo V2 的主要貢獻在于: 1. 利用 wordTree 設計,充分利用分類數據集,彌補目標識別類別數目的不足 2. 重新設計基礎網絡 darknet-19,輸入尺寸可變,從而在同一套模型上,提供速度和精度之間的切換 3. 重新設計 anchor box 和坐標變換格式,使的瘦臉更快,精度更高 關鍵改進 這篇論文進行了較多的改進優化,主要分為新設計的基礎網絡 darknet-19,以及新設計 anchor box 等。至于其他改進,詳見論文。 重新定義 Anchor box 在 Yolo V2 中,輸入尺寸變為416×416,網絡整體縮放倍數為 13,最后得到尺寸為13×13的特征圖,并在改尺寸上進行推理預測。 此外,較為重要的是,v2 中,每個 bounding box 負責預測一個目標,因此一個格點內可以預測多個目標,解決了密集目標的預測問題。 此外,不再通過手工選擇 anchor box,而是針對特定數據集,通過 k-means 算法進行選擇,詳見論文。 坐標變換方式 在 yolo v1 中,使用全連接層來直接預測目標的 bounding box 的坐標。訓練過程不夠穩定,主要來自(x,y)的預測。 而在 Faster R-CNN 中,使用全卷積網絡 RPN 來預測 bounding box 相對于 anchor box 的坐標的偏移量。由于預測網絡是卷積網絡,因此 PRN 在 feature map 網絡的每個位置預測這些 offset。 相比于直接預測坐標,預測 offset 更簡單,誤差更小,可以簡化問題,使得網絡更容易學習。 原始方案中,預測值 ![]() 和(x,y)之間,計算方式如下: ![]() 該方式下,對坐標 ![]() 沒有限制,因此預測的 bounding box 可能出現在任意位置,導致訓練不穩定。因此,在 V2 內改為預測偏移量,其計算方式如下所示: ![]() 其中, ![]() 表示格點單元相對于圖像左上角的坐標; ![]() 表示先驗框的尺寸 (bounding box prior),預測值為 ![]() 。 · 對于預測的 bbox 的中心,需要壓縮到 0-1 之間,再加上 anchor 相對于grid 在 x 和 y 方向上的偏移。這一點,和 yolo v1 是一致的 · 對于預測的 bbox 的寬高,這個和 faster RCNN 一樣,是相對于 anchor 寬高的一個放縮。exp(w) 和 exp(h) 分別對應了寬高的放縮因子 · 對于預測的 bbox 的置信度,則需要用 sigmoid 壓縮到 0-1 之間。這個很合理,因為置信度就是要0-1之間。 · 對于預測的每個類別,也是用你 sigmoid 壓縮到0-1之間。這是因為類別概率是在0-1之間 最后通過換算得到的為在當前特征圖尺寸上的坐標和尺寸,需要乘以整體縮放因子(32),方可得到在原圖中的坐標和尺寸。 這種參數化的方式,使得神經網絡更加穩定。 ![]() 多尺度融合 13×13的輸出特征圖,可以很好的預測較大尺寸的目標,但是對于小尺寸的目標,可能并不太好。 因此,在 YOLO v2 中,除了使用13×13的特征圖,還使用其之前層尺寸為26×26和52×52的特征圖,并進行多尺度融合。不同尺寸之間,通過如下形式,進行特征融合。 ![]() 例如,26×26×256通過這種方式,將變為13×13×1024的 tensor。 具體融合形式,詳見圖 9。 Darknet-19 大多數 detection 系統以 VGG-16 作為基礎的特征提取器 (base feature extractor)。但是 vgg-16 較為復雜,計算量較大。 Yolo V2 使用一個定制的神經網絡作為特征提取網絡,它基于 Googlenet 架構,運算量更小,速度更快,然而其精度相較于 VGG-16 略微下降,稱之為 darknet-19。 與 VGG 模型類似,大多數使用3×3的卷積層,并在每一次 pooling 后,通道數加倍。此外,使用全局池化 ( GAP,global average pooling ) 來進行預測。同時,在3×3的卷積層之間,使用1×1的卷積層來壓縮特征表達。此外,使用 batch normalization 來穩定訓練,加速收斂以及正則化模型。 完整的網絡層如下所示: ![]() Yolo V3 Yolo V3 只是對 Yolo v2 進行了一次較小的優化,主要體現在網絡結構上,提出了 darknet-53 結構,作為特征提取網絡。最后,Yolo V3 在小目標的識別上改善較大,但是中等目標和大目標的識別方面,表現略微下降。 網絡結構如下所示: ![]() ![]() 最后附上一張性能表現圖: ![]() 參考 - https:///abs/1506.02640 - https:///pdf/1612.08242.pdf - https:///media/files/papers/YOLOv3.pdf - https:///darknet/yolo/ - https://github.com/BobLiu20/YOLOv3_PyTorch - https://www.jianshu.com/p/d535a3825905 本文為SIGAI原創 |
|
來自: taotao_2016 > 《it》