A. 目標檢測演算法的分步介紹(第 1 部分)
英文原文: https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introction-to-the-basic-object-detection-algorithms-part-1/
對原文的表達有部分改動
在本文中,我們將更深入地研究可用於目標檢測的各種演算法。我們將從 RCNN 家族的演算法開始,即 RCNN、Fast RCNN 和 Faster RCNN。在本系列即將發布的文章中,我們將介紹更高級的演算法,如 YOLO、SSD 等。
下圖是說明目標檢測演算法如何工作的一個流行示例。圖像中的每個物體,從一個人到一隻風箏,都以一定的精度被定位和識別。
讓我們從最簡單的深度學習方法開始,也是一種廣泛使用的方法,用於檢測圖像中的目標——卷積神經網路( CNN)。CNN 的內部工作原理如下:
我們將圖像傳遞給網路,然後通過各種卷積和池化層處理,發送給全連接層。最後,我們以目標類別的形式獲得輸出。這相當簡單,不是嗎?對於每個輸入圖像,我們得到一個相應的類作為輸出。我們可以使用這種技術來檢測圖像中的各種目標嗎?讓我們看看如何使用 CNN 解決一般的目標檢測問題。
使用這種方法的問題在於圖像中的目標可能具有不同的縱橫比和空間位置。例如,在某些情況下,目標可能覆蓋圖像的大部分,而在某些情況下,目標可能僅覆蓋圖像的一小部分。目標的形狀也可能不同(在現實生活中經常發生)。由於這些因素,我們將需要大量的區域,從而導致大量的計算時間。因此,為了解決這個問題並減少區域數量,我們可以使用基於區域的 CNN,它使用提案法選擇區域。讓我們了解這個基於區域的 CNN 可以為我們做什麼。
與在大量區域上工作不同的是,RCNN 演算法是在圖像中選取一堆框並檢查這些框中是否有任何一個包含任何目標。 RCNN 使用 selective search 從圖像中提取這些框(這些框稱為 regions)。
讓我們首先了解什麼是 selective search 以及它如何識別不同的 regions。基本上四個模式可以構成一個物體:不同的尺度、顏色、紋理和外殼。selective search 識別圖像中的這些模式,並在此基礎上提出各種regions。以下是selective search 工作原理的簡要概述:
舉個例子:
到目前為止,我們已經看到了 RCNN 如何實現目標檢測。但是這種技術有其自身的局限性。由於以下步驟,訓練 RCNN 模型既昂貴又緩慢:
所有這些過程結合起來使 RCNN 非常慢。對每張新圖像進行預測大約需要 40-50 秒,這實質上使得模型在面對龐大的數據集時變得笨重且幾乎無法構建。
好消息是——我們有另一種目標檢測技術,它修復了我們在 RCNN 中看到的大部分問題。
我們還能做些什麼來減少 RCNN 演算法通常需要的計算時間?我們是否可以每張圖像只運行一次並獲取所有感興趣的區域(包含某個目標的區域)。
RCNN 的作者 Ross Girshick 提出了這個想法,即每張圖像只運行一次 CNN,然後找到一種方法在 2,000 個區域之間共享該計算。在 Fast RCNN 中,我們將輸入圖像提供給 CNN,後者反過來生成卷積特徵圖。使用這些地圖,提取提議的區域。然後我們使用 RoI 池化層將所有提議的區域重塑為固定大小,以便可以將其饋入全連接網路。
讓我們將其分解為簡化概念的步驟:
因此,Fast RCNN 不是使用三個不同的模型(如 RCNN),而是使用單個模型從區域中提取特徵,將它們分成不同的類,並同時返回識別類的邊界框。
為了進一步分解,我將對每個步驟進行可視化。
這就是 Fast RCNN 如何解決 RCNN 的兩個主要問題,1. 將每個圖像的一個而不是 2,000 個區域傳遞給 ConvNet。2. 使用一個而不是三個不同的模型來提取特徵、分類和生成邊界框。
但即使是 Fast RCNN 也存在某些問題。它還使用 selective search 作為尋找感興趣區域的建議方法,這是一個緩慢且耗時的過程。每張圖像檢測目標大約需要 2 秒,這與 RCNN 相比要好得多。但是當我們考慮大型現實生活數據集時,即使是 Fast RCNN 看起來也不那麼快了。
Faster RCNN 是 Fast RCNN 的修改版本。它們之間的主要區別在於 Fast RCNN 使用 selective search 來生成感興趣的區域,而 Faster RCNN 使用 Region Proposal Network ,又名 RPN。 RPN 將圖像特徵圖作為輸入並生成一組目標提議,每個提議的目標以分數作為輸出。
Faster RCNN 方法通常遵循以下步驟:
讓我簡要解釋一下這個區域提議網路(RPN)實際上是如何工作的。
首先,Faster RCNN 從 CNN 獲取特徵圖並將它們傳遞給區域提議網路。 RPN 在這些特徵圖上使用一個滑動窗口,在每個窗口,它生成 k 個不同形狀和大小的 Anchor 框:
Anchor 框是固定大小的邊界框,它們放置在整個圖像中,具有不同的形狀和大小。對於每個 Anchor,RPN 預測兩件事:
我們現在有不同形狀和大小的邊界框,它們被傳遞到 RoI 池化層。在 RPN 步驟之後,有可能存在沒有分配給它們的類別提議。我們可以獲取每個建議並對其進行裁剪,以便每個建議都包含一個目標。這就是 RoI 池化層所做的。它為每個錨點提取固定大小的特徵圖:
然後將這些特徵圖傳遞到具有 softmax 和線性回歸層的全連接層。它最終對目標進行分類並預測已識別目標的邊界框。
到目前為止,我們討論的所有目標檢測演算法都使用區域來識別目標。網路不會一次性查看完整圖像,而是依次關注圖像的各個部分。這會造成兩個並發症:
B. R-CNN, Fast R-CNN, Faster R-CNN, YOLO:目標檢測演算法總結
參考鏈接
以下是文中涉及的演算法的最原始的文章:
一個最直接的解決辦法是從圖中取不同的感興趣區域,然後對這些區域用CNN進行分類,檢測這些區域中是否有物體的存在。
但是待檢測物體可能存在於圖片的不同位置而且有不同的長寬比例。所以以上方法需要選取量非常大的區域並需要非常大的計算量。
因此,R-CNN, Fast R-CNN, Faster R-CNN, YOLO被開發去又快又准地找物體。
為了解決上述提到的有大量區域被選擇的問題, Ross Girshick et al 提出了一種方法:用了選擇性搜索從圖片提取了2000個區域,這些區域被稱為」region proposals「。
用這種辦法,我們不需要去分類巨大數量的區域了,我們只需要去處理2000個區域。這2000個區域是用如下的選擇性搜索演算法(selective search algorithm)來找到的:
這篇文章 介紹了更多關於選擇性搜索演算法(selective search algorithm)的內容。
RCNN步驟:
R-CNN存在的問題:
Fast R-CNN的幾個改進:
The same author of the previous paper(R-CNN) solved some of the drawbacks of R-CNN to build a faster object detection algorithm and it was called Fast R-CNN. The approach is similar to the R-CNN algorithm.
Fast R-CNN更快的原因是:
Fast R-CNN更快:
From the above graphs, you can infer that Fast R-CNN is significantly faster in training and testing sessions over R-CNN. When you look at the performance of Fast R-CNN ring testing time, including region proposals slows down the algorithm significantly when compared to not using region proposals. Therefore, region proposals become bottlenecks in Fast R-CNN algorithm affecting its performance.
上面兩個演算法的缺點:
selective search耗時
Both of the above algorithms(R-CNN & Fast R-CNN) uses selective search to find out the region proposals . Selective search is a slow and time-consuming process affecting the performance of the network.
Faster R-CNN的改進:
不用selective search去找region proposals;
用network去找region proposals;
Therefore, Shaoqing Ren et al . came up with an object detection algorithm that eliminates the selective search algorithm and lets the network learn the region proposals .
Faster R-CNN的步驟:
時間上的對比:
Faster R-CNN最快並且能用作實時目標檢測
之前幾種演算法的缺點:
產生region的時候沒有縱覽整幅圖。其實圖的某些部分有更高的可能性包含物體。
All of the previous object detection algorithms use regions to localize the object within the image. The network does not look at the complete image. Instead, parts of the image which have high probabilities of containing the object .
YOLO的思想:
用一個單獨的網路去預測bounding boxes和bounding boxes中存在物體的概率
YOLO or You Only Look Once is an object detection algorithm much different from the region based algorithms seen above.
In YOLO, a single convolutional network predicts (1) the bounding boxes and (2)the class probabilities for these boxes.
YOLO的具體步驟:
How YOLO works is that:
YOLO的優缺點:
C. Fast演算法原理:fastica演算法步驟詳解
1. Fast演算法原理
我們前面已經介紹過幾個特徵檢測器,它們的效果都很好,特別是SIFT和SURF演算法,但是從實時處理的角度來看,效率還是太低了。為了解決這個問題,Edward Rosten和Tom Drummond在2006年提出了FAST演算法,並在2010年對其進行了修正。
FAST (全稱Features from accelerated segment test)是一種用於角點檢測的演算法,該演算法的原理是取圖像中檢測點,以該點為圓心的周圍鄰域內像素點判斷檢測點是否為角點,通俗的講就是若一個像素周圍有一定數量的像素與該點像素值不同,則認為其為角點。
1. 1 FAST演算法的基本流程
在圖像中選取一個像素點 p,來判斷它是不是關鍵點。$$I_p$$等於像素點 p的灰度值。
以r為半徑畫圓,覆蓋p點周圍的M個像素,通常情狂下,設置 r=3,則 M=16,如下圖所示:
設置一個閾值t,如果在這 16 個像素點中存在 n 個連續像素點的灰度值都高於$$I_p + t$$,或者低於$$I_p - t$$,那麼像素點 p 就被認為是一個角點。如上圖中的虛線所示,n 一般取值為 12。
由於在檢測特徵點時是需要對圖像中所有的像素點進行檢測,然而圖像中的絕大多數點都不是特徵點,如果對每個像素點都進行上述的檢測過程,那顯然會浪費許多時間,因此採用一種進行非特徵點判別的方法:首先對候選點的周圍每個 90 度的點:1,9,5,13 進行測試(先測試 1 和 19, 如果它們符合閾值要求再測試 5 和 13)。如果 p 是角點,那麼這四個點中至少有 3 個要符合閾值要求,否則直接剔除。對保留下來的點再繼續進行測試(是否有 12 的點符合閾值要求)。
雖然這個檢測器的效率很高,但它有以下幾條缺點:
·獲得的候選點比較多
·特徵點的選取不是最優的,因為它的效果取決與要解決的問題和角點的分布情況。
·進行非特徵點判別時大量的點被丟棄
·檢測到的很多特徵點都是相鄰的
前 3 個問題可以通過機器學習的方法解決,最後一個問題可以使用非最大值抑制的方法解決。
1. 2 機器學習的角點檢測器
選擇一組訓練圖片(最好是跟最後應用相關的圖片)
使用 FAST 演算法找出每幅圖像的特徵點,對圖像中的每一個特徵點,將其周圍的 16 個像素存儲構成一個向量P。
每一個特徵點的 16 像素點都屬於下列三類中的一種
根據這些像素點的分類,特徵向量 P 也被分為 3 個子集:Pd ,Ps ,Pb,
定義一個新的布爾變數$$K_p$$,如果 p 是角點就設置為 Ture,如果不是就設置為 False。
利用特徵值向量p,目標值是$K_p$,訓練ID3 樹(決策樹分類器)。
將構建好的決策樹運用於其他圖像的快速的檢測。
1. 3 非極大值抑制
在篩選出來的候選角點中有很多是緊挨在一起的,需要通過非極大值抑制來消除這種影響。
為所有的候選角點都確定一個打分函數$$V $$ , $$V $$的值可這樣計算:先分別計算$$I_p$$與圓上16個點的像素值差值,取絕對值,再將這16個絕對值相加,就得到了$$V $$的值
最後比較毗鄰候選角點的 V 值,把V值較小的候選角點pass掉。
FAST演算法的思想與我們對角點的直觀認識非常接近,化繁為簡。FAST演算法比其它角點的檢測演算法快,但是在雜訊較高時不夠穩定,這需要設置合適的閾值。
2.Fast實現
OpenCV中的FAST檢測演算法是用傳統方法實現的,
1.實例化fast
參數:
·threshold:閾值t,有默認值10
·nonmaxSuppression:是否進行非極大值抑制,默認值True
返回:
Fast:創建的FastFeatureDetector對象
2.利用fast.detect檢測關鍵點,沒有對應的關鍵點描述
參數:
gray: 進行關鍵點檢測的圖像,注意是灰度圖像
返回:
kp: 關鍵點信息,包括位置,尺度,方向信息
3.將關鍵點檢測結果繪制在圖像上,與在sift中是一樣的
示例:
結果:
D. 計算機視覺——典型的目標檢測演算法(Fast R-CNN演算法)(五)
【嵌牛導讀】目標檢測在現實中的應用很廣泛,我們需要檢測數字圖像中的物體位置以及類別,它需要我們構建一個模型,模型的輸入一張圖片,模型的輸出需要圈出圖片中所有物體的位置以及物體所屬的類別。在深度學習浪潮到來之前,目標檢測精度的進步十分緩慢,靠傳統依靠手工特徵的方法來提高精度已是相當困難的事。而ImageNet分類大賽出現的卷積神經網路(CNN)——AlexNet所展現的強大性能,吸引著學者們將CNN遷移到了其他的任務,這也包括著目標檢測任務,近年來,出現了很多目標檢測演算法。
【嵌牛鼻子】計算機視覺
【嵌牛提問】如何理解目標檢測演算法——Fast R-CNN
【嵌牛正文】
為克服SPP-Net 存在的問題,2015 年Girshick 等提出基於邊界框和多任務損失分類的Fast R-CNN[31]演算法。該演算法將SPP 層簡化,設計出單尺度的ROI Pooling 池化層結構;將整張圖像的候選區域采樣成固定大小,生成特徵圖後作SVD分解,通過RoI Pooling層得到Softmax的分類得分和BoundingBox 外接矩形框的窗口回歸兩個向量;用Softmax 代替SVM 提出多任務損失函數思想,將深度網路和SVM分類兩個階段整合,即將分類問題和邊框回歸問題進行合並。
演算法詳解:
Fast R-CNN的流程圖如下,網路有兩個輸入: 圖像和對應的region proposal 。其中region proposal由selective search方法得到,沒有表示在流程圖中。對每個類別都訓練一個回歸器,且只有非背景的region proposal才需要進行回歸。
ROI pooling:ROI Pooling的作用是對不同大小的region proposal,從最後卷積層輸出的feature map提取大小固定的feature map。簡單講可以看做是SPPNet的簡化版本,因為全連接層的輸入需要尺寸大小一樣,所以不能直接將不同大小的region proposal映射到feature map作為輸出,需要做尺寸變換。在文章中,VGG16網路使用H=W=7的參數,即將一個h*w的region proposal分割成H*W大小的網格,然後將這個region proposal映射到最後一個卷積層輸出的feature map,最後計算每個網格里的最大值作為該網格的輸出,所以不管ROI pooling之前的feature map大小是多少,ROI pooling後得到的feature map大小都是H*W。
因此可以看出Fast RCNN主要有3個改進:1、卷積不再是對每個region proposal進行,而是直接對整張圖像,這樣減少了很多重復計算。原來RCNN是對每個region proposal分別做卷積,因為一張圖像中有2000左右的region proposal,肯定相互之間的重疊率很高,因此產生重復計算。2、用ROI pooling進行特徵的尺寸變換,因為全連接層的輸入要求尺寸大小一樣,因此不能直接把region proposal作為輸入。3、將regressor放進網路一起訓練,每個類別對應一個regressor,同時用softmax代替原來的SVM分類器。
在實際訓練中,每個mini-batch包含2張圖像和128個region proposal(或者叫ROI),也就是每張圖像有64個ROI。然後從這些ROI中挑選約25%的ROI,這些ROI和ground truth的IOU值都大於0.5。另外只採用隨機水平翻轉的方式增加數據集。
測試的時候則每張圖像大約2000個ROI。
損失函數的定義是將分類的loss和回歸的loss整合在一起,其中分類採用log loss,即對真實分類(下圖中的pu)的概率取負log,而回歸的loss和R-CNN基本一樣。分類層輸出K+1維,表示K個類和1個背景類。
這是回歸的loss,其中t^u表示預測的結果,u表示類別。v表示真實的結果,即bounding box regression target。
採用SVD分解改進全連接層。如果是一個普通的分類網路,那麼全連接層的計算應該遠不及卷積層的計算,但是針對object detection,Fast RCNN在ROI pooling後每個region proposal都要經過幾個全連接層,這使得全連接層的計算占網路的計算將近一半,如下圖,所以作者採用SVD來簡化全連接層的計算。另一篇博客鏈接講的R-FCN網路則是對這個全連接層計算優化的新的演算法。
稍微總結下訓練和測試的結構,如下面兩個圖,對演算法的理解會更清晰。
test結構圖在ROI Pooling層是怎麼輸出的畫得比較容易理解。
E. fast和quick的區別
1,詞性上面的區別。
fast既是形容詞,也是副詞。quick是形容詞,它的副詞形式是quickly。
2,強調重點不同。
fast強調速度快,強調的是「速度」。
比如:一輛汽車行駛的非常快(It's a very fast car),一個人跑的非常快(He runs very fast)。在此時,我們需要用fast來形容。
3,發音不同。
quickly
音標:英['kwɪklɪ]美['kwɪkli]
fast
音標:英[fɑːst]美[fæst]
(5)fastscnn演算法擴展閱讀:
fast,quick的其他釋義,短語,例句:
fast的其他意思:
vi. 禁食,齋戒
n. 齋戒;絕食
短語:
as fast as和…一樣快
fast growth快速生長
fast response快速響應
fast algorithm快速演算法
例句:
1,These apples are maturing fast.
這些蘋果正在快速成熟。
2,They fast on certain days.
他們在某些天齋戒。
3,The fast bowlers were brought on again after the interval.
在休息後快速投球手再次被要求出場投球。
quick的其他釋義:無
短語:
answer quickly搶答字母組
quickly erase快速抹除
sit quickly安靜地坐
例句:
1,I have done the errands quickly.
我很快幹完了這些差事。
2,The dough would sour quickly in such weather.
在這種天氣生面團會很快發酵。
3,If we do the work turn and turn about, we can finish it quickly.
如果我們輪換著做這個工作,我們能很快地把它完成。
F. Fast-SCNN
https://blog.csdn.net/calvinpaean/article/details/88534052
https://arxiv.org/pdf/1902.04502.pdf
https://github.com/Tramac/Fast-SCNN-pytorch
https://github.com/xiaoyufenfei/Efficient-Segmentation-Networks
摘要 :本文介紹一種適用於低內存嵌入式設備、計算高效、可用於高解析度圖像(1024×2048px)的實時語義分割模型FastSCNN。在現有的快速分割的雙分支方法的基礎上,我們引入「學習下采樣」模塊,該模塊同時計算多個解析度分支的低層級特徵。然後將高解析度的空間細節與低解析度提取的深層特徵結合起來,在Cityspaces數據集上獲得68.0%mIoU的精度,123.5FPS的速度。我們還證明大規模預訓練沒必要。我們用ImageNet預訓練和Cityspaces的粗標記數據對我們的度量進行了實驗驗證。最後,我們不修改網路結構,在下采樣的輸入上獲得了速度更快、精度有可比性的結果。
1.引言
實時語義分割的研究最近獲得了顯著的普及[21,34,17,25,36,20]。
我們發現,文獻中語義分割通常由具有編碼器-解碼器框架的深卷積神經網路來處理[29,2],而許多計算高效的方法使用雙分支或多分支架構[21,34,17]。通常情況下:
•更大的感受野對於學習對象類之間的復雜關聯(即全局上下文)很重要,
•圖像中的空間細節是保持物體邊界所必需的,以及
•需要具體的設計來平衡速度和准確性(而不是重定位的分類DCNNs)。
具體地說,在兩個分支網路中,較深的分支在低解析度下用於捕獲全局上下文,而較淺的分支在全輸入解析度下用於學習空間細節。然後將二者合並,得到最終的語義分割結果。重要的是,較深的分支帶來的計算成本的提升需要靠縮小輸入尺寸來克服。而要獲得全解析度圖只需要較少的層數。因而,在現代GPU上,實時性是可以實現的。與編碼-解碼不同的是,雙分支中不同解析度的初始卷積是不共享的。這里值得注意的是,引導上采樣網路(GUN)[17]和圖像級聯網路(ICNet)[36]只在前幾層之間共享權重。
我們提出FastSCNN,將雙分支技術[21,34,17,36]與編碼-解碼[29,2]結合起來。FastSCNN的結構如圖1。因為深度卷積網路的淺層主要提取低級特徵[35,19],我們共享了雙分支中初始層的計算。我們稱這種技術為「學習下采樣」,其效果與編碼-解碼中的跳連相似。我們只使用了一次跳連來保證計算效率。「學習下采樣」模塊層數比較淺,以保證特徵共享的有效性。最後,我們還使用了深度可分離卷積[30,10]和逆殘差模塊[28]。
在Cityspaces數據集[6]上,FastSCNN在NvidiaTitanXp(Pascal)上處理全解析度圖像(1024×2048px),速度是123.5FPS,精度是68.0%mIoU。比現有最先進技術快兩倍。(BiSeNet,71.4%mIoU,[34])。
雖然我們的參數量達到1.11M,但大多數離線分割方法(如DeepLab[4]和PSPNet[37])以及一些實時演算法(如GUN[17]和ICNet[36])的參數量多得多。FastSCNN的模型容量特別低,原因是:(1)要在低內存的嵌入式設備上運行,(2)期待有更好的泛化能力。先前的很多工作都建議在ImageNet數據集[27]上預訓練以提高精度和泛化能力。我們研究了預訓練對低容量的FastSCNN的影響,結論是,使用預訓練或者弱標簽數據沒有明顯的提升效果,在Cityscapes數據集上只提升了0.5%mIoU,這一點和那些大容量的模型剛好相反。總結下我們的貢獻:
(1) 提出了FastSCNN,在高解析度圖像(1024×2048px)上,精度有競爭力(68.0%),速度特別強(123.5fps)。
(2) 使用離線方法中常用的跳連,提出了一個淺層的「學習下采樣」模塊,以快速高效地多分支低層級特徵提取。
(3)將FastSCNN設計為小容量,並且實驗證明,對於小容量網路,多跑一些epoch,和使用預訓練或額外的弱標簽數據是等效的。
此外,對於下采樣的輸入,我們不對網路做任何修改就達到了最先進水平。
2.相關工作
我們對比分析語義分割方法,尤其是低功耗低內存的實時語義分割方法[2,20,21,36,34,17,25,18]。
2.1.語義分割的基礎
最先進的語義分割結合了兩個獨立的模塊:編碼器和解碼器。編碼器用卷積和池化來提取特徵。解碼器從低解析度特徵中恢復空間細節,並預測分割結果[29,2]。通常,編碼器用一個移除全連接層的分類網路,例如VGG或ResNet。
FCN[29]是大多數分割模型的基礎,采樣VGG為編碼器,雙線性上采樣結合較低層的跳接來恢復空間細節。U-Net[26]使用密集的跳連進一步利用空間細節。
之後,受全局的圖像上下文先驗啟發[13,16],PSPNet[37]使用金字塔池化模塊,DeepLab[4]使用atrous空間金字塔池化(ASPP)對全局上下文進行編碼和利用。
其他競爭性的基本分割結構使用條件隨機場(CRF)[38,3]或遞歸神經網路[32,38]。然而它們不實時。
與目標檢測[23,24,15]類似,速度是一個重要因素[21,34,17,25,36,20]。SegNet在FCN的基礎上引入了聯合編解碼模型,成為最早的高效分割模型之一。繼SegNet之後,ENet[20]還設計了一個具有很少幾層的編碼器-解碼器,以降低計算成本。
最近出現了雙分支和多分支方法。ICNet[36]、ContextNet[21]、BiSeNet[34]和GUN[17]通過在深度分支中減少輸入的解析度來學習全局上下文,而在淺層分支的全解析度特徵中學習邊緣的細節信息。
然而,最先進的實時語義分割仍然具有局限性,並且通常需要高端GPU。受雙分支方法的啟發,FastSCNN使用了一個淺層的網路路徑來編碼細節信息,上下文信息在低分辨特徵中被有效地學習,如圖2所示。
2.2 DCNN中的高效設計
深度可分離卷積: MobileNet[10]提出深度可分離卷積,減少了浮點運算和卷積參數,降低了計算量和內存需求。
高效的重新設計: Chollet[5]使用高效的深度可分離卷積設計了Xception 網路。MobileNet-V2提出了inverted bottleneck resial block[28]來構建一個高效率的深度網路,用於分類任務。ContextNet[21]使用 inverted bottleneck resial block設計了一個雙分支網路,用於實時語義分割。
網路量化: 浮點計算相較於整型和二進制操作要昂貴的多,模型運行時間可以進一步通過量化技巧來縮短。
網路壓縮: 剪枝可以用於減小預訓練網路的大小,使運行速度更快,參數更少,內存佔用更少。
FastSCNN很依賴於深度可分離卷積和resial bottleneck blocks[28]。此外,我們還引入雙分支結構,與「學習下采樣」模塊結合起來,允許在多級解析度上共享特徵,如圖2所示。注意,盡管多個分支的初始層提取了相似的特徵[35,19],但常用的雙分支方法並沒有使用這一點。網路量化和網路壓縮可以正交應用,這個留給我們以後的工作。
2.3 輔助任務的預訓練
普遍認為輔助任務的預訓練可以提高精度。早期的目標檢測[7]和語義分割[4,37]的研究在ImageNet上進行了預訓練[27]。其他實時高效的語義分割方法也在ImageNet上進行了預訓練[36,34,17]。然而,尚不清楚低容量網路是否有必要預訓練。我們實驗證明預訓練對小網路沒有明顯的提升效果。數據增廣和訓練更多的epoch也能取得類似的效果。
3 我們提出的FastSCNN
FastSCNN靈感來自於雙分支結構[21,34,17]和具有跳連的編碼器網路[29,26]。因為注意到網路的前幾層通常提取低級特徵,我們將跳連重新解釋為一個「學習下采樣」模塊,這樣我們就能夠融合兩個框架的關鍵思想,並可以構建一個快速的語義分割模型。圖1和表1是FastSCNN的結構。接下來將介紹我們的設計動機和各模塊的詳細設置。
3.1 動機
當前最先進的實時語義分割方法是基於雙分支結構,每個分支作用在不同級別的解析度上[21,34,17],從輸入圖像的低分辨特徵中學習全局信息,並使用淺層網路的全解析度來細化分割結果的精度。由於輸入解析度和網路深度是決定運行時間的主要因素,雙分支結構使得模型可以是實時的。
眾所周知,網路的前幾層提取低級特徵,例如邊和角[35,19]。因此,我們不採用將兩個分支完全獨立的方法,而是引入學習下采樣模塊,讓兩個分支共享淺層的網路模塊。
3.2 網路結構
我們的FastSCNN使用「學習下采樣模塊」,一個粗糙的全局特徵提取模塊、一個特徵融合模塊和一個標準的分類器。所有模塊都是用深度可分離卷積來構建,深度可分離卷積已經是許多高效網路的關鍵[5,10,21]。
3.2.1學習下采樣
為了保證低層特徵共享的有效和高效,學習下采樣模塊只採用了三層結構。第一層是標准卷積層(Conv2D),另外兩層是深度可分離卷積(DSConv)。這里要說明的是,雖然DSConv可以提升計算效率,但由於輸入圖像只有3個通道,深度可分離卷積放在第一層的話帶來的效率的提升是微不足道的,因此第一層用標准卷積。
學習下采樣的3層中的每一層的卷積滑動步長都是2,然後是批量歸一化和ReLU。標准卷積和深度可分離中的深度層的卷積核尺寸都是3×3。和[5,28,21]一樣,我們省略了深度可分離卷積中深度卷積和點卷積的非線性運算。
3.2.2全局特徵提取器
全局特徵提取模塊是為了獲取圖像分割的全局上下文。與通常的雙分支方法在原始圖像上獲取低解析度特徵不同,我們是取「學習下采樣」模塊的輸出作為全局特徵提取器的輸入,其解析度是原始圖像的1/8。詳細結構如表1所示。我們使用MobileNet-v2[28]中提出的高效的bottleneck resial block,如表2所示。
特別地,當輸入輸出大小相同時,我們對bottleneck resial block採用殘差連接。我們的bottleneck block使用了一個高效的深度可分離卷積,這樣參數量更小,浮點計算更少。此外,在末尾添加金字塔池模塊(PPM)[37],以聚合基於不同區域的上下文信息。
3.2.3特徵融合模塊
與ICNet[36]和ContextNet[21]類似,我們更喜歡簡單的特徵相加,以確保效率。或者,使用更復雜的特徵融合模塊,例如[34],這樣精度更高而計算量也更大。特徵融合模塊的細節如表3所示。
3.2.4分類器
分類器中使用了兩個深度可分離卷積和一個點卷積。我們發現在特徵融合模塊後增加幾層可以提高精度。分類器模塊的詳細信息如表1所示。
在訓練過程中使用Softmax,因為使用了梯度下降。在推理過程中,我們可以用Argmax代替昂貴的Softmax計算。我們將此選項表示為Fast SCNN cls(分類)。另一方面,如果需要輸出概率模型,則使用softmax,表示為FastSCNN prob(概率)。
3.3 和現有的最先進技術比較
3.3.1與雙分支模型的關系
最先進的實時模型(ContextNet[21]、BiSeNet[34]和GUN[17])使用雙分支結構。我們的「學習下采樣」模塊相當於它們的空間路徑,因為它很淺,從全解析度學習,並用於特徵融合模塊(圖1)。
我們的全局特徵提取模塊相當於這種方法更深層的低解析度分支。相反,我們的全局特徵抽取器與學習下采樣模塊共享其前幾層的計算。通過共享層,我們不僅降低了特徵提取的計算復雜度,而且還降低了所需的輸入大小,因為FastSCNN使用1/8解析度而不是1/4解析度進行全局特徵提取。
3.3.2與編碼-解碼模型的關系
FastSCNN可以看做是諸如FCN[29]或U-Net[26]等編碼-解碼框架的特例。然而,與FCN中的多個跳連和U-Net中的密集跳連不同,FastSCNN只使用一個跳連來減少計算量和內存。
與[35]一致,他主張在DCNNs中只在前幾層共享特徵,我們將跳連放在網路的前幾層。和我們相反,現有的最先進技術都是在每個解析度下使用很深的模塊之後才使用跳連。
4.實驗
我們在Cityscapes數據集[6]上評估我們的方法,並且在測試集,也就是Cityscapes benchmark server上提交了它的性能。
4.1實現細節
我們用Python、Tensorflow上進行了實驗。我們實驗的工作站有有Nvidia Titan X(Maxwell)或Nvidia Titan Xp(Pascal)GPU、CUDA 9.0和CuDNN v7。運行時評估在單個CPU線程和一個GPU中執行,以測量前向推理時間。我們取100幀的平均耗時作為單幀耗時。
我們使用SGD(momentum=0.9),批量大小是12。受[4,37,10]的啟發,我們使用「poly」學習率,其中基學習率為0.045,冪為0.9。與MobileNet-V2類似,我們發現L2正則化對深度卷積(depthwise convolution)不必要。其他的層,L2系數是0.00004。因為語義分割的訓練數據有限,我們使用了多種數據增強技術:隨機縮放(縮放率范圍是0.5到2)、平移/裁剪、水平翻轉、顏色通道雜訊和亮度變化。使用交叉熵損失訓練。我們發現學習結束時的輔助損失和0.4權值的全局特徵提取模塊是有益的。
批量歸一化在每個激活函數之前使用。Dropout只在最後一層,也就是softmax之前。與MobileNet[10]和ContextNet[21]相反,我們發現使用ReLU訓練得更快,而且精度比ReLU6稍高,即使整個模型都使用深度可分離卷積。
我們發現訓練更多的迭代次數可以提高性能。除非另有說明,我們使用Cityescapes數據集[6]用1000個epoch訓練我們的模型。值得注意的是,Fast-SCNN的容量故意非常低,只有1.11million個參數。後來我們發現有益的數據增強技術使得不太可能過度擬合。
4.2.在Cityscapes數據集上的評估
Cityscapes是最大的公開的城市道路數據集,包含從歐洲50個不同城市拍攝的高解析度圖像(1024×2048px)。它有5000個高質量標注的圖像,其中訓練集2975個,驗證集500個,測試集1525個。訓練集和驗證集的標注是公開的,測試集的結果可以在評估伺服器上進行評估。此外,20000個弱標注圖像(粗糙標簽)可用於訓練。我們在這兩者上都進行評估:高質量標注樣本和粗糙標注樣本。Cityscapes提供30個類別標簽,而只有19個類別用於評估。接下來我們報告模型的mIoU和推斷時間。下面報告聯合上的平均交集(mIoU)和網路推理時間。
我們在Cityscapes不公開的測試集上評估總體性能。我們所提的FastSCNN與其他最先進的實時語義分割方法(ContextNet[21]、BiSeNet[34]、GUN[17]、ENet[20]和ICNet[36])和離線方法(PSPNet[37]和DeepLab-V2[4])的比較如表4所示。FastSCNN達到68.0%mIoU,略低於BiSeNet(71.5%)和GUN(70.4%)。ContextNet在這里只達到66.1%。
表5比較了不同解析度下的推斷時間。在這里,BiSeNet(57.3 fps)和GUN(33.3 fps)明顯慢於FastSCNN(123.5 fps)。與ContextNet(41.9fps)相比,在Nvidia Titan X(Maxwell)上,FastSCNN的速度也明顯更快。因此,我們得出結論,FastSCNN顯著提高了最先進模型的速度,而只以輕微的精度降低為代價。FastSCNN為低內存嵌入設備而設計,使用1.11million個參數,比BiSeNet的5.8million個參數少5倍。
最後,我們將跳連的作用置零,來測試FastSCNN的性能。驗證集上,mIoU從69.22%降低到64.30%。圖3比較了定性結果。正如所料,跳連對FastSCNN是有益的,特別是在邊界和小尺寸物體周圍。
4.3 預訓練和弱標注數據
大容量的深度卷積網路,如R-CNN[7]和PSPNet[37]已經表明,通過不同的輔助任務,預訓練可以提高性能。由於我們的FastSCNN是低容量的,我們希望在使用預訓練和不使用預訓練的情況下分別測試性能。據我們所知,預訓練和弱標注數據對低容量模型的作用的重要性,還沒有被研究過。結果如表6所示。
我們在ImageNet[27]上預先訓練FastSCNN,用平均池化替換特徵融合模塊,分類模塊現在只有一個softmax層。FastSCNN在ImageNet的驗證集上達到60.71%的top-1精度和83.0%的top-5精度。這一結果表明,FastSCNN的容量不足以達到ImageNet上大多數標准DCNNs的性能(>70%top-1)[10,28]。使用ImageNet預訓練的Fast-SCNN在城市景觀驗證集上的准確率為69.15%mIoU,僅比沒有預訓練的FastSCNN提高0.53%。因此,我們得出結論,在FastSCNN中,使用ImageNet預訓練不能獲得顯著的提升。
由於Cityscapes數據集和ImageNet數據集之間的重疊是有限的,因此可以合理地假設,由於兩個領域的容量有限,FastSCNN可能不會受益。因此,我們現在合並了Cityscapes提供的20000張粗糙標記的附加圖像,因為這些圖像來自類似的領域。然而,使用粗糙標注數據訓練的FastSCNN(使用或不使用ImageNet預訓練)性能相似,僅在沒有預訓練的情況下略優於原始的FastSCNN。請注意,由於DCNNs的隨機初始化,微小的性能浮動是微不足道的。
我們表明,無論是ImageNet預訓練還是弱標記數據都對我們的低容量DCNN沒有顯著的好處。圖4顯示了訓練曲線。使用粗糙標注數據訓練的FastSCNN的迭代速度慢,因為標注的質量差。使用ImageNet預訓練的兩個模型在早期階段(對不用粗標注數據的模型是前400個epoch,對使用粗標注數據的模型是前100個epoch)表現的更好。帶有粗數據序列的快速SCNN迭代速度慢是標簽質量差的原因。ImageNet的兩個預訓練版本只在早期階段都表現得更好(單獨訓練集最多400個階段,使用附加的粗略標記數據訓練時為100個階段)。這意味著,當我們從頭訓練模型(也就是不使用預訓練)時,多訓練一些epoch就能達到和使用預訓練類似的精度。
4.4 更低的輸入解析度
我們評估下在1/2和1/4解析度下模型的性能(表7)。
1/4解析度下,模型精度51.9%,速度485.4fps,這比MiniNet(佚名)的40.7%mIoU、250fps好得多。在1/2解析度下,可達到具有競爭力的62.8%mIoU、285.8fps。我們強調,無需修改,快速SCNN直接適用於較低的輸入解析度,使其非常適合嵌入式設備。
5 結論
我們提出了FastSCNN用於實時語義分割。多分支結構的共享計算可以節省計算量提高速度。實驗表明跳連有利於恢復空間細節。如果訓練的epoch數足夠多,對低容量網路而言,大規模輔助任務預訓練沒必要。
G. OpenCV-Python教程:38.FAST角點檢測演算法
理論
我們看到了一些特徵檢測演算法,他們很多都不錯,但是從實時應用的角度看,他們都不夠快,一個最好的例子是SLAM(同步定位與地圖創建)移動機器人沒有足夠的計算能力。
作為解決方案,FAST(加速切片測試特徵)演算法被提出,Edward Rosten和Tom Drummond 2006年在他們的論文「Machine learning for high-speed corner detection」提出,並在2010年最後修訂,演算法的基本大意如下:
使用FAST進行特徵檢測
1.選擇一個圖像里的像素p用來識別是不是一個興趣點,它的強度是Ip
2.選擇一個合適的閾值t
3.在要測試的像素周圍找16個像素的圓
4.現在如果存在一個在圓內(16像素的)的n個連續像素集合,他們都比Ip + t要亮,或者都比Ip - t 要暗(用白虛線顯示),那p就是角, n取12。
5.用一個高速測試來排除大量非角。這個測試只檢查1,9,5和13位置的像素(首先1和9會測試是否他們太亮或者太暗,如果是,再檢查5和13)。如果p是角,那麼至少3個都比Ip+t要亮或者比Ip-t要暗,如果不是這樣,那麼p不可能是角。這個檢測器展現了高性能,但是有幾個缺陷:
·當n< 12時不能拒絕很多備選點
·像素的選擇不是可選的,因為它的效率依賴問題和角的分布。
·高速測試的結果被丟棄了
·會檢測出多個愛挨在一起的特徵
機器學習角點檢測
1.選擇一組圖像進行訓練(最好從目標應用范圍內)
2.運行FAST演算法來對每個圖像進行特徵點查找
3.對每個特徵點,存下周圍的16個像素作為向量。所有圖像做完以後得到特徵向量P。
4.這16個像素里的每個像素(設為x)可以有下面的三個狀態:
5.根據這些狀態,特徵向量P被分成3個子集,Pd, Ps, Pb.
6.定義個新的布爾變數Kp,如果p是角就是真反之為假。
7.使用ID3演算法(決策樹分類)來查詢每個子集,對於每個true類用變數Kp,它選擇x來得出一個備選像素是否是角的信息。
8.對所有子集迭代直到為0
9.創建的決策樹用來對其他圖形做fast檢測
非極大值抑制
在臨近位置檢測多個興趣點是另一個問題,可以使用非極大值抑制來解決。
1.計算一個分數函數,V是所有檢測到的特徵點,V是p和16個圍著的像素值得絕對差。
2.計算兩個相鄰關鍵點的V值
3.丟掉V值低的那個
總結:
它比其他存在的角點演算法要快幾倍
但是它對高噪點情況來說不健壯,依賴閾值
OpenCV里的FAST特徵檢測
它和其他OpenCV里的特徵檢測類似,如果你願意,你可以指定閾值,是否使用非極大值抑制,要用的鄰居等。
對於鄰居,定義了三個標志位, cv2.FAST_FEATURE_DETECTOR_TYPE_5_8, cv2.FAST_FEATURE_DETECTOR_TYPE_7_12和cv2.FAST_FEATURE_DETECTOR_TYPE_9_16.
看結果,第一個圖像顯示了使用了非極大值抑制的FAST,第二個是沒有使用非極大值抑制的。
END
H. 目標檢測演算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)
深度學習目前已經應用到了各個領域,應用場景大體分為三類:物體識別,目標檢測,自然語言處理。 目標檢測可以理解為是物體識別和物體定位的綜合 ,不僅僅要識別出物體屬於哪個分類,更重要的是得到物體在圖片中的具體位置。
2014年R-CNN演算法被提出,基本奠定了two-stage方式在目標檢測領域的應用。它的演算法結構如下圖
演算法步驟如下:
R-CNN較傳統的目標檢測演算法獲得了50%的性能提升,在使用VGG-16模型作為物體識別模型情況下,在voc2007數據集上可以取得66%的准確率,已經算還不錯的一個成績了。其最大的問題是速度很慢,內存佔用量很大,主要原因有兩個
針對R-CNN的部分問題,2015年微軟提出了Fast R-CNN演算法,它主要優化了兩個問題。
R-CNN和fast R-CNN均存在一個問題,那就是 由選擇性搜索來生成候選框,這個演算法很慢 。而且R-CNN中生成的2000個左右的候選框全部需要經過一次卷積神經網路,也就是需要經過2000次左右的CNN網路,這個是十分耗時的(fast R-CNN已經做了改進,只需要對整圖經過一次CNN網路)。這也是導致這兩個演算法檢測速度較慢的最主要原因。
faster R-CNN 針對這個問題, 提出了RPN網路來進行候選框的獲取,從而擺脫了選擇性搜索演算法,也只需要一次卷積層操作,從而大大提高了識別速度 。這個演算法十分復雜,我們會詳細分析。它的基本結構如下圖
主要分為四個步驟:
使用VGG-16卷積模型的網路結構:
卷積層採用的VGG-16模型,先將PxQ的原始圖片,縮放裁剪為MxN的圖片,然後經過13個conv-relu層,其中會穿插4個max-pooling層。所有的卷積的kernel都是3x3的,padding為1,stride為1。pooling層kernel為2x2, padding為0,stride為2。
MxN的圖片,經過卷積層後,變為了(M/16) x (N/16)的feature map了。
faster R-CNN拋棄了R-CNN中的選擇性搜索(selective search)方法,使用RPN層來生成候選框,能極大的提升候選框的生成速度。RPN層先經過3x3的卷積運算,然後分為兩路。一路用來判斷候選框是前景還是背景,它先reshape成一維向量,然後softmax來判斷是前景還是背景,然後reshape恢復為二維feature map。另一路用來確定候選框的位置,通過bounding box regression實現,後面再詳細講。兩路計算結束後,挑選出前景候選框(因為物體在前景中),並利用計算得到的候選框位置,得到我們感興趣的特徵子圖proposal。
卷積層提取原始圖像信息,得到了256個feature map,經過RPN層的3x3卷積後,仍然為256個feature map。但是每個點融合了周圍3x3的空間信息。對每個feature map上的一個點,生成k個anchor(k默認為9)。anchor分為前景和背景兩類(我們先不去管它具體是飛機還是汽車,只用區分它是前景還是背景即可)。anchor有[x,y,w,h]四個坐標偏移量,x,y表示中心點坐標,w和h表示寬度和高度。這樣,對於feature map上的每個點,就得到了k個大小形狀各不相同的選區region。
對於生成的anchors,我們首先要判斷它是前景還是背景。由於感興趣的物體位於前景中,故經過這一步之後,我們就可以舍棄背景anchors了。大部分的anchors都是屬於背景,故這一步可以篩選掉很多無用的anchor,從而減少全連接層的計算量。
對於經過了3x3的卷積後得到的256個feature map,先經過1x1的卷積,變換為18個feature map。然後reshape為一維向量,經過softmax判斷是前景還是背景。此處reshape的唯一作用就是讓數據可以進行softmax計算。然後輸出識別得到的前景anchors。
另一路用來確定候選框的位置,也就是anchors的[x,y,w,h]坐標值。如下圖所示,紅色代表我們當前的選區,綠色代表真實的選區。雖然我們當前的選取能夠大概框選出飛機,但離綠色的真實位置和形狀還是有很大差別,故需要對生成的anchors進行調整。這個過程我們稱為bounding box regression。
假設紅色框的坐標為[x,y,w,h], 綠色框,也就是目標框的坐標為[Gx, Gy,Gw,Gh], 我們要建立一個變換,使得[x,y,w,h]能夠變為[Gx, Gy,Gw,Gh]。最簡單的思路是,先做平移,使得中心點接近,然後進行縮放,使得w和h接近。如下:
我們要學習的就是dx dy dw dh這四個變換。由於是線性變換,我們可以用線性回歸來建模。設定loss和優化方法後,就可以利用深度學習進行訓練,並得到模型了。對於空間位置loss,我們一般採用均方差演算法,而不是交叉熵(交叉熵使用在分類預測中)。優化方法可以採用自適應梯度下降演算法Adam。
得到了前景anchors,並確定了他們的位置和形狀後,我們就可以輸出前景的特徵子圖proposal了。步驟如下:
1,得到前景anchors和他們的[x y w h]坐標。
2,按照anchors為前景的不同概率,從大到小排序,選取前pre_nms_topN個anchors,比如前6000個
3,剔除非常小的anchors。
4,通過NMS非極大值抑制,從anchors中找出置信度較高的。這個主要是為了解決選取交疊問題。首先計算每一個選區面積,然後根據他們在softmax中的score(也就是是否為前景的概率)進行排序,將score最大的選區放入隊列中。接下來,計算其餘選區與當前最大score選區的IOU(IOU為兩box交集面積除以兩box並集面積,它衡量了兩個box之間重疊程度)。去除IOU大於設定閾值的選區。這樣就解決了選區重疊問題。
5,選取前post_nms_topN個結果作為最終選區proposal進行輸出,比如300個。
經過這一步之後,物體定位應該就基本結束了,剩下的就是物體識別了。
和fast R-CNN中類似,這一層主要解決之前得到的proposal大小形狀各不相同,導致沒法做全連接。全連接計算只能對確定的shape進行運算,故必須使proposal大小形狀變為相同。通過裁剪和縮放的手段,可以解決這個問題,但會帶來信息丟失和圖片形變問題。我們使用ROI pooling可以有效的解決這個問題。
ROI pooling中,如果目標輸出為MxN,則在水平和豎直方向上,將輸入proposal劃分為MxN份,每一份取最大值,從而得到MxN的輸出特徵圖。
ROI Pooling層後的特徵圖,通過全連接層與softmax,就可以計算屬於哪個具體類別,比如人,狗,飛機,並可以得到cls_prob概率向量。同時再次利用bounding box regression精細調整proposal位置,得到bbox_pred,用於回歸更加精確的目標檢測框。
這樣就完成了faster R-CNN的整個過程了。演算法還是相當復雜的,對於每個細節需要反復理解。faster R-CNN使用resNet101模型作為卷積層,在voc2012數據集上可以達到83.8%的准確率,超過yolo ssd和yoloV2。其最大的問題是速度偏慢,每秒只能處理5幀,達不到實時性要求。
針對於two-stage目標檢測演算法普遍存在的運算速度慢的缺點, yolo創造性的提出了one-stage。也就是將物體分類和物體定位在一個步驟中完成。 yolo直接在輸出層回歸bounding box的位置和bounding box所屬類別,從而實現one-stage。通過這種方式, yolo可實現45幀每秒的運算速度,完全能滿足實時性要求 (達到24幀每秒,人眼就認為是連續的)。它的網路結構如下圖:
主要分為三個部分:卷積層,目標檢測層,NMS篩選層。
採用Google inceptionV1網路,對應到上圖中的第一個階段,共20層。這一層主要是進行特徵提取,從而提高模型泛化能力。但作者對inceptionV1進行了改造,他沒有使用inception mole結構,而是用一個1x1的卷積,並聯一個3x3的卷積來替代。(可以認為只使用了inception mole中的一個分支,應該是為了簡化網路結構)
先經過4個卷積層和2個全連接層,最後生成7x7x30的輸出。先經過4個卷積層的目的是為了提高模型泛化能力。yolo將一副448x448的原圖分割成了7x7個網格,每個網格要預測兩個bounding box的坐標(x,y,w,h)和box內包含物體的置信度confidence,以及物體屬於20類別中每一類的概率(yolo的訓練數據為voc2012,它是一個20分類的數據集)。所以一個網格對應的參數為(4x2+2+20) = 30。如下圖
其中前一項表示有無人工標記的物體落入了網格內,如果有則為1,否則為0。第二項代表bounding box和真實標記的box之間的重合度。它等於兩個box面積交集,除以面積並集。值越大則box越接近真實位置。
分類信息: yolo的目標訓練集為voc2012,它是一個20分類的目標檢測數據集 。常用目標檢測數據集如下表:
| Name | # Images (trainval) | # Classes | Last updated |
| --------------- | ------------------- | --------- | ------------ |
| ImageNet | 450k | 200 | 2015 |
| COCO | 120K | 90 | 2014 |
| Pascal VOC | 12k | 20 | 2012 |
| Oxford-IIIT Pet | 7K | 37 | 2012 |
| KITTI Vision | 7K | 3 | |
每個網格還需要預測它屬於20分類中每一個類別的概率。分類信息是針對每個網格的,而不是bounding box。故只需要20個,而不是40個。而confidence則是針對bounding box的,它只表示box內是否有物體,而不需要預測物體是20分類中的哪一個,故只需要2個參數。雖然分類信息和confidence都是概率,但表達含義完全不同。
篩選層是為了在多個結果中(多個bounding box)篩選出最合適的幾個,這個方法和faster R-CNN 中基本相同。都是先過濾掉score低於閾值的box,對剩下的box進行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體演算法可以回顧上面faster R-CNN小節)。這樣就得到了最終的最合適的幾個box和他們的類別。
yolo的損失函數包含三部分,位置誤差,confidence誤差,分類誤差。具體公式如下:
誤差均採用了均方差演算法,其實我認為,位置誤差應該採用均方差演算法,而分類誤差應該採用交叉熵。由於物體位置只有4個參數,而類別有20個參數,他們的累加和不同。如果賦予相同的權重,顯然不合理。故yolo中位置誤差權重為5,類別誤差權重為1。由於我們不是特別關心不包含物體的bounding box,故賦予不包含物體的box的置信度confidence誤差的權重為0.5,包含物體的權重則為1。
Faster R-CNN准確率mAP較高,漏檢率recall較低,但速度較慢。而yolo則相反,速度快,但准確率和漏檢率不盡人意。SSD綜合了他們的優缺點,對輸入300x300的圖像,在voc2007數據集上test,能夠達到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。
SSD網路結構如下圖:
和yolo一樣,也分為三部分:卷積層,目標檢測層和NMS篩選層
SSD論文採用了VGG16的基礎網路,其實這也是幾乎所有目標檢測神經網路的慣用方法。先用一個CNN網路來提取特徵,然後再進行後續的目標定位和目標分類識別。
這一層由5個卷積層和一個平均池化層組成。去掉了最後的全連接層。SSD認為目標檢測中的物體,只與周圍信息相關,它的感受野不是全局的,故沒必要也不應該做全連接。SSD的特點如下。
每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進行目標位置和類別的訓練和預測,從而達到 多尺度檢測 的目的,可以克服yolo對於寬高比不常見的物體,識別准確率較低的問題。而yolo中,只在最後一個卷積層上做目標位置和類別的訓練和預測。這是SSD相對於yolo能提高准確率的一個關鍵所在。
如上所示,在每個卷積層上都會進行目標檢測和分類,最後由NMS進行篩選,輸出最終的結果。多尺度feature map上做目標檢測,就相當於多了很多寬高比例的bounding box,可以大大提高泛化能力。
和faster R-CNN相似,SSD也提出了anchor的概念。卷積輸出的feature map,每個點對應為原圖的一個區域的中心點。以這個點為中心,構造出6個寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個anchor對應4個位置參數(x,y,w,h)和21個類別概率(voc訓練集為20分類問題,在加上anchor是否為背景,共21分類)。如下圖所示:
另外,在訓練階段,SSD將正負樣本比例定位1:3。訓練集給定了輸入圖像以及每個物體的真實區域(ground true box),將default box和真實box最接近的選為正樣本。然後在剩下的default box中選擇任意一個與真實box IOU大於0.5的,作為正樣本。而其他的則作為負樣本。由於絕大部分的box為負樣本,會導致正負失衡,故根據每個box類別概率排序,使正負比例保持在1:3。SSD認為這個策略提高了4%的准確率
另外,SSD採用了數據增強。生成與目標物體真實box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機選取這些patch參與訓練,並對他們進行隨機水平翻轉等操作。SSD認為這個策略提高了8.8%的准確率。
和yolo的篩選層基本一致,同樣先過濾掉類別概率低於閾值的default box,再採用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標檢測輸出的default box。
SSD基本已經可以滿足我們手機端上實時物體檢測需求了,TensorFlow在android上的目標檢測官方模型ssd_mobilenet_v1_android_export.pb,就是通過SSD演算法實現的。它的基礎卷積網路採用的是mobileNet,適合在終端上部署和運行。
針對yolo准確率不高,容易漏檢,對長寬比不常見物體效果差等問題,結合SSD的特點,提出了yoloV2。它主要還是採用了yolo的網路結構,在其基礎上做了一些優化和改進,如下
網路採用DarkNet-19:19層,裡麵包含了大量3x3卷積,同時借鑒inceptionV1,加入1x1卷積核全局平均池化層。結構如下
yolo和yoloV2隻能識別20類物體,為了優化這個問題,提出了yolo9000,可以識別9000類物體。它在yoloV2基礎上,進行了imageNet和coco的聯合訓練。這種方式充分利用imageNet可以識別1000類物體和coco可以進行目標位置檢測的優點。當使用imageNet訓練時,只更新物體分類相關的參數。而使用coco時,則更新全部所有參數。
YOLOv3可以說出來直接吊打一切圖像檢測演算法。比同期的DSSD(反卷積SSD), FPN(feature pyramid networks)准確率更高或相仿,速度是其1/3.。
YOLOv3的改動主要有如下幾點:
不過如果要求更精準的預測邊框,採用COCO AP做評估標準的話,YOLO3在精確率上的表現就弱了一些。如下圖所示。
當前目標檢測模型演算法也是層出不窮。在two-stage領域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 演算法,將對抗學習引入到目標檢測領域。Face++也提出了Light-Head R-CNN,主要探討了 R-CNN 如何在物體檢測中平衡精確度和速度。
one-stage領域也是百花齊放,2017年首爾大學提出 R-SSD 演算法,主要解決小尺寸物體檢測效果差的問題。清華大學提出了 RON 演算法,結合 two stage 名的方法和 one stage 方法的優勢,更加關注多尺度對象定位和負空間樣本挖掘問題。
目標檢測領域的深度學習演算法,需要進行目標定位和物體識別,演算法相對來說還是很復雜的。當前各種新演算法也是層不出窮,但模型之間有很強的延續性,大部分模型演算法都是借鑒了前人的思想,站在巨人的肩膀上。我們需要知道經典模型的特點,這些tricks是為了解決什麼問題,以及為什麼解決了這些問題。這樣才能舉一反三,萬變不離其宗。綜合下來,目標檢測領域主要的難點如下:
一文讀懂目標檢測AI演算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2
從YOLOv1到v3的進化之路
SSD-Tensorflow超詳細解析【一】:載入模型對圖片進行測試 https://blog.csdn.net/k87974/article/details/80606407
YOLO https://pjreddie.com/darknet/yolo/ https://github.com/pjreddie/darknet
C#項目參考:https://github.com/AlturosDestinations/Alturos.Yolo
項目實踐貼個圖。
I. Sparse R-CNN: 稀疏的目標檢測,武裝Fast RCNN | 新文分析
論文: Sparse R-CNN: End-to-End Object Detection with Learnable Proposals
論文認為,目前的目標檢測演算法可以按預設框的多少分為兩種:
上述兩種方法都會預測大量的結果,需要進行NMS後處理,而在訓練的時候會存在many-to-one的問題,並且anchor的設置對性能的影響很大。
於是,很多研究開始探討稀疏(sparse)檢測,比如近期的DETR演算法。該演算法不需要預設anchor,並且預測的結果可直接輸出,不需要後處理。但論文認為DETR並不是真正的稀疏檢測,因為DETR在各位置提取特徵時,需要與全圖的上下文進行交互,而真正的稀疏檢測應該滿足sparse boxes和sparse features,即較少的初始框設定以及框之間不需要過多的特徵互動。
為此,論文提出了Sparse R-CNN,如圖1c所示,僅需設定少量anchor即可進行檢測,而且能夠進行set prediction,免去NMS等後處理,其核心主要包含以下幾點:
Sparse R-CNN的推理流程如圖3所示,輸入圖片、可學習的proposal boxes以及可學習的proposal features,根據proposal boxes提取對應的RoIAlign特徵,dynamic head將proposal features轉換為卷積核參數,對RoIAlign特徵進一步提取特徵,再進行後續的分類和回歸。整體的思想和Fast RCNN很像,將selective search替換為proposal boxes,再增加其它更強的模塊。
論文採用FPN-ResNet作為主幹網路,輸出多層特徵,每層特徵的維度都是256。採用更復雜的主幹網路可以獲得更好的性能,但論文與Faster R-CNN對齊,採用標準的實現。
Sparse R-CNN的核心是採用數目固定的小批量可學習proposal boxes( )作為region proposal,而非RPN。每個box為4-d參數,在0~1范圍內,值為歸一化的中心點坐標、寬度和高度。這些參數在訓練過程中通過反向傳播進行更新,包含了訓練集目標位置的統計信息,可用於推理時的初步目標位置猜測。
盡管4維的proposal box能夠直觀地表示目標的定位,但缺少了目標的信息,比如目標的姿態和形狀,所以論文引入proposal feature( )進行補充。proposal features是高維的可學習向量,與proposal boxes一一對應,用於豐富目標的RoIAlign特徵。
Dynamic instance interactive head的結構如圖4所示,每個proposal box都有一個專屬的預測head。給定 個proposal boxes和 個proposal features,先通過RoIAlign提取每個box的 維特徵,Dynamic instance interactive head將其對應的 維proposal feature轉換為卷積參數,使用這個卷積參數對RoIAlign特徵進行提取,得到目標的 維特徵,最後經過簡單的3層感知機進行分類與回歸。
Dynamic instance interactive head也可以使用類似Cascade R-CNN那樣的級聯模式進一步的提升性能,將輸出的新回歸框和 維特徵作為下一次迭代的proposal box和proposal feature即可。
Sparse R-CNN的訓練採用set prediction的形式,將固定數量的預測結果與GT之間進行二分圖最優的匹配,然後計算損失值,完整的損失函數為:
各模塊對比實驗。
性能與收斂性。
在COCO上進行對比。
Sparse R-CNN貫徹了稀疏的思想,只提供少量初始框,可進行Set prediction,顛覆了當前密集預測的檢測思路,整體框架十分簡潔,跟Fast RCNN有點像,十分值得大家閱讀。
J. 經典目標檢測演算法介紹
姓名:牛曉銀;學號:20181213993;學院:計算機科學與技術
轉自:https://zhuanlan.hu.com/p/34142321
【嵌牛導讀】:目標檢測,也叫目標提取,是一種基於目標幾何和統計特徵的圖像分割。隨著計算機技術的發展和計算機視覺原理的廣泛應用,利用計算機圖像處理技術對目標進行實時跟蹤研究越來越熱門,對目標進行動態實時跟蹤定位在智能化交通系統、軍事目標檢測及醫學導航手術中手術器械定位等方面具有廣泛的應用價值。
【嵌牛鼻子】:目標檢測、檢測模型、計算機視覺
【嵌牛提問】:你知道或者用過哪些目標檢測演算法?
【嵌牛正文】:
(一)目標檢測經典工作回顧
本文結構
兩階段模型因其對圖片的兩階段處理得名,也稱為基於區域(Region-based)的方法,我們選取R-CNN系列工作作為這一類型的代表。
R-CNN: R-CNN系列的開山之作
論文鏈接: Rich feature hierarchies for accurate object detection and semantic segmentation
本文的兩大貢獻:1)CNN可用於基於區域的定位和分割物體;2)監督訓練樣本數緊缺時,在額外的數據上預訓練的模型經過fine-tuning可以取得很好的效果。第一個貢獻影響了之後幾乎所有2-stage方法,而第二個貢獻中用分類任務(Imagenet)中訓練好的模型作為基網路,在檢測問題上fine-tuning的做法也在之後的工作中一直沿用。
傳統的計算機視覺方法常用精心設計的手工特徵(如SIFT, HOG)描述圖像,而深度學習的方法則倡導習得特徵,從圖像分類任務的經驗來看,CNN網路自動習得的特徵取得的效果已經超出了手工設計的特徵。本篇在局部區域應用卷積網路,以發揮卷積網路學習高質量特徵的能力。
R-CNN將檢測抽象為兩個過程,一是基於圖片提出若干可能包含物體的區域(即圖片的局部裁剪,被稱為Region Proposal),文中使用的是Selective Search演算法;二是在提出的這些區域上運行當時表現最好的分類網路(AlexNet),得到每個區域內物體的類別。
另外,文章中的兩個做法值得注意。
一是數據的准備。輸入CNN前,我們需要根據Ground Truth對提出的Region Proposal進行標記,這里使用的指標是IoU(Intersection over Union,交並比)。IoU計算了兩個區域之交的面積跟它們之並的比,描述了兩個區域的重合程度。
文章中特別提到,IoU閾值的選擇對結果影響顯著,這里要談兩個threshold,一個用來識別正樣本(如跟ground truth的IoU大於0.5),另一個用來標記負樣本(即背景類,如IoU小於0.1),而介於兩者之間的則為難例(Hard Negatives),若標為正類,則包含了過多的背景信息,反之又包含了要檢測物體的特徵,因而這些Proposal便被忽略掉。
另一點是位置坐標的回歸(Bounding-Box Regression),這一過程是Region Proposal向Ground Truth調整,實現時加入了log/exp變換來使損失保持在合理的量級上,可以看做一種標准化(Normalization)操作。
小結
R-CNN的想法直接明了,即將檢測任務轉化為區域上的分類任務,是深度學習方法在檢測任務上的試水。模型本身存在的問題也很多,如需要訓練三個不同的模型(proposal, classification, regression)、重復計算過多導致的性能問題等。盡管如此,這篇論文的很多做法仍然廣泛地影響著檢測任務上的深度模型革命,後續的很多工作也都是針對改進這一工作而展開,此篇可以稱得上"The First Paper"。
Fast R-CNN: 共享卷積運算
論文鏈接: Fast R-CNN
文章指出R-CNN耗時的原因是CNN是在每一個Proposal上單獨進行的,沒有共享計算,便提出將基礎網路在圖片整體上運行完畢後,再傳入R-CNN子網路,共享了大部分計算,故有Fast之名。
上圖是Fast R-CNN的架構。圖片經過feature extractor得到feature map, 同時在原圖上運行Selective Search演算法並將RoI(Region of Interset,實為坐標組,可與Region Proposal混用)映射到到feature map上,再對每個RoI進行RoI Pooling操作便得到等長的feature vector,將這些得到的feature vector進行正負樣本的整理(保持一定的正負樣本比例),分batch傳入並行的R-CNN子網路,同時進行分類和回歸,並將兩者的損失統一起來。
RoI Pooling 是對輸入R-CNN子網路的數據進行准備的關鍵操作。我們得到的區域常常有不同的大小,在映射到feature map上之後,會得到不同大小的特徵張量。RoI Pooling先將RoI等分成目標個數的網格,再在每個網格上進行max pooling,就得到等長的RoI feature vector。
文章最後的討論也有一定的借鑒意義:
multi-loss traing相比單獨訓練classification確有提升
multi-scale相比single-scale精度略有提升,但帶來的時間開銷更大。一定程度上說明CNN結構可以內在地學習尺度不變性
在更多的數據(VOC)上訓練後,精度是有進一步提升的
Softmax分類器比"one vs rest"型的SVM表現略好,引入了類間的競爭
更多的Proposal並不一定帶來精度的提升
小結
Fast R-CNN的這一結構正是檢測任務主流2-stage方法所採用的元結構的雛形。文章將Proposal, Feature Extractor, Object Classification&Localization統一在一個整體的結構中,並通過共享卷積計算提高特徵利用效率,是最有貢獻的地方。
Faster R-CNN: 兩階段模型的深度化
論文鏈接: Faster R-CNN: Towards Real Time Object Detection with Region Proposal Networks
Faster R-CNN是2-stage方法的奠基性工作,提出的RPN網路取代Selective Search演算法使得檢測任務可以由神經網路端到端地完成。粗略的講,Faster R-CNN = RPN + Fast R-CNN,跟RCNN共享卷積計算的特性使得RPN引入的計算量很小,使得Faster R-CNN可以在單個GPU上以5fps的速度運行,而在精度方面達到SOTA(State of the Art,當前最佳)。
本文的主要貢獻是提出Regional Proposal Networks,替代之前的SS演算法。RPN網路將Proposal這一任務建模為二分類(是否為物體)的問題。
第一步是在一個滑動窗口上生成不同大小和長寬比例的anchor box(如上圖右邊部分),取定IoU的閾值,按Ground Truth標定這些anchor box的正負。於是,傳入RPN網路的樣本數據被整理為anchor box(坐標)和每個anchor box是否有物體(二分類標簽)。RPN網路將每個樣本映射為一個概率值和四個坐標值,概率值反應這個anchor box有物體的概率,四個坐標值用於回歸定義物體的位置。最後將二分類和坐標回歸的損失統一起來,作為RPN網路的目標訓練。
由RPN得到Region Proposal在根據概率值篩選後經過類似的標記過程,被傳入R-CNN子網路,進行多分類和坐標回歸,同樣用多任務損失將二者的損失聯合。
小結
Faster R-CNN的成功之處在於用RPN網路完成了檢測任務的"深度化"。使用滑動窗口生成anchor box的思想也在後來的工作中越來越多地被採用(YOLO v2等)。這項工作奠定了"RPN+RCNN"的兩階段方法元結構,影響了大部分後續工作。
單階段(1-stage)檢測模型
單階段模型沒有中間的區域檢出過程,直接從圖片獲得預測結果,也被成為Region-free方法。
YOLO
論文鏈接: You Only Look Once: Unified, Real-Time Object Detection
YOLO是單階段方法的開山之作。它將檢測任務表述成一個統一的、端到端的回歸問題,並且以只處理一次圖片同時得到位置和分類而得名。
YOLO的主要優點:
快。
全局處理使得背景錯誤相對少,相比基於局部(區域)的方法, 如Fast RCNN。
泛化性能好,在藝術作品上做檢測時,YOLO表現比Fast R-CNN好。
YOLO的工作流程如下:
1.准備數據:將圖片縮放,劃分為等分的網格,每個網格按跟Ground Truth的IoU分配到所要預測的樣本。
2.卷積網路:由GoogLeNet更改而來,每個網格對每個類別預測一個條件概率值,並在網格基礎上生成B個box,每個box預測五個回歸值,四個表徵位置,第五個表徵這個box含有物體(注意不是某一類物體)的概率和位置的准確程度(由IoU表示)。測試時,分數如下計算:
等式左邊第一項由網格預測,後兩項由每個box預測,以條件概率的方式得到每個box含有不同類別物體的分數。 因而,卷積網路共輸出的預測值個數為S×S×(B×5+C),其中S為網格數,B為每個網格生成box個數,C為類別數。
3.後處理:使用NMS(Non-Maximum Suppression,非極大抑制)過濾得到最後的預測框
損失函數的設計
損失函數被分為三部分:坐標誤差、物體誤差、類別誤差。為了平衡類別不均衡和大小物體等帶來的影響,損失函數中添加了權重並將長寬取根號。
小結
YOLO提出了單階段的新思路,相比兩階段方法,其速度優勢明顯,實時的特性令人印象深刻。但YOLO本身也存在一些問題,如劃分網格較為粗糙,每個網格生成的box個數等限制了對小尺度物體和相近物體的檢測。
SSD: Single Shot Multibox Detector
論文鏈接: SSD: Single Shot Multibox Detector
SSD相比YOLO有以下突出的特點:
多尺度的feature map:基於VGG的不同卷積段,輸出feature map到回歸器中。這一點試圖提升小物體的檢測精度。
更多的anchor box,每個網格點生成不同大小和長寬比例的box,並將類別預測概率基於box預測(YOLO是在網格上),得到的輸出值個數為(C+4)×k×m×n,其中C為類別數,k為box個數,m×n為feature map的大小。
小結
SSD是單階段模型早期的集大成者,達到跟接近兩階段模型精度的同時,擁有比兩階段模型快一個數量級的速度。後續的單階段模型工作大多基於SSD改進展開。
檢測模型基本特點
最後,我們對檢測模型的基本特徵做一個簡單的歸納。
檢測模型整體上由基礎網路(Backbone Network)和檢測頭部(Detection Head)構成。前者作為特徵提取器,給出圖像不同大小、不同抽象層次的表示;後者則依據這些表示和監督信息學習類別和位置關聯。檢測頭部負責的類別預測和位置回歸兩個任務常常是並行進行的,構成多任務的損失進行聯合訓練。
相比單階段,兩階段檢測模型通常含有一個串列的頭部結構,即完成前背景分類和回歸後,把中間結果作為RCNN頭部的輸入再進行一次多分類和位置回歸。這種設計帶來了一些優點:
對檢測任務的解構,先進行前背景的分類,再進行物體的分類,這種解構使得監督信息在不同階段對網路參數的學習進行指導
RPN網路為RCNN網路提供良好的先驗,並有機會整理樣本的比例,減輕RCNN網路的學習負擔
這種設計的缺點也很明顯:中間結果常常帶來空間開銷,而串列的方式也使得推斷速度無法跟單階段相比;級聯的位置回歸則會導致RCNN部分的重復計算(如兩個RoI有重疊)。
另一方面,單階段模型只有一次類別預測和位置回歸,卷積運算的共享程度更高,擁有更快的速度和更小的內存佔用。讀者將會在接下來的文章中看到,兩種類型的模型也在互相吸收彼此的優點,這也使得兩者的界限更為模糊。