物件偵測 - RetinaNet 介紹

22 12
8 min readDec 10, 2019

--

RetinaNet是由Facebook AI Research (FAIR)所發表的論文 其中包括知名的何愷明大神

論文連結

github 連結

推荐新手實作的github連結

RetinaNet

RetinaNet論文名稱並沒有直接接寫上其網路名稱 而是寫上Focal Loss for Dense Object Detection

其設計了密集檢測器RetinaNet來評估標題上寫的Focal Loss效果

我們首先先看一下RetinaNet架構

從左到右分別用上了

殘差網路(Residual Network ResNet)

特徵金字塔(Feature Pyramid Network FPN)

類別子網路(Class Subnet)

框子網路(Box Subnet)

以及Anchors

這個概念像是強強聯手一樣把最好的幾個架構都用上

(1)殘差網路(Residual Network ResNet)

ResNet是眾所皆知強而有力的特徵萃取利器 到目前眾多的知名網路結構都有運用殘差的概念 像是Yolov3 Resnet也被當作backbone被許多架構所使用

(2)特徵金字塔(Feature Pyramid Network FPN)

如果說ResNet是骨幹網路的第一把交椅 那特徵金字塔就是multi-scale領域的老大

特徵金字塔是一種用來解決multi-scale的方法 負責產生不同尺度的特徵圖

產生不同尺度的特徵圖通常都是要處理小物件在影像上的問題 幾乎每個物件偵測方法都有各自的multi-scale方法

而特徵金字塔有許多變形以及應用

在原本的論文也是使用ResNet作為backbone使用全卷積網絡進( Fully Convolutional Networks FCN)進行預測 其論文使用p3到p7來定義金字塔層 並且每層具有256個通道(Channel)

而RetinaNet中每一層都可以用不同尺寸大小來偵測 並使用

(3)類別子網路(Class Subnet)

輸入大小有W*H*256(也就是上面的通道數)的特徵圖 來預測每個空間位置上anchor K個類別的機率 並且參數其中金字塔的不同層是共通的

架構為4層3*3 卷積網路 每一層都利用Relu來做激活 然後一個3*3*k*A

(原文為: followed by a 3×3 conv layer with KA filters)

的卷積操作 最後連接sigmoid 預測KA個binary predictions

註:實驗中大部分C設置為256,A設置為9

(4)框子網路(Box Subnet)

而另一個子網路類似於上面的類別子網路用於邊界框回歸

每個位置包含4A個線性輸出

(原文為:4A linear outputs per spatial location)

在每個位置的A個anchor上 四個輸出用於預測每個anchor與ground truth box的相對偏移量 也就是物件偵測中常見的offest

(5)Anchors

根據金字塔的層數p3~p7 anchor的大小由32x32變為512x512

在每一層anchor的比例大小為{1:2,1:1,2:1}

並且擁有3個縮放比例

共有九個anchors

這邊類似於Yolov3

每個anchor都有一個長度為k 的one-hot vector的分類目標(classification targets)

和一個4-vector的邊界框回歸目標(box regression targets)

將anchor與ground truth IOU超過0.5的標記為前景

0~0.4的標記為背景。將IOU在0.4~0.5之間的anchor捨棄

框回歸目標由每個anchor及assigned目標物框的偏移量計算得到

以上為RetinaNet 的架構

而作者強調了所謂的Focal Loss則留到最後介紹

Focal Loss

目前物件偵測有分為

兩階段物件偵測(Two-stage)

像是Faster-RCNN系列都是這種用法

以及

單階段物件偵測(One-stage)

如Yolo以及SSD

單階段物件偵測會對物件位置及利用multi-scale方法進行特徵萃取 會產生的候選框大約為100k

而兩階段物件偵測則是會先進行提議(Proposal)來提出影像中有可能的候選框位置 後期Faster R-CNN兩階段物件偵測所使用的(Region Proposal Network RPN)可以控制候選框下降到1k~2k的數量 並且會固定前景及背景量的比例

單階段物件偵測最大的問題為類別不平衡的問題 當你每一張輸入影像產生100k的候選框 而要偵測的物體只有10幾項時 就會產生論文中所提到的類別不平衡

並且大多數負樣本(無用的候選框)對訓練沒意意 並且其容易佔據主要的訓練階段 這邊的核心概念可以參考Online Hard Example Mining

而本文辨識提出動態的比例交叉熵損失函數Focal Loss 比例系數大小會隨著正確分類樣本置信度的增加逐漸趨向於0 比例系數可以降低簡單樣本貢獻

如下

CE 為傳統使用的交叉熵(cross entropy)

這邊的y是label 而p是所謂的同物件並且也背標記為同物件的機率

現在具有兩個label也就是前景及後景(0,1)

假設目前有1個前景 分類為前景的機率是0.8

而100 個背景每一個背景被分為前景的機率為0.01

loss = -log(0.8) + 100*(-log(1–0.01)) =0.53339055325

我們來考量兩種狀況偵測器變強跟變弱的情況

假設目前有1個前景 偵測前景的機率上升到0.9

loss = -log(0.9) + 100*(-log(1–0.01)) = 0.4822380308

假設目前有1個前景 偵測前景的機率下降到0.7

loss = -log(0.7) + 100*(-log(1–0.01)) = 0.59138250023

這邊我們可以看到偵測器偵測到的機率下降 loss還是十分正常的

當我們將而100 個背景每一個背景被分為前景的機率改成0.001時

loss = -log(0.8) + 100*(-log(1–0.001)) =0.14036119041

神奇的是Loss也下降了 這時候就可能會發生優化器將背景每一個背景被分為前景的機率降低 來達到下降Loss 這不是我們想要看到的情況

於是論文設計了如下的Focal loss

加入了聚焦參數 γ(focusing parameter)來進行優化

以及加入了平衡變數 (α-balanced variant)

這種平衡變數類似所謂的Balanced Cross Entropy 如下 也就是用於交叉熵(cross entropy)的一種方法

本文實驗發現 當偵測機率為0.9的時候 γ = 2效果是較佳

效果如下

結論及優化

整體看來RetinaNet的表現還是不錯的 雖然相比的論文皆為比較弱的一些物件偵測方法 筆者在訓練時成效也十分優良 但是Focal loss 是否能用於所有單階段物件偵測的能力還有待商榷

優化方向

(1)backbone替換

文中使用的是Resnet的架構 論文中使用了 Resnet50以及 Resnet101 而筆者使用了Resnet152以及一些傳統架構都取得了很大的進展 這方面非常容易進行優化

(2)更多的尺度

在論文中使用了p3~p7的尺度 擴展尺度不失為一種優化的方式 如果要獲得更高的準確度 可以使用更多尺度 而要提升速度也能使用較少尺度 筆者就縮減了尺度 能獲得有感的速度加乘

(3)調整特徵圖

在特徵金字塔方面 全連接卷積(FCN)還有許多發展空間 能加入更多萃取步驟或是調整channel都是一種不錯的方法 用來提升準確度或提升速度

--

--

22 12
22 12

Written by 22 12

目前擔任AI工程師 聯絡資訊: changrunlin@gmail.com

No responses yet