--- title: 'Object Detection' tags: CS --- ## Table of Contents [TOC] ## RCNN家族 [參考網址](https://kknews.cc/zh-tw/code/k2yqmvb.html) [SPP(Spatial Pyramid Pooling)以及ROI Pooling觀念](https://blog.csdn.net/qq_35586657/article/details/97885290) ## Retina Net >[參考網址](https://medium.com/@gino6178/%E7%89%A9%E4%BB%B6%E5%81%B5%E6%B8%AC-retinanet-%E4%BB%8B%E7%B4%B9-dda4100673bb) ### Architecture ![](https://i.imgur.com/jLFSera.png) + 殘差網路(Residual Network ResNet) ResNet是眾所皆知強而有力的特徵萃取利器 到目前眾多的知名網路結構都有運用殘差的概念 像是Yolov3 Resnet也被當作backbone被許多架構所使用 + 特徵金字塔(Feature Pyramid Network FPN) 特徵金字塔是一種用來解決**multi-scale**的方法 負責產生不同尺度的特徵圖 產生不同尺度的特徵圖通常都是要**處理小物件在影像上的問題** 幾乎每個物件偵測方法都有各自的multi-scale方法,示意圖如下: ![](https://i.imgur.com/FRmGuO2.png) + 類別子網路(Class Subnet) 輸入大小有WxHx256(也就是上面的通道數)的特徵圖 來預測每個空間位置上anchor K個類別的機率 並且參數其中金字塔的不同層是共通的 架構為4層3x3 卷積網路 每一層都利用Relu來做激活 然後一個3x3xkxA (原文為: followed by a 3×3 conv layer with KA filters) 的卷積操作 最後連接sigmoid 預測KA個binary predictions 註:實驗中大部分C設置為256,A設置為9 + 框子網路(Box Subnet) 而另一個子網路類似於上面的類別子網路用於邊界框回歸 每個位置包含4A個線性輸出 (原文為:4A linear outputs per spatial location) 在每個位置的A個anchor上 四個輸出用於預測每個anchor與ground truth box的相對偏移量 也就是物件偵測中常見的offest + Anchors 根據金字塔的層數p3~p7 anchor的大小由32x32變為512x512 在每一層anchor的比例大小為{1:2,1:1,2:1} 並且擁有3個縮放比例 ![](https://i.imgur.com/NwWkhHS.png) 共有九個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目標物框的偏移量計算得到 ### Focal loss 針對每個pixel,我們apply anchor上去之後,會產生數個候選框,而每一個候選框,都會給出它屬於每一個類別的機率,而One-stage的物件偵測不像Two-stage的,會過濾掉大部分的候選框,又因為背景的比例遠大於前景,因此會導致model在訓練過程中,著重在比較容易分辨的背景上,而比較難分辨出的前景就不會被訓練到,因此提出了Focal loss + 一般做classification會用到的Cross Entropy ![](https://i.imgur.com/3SYtNfe.png) 假設目前有**1個前景** **分類為前景的機率是0.8** (*也就是說只有兩類,事實上前景可能為很多類別*) 而**100 個背景**每一個背景**被分為前景的機率為0.01** (*目的是要讓前景被分為前景的機率=1,背景被分為前景的機率=0*) **loss = -log(0.8) + 100x(-log(1–0.01)) =0.53339055325** 我們來考量兩種狀況偵測器變強跟變弱的情況 假設目前有1個前景 偵測前景的機率上升到0.9 (*此時loss下降,因為前景變準了*) **loss = -log(0.9) + 100x(-log(1–0.01)) = 0.4822380308** 假設目前有1個前景 偵測前景的機率下降到0.7 (*此時loss上升,因為前景變不準了*) **loss = -log(0.7) + 100x(-log(1–0.01)) = 0.59138250023** 這邊我們可以看到偵測器偵測到的機率下降 loss還是十分正常的 當我們將而100 個背景每一個背景被分為前景的機率改成0.001時 (*此時loss下降,因為後景變準了,但是loss下降幅度比前景變準還要大*) **loss = -log(0.8) + 100x(-log(1–0.001)) =0.14036119041** **神奇的是Loss也下降了,因為背景的數量龐大,將每個小loss集合起來,就會大過於前景的影響力,這時候就可能會發生優化器將背景每一個背景被分為前景的機率降低 來達到下降Loss 這不是我們想要看到的情況** + 為了改善此種情況而生的Focal loss ![](https://i.imgur.com/KdIdh2u.png) 加入scale的參數α可提高正確率,所以最終版如下: ![](https://i.imgur.com/vgAgejd.png) 我們設==α=1, r為1==,再來看剛剛的example: 原始case **loss = -(==1-0.8==)xlog(0.8) + 100x(-==0.01==xlog(1–0.01)) =0.023746808004** 假設目前有1個前景 偵測前景的機率上升到0.9 (*此時loss下降,因為前景變準了*) **loss = -(==1-0.9==)xlog(0.9) + 100x(-==0.01==xlog(1–0.01)) = 0.008940554458** 假設目前有1個前景 偵測前景的機率下降到0.7 (*此時loss上升,因為前景變不準了*) **loss = -(==1-0.7==)xlog(0.7) + 100x(-==0.01==xlog(1–0.01)) = 0.050835393398** 當我們將而100 個背景每一個背景被分為前景的機率改成0.001時 (*此時loss下降,因為後景變準了,但是loss下降幅度比前景變準還要小*) **loss = -(==1-0.8==)xlog(0.8) + 100x(-==0.001==xlog(1–0.001)) =0.019425453779** 可以看到,我們加大了前景分類的loss比重(hard examples),這樣一來,前景幾乎就左右了整個loss的走向,也是我們所要看到的 + 事實上Cross entropy就是Focal loss的一個特例(Focal loss的α=1且r=0時) ![](https://i.imgur.com/QAQbU31.png) ## YOLO系列 > [YOLO v1, v2, v3](https://medium.com/chiukevin0321/yolo-v1-v2-v3-35af83a8b29b)