1. 程式人生 > 實用技巧 >TensorFlow 2.x 演算法基礎

TensorFlow 2.x 演算法基礎

TensorFlow 2.x 演算法基礎

1. 簡介

1.1 IoU (Intersection over Union)

在這裡插入圖片描述

  • GT_Box:Ground Truth的Bounding Box
  • Pre_Box:Predicted的Bounding Box
  • IoU = GT_Box與Pre_Box交集的面積/GT_Box與Pre_Box並集的面積

2. 目標檢測中的Anchor

  • Anchor是什麼?
    • 每個畫素分配幾個不同scale和ratio的矩形視窗就是Anchor
    • 本質就是把基於畫素遍歷的一個過程直接分配到每個畫素來做,然後CNN是可以直接做基於畫素的一個Dense Map的預測
  • Anchor本質
    • 就是一堆變scale和ratio的滑動視窗
  • 步驟:
    • 第一步:為每個畫素分配多個Anchor
    • 第二步:根據CNN提取到的特徵,判斷此Anchor的分類,即是否為待找目標物體;判斷方法:計算IoU(當前Anchor與給定矩形框的IoU),IoU>0.5為Positive, IoU<0.2為Negative,如下圖中,綠色的矩形框為Positive的Anchor
      在這裡插入圖片描述

2.1 目標檢測

  • 目標檢測
    • 目標檢測是"在哪裡有什麼"的任務,在這個任務中,目標的類別不確定、數量不確定、位置不確定、尺度不確定
  • 傳統方法
    • 傳統非深度學習方法如VJ和DPM,和早期深度學習方法如OverFeat,都要金字塔多尺度+遍歷滑窗的方式,逐尺度逐位置判斷"這個尺度的這個位置處有沒有認識的目標",非常笨重耗時
    • 傳統的解決目標檢測問題的方法是使用“滑動視窗”,所有視窗都會共享一個判別器,如SVM。當不同尺度的視窗,在影象中順次滑動時,判別器可以判斷視窗內的目標是什麼,有多大,最後再將所有視窗的判別結果做一些後處理,如NMS,就可以找到目標在哪裡,並且得到每個目標的類別資訊,如DPM。

2.2 感受野

  • 感受野概念

    • 感受野有理論感受野和有效感受野之分,網路確定之後理論感受野的大小是確定的,有效感受野受網路引數影響,網路訓練的好,有效感受野也會相對大一些。但有效感受野遠遠小於理論感受野,隨著網路深度的加深,有效感受野與理論感受野的比值從最大約90%可能會降到30%左右。
  • 好的anchor設定需要滿足如下關係:Anchor大小 < 實際感受野 < 理論感受野

  • 通用的目標檢測相對困難一些,不僅僅類內目標尺度有較大差別,而且類間尺度變化更加多樣
    在這裡插入圖片描述

  • 不同類間的有效感受野差別也很大,如上圖,左邊一列是pool5 layer的不同類別目標的有效感受野,右邊是不同類別的圖片,從圖中可以看出不同類別的目標的有效感受野差別較大

  • 但是在通用目標檢測中,所有類別的目標是共享anchor的,有效感受野參考難度更大,故關於anchor大小的設計規則可以參考:目標大小<=Anchor大小<理論感受野。因此,如果需要手動設計anchor大小時,基於這個規則,再參考ssd的anchor設計公式進行設計。

2.3 Anchor與特徵表達

  • 在一個feature map上,不同尺度的anchor的數量是相同的,使用的特徵是統一的,造成了anchor有以下問題:

    • 問題1: 小尺度的anchor與相應小目標框的IOU可能會比較小,造成小目標正樣本變少
    • 問題2: 不同尺度的anchor應該對應不同的特徵才有利於不同尺度目標的表達
  • 這兩個問題從兩個角度提出,一個是anchor本身的問題,一個是特徵表達的問題,那就從這兩個角度分別出一些解決方案

  • 問題1:Anchor本身的問題

    • 本質: 這裡小尺度的anchor指的非常小的anchor,比如長寬個10多個畫素,造成與小目標框IoU較小的原因還是anchor不夠密集,與小目標目標的匹配概率比較小。
    • 方法1: 圍繞著每一個 anchor 的中心,將其進行擴充套件,可以擴展出2倍,3倍,4倍的anchor,這裡僅對小尺度anchor進行擴充套件
    • 方法2: 在ssd的設計中,不同尺度的anchor在設計時,其scale指標是線性的,可以在小尺度anchor設定更密集的變化,使其可以與小目標有更好的匹配
  • 問題2:特徵表達的問題

    • 本質: 想要檢測出不同尺度的目標,特徵表達是關鍵,下面介紹幾種不同尺度特徵表達的方式
    • 方法1:特徵reshape
      • Yolov2使用了該方式。將不同大小的feature map,通過reshape的方式統一,最後在進行特徵串聯,作為最終的目標檢測特徵
      • 如:目標輸出的檢測特徵圖為 w × h × c w \times h \times c w×h×c,上一層的特徵圖大小為 ( 2 w ) × ( 2 h ) × c 1 (2w)\times(2h)\times c1 (2w×2h×c1,通過特徵reshape得到 w × h × ( 4 c 1 ) w \times h \times(4c1) w×h×(4c1),再與目標特徵圖串聯後可以得到最終的目標檢測的特徵圖為: w × h × ( c + 4 c 1 ) w \times h \times (c+4c1) w×h×(c+4c1)。最後不同尺度的anchor將在這個包含不同尺度特徵的特徵圖上回歸目標框。
    • 方法2: dilation-conv
      • TridentNet使用了感受野思想:當感受野與目標尺寸相互匹配時,相應的目標能夠獲得最佳效能,而dilation-conv可以改變有效感受野
    • 方法3: FPN
      • FPN的提出還是為了解決目標檢測中物體尺度不同的問題,它利用多級的feature map去預測不同尺度大小的物體
      • 其中高層特徵帶有高階語義資訊和較大的感受野,適合檢測大物體,淺層特徵帶有低階的細節語義資訊和較小的感受野,適合檢測小物體
      • 與ssd不同,FPN逐步融合深層特和淺層特徵,使得逐步增加淺層的特徵的高階語義資訊來提高特徵表達能力,提升檢測效果

2.4 Anchor

在這裡插入圖片描述

  • 深度學習中的“滑動視窗”

    • 此“滑動視窗”叫做anchor-box。anchor翻譯過來就是,多用來固定船。用到影象中,這個anchor就用來固定“滑動視窗”了,表示box的中心,叫做錨點。當不同尺度的anchor-box被密集地固定在影象的每個畫素處時,其作用就與“滑動視窗”相同了。anchor-box的提出主要是為了解決目標框定位的問題。
  • Anchor技術

    • 首先預設一組不同尺度不同位置的固定參考框,覆蓋幾乎所有位置和尺度
    • 每個參考框負責檢測與其交併比大於閾值 (訓練預設值,常用0.5或0.7) 的目標
    • anchor技術將問題轉換為"這個固定參考框中有沒有認識的目標,目標框偏離參考框多遠",不再需要多尺度遍歷滑窗,真正實現了又好又快,如在Faster R-CNN和SSD兩大主流目標檢測框架及擴充套件演算法中anchor都是重要部分。
  • Anchor工作過程
    在這裡插入圖片描述

    • 由於anchor是預先放置在影象的每個畫素處,如上圖,每個黑色方框代表影象特徵提取過程中某個特徵圖上的特徵點,藍色的點表示預先放置在特徵圖上的anchor的錨點,這樣就可以知道目標大約在哪兒,但是目標精確位置與大小還是未知
    • 關於目標的精確位置,anchor將原來大海撈針(從整張圖中找目標)的問題,轉換為以anchor作為參考,尋找目標精確位置,也就是計算目標位置相對anchor錨點的偏移,這個問題就簡單多了。而對於目標大小的迴歸,就涉及到anchor的設計了
  • Anchor Box引數
    在這裡插入圖片描述

    • scale:尺度(縮放,如上圖展示了紅綠藍三種顏色不同尺度的anchor)
    • ratio:寬高比
    • 在同一個錨點,也可以有多種尺度的anchor
    • 調整scale和ratio的目的是得到與目標框有最優IOU匹配的anchor,即正樣本,對目標框迴歸起關鍵作用的anchor
    • 根據兩個引數的獲得方式,可以分為人工設計的anchor,即handcrafted-anchor,和學習得到的anchor,即learned-anchor。
  • 人工設計的Anchor

    • 基於單個特徵的Anchor:single-feature based anchor
    • 基於多個特徵的Anchor:multi-feature based anchor
  • 學習得到的Anchor

    • 基於k-means演算法的anchor
    • guided anchor

2.4.1 基於單個特徵的Anchor

  • Anchor首次在Faster-RNN的檢測框架中提出來,用於候選框提取,並且具有平移不變性,即一種Anchor可以在影象的某個位置檢測到一個目標,那麼該種anchor同樣也可以檢測影象其他位置處相同的目標

  • 在文中,作者其實將anchor等同於“滑動視窗”,如下圖,在一個“conv feature map”處有一個紅色的“sliding window”,該視窗的中心點對應anchor的錨點,即box中心點;而且圖中還展示出,k個anchor boxes的尺度是多種多樣的,具體數量通過設定scale和ratio引數來獲得
    在這裡插入圖片描述

  • 在實驗Pascal Voc中,分別設定了3種scale:{128, 256, 512},和3種ratio:{1:1, 1:2, 2:1},得到9種anchor,如下圖所示,黑點表示錨點,紅綠藍分別代表了anchor的不同scale,紅框表示128,綠框表示256,藍框表示512,而每個scale下都有3種不同ratio。

  • 由於anchor是放置在特徵圖的每個畫素位置處,假設“conv feature map“大小為WxH,則最終的anchor個數k=WxHx9
    在這裡插入圖片描述

  • 最初的anchor比較簡單,作為目標框迴歸的參考框,沒有具體說明scale和ratio兩個引數如何設計。但是從作者的實驗可以看出,scale的設計對不同大小目標的迴歸很重要,比如在使用MS COCO做目標檢測時,增加了{64}這個scale,則anchor最終有4種scale,即:{64, 128, 256, 512},增加的目的作者也進行了解釋“mainly motivated by handling small objects on this dataset”,也就是為了檢測小目標。

2.4.2 基於多個特徵的Anchor

  • 在不同大小的feature map上設計一組anchor用於檢測特定尺度範圍的目標
  • 假設有m個feature map需要用於迴歸目標框,每個feature map中anchor的scale係數可以由以下公式確定:
    S k = S m i n + S m a x − S m i n m − 1 ( k − 1 ) , k ∈ [ 1 , m ] S_k = S_{min} + \frac{S_{max} - S_{min}}{m-1} (k-1), \quad k \in [1, m] Sk=Smin+m1SmaxSmin(k1),k[1,m]
    • S m i n = 0.2 , S m a x = 0.9 S_{min}=0.2, S_{max}=0.9 Smin=0.2,Smax=0.9:分別對應了最大feature map和最小feature map的scale係數
  • 需要學習ssd中的anchor設計思想,針對不同尺度的目標,使用不同尺度的feature以及anchor,來得到更好的檢測效果

2.4.3 基於k-means演算法的anchor

  • Yolo-V2使用了k-means演算法來獲得對資料庫中目標框更好的表達的anchor。原始的k-means距離計算使用歐式距離,但是框之間的歐式距離對大框和小框的處理不公平,而IoU的值與框的大小無關,故k-means中的距離計算使用IoU,公式如下,其中centroid指的是anchor
    d ( b o x , c e n t r o i d ) = 1 − I o U ( b o x , c e n t r o i d ) d(box, centroid) = 1 - IoU(box, centroid) d(box,centroid)=1IoU(box,centroid)
  • K-Means演算法流程:
    • 隨機選擇k個真實框作為anchor;
    • 對資料庫中的每個框,計算和k個anchor之間的距離,選擇距離最近(即IOU最大)的anchor,併成為該anchor的聚類列表中的一個元素;
    • 對每一個anchor的聚類列表,分別計算長和寬的均值,長寬組合成為新的類中心,即新的anchor;
    • 重複計算2~3步,直到anchor不變,獲達到最大迭代次數,此時的類中心k個框的長和寬即為最終的anchor。

2.4.4 Guided anchor

  • 作者認為anchor的設計是目標檢測演算法的關鍵,但是通過人工設計的方式獲得的anchor,需要調節超參,得不到最優的目標檢測效果。guided-anchor的目的是獲得稀疏,且位置和大小可變的anchor。

  • 具體方法如下圖:anchor 的生成過程可以分解為兩個步驟:
    在這裡插入圖片描述

    • anchor 位置預測(location)
    • 形狀預測(shape)
    • 位置預測分支的目標是預測那些區域應該作為中心點來生成 anchor,是一個二分類問題。大概思路就是將 ground truth 框的中心一小塊對應在 feature map 上的區域標為物體中心區域,在訓練的時候作為正樣本,其餘區域按照離中心的距離標為忽略或者負樣本。
    • 形狀預測分支的目標是給定 anchor 中心點,預測最佳的長和寬,這是一個迴歸問題。使用 bounded IoU Loss 作為監督,來學習 w 和 h。整個流程是end-to-end訓練的,作者通過這種方式得到了高質量的anchor。

2.5 Anchor本質

  • Anchor box 實際上就是用來生成一系列先驗框的規則,其生成的先驗框有以下三部分構成:
    • CNN提取的Feature Map的點,來定位邊框的位置
    • Anchor box的Scale來表示邊框的大小
    • Anchor box的Aspect Ratio來表示邊框的形狀
  • 在One-Stage中的目標檢測,是直接在最後提取的Feature map上使用預定義的Anchor生成一系列的邊框,最後再對這些邊框進行迴歸
  • 在Two-Stage中的目標檢測,提取的Feature map上使用預定義的Anchor生成一系列的邊框,這些邊框經過RPN網路,生成一些的ROI區域。將提取到的ROI輸入到後續網路中進行邊框迴歸,這就比one stage的方法多了一步,所以精度和耗時上都有所增加
  • 在使用Anchor生成邊框時,要注意其定義在那種尺度上,最好將生成的邊框使用歸一化的座標表示,在使用的時候,乘以原影象的尺度就行了

2.6 Anchor總結

  • 從基於anchor的目標檢測的文章中,可以看到anchor的設計對目標檢測的效果影響很大。如果scale和ratio設定不合適,可能會導致recall不夠高,或者 anchor 過多影響分類效能和速度。
    • 一方面,anchor過於密集,絕大部分anchor分佈在背景區域,對目標框迴歸的loss起的作用的不大;
    • 另一方面,預先設定的anchor形狀不能應對一些極端大小以及極端長寬比的目標。
    • 因此,我們在面對實際中的目標檢測中的anchor設計時,要從scale、ratio、anchor在特徵圖的分佈、以及anchor對不同長寬比的目標覆蓋率上來考慮。當某種尺度的目標(如小目標)召回率較低時,要考慮增加一種小尺度anchor;同樣在漏檢的目標中,長寬比比較統一時,也要增加一種ratio;當目標檢測結果中虛警(誤檢)較高時,考慮anchor的數量是否太高,或者在正負樣本的選擇時,沒有選到更好的負樣本。
  • 總而言之,anchor是目標框迴歸的參考標準,用於預測最終的目標邊界框。進行anchor設計可以參考兩條標準:
    • 中心對齊
    • 特徵一致
    • 首先:卷積特徵作為anchor的表示特徵,anchor的中心要與Feature map的中心很好的對齊。
    • 其次:感受野的大小及語義範圍在一個feature map上的不同區域要一致,不同區域的anchor的大小及尺寸要保持一致。
  • 想得到比較好的檢測效果,單獨anchor的設計是不夠的,需要和網路設計(感受野),特徵表達(如fpn)同時考慮,其實,ssd的anchor設計很好的遵循了這兩條原則。