檢測相關問題面試準備

1. OHEM (online Hard Example Mining)

OHEM(online hard example miniing)算法的核心思想是根據輸入樣本的損失進行篩選篩選出hard example,表示對分類和檢測影響較大的樣本; 然後將篩選得到的這些樣本應用在隨機梯度下降中訓練。在實際操作中是將原來的一個ROI Network擴充爲兩個ROI Network,這兩個ROI Network共享參數。其中前面一個ROI Network只有前向操作,主要用於計算損失;後面一個ROI Network包括前向和後向操作,以hard example作爲輸入,計算損失並回傳梯度。該算法主要用於Fast RCNN。

算法的優點:(1)對於數據的類別不平衡問題不需要採用設置正負樣本比例的方式來解決,這種在線選擇方式針對性更強。(2)
隨着數據集的增大,算法的提升更加明顯(作者是通過在COCO數據集上做實驗和VOC數據集做對比,因爲前者的數據集更大,而且提升更明顯,所以有這個結論)。

什麼是難樣本:有多樣性和高損失的樣本。重合率比較大的ROI之間的損失也比較相似。因此這裏作者採用NMS(non-maximum suppresison)去除重合率較大的ROI,這裏作者給的閾值是當IOU大於0.7就認爲重合率較高,需去除。

在Fast RCNN上OHEM 結構

包含兩個ROI network,上面一個ROI network是隻讀的,爲所有的ROI在前向傳遞的時候分配空間。下面一個ROI network則同時爲前向和後向分配空間。 首先,ROI經過ROI plooling層生成feature map,然後進入只讀的ROI network得到所有ROI的loss;然後是hard ROI sampler結構根據損失排序選出hard example,並把這些hard example作爲下面那個ROI network的輸入。

實際訓練的時候,每個mini-batch包含N個圖像,共|R|個ROI,也就是每張圖像包含|R|/N個ROI。經過hard ROI sampler篩選後得到B個hard example。作者在文中採用N=2,|R|=4000,B=128。 另外關於正負樣本的選擇:當一個ROI和一個ground truth的IOU大於0.5,則爲正樣本;當一個ROI和所有ground truth的IOU的最大值小於0.5時爲負樣本。

2.A-Fast-RCNN (利用GAN來生成hard example,而不是像OHEM這樣選擇hard example)

3. faster rcnn 和ssd 爲什麼用smooth L1 loss和 L2有什麼區別

使用smooth L1的原因

(1) 當預測框與 ground truth 差別過大時,梯度值不至於過大;(2)當預測框與 ground truth差別很小時,梯度值足夠小。

4.FPN 特徵級聯金字塔在檢測算法中的應用

5.檢測領域目前存在的問題

針對遮擋問題設計的相關loss

如何高效準確地生成Proposals、如何獲取更好的ROI features、如何加速Two-Stage檢測算法以及如何改進後處理方法

如何高效的獲得生成的Proposals:

R-CNN[11]:R-CNN生成Proposals的方法是傳統方法Selective Search,主要思路是通過圖像中的紋理、邊緣、顏色等信息對圖像進行自底向上的分割,然後對分割區域進行不同尺度的合併每個生成的區域即一個候選Proposal,如下圖所示。這種方法基於傳統特徵,速度較慢。

Faster R-CNN使用RPN網絡代替了Selective Search方法,大大提高了生成Proposals的速度;

FPN:Faster R-CNN只採用頂層特徵做預測,但我們知道低層的特徵語義信息比較少,但是目標位置準確;高層的特徵語義信息比較豐富,但是目標位置比較粗略FPN算法把低分辨率、高語義信息的高層特徵和高分辨率、低語義信息的低層特徵進行自上而下的側邊連接,使得所有尺度下的特徵都有豐富的語義信息,然後在不同尺度的特徵層上進行預測,使得生成Proposals的效果優於只在頂層進行預測的Faster R-CNN算法

Cascade R-CNN:Cascade R-CNN在獲取Proposals的時候也採用逐步求精的策略前一步生成的Proposals作爲後一步的輸入,通過控制正樣本的交併比閾值不斷提高Proposals的質量;

如何獲取更好的ROI features:

 

6.單階段檢測算法的發展

yolo  v1算法:

YOLO 的核心思想就是利用整張圖作爲網絡的輸入,直接在輸出層迴歸 bounding box(邊界框) 的位置及其所屬的類別。

將目標檢測看成迴歸問題,所以採用的是均方差損失函數。但是對不同的部分採用了不同的權重值。首先區分定位誤差和分類誤差。對於定位誤差,即邊界框座標預測誤差,採用較大的權重。 

實現方法:將一張圖像化成s*s的網格,如果某個object 的中心落在這個網格中,這個網絡就負責這個object。每個網格要預測 B 個 bounding box,每個 bounding box 除了要回歸自身的位置之外,還要附帶預測一個 confidence 值。 每個 bounding box 要預測 (x, y, w, h) 和 confidence 共5個值每個網格還要預測一個類別信息,記爲 C 類。則 SxS個 網格,每個網格要預測 B 個 bounding box 還要預測 C 個 categories。輸出就是 S x S x (5*B+C) 的一個 tensor

網絡設計:yolo的網絡模型參考的是GooLeNet模型,包含24個卷積層和2個全連接層,對於卷積層和全連接層,採用Leaky ReLU激活函數。但是最後一層卻採用線性激活函數。最後的輸出如下圖:

Yolo算法將目標檢測看成迴歸問題,所以採用的是均方差損失函數。但是對不同的部分採用了不同的權重值。首先區分定位誤差和分類誤差。對於定位誤差,即邊界框座標預測誤差,採用較大的權重

首先是優點,Yolo採用一個CNN網絡來實現檢測,是單管道策略,其訓練與預測都是end-to-end; Yolo算法比較簡潔且速度快。第二點由於Yolo是對整張圖片做卷積,所以其在檢測目標有更大的視野,它不容易對背景誤判;Yolo的泛化能力強,在做遷移時,模型魯棒性高。速度快,超過實時。

缺點:首先Yolo各個單元格僅僅預測兩個邊界框,而且屬於一個類別。對於小物體,Yolo的表現會不如人意。這方面的改進可以看SSD,其採用多尺度單元格。也可以看Faster R-CNN,其採用了anchor boxes。Yolo對於在物體的寬高比方面泛化率低,就是無法定位不尋常比例的物體。當然Yolo的定位不準確也是很大的問題。挨近的物體的檢測效果不好。同一類物體出現的新的不常見的長寬比和其他情況時,泛化能力偏弱。由於損失函數的問題,定位誤差是影響檢測效果的主要原因尤其是大小物體的處理上,還有待加強

注意:(1)由於輸出層爲全連接層,因此在檢測時,YOLO 訓練模型只支持與訓練圖像相同的輸入分辨率;

(2)雖然每個格子可以預測 B 個 bounding box,但是最終只選擇只選擇 IOU 最高的 bounding box 作爲物體檢測輸出,即每個格子最多隻預測出一個物體。當物體佔畫面比例較小,如圖像中包含畜羣或鳥羣時,每個格子包含多個物體,但卻只能檢測出其中一個。這是 YOLO 方法的一個缺陷。

yolo  v2算法:

文章提出了一種新的訓練方法–聯合訓練算法。這種算法可以把這兩種的數據集(現有分類和檢測的數據集)混合到一起。使用一種分層的觀點對物體進行分類,用巨量的分類數據集數據來擴充檢測數據集,從而把兩種不同的數據集混合起來

聯合訓練算法的基本思路就是:同時在檢測數據集和分類數據集上訓練物體檢測器(Object Detectors )用檢測數據集的數據學習物體的準確位置,分類數據集的數據來增加分類的類別量提升魯棒性

2018年的業界最佳檢測算法???

YOLO9000 就是使用聯合訓練算法訓練出來的,他擁有 9000 類的分類信息,這些分類信息學習自ImageNet分類數據集,物體位置檢測則學習自 COCO 檢測數據集。

YOLO 一代有很多缺點,作者希望改進的方向是改善 recall,提升定位的準確度,同時保持分類的準確度。 

具體改進:

(1)使用batch normalization

(2)high resolution classifier 448*448

(3)Convolution with anchor boxes 輸入是416*416 最後通過32的下采樣,得到13*13 的feature map 最後使用anchor box 這個時候精確度下降;

(4)Dimension clusters, 對gt box進行聚類,獲得base size 和ratio

centroid是當前的遍歷的某個bounding box 而利用1-IOU的來度量距離

(5)Direct location prediction

作者發現通過預測偏移量而不是座標值能夠簡化問題,讓神經網絡學習起來更容易。

Dimension clusters和Direct location prediction,使 YOLO 比其他使用 Anchor Box 的版本提高了近5%。

(6)Fine-Grained Features

YOLO 採取了不同的方法,YOLO 加上了一個 Passthrough Layer 來取得之前的某個 26*26 分辨率的層的特徵(利用FPN的思想,集合低層語義的feature map),這個 Passthrough layer 能夠把高分辨率特徵與低分辨率特徵聯繫在一起,聯繫起來的方法是把相鄰的特徵堆積在不同的 Channel 之中,這一方法類似與 Resnet 的 Identity Mapping,從而把 26*26*512 變成 13*13*2048YOLO 中的檢測器位於擴展後(expanded )的特徵圖的上方,所以他能取得細粒度的特徵信息,這提升了 YOLO 1% 的性能。

(7)Multi-Scale Training

OLOv2 每迭代幾次都會改變網絡參數。每 10 個 Batch,網絡會隨機地選擇一個新的圖片尺寸,由於使用了下采樣參數是  32,所以不同的尺寸大小也選擇爲 32 的倍數 {320,352…..608},最小 320*320,最大 608*608,網絡會自動改變尺寸,並繼續訓練的過程。

(8)更快

YOLO 使用的是 GoogLeNet 架構,比 VGG-16 快,YOLO 完成一次前向過程只用 85.2 億次運算,而 VGG-16 要 306.9 億次,但是 YOLO 精度稍低於 VGG-16。Draknet19 YOLO v2 基於一個新的分類模型,有點類似於 VGG, 在 ImageNet 上達到 72.9% top-1 精確度,91.2% top-5 精確度。

(9)更強

在訓練的過程中,當網絡遇到一個來自檢測數據集的圖片與標記信息,那麼就把這些數據用完整的 YOLO v2 loss 功能反向傳播這個圖片。當網絡遇到一個來自分類數據集的圖片和分類標記信息,只用整個結構中分類部分的 loss 功能反向傳播這個圖片。

分類數據集是一種多標籤的模型來混合數據集

(10)Hierarchical classification, Datasets combination with wordtree

WordNet 的結構是一個直接圖表(directed graph)而不是樹型結構。因爲語言是複雜的,狗這個詞既屬於‘犬科’又屬於‘家畜’兩類,而‘犬科’和‘家畜’兩類在 WordNet 中則是同義詞,所以不能用樹形結構。

(11)Joint classification and detection

作者的目的是:訓練一個 Extremely Large Scale 檢測器, 訓練的時候使用 WordTree 混合了 COCO 檢測數據集 ImageNet 中的 Top9000 類,混合後的數據集對應的 WordTree 有 9418 個類。另一方面,由於 ImageNet 數據集太大了,作者爲了平衡一下兩個數據集之間的數據量,通過過採樣(oversampling) COCO 數據集中的數據,使 COCO 數據集與 ImageNet 數據集之間的數據量比例達到 1:4。
YOLO9000 的訓練基於 YOLO v2 的構架,但是使用 3 priors 而不是 5 來限制輸出的大小。當網絡遇到檢測數據集中的圖片時則正常地反方向傳播,當遇到分類數據集圖片的時候,只使用分類的 loss 功能進行反向傳播。同時作者假設 IOU 最少爲 0.3。最後根據這些假設進行反向傳播。

yolo  v3算法:

YOLOv3 在 Pascal Titan X 上處理 608x608 圖像速度可以達到 20FPS,在 COCO test-dev 上 [email protected] 達到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網絡)的結果相近,並且速度快 4 倍.

YOLOv3 在實現相同準確度下要顯著地比其它檢測方法快。時間都是在採用 M40 或 Titan X 等相同 GPU 下測量的。

改進之處:

1.多尺度預測 (類FPN)

2.更好的基礎分類網絡(類ResNet)和分類器 darknet-53,見下圖

3.分類器-類別預測:

推薦:https://blog.csdn.net/guleileo/article/details/80581858

https://blog.csdn.net/m0_37192554/article/details/81092514

https://blog.csdn.net/zxyhhjs2017/article/details/83013297

SSD  算法:

SSD 將輸出一系列 離散化(discretization) 的 bounding boxes這些 bounding boxes 是在 不同層次(layers) 上的 feature maps 上生成的,並且有着不同的 aspect ratio

SSD 相比較於其他單結構模型(YOLO),SSD 取得更高的精度,即是是在輸入圖像較小的情況下。如輸入 300×300 大小的 PASCAL VOC 2007 test 圖像,在 Titan X 上,SSD 以 58 幀的速率,同時取得了 72.1% 的 mAP。SSD 在保證精度的同時,其速度要比用 region proposals 的方法要快很多。如果輸入的圖像是 500×500,SSD 則取得了75.1% 的 mAP,比目前最 state-of-art 的 Faster R-CNN 要好很多。

本文提出的實時檢測方法,消除了中間的 bounding boxes、pixel or feature resampling 的過程;本文做了一些提升性的工作,既保證了速度,也保證了檢測精度。

貢獻點:

提出了新的物體檢測方法:SSD,比原先最快的 YOLO: You Only Look Once 方法,還要快,還要精確。保證速度的同時,其結果的 mAP 可與使用 region proposals 技術的方法(如 Faster R-CNN)相媲美。

SSD 方法的核心就是 predict object(物體),以及其 歸屬類別的 score(得分);同時,在 feature map 上使用小的卷積核,去 predict 一系列 bounding boxes 的 box offsets。

本文中爲了得到高精度的檢測結果,在不同層次的 feature maps 上去 predict object、box offsets,同時,還得到不同 aspect ratio 的 predictions。

本文的這些改進設計,能夠在當輸入分辨率較低的圖像時,保證檢測的精度。同時,這個整體 end-to-end 的設計,訓練也變得簡單。在檢測速度、檢測精度之間取得較好的 trade-off。

本文提出的模型(model)在不同的數據集上,如 PASCAL VOC、MS COCO、ILSVRC, 都進行了測試。在檢測時間(timing)、檢測精度(accuracy)上,均與目前物體檢測領域 state-of-art 的檢測方法進行了比較。
SSD 模型的最開始部分,本文稱作 base network,是用於圖像分類的標準架構。在 base network 之後,本文添加了額外輔助的網絡結構:

  • 在基礎網絡結構後,添加了額外的卷積層,這些卷積層的大小是逐層遞減的,可以在多尺度下進行 predictions。

推薦 :https://blog.csdn.net/u010167269/article/details/52563573

RetinaNet 算法:

https://blog.csdn.net/JNingWei/article/details/80038594

7.兩階段檢測算法的發展

spp net 算法:

之前算法的侷限:需要固定大小的圖像輸入,不同尺寸的圖像需要經過crop,或者warp等一系列操作,這都在一定程度上導致圖片信息的丟失和變形,限制了識別精確度;從生理學角度出發,人眼看到一個圖片時,大腦會首先認爲這是一個整體,而不會進行crop和warp,所以更有可能的是,我們的大腦通過蒐集一些淺層的信息,在更深層才識別出這些任意形狀的目標。固定長度的約束僅限於全連接層。

 SPP-Net在最後一個卷積層後,接入了金字塔池化層,使用這種方式,可以讓網絡輸入任意的圖片,而且還會生成固定大小的輸出

總結而言,當網絡輸入的是一張任意大小的圖片,這個時候我們可以一直進行卷積、池化,直到網絡的倒數幾層的時候,也就是我們即將與全連接層連接的時候,就要使用金字塔池化,使得任意大小的特徵圖都能夠轉換成固定大小的特徵向量,這就是空間金字塔池化的意義(多尺度特徵提取出固定大小的特徵向量)。

8.詳述RPN網絡結構,爲什麼要使用3*3卷積,不實用5*5卷積,寫出實現的代碼

第一層是固定的3x3卷積,對所有的9個anchor來說是一樣的。這個3x3卷積的感受野,映射到原圖上,就是228x228的區域(VGG網絡)。只有在第2層的2個1x1卷積,是分別針對不同anchor的,它們的輸出通道串起來就是2k和4k這個數量了。所以,anchor的scale和ratio都只是跟1x1卷積的輸出通道相關的,參數是學出來的,但輸入的3x3卷積特徵都是一樣的。

9.詳細瞭解cascade rcnn 網絡結構,損失函數怎麼在級聯網絡中傳遞,級聯的結構是否共用一個feature map層

參考:https://zhuanlan.zhihu.com/p/45036212

10.怎麼減少fp,特別是在一張沒有gt的圖像出框,怎麼避免出框(產生的框都是fp)

11.瞭解目前檢測領域的最新算法

CornerNet:Detecting Objects as Paired Keypoints

提出了一種新的目標檢測方法,使用單個卷積神經網絡將目標邊界框檢測爲一對關鍵點即邊界框的左上角和右下角);我們消除了現有的one stage檢測器設計中對一組anchors的需要;還引入了corner pooling,這是一種新型的池化層,可以幫助網絡更好地定位邊界框的角點。CornerNet在MS COCO上實現了42.1%的AP,優於所有現有的one stage檢測器

使用anchor box的缺點:(1)需要一組龐大的anchor boxes 在DSSD中有超過4萬,在RetinaNet中有超過10萬的anchor box,結果,只有一小部分anchor boxes與ground truth重疊; 這在正負樣本之間造成了巨大的不平衡減慢了訓練速度以及檢測的精度;(2)anchor box需要一組龐大的超參數(例如 box數量,大小以及寬高比)

cornernet是首個基於關鍵點的目標檢測算法,它的優點是:避免了設計anchor boxes的複雜操作

本文采用的方法:

將一個目標物體檢測爲一對關鍵點——邊界框的左上角和右下角。使用單個卷積網絡來預測同一物體類別的所有實例的左上角的熱圖,所有右下角的熱圖,以及每個檢測到的角點的嵌入向量(嵌入用於對屬於同一目標的一對角點進行分組——訓練網絡以預測它們的類似嵌入

corner pooling:包含兩個特徵圖; 在每個像素位置,它最大池化從第一個特徵映射到右側的所有特徵向量,最大池化從第二個特徵映射下面的所有特徵向量,然後將兩個池化結果一起添加。

爲什麼預測角點更加容易:首先,盒子的中心可能更難以定位,因爲它取決於目標的所有4個邊,而定位角取決於2邊,因此更容易,甚至更多的corner pooling,它編碼一些明確的關於角點定義的先驗信息。 其次,角點提供了一種更有效的方式來密集地離散邊界框的空間。

本文是第一個將目標檢測任務定義爲同時檢測和分組角點的任務另一個新穎之處在於corner pooling layer它有助於更好定位角點。本文還對沙漏結構進行了顯著地修改,並添加了新的focal loss的變體,以幫助更好地訓練網絡

使用沙漏網絡[28]作爲CornerNet的骨幹網絡。 沙漏網絡之後是兩個預測模塊。 一個模塊用於左上角,而另一個模塊用於右下角。 每個模塊都有自己的corner pooling模塊,在預測熱圖、嵌入和偏移之前,池化來自沙漏網絡的特徵。 與許多其他物體探測器不同,我們不使用不同尺度的特徵來檢測不同大小的物體。 我們只將兩個模塊應用於沙漏網絡的輸出。
 

CenterNet :Keypoint Triplets for Object Detection

不存在後處理是CenterNet類似網絡一個巨大特點,也是一個非常好的優點,現有的目標檢測方法在nms階段就得浪費大量的時間

cornernet使用了corner pooling操作定位關鍵點,而這個操作是基於bounding box的邊界查找最值點,不能感知bounding box內部的語義信息,所以容易有誤識別

參考博客:https://blog.csdn.net/diligent_321/article/details/89736598

12. 怎麼提高單階段模型的精度,怎麼提高兩階段模型的速度。

13.手寫box regression 推導和NMS算法

14.L1損失和L2損失的比較,以及對應正則化的比較,以及L0損失是什麼,L1損失爲什麼可以提取稀疏的特徵

15.openpose 的實現原理,PIFPAF的實現原理

16. onestage 與 two stage類別不平衡問題

什麼是“類別不平衡”呢?

詳細來說,檢測算法在早期會生成一大波的bbox。而一幅常規的圖片中,頂多就那麼幾個object。這意味着,絕大多數的bbox屬於background。

“類別不平衡”又如何會導致檢測精度低呢?

因爲bbox數量爆炸。 
正是因爲bbox中屬於background的bbox太多了,所以如果分類器無腦地把所有bbox統一歸類爲background,accuracy也可以刷得很高。於是乎,分類器的訓練就失敗了。分類器訓練失敗,檢測精度自然就低了。

那爲什麼two-stage系就可以避免這個問題呢?

因爲two-stage繫有RPN罩着。 
第一個stage的RPN會對anchor進行簡單的二分類(只是簡單地區分是前景還是背景,並不區別究竟屬於哪個細類)。經過該輪初篩,屬於background的bbox被大幅砍削。雖然其數量依然遠大於前景類bbox,但是至少數量差距已經不像最初生成的anchor那樣誇張了。就等於是 從 “類別 極 不平衡” 變成了 “類別 較 不平衡” 。 
不過,其實two-stage系的detector也不能完全避免這個問題,只能說是在很大程度上減輕了“類別不平衡”對檢測精度所造成的影響。 
接着到了第二個stage時,分類器登場,在初篩過後的bbox上進行難度小得多的第二波分類(這次是細分類)。這樣一來,分類器得到了較好的訓練,最終的檢測精度自然就高啦。但是經過這麼兩個stage一倒騰,操作複雜,檢測速度就被嚴重拖慢了。

那爲什麼one-stage系無法避免該問題呢?

因爲one stage系的detector直接在首波生成的“類別極不平衡”的bbox中就進行難度極大的細分類,意圖直接輸出bbox和標籤(分類結果)。而原有交叉熵損失(CE)作爲分類任務的損失函數,無法抗衡“類別極不平衡”,容易導致分類器訓練失敗。因此,one-stage detector雖然保住了檢測速度,卻喪失了檢測精度。

17.D-RFCN + SNIP

18.faster rcnn的RPN具體是怎麼做的?爲什麼使用anchor,不實用會怎麼樣?爲什麼是3種尺度,3種比例?faster rcnn 損失函數

19.anchor free的檢測算法

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章