計算機視覺四大基本任務 (分類、定位、檢測、分割)
引言
深度學習目前已成為發展最快、最令人興奮的機器學習領域之一,許多卓有建樹的論文已經發表,而且已有很多高質量的開源深度學習框架可供使用。然而,論文通常非常簡明扼要並假設讀者已對深度學習有相當的理解,這使得初學者經常卡在一些概念的理解上,讀論文似懂非懂,十分吃力。另一方面,即使有了簡單易用的深度學習框架,如果對深度學習常見概念和基本思路不了解,面對現實任務時不知道如何設計、診斷、及調試網絡,最終仍會束手無策。
本系列文章旨在直觀系統地梳理深度學習各領域常見概念與基本思想,使讀者對深度學習的重要概念與思想有一直觀理解,做到 “知其然,又知其所以然”,從而降低后續理解論文及實際應用的難度。本系列文章力圖用簡練的語言加以描述,避免數學公式和繁雜細節。本文是該系列文章中的第二篇,旨在介紹深度學習在計算機視覺領域四大基本任務中的應用,包括分類 (圖 a)、定位、檢測 (圖 b)、語義分割 (圖 c)、和實例分割 (圖 d)。后續文章將關注深度學習在計算機視覺領域的其他任務的應用,以及自然語言處理和語音識別。
(本文作者為我本人,部分內容首發於新智元)
計算機視覺 (computer vision) 簡介
計算機視覺旨在識別和理解圖像 / 視頻中的內容。其誕生於 1966 年 MIT AI Group 的 "the summer vision project"。當時,人工智能其他分支的研究已經有一些初步成果。由於人類可以很輕易地進行視覺認知,MIT 的教授們希望通過一個暑期項目解決計算機視覺問題。當然,計算機視覺沒有被一個暑期內解決,但計算機視覺經過 50 余年發展已成為一個十分活躍的研究領域。如今,互聯網上超過 70% 的數據是圖像 / 視頻,全世界的監控攝像頭數目已超過人口數,每天有超過八億小時的監控視頻數據生成。如此大的數據量亟待自動化的視覺理解與分析技術。
計算機視覺的難點在於語義鴻溝。這個現象不僅出現在計算機視覺領域,Moravec 悖論發現,高級的推理只需要非常少的計算資源,而低級的對外界的感知卻需要極大的計算資源。要讓計算機如成人般地下棋是相對容易的,但是要讓電腦有如一歲小孩般的感知和行動能力卻是相當困難甚至是不可能的。
語義鴻溝 (semantic gap) 人類可以輕松地從圖像中識別出目標,而計算機看到的圖像只是一組 0 到 255 之間的整數。
計算機視覺任務的其他困難 拍攝視角變化、目標占據圖像的比例變化、光照變化、背景融合、目標形變、遮擋等。
計算機視覺的頂級會議和期刊 頂級會議有 CVPR、ICCV、和 ECCV,此外 ICLR 也有不少計算機視覺論文。頂級期刊有 IJCV 和 TPAMI。由於計算機視覺領域發展十分迅速,不論身處學術界或產業界,通過閱讀頂級會議和期刊論文了解計算機視覺的最近研究成果都十分必要。
卷積神經網絡 (convolutional neural networks, CNN)
經典的多層感知機由一系列全連接層組成,卷積神經網絡中除全連接層外,還有卷積層和匯合 (pooling) 層。
(1) 卷積層
為什么要用卷積層 輸入圖像通常很維數很高,例如,1,000×1,000 大小的彩色圖像對應於三百萬維特征。因此,繼續沿用多層感知機中的全連接層會導致龐大的參數量。大參數量需要繁重的計算,而更重要的是,大參數量會有更高的過擬合風險。卷積是局部連接、共享參數版的全連接層。這兩個特性使參數量大大降低。卷積層中的權值通常被成為濾波器 (filter) 或卷積核(convolution kernel)。
局部連接 在全連接層中,每個輸出通過權值 (weight) 和所有輸入相連。而在視覺識別中,關鍵性的圖像特征、邊緣、角點等只占據了整張圖像的一小部分,圖像中相距很遠的兩個像素之間有相互影響的可能性很小。因此,在卷積層中,每個輸出神經元在通道方向保持全連接,而在空間方向上只和一小部分輸入神經元相連。
共享參數 如果一組權值可以在圖像中某個區域提取出有效的表示,那么它們也能在圖像的另外區域中提取出有效的表示。也就是說,如果一個模式 (pattern) 出現在圖像中的某個區域,那么它們也可以出現在圖像中的其他任何區域。因此,卷積層不同空間位置的神經元共享權值,用於發現圖像中不同空間位置的模式。共享參數是深度學習一個重要的思想,其在減少網絡參數的同時仍然能保持很高的網絡容量 (capacity)。卷積層在空間方向共享參數,而循環神經網絡(recurrent neural networks) 在時間方向共享參數。
卷積層的作用 通過卷積,我們可以捕獲圖像的局部信息。通過多層卷積層堆疊,各層提取到特征逐漸由邊緣、紋理、方向等低層級特征過度到文字、車輪、人臉等高層級特征。
卷積層中的卷積和數學教材中的卷積是什么關系 基本沒有關系。卷積層中的卷積實質是輸入和權值的互相關 (cross-correlation) 函數,而不是數學教材中的卷積。
描述卷積的四個量 一個卷積層的配置由如下四個量確定**。1. 濾波器個數。使用一個濾波器對輸入進行卷積會得到一個二維的特征圖 (feature map)。我們可以用時使用多個濾波器對輸入進行卷積,以得到多個特征圖。2. 感受野 (receptive field) F,即濾波器空間局部連接大小。3. 零填補 (zero-padding) P。隨着卷積的進行,圖像大小將縮小,圖像邊緣的信息將逐漸丟失。因此,在卷積前,我們在圖像上下左右填補一些 0,使得我們可以控制輸出特征圖的大小。4. 步長 (stride) S。**濾波器在輸入每移動S個位置計算一個輸出神經元。
卷積輸入輸出的大小關系 假設輸入高和寬為H和W,輸出高和寬為H'和W', 則H'=(H-F+2P)/S+1, W'=(W-F+2P)/S+1. 當S=1 時,通過設定P=(F-1)/2, 可以保證輸入輸出空間大小相同。例如,3*3 的卷積需要填補一個像素使得輸入輸出空間大小不變。
應該使用多大的濾波器 盡量使用小的濾波器,如 3×3 卷積。通過堆疊多層 3×3 卷積,可以取得與大濾波器相同的感受野,例如三層 3×3 卷積等效於一層 7×7 卷積的感受野。但使用小濾波器有以下兩點好處。1. 更少的參數量。假設通道數為D,三層 3×3 卷積的參數量為 3×(D×D×3×3)=27D^2, 而一層 7×7 卷積的參數量為D×D×7×7=49D^2。2. **更多非線性。**由於每層卷積層后都有非線性激活函數,三層 3×3 卷積一共經過三次非線性激活函數,而一層 7×7 卷積只經過一次。
1×1 卷積 旨在對每個空間位置的D維向量做一個相同的線性變換。通常用於增加非線性,或降維,這相當於在通道數方向上進行了壓縮。1×1 卷積是減少網絡計算量和參數的重要方式。
全連接層的卷積層等效 由於全連接層和卷積層都是做點乘,這兩種操作可以相互等效。全連接層的卷積層等效只需要設定好卷積層的四個量:濾波器個數等於原全連接層輸出神經元個數、感受野等於輸入的空間大小、沒有零填補、步長為 1。
為什么要將全連接層等效為卷積層 全連接層只能處理固定大小的輸入,而卷積層可以處理任意大小輸入。假設訓練圖像大小是 224×224,而當測試圖像大小是 256×256。如果不進行全連接層的卷積層等效,我們需要從測試圖像中裁剪出多個 224×224 區域分別前饋網絡。而進行卷積層等效后,我們只需要將 256×256 輸入前饋網絡一次,即可達到多次前饋 224×224 區域的效果。
卷積結果的兩種視角 卷積結果是一個D×H×W的三維張量。其可以被認為是有D個通道,每個通道是一個二維的特征圖,從輸入中捕獲了某種特定的特征。也可以被認為是有H×W個空間位置,每個空間位置是一個D維的描述向量,描述了對應感受野的圖像局部區域的語義特征。
卷積結果的分布式表示 卷積結果的各通道之間不是獨立的。卷積結果的各通道的神經元和語義概念之間是一個 “多對多” 的映射。即,每個語義概念由多個通道神經元一起表示,而每個神經元又同時參與到多個語義概念中去。並且,神經元響應是稀疏的,即大部分的神經元輸出為 0。
卷積操作的實現 有如下幾種基本思路。1. 快速傅里葉變換 (FFT)。通過變換到頻域,卷積運算將變為普通矩陣乘法。實際中,當濾波器尺寸大時效果好,而對於通常使用的 1×1 和 3×3 卷積,加速不明顯。2. im2col (image to column)。im2col 將與每個輸出神經元相連的局部輸入區域展成一個列向量,並將所有得到的向量拼接成一個矩陣。這樣卷積運算可以用矩陣乘法實現。im2col 的優點是可以利用矩陣乘法的高效實現,而弊端是會占用很大存儲,因為輸入元素會在生成的矩陣中多次出現。此外,Strassen 矩陣乘法和 Winograd 也常被使用。現有的計算庫如 MKL 和 cuDNN,會根據濾波器大小選擇合適的算法。
(2) 匯合層
匯合層 根據特征圖上的局部統計信息進行下采樣,在保留有用信息的同時減少特征圖的大小。和卷積層不同的是,匯合層不包含需要學習的參數。最大匯合 (max-pooling) 在一個局部區域選最大值作為輸出,而平均匯合 (average pooling) 計算一個局部區域的均值作為輸出。局部區域匯合中最大匯合使用更多,而全局平均匯合 (global average pooling) 是更常用的全局匯合方法。
匯合層的作用 匯合層主要有以下三點作用。**1. 增加特征平移不變性。**匯合可以提高網絡對微小位移的容忍能力。**2. 減小特征圖大小。匯合層對空間局部區域進行下采樣,使下一層需要的參數量和計算量減少,並降低過擬合風險。3. 最大匯合可以帶來非線性。**這是目前最大匯合更常用的原因之一。近年來,有人使用步長為 2 的卷積層代替匯合層。而在生成式模型中,有研究發現,不使用匯合層會使網絡更容易訓練。
圖像分類 (image classification)
給定一張輸入圖像,圖像分類任務旨在判斷該圖像所屬類別。
(1) 圖像分類常用數據集
以下是幾種常用分類數據集,難度依次遞增。http://rodrigob.github.io/are_we_there_yet/build/ 列舉了各算法在各數據集上的性能排名。
MNIST 60k 訓練圖像、10k 測試圖像、10 個類別、圖像大小 1×28×28、內容是 0-9 手寫數字。
CIFAR-10 50k 訓練圖像、10k 測試圖像、10 個類別、圖像大小 3×32×32。
CIFAR-100 50k 訓練圖像、10k 測試圖像、100 個類別、圖像大小 3×32×32。
ImageNet 1.2M 訓練圖像、50k 驗證圖像、1k 個類別。2017 年及之前,每年會舉行基於 ImageNet 數據集的 ILSVRC 競賽,這相當於計算機視覺界奧林匹克。
(2) 圖像分類經典網絡結構
基本架構 我們用 conv 代表卷積層、bn 代表批量歸一層、pool 代表匯合層。最常見的網絡結構順序是 conv → bn → relu → pool,其中卷積層用於提取特征、匯合層用於減少空間大小。隨着網絡深度的進行,圖像的空間大小將越來越小,而通道數會越來越大。
針對你的任務,如何設計網絡? 當面對你的實際任務時,如果你的目標是解決該任務而不是發明新算法,那么不要試圖自己設計全新的網絡結構,也不要試圖從零復現現有的網絡結構。找已經公開的實現和預訓練模型進行微調。去掉最后一個全連接層和對應 softmax,加上對應你任務的全連接層和 softmax,再固定住前面的層,只訓練你加的部分。如果你的訓練數據比較多,那么可以多微調幾層,甚至微調所有層。
LeNet-5 60k 參數。網絡基本架構為:conv1 (6) → pool1 → conv2 (16) → pool2 → fc3 (120) → fc4 (84) → fc5 (10) → softmax。括號中的數字代表通道數,網絡名稱中有 5 表示它有 5 層 conv/fc 層。當時,LeNet-5 被成功用於 ATM 以對支票中的手寫數字進行識別。LeNet 取名源自其作者姓 LeCun。
AlexNet 60M 參數,ILSVRC 2012 的冠軍網絡。網絡基本架構為:conv1 (96) → pool1 → conv2 (256) → pool2 → conv3 (384) → conv4 (384) → conv5 (256) → pool5 → fc6 (4096) → fc7 (4096) → fc8 (1000) → softmax。AlexNet 有着和 LeNet-5 相似網絡結構,但更深、有更多參數。conv1 使用 11×11 的濾波器、步長為 4 使空間大小迅速減小 (227×227 → 55×55)。AlexNet 的關鍵點是:(1). 使用了 ReLU 激活函數,使之有更好的梯度特性、訓練更快。(2). 使用了隨機失活 (dropout)。(3). 大量使用數據擴充技術。AlexNet 的意義在於它以高出第二名 10% 的性能取得了當年 ILSVRC 競賽的冠軍,這使人們意識到卷積神經網絡的優勢。此外,AlexNet 也使人們意識到可以利用 GPU 加速卷積神經網絡訓練。AlexNet 取名源自其作者名 Alex。
VGG-16/VGG-19 138M 參數,ILSVRC 2014 的亞軍網絡。VGG-16 的基本架構為:conv12 (64) → pool1 → conv22 (128) → pool2 → conv33 (256) → pool3 → conv43 (512) → pool4 → conv5^3 (512) → pool5 → fc6 (4096) → fc7 (4096) → fc8 (1000) → softmax。 ^3 代表重復 3 次。VGG 網絡的關鍵點是:(1). 結構簡單,只有 3×3 卷積和 2×2 匯合兩種配置,並且重復堆疊相同的模塊組合。卷積層不改變空間大小,每經過一次匯合層,空間大小減半。(2). 參數量大,而且大部分的參數集中在全連接層中。網絡名稱中有 16 表示它有 16 層 conv/fc 層。(3). 合適的網絡初始化和使用批量歸一 (batch normalization) 層對訓練深層網絡很重要。在原論文中無法直接訓練深層 VGG 網絡,因此先訓練淺層網絡,並使用淺層網絡對深層網絡進行初始化。在 BN 出現之后,伴隨其他技術,后續提出的深層網絡可以直接得以訓練。VGG-19 結構類似於 VGG-16,有略好於 VGG-16 的性能,但 VGG-19 需要消耗更大的資源,因此實際中 VGG-16 使用得更多。由於 VGG-16 網絡結構十分簡單,並且很適合遷移學習,因此至今 VGG-16 仍在廣泛使用。VGG-16 和 VGG-19 取名源自作者所處研究組名(Visual Geometry Group)。
GoogLeNet 5M 參數,ILSVRC 2014 的冠軍網絡。GoogLeNet 試圖回答在設計網絡時究竟應該選多大尺寸的卷積、或者應該選匯合層。其提出了 Inception 模塊,同時用 1×1、3×3、5×5 卷積和 3×3 匯合,並保留所有結果。網絡基本架構為:conv1 (64) → pool1 → conv22 (64, 192) → pool2 → inc3 (256, 480) → pool3 → inc45 (512, 512, 512, 528, 832) → pool4 → inc5^2 (832, 1024) → pool5 → fc (1000)。GoogLeNet 的關鍵點是:(1). 多分支分別處理,並級聯結果。(2). 為了降低計算量,用了 1×1 卷積降維。GoogLeNet 使用了全局平均匯合替代全連接層,使網絡參數大幅減少。GoogLeNet 取名源自作者所處單位 (Google),其中 L 大寫是為了向 LeNet 致敬,而 Inception 的名字來源於盜夢空間中的 "we need to go deeper" 梗。
Inception v3/v4 在 GoogLeNet 的基礎上進一步降低參數。其和 GoogLeNet 有相似的 Inception 模塊,但將 7×7 和 5×5 卷積分解成若干等效 3×3 卷積,並在網絡中后部分把 3×3 卷積分解為 1×3 和 3×1 卷積。這使得在相似的網絡參數下網絡可以部署到 42 層。此外,Inception v3 使用了批量歸一層。Inception v3 是 GoogLeNet 計算量的 2.5 倍,而錯誤率較后者下降了 3%。Inception v4 在 Inception 模塊基礎上結合了 residual 模塊 (見下文),進一步降低了 0.4% 的錯誤率。
ResNet ILSVRC 2015 的冠軍網絡。ResNet 旨在解決網絡加深后訓練難度增大的現象。其提出了 residual 模塊,包含兩個 3×3 卷積和一個短路連接 (左圖)。短路連接可以有效緩解反向傳播時由於深度過深導致的梯度消失現象,這使得網絡加深之后性能不會變差。短路連接是深度學習又一重要思想,除計算機視覺外,短路連接也被用到了機器翻譯、語音識別 / 合成領域。此外,具有短路連接的 ResNet 可以看作是許多不同深度而共享參數的網絡的集成,網絡數目隨層數指數增加。ResNet 的關鍵點是:(1). 使用短路連接,使訓練深層網絡更容易,並且重復堆疊相同的模塊組合。(2). ResNet 大量使用了批量歸一層。(3). 對於很深的網絡 (超過 50 層),ResNet 使用了更高效的瓶頸 (bottleneck) 結構 (右圖)。ResNet 在 ImageNet 上取得了超過人的准確率。
下圖對比了上述幾種網絡結構。
preResNet ResNet 的改進。preResNet 整了 residual 模塊中各層的順序。相比經典 residual 模塊 (a),(b) 將 BN 共享會更加影響信息的短路傳播,使網絡更難訓練、性能也更差;(c)直接將 ReLU 移到 BN 后會使該分支的輸出始終非負,使網絡表示能力下降;(d)將 ReLU 提前解決了 (e) 的非負問題,但 ReLU 無法享受 BN 的效果;(e)將 ReLU 和 BN 都提前解決了 (d) 的問題。preResNet 的短路連接 (e) 能更加直接的傳遞信息,進而取得了比 ResNet 更好的性能。
ResNeXt ResNet 的另一改進。傳統的方法通常是靠加深或加寬網絡來提升性能,但計算開銷也會隨之增加。ResNeXt 旨在不改變模型復雜度的情況下提升性能。受精簡而高效的 Inception 模塊啟發,ResNeXt 將 ResNet 中非短路那一分支變為多個分支。和 Inception 不同的是,每個分支的結構都相同。ResNeXt 的關鍵點是:(1). 沿用 ResNet 的短路連接,並且重復堆疊相同的模塊組合。(2). 多分支分別處理。(3). 使用 1×1 卷積降低計算量。其綜合了 ResNet 和 Inception 的優點。此外,ResNeXt 巧妙地利用分組卷積進行實現。ResNeXt 發現,增加分支數是比加深或加寬更有效地提升網絡性能的方式。ResNeXt 的命名旨在說明這是下一代 (next) 的 ResNet。
隨機深度 ResNet 的改進。旨在緩解梯度消失和加速訓練。類似於隨機失活 (dropout),其以一定概率隨機將 residual 模塊失活。失活的模塊直接由短路分支輸出,而不經過有參數的分支。在測試時,前饋經過全部模塊。隨機深度說明 residual 模塊是有信息冗余的。
DenseNet 其目的也是避免梯度消失。和 residual 模塊不同,dense 模塊中任意兩層之間均有短路連接。也就是說,每一層的輸入通過級聯 (concatenation) 包含了之前所有層的結果,即包含由低到高所有層次的特征。和之前方法不同的是,DenseNet 中卷積層的濾波器數很少。DenseNet 只用 ResNet 一半的參數即可達到 ResNet 的性能。實現方面,作者在大會報告指出,直接將輸出級聯會占用很大 GPU 存儲。后來,通過共享存儲,可以在相同的 GPU 存儲資源下訓練更深的 DenseNet。但由於有些中間結果需要重復計算,該實現會增加訓練時間。
SENet ILSVRC 2017 的冠軍網絡。SENet 通過額外的分支 (gap-fc-fc-sigm) 來得到每個通道的 [0, 1] 權重,自適應地校正原各通道激活值響應。以提升有用的通道響應並抑制對當前任務用處不大的通道響應。
目標定位 (object localization)
在圖像分類的基礎上,我們還想知道圖像中的目標具體在圖像的什么位置,通常是以包圍盒的 (bounding box) 形式。
基本思路 多任務學習,網絡帶有兩個輸出分支。一個分支用於做圖像分類,即全連接 + softmax 判斷目標類別,和單純圖像分類區別在於這里還另外需要一個 “背景” 類。另一個分支用於判斷目標位置,即完成回歸任務輸出四個數字標記包圍盒位置 (例如中心點橫縱坐標和包圍盒長寬),該分支輸出結果只有在分類分支判斷不為“背景” 時才使用。
人體位姿定位 / 人臉定位 目標定位的思路也可以用於人體位姿定位或人臉定位。這兩者都需要我們對一系列的人體關節或人臉關鍵點進行回歸。
弱監督定位 由於目標定位是相對比較簡單的任務,近期的研究熱點是在只有標記信息的條件下進行目標定位。其基本思路是從卷積結果中找到一些較高響應的顯著性區域,認為這個區域對應圖像中的目標。
目標檢測 (object detection)
在目標定位中,通常只有一個或固定數目的目標,而目標檢測更一般化,其圖像中出現的目標種類和數目都不定。因此,目標檢測是比目標定位更具挑戰性的任務。
(1) 目標檢測常用數據集
PASCAL VOC 包含 20 個類別。通常是用 VOC07 和 VOC12 的 trainval 並集作為訓練,用 VOC07 的測試集作為測試。
MS COCO COCO 比 VOC 更困難。COCO 包含 80k 訓練圖像、40k 驗證圖像、和 20k 沒有公開標記的測試圖像 (test-dev),80 個類別,平均每張圖 7.2 個目標。通常是用 80k 訓練和 35k 驗證圖像的並集作為訓練,其余 5k 圖像作為驗證,20k 測試圖像用於線上測試。
mAP (mean average precision) 目標檢測中的常用評價指標,計算方法如下。當預測的包圍盒和真實包圍盒的交並比大於某一閾值 (通常為 0.5),則認為該預測正確。對每個類別,我們畫出它的查准率 - 查全率(precision-recall) 曲線,平均准確率是曲線下的面積。之后再對所有類別的平均准確率求平均,即可得到 mAP,其取值為[0, 100%]。
交並比 (intersection over union, IoU) 算法預測的包圍盒和真實包圍盒交集的面積除以這兩個包圍盒並集的面積,取值為 [0, 1]。交並比度量了算法預測的包圍盒和真實包圍盒的接近程度,交並比越大,兩個包圍盒的重疊程度越高。
(2) 基於候選區域的目標檢測算法
基本思路 使用不同大小的窗口在圖像上滑動,在每個區域,對窗口內的區域進行目標定位。即,將每個窗口內的區域前饋網絡,其分類分支用於判斷該區域的類別,回歸分支用於輸出包圍盒。基於滑動窗的目標檢測動機是,盡管原圖中可能包含多個目標,但滑動窗對應的圖像局部區域內通常只會有一個目標 (或沒有)。因此,我們可以沿用目標定位的思路對窗口內區域逐個進行處理。但是,由於該方法要把圖像所有區域都滑動一遍,而且滑動窗大小不一,這會帶來很大的計算開銷。
R-CNN 先利用一些非深度學習的類別無關的無監督方法,在圖像中找到一些可能包含目標的候選區域。之后,對每個候選區域前饋網絡,進行目標定位,即兩分支 (分類 + 回歸) 輸出。其中,我們仍然需要回歸分支的原因是,候選區域只是對包含目標區域的一個粗略的估計,我們需要有監督地利用回歸分支得到更精確的包圍盒預測結果。R-CNN 的重要性在於當時目標檢測已接近瓶頸期,而 R-CNN 利於在 ImageNet 預訓練模型微調的方法一舉將 VOC 上 mAP 由 35.1% 提升至 53.7%,確定了深度學習下目標檢測的基本思路。一個有趣之處是 R-CNN 論文開篇第一句只有兩個詞 "Features matter." 這點明了深度學習方法的核心。
候選區域 (region proposal) 候選區域生成算法通常基於圖像的顏色、紋理、面積、位置等合並相似的像素,最終可以得到一系列的候選矩陣區域。這些算法,如 selective search 或 EdgeBoxes,通常只需要幾秒的 CPU 時間,而且,一個典型的候選區域數目是 2k,相比於用滑動窗把圖像所有區域都滑動一遍,基於候選區域的方法十分高效。另一方面,這些候選區域生成算法的查准率 (precision) 一般,但查全率 (recall) 通常比較高,這使得我們不容易遺漏圖像中的目標。
Fast R-CNN R-CNN 的弊端是需要多次前饋網絡,這使得 R-CNN 的運行效率不高,預測一張圖像需要 47 秒。Fast R-CNN 同樣基於候選區域進行目標檢測,但受 SPPNet 啟發,在 Fast R-CNN 中,不同候選區域的卷積特征提取部分是共享的。也就是說,我們先將整副圖像前饋網絡,並提取 conv5 卷積特征。之后,基於在原始圖像上運行候選區域生成算法的結果在卷積特征上進行采樣,這一步稱為興趣區域匯合。最后,對每個候選區域,進行目標定位,即兩分支 (分類 + 回歸) 輸出。
興趣區域匯合 (region of interest pooling, RoI pooling) 興趣區域匯合旨在由任意大小的候選區域對應的局部卷積特征提取得到固定大小的特征,這是因為下一步的兩分支網絡由於有全連接層,需要其輸入大小固定。其做法是,先將候選區域投影到卷積特征上,再把對應的卷積特征區域空間上划分成固定數目的網格 (數目根據下一步網絡希望的輸入大小確定,例如 VGGNet 需要 7×7 的網格),最后在每個小的網格區域內進行最大匯合,以得到固定大小的匯合結果。和經典最大匯合一致,每個通道的興趣區域匯合是獨立的。
Faster R-CNN Fast R-CNN 測試時每張圖像前饋網絡只需 0.2 秒,但瓶頸在於提取候選區域需要 2 秒。Faster R-CNN 不再使用現有的無監督候選區域生成算法,而利用候選區域網絡從 conv5 特征中產生候選區域,並且將候選區域網絡集成到整個網絡中端到端訓練。Faster R-CNN 的測試時間是 0.2 秒,接近實時。后來有研究發現,通過使用更少的候選區域,可以在性能損失不大的條件下進一步提速。
候選區域網絡 (region proposal networks, RPN) 在卷積特征上的通過兩層卷積 (3×3 和 1×1 卷積),輸出兩個分支。其中,一個分支用於判斷每個錨盒是否包含了目標,另一個分支對每個錨盒輸出候選區域的 4 個坐標。候選區域網絡實際上延續了基於滑動窗進行目標定位的思路,不同之處在於候選區域網絡在卷積特征而不是在原圖上進行滑動。由於卷積特征的空間大小很小而感受野很大,即使使用 3×3 的滑動窗,也能對應於很大的原圖區域。Faster R-CNN 實際使用了 3 組大小 (128×128、256×256、512×512)、3 組長寬比 (1:1、1:2、2:1),共計 9 個錨盒,這里錨盒的大小已經超過 conv5 特征感受野的大小。對一張 1000×600 的圖像,可以得到 20k 個錨盒。
為什么要使用錨盒 (anchor box) 錨盒是預先定義形狀和大小的包圍盒。使用錨盒的原因包括:(1). 圖像中的候選區域大小和長寬比不同,直接回歸比對錨盒坐標修正訓練起來更困難。(2). conv5 特征感受野很大,很可能該感受野內包含了不止一個目標,使用多個錨盒可以同時對感受野內出現的多個目標進行預測。(3). 使用錨盒也可以認為這是向神經網絡引入先驗知識的一種方式。我們可以根據數據中包圍盒通常出現的形狀和大小設定一組錨盒。錨盒之間是獨立的,不同的錨盒對應不同的目標,比如高瘦的錨盒對應於人,而矮胖的錨盒對應於車輛。
R-FCN Faster R-CNN 在 RoI pooling 之后,需要對每個候選區域單獨進行兩分支預測。R-FCN 旨在使幾乎所有的計算共享,以進一步加快速度。由於圖像分類任務不關心目標具體在圖像的位置,網絡具有平移不變性。但目標檢測中由於要回歸出目標的位置,所以網絡輸出應當受目標平移的影響。為了緩和這兩者的矛盾,R-FCN 顯式地給予深度卷積特征各通道以位置關系。在 RoI 匯合時,先將候選區域划分成 3×3 的網格,之后將不同網格對應於候選卷積特征的不同通道,最后每個網格分別進行平均匯合。R-FCN 同樣采用了兩分支 (分類 + 回歸) 輸出。
小結 基於候選區域的目標檢測算法通常需要兩步:第一步是從圖像中提取深度特征,第二步是對每個候選區域進行定位 (包括分類和回歸)。其中,第一步是圖像級別計算,一張圖像只需要前饋該部分網絡一次,而第二步是區域級別計算,每個候選區域都分別需要前饋該部分網絡一次。因此,第二步占用了整體主要的計算開銷。R-CNN, Fast R-CNN, Faster R-CNN, R-FCN 這些算法的演進思路是逐漸提高網絡中圖像級別計算的比例,同時降低區域級別計算的比例。R-CNN 中幾乎所有的計算都是區域級別計算,而 R-FCN 中幾乎所有的計算都是圖像級別計算。
(3) 基於直接回歸的目標檢測算法
基本思路 基於候選區域的方法由於有兩步操作,雖然檢測性能比較好,但速度上離實時仍有一些差距。基於直接回歸的方法不需要候選區域,直接輸出分類 / 回歸結果。這類方法由於圖像只需前饋網絡一次,速度通常更快,可以達到實時。
YOLO 將圖像划分成 7×7 的網格,其中圖像中的真實目標被其划分到目標中心所在的網格及其最接近的錨盒。對每個網格區域,網絡需要預測:每個錨盒包含目標的概率 (不包含目標時應為 0,否則為錨盒和真實包圍盒的 IoU)、每個錨盒的 4 個坐標、該網格的類別概率分布。每個錨盒的類別概率分布等於每個錨盒包含目標的概率乘以該網格的類別概率分布。相比基於候選區域的方法,YOLO 需要預測包含目標的概率的原因是,圖像中大部分的區域不包含目標,而訓練時只有目標存在時才對坐標和類別概率分布進行更新。YOLO 的優點在於:(1). 基於候選區域的方法的感受野是圖像中的局部區域,而 YOLO 可以利用整張圖像的信息。(2). 有更好的泛化能力。YOLO 的局限在於:(1). 不能很好處理網格中目標數超過預設固定值,或網格中有多個目標同時屬於一個錨盒的情況。(2). 對小目標的檢測能力不夠好。(3). 對不常見長寬比的包圍盒的檢測能力不強。(4). 計算損失時沒有考慮包圍盒大小。大的包圍盒中的小偏移和小的包圍盒中的小偏移應有不同的影響。
SSD 相比 YOLO,SSD 在卷積特征后加了若干卷積層以減小特征空間大小,並通過綜合多層卷積層的檢測結果以檢測不同大小的目標。此外,類似於 Faster R-CNN 的 RPN,SSD 使用 3×3 卷積取代了 YOLO 中的全連接層,以對不同大小和長寬比的錨盒來進行分類 / 回歸。SSD 取得了比 YOLO 更快,接近 Faster R-CNN 的檢測性能。后來有研究發現,相比其他方法,SSD 受基礎模型性能的影響相對較小。
FPN 之前的方法都是取高層卷積特征。但由於高層特征會損失一些細節信息,FPN 融合多層特征,以綜合高層、低分辨率、強語義信息和低層、高分辨率、弱語義信息來增強網絡對小目標的處理能力。此外,和通常用多層融合的結果做預測的方法不同,FPN 在不同層獨立進行預測。FPN 既可以與基於候選區域的方法結合,也可以與基於直接回歸的方法結合。FPN 在和 Faster R-CNN 結合后,在基本不增加原有模型計算量的情況下,大幅提高對小目標的檢測性能。
RetinaNet RetinaNet 認為,基於直接回歸的方法性能通常不如基於候選區域方法的原因是,前者會面臨極端的類別不平衡現象。基於候選區域的方法可以通過候選區域過濾掉大部分的背景區域,但基於直接回歸的方法需要直接面對類別不平衡。因此,RetinaNet 通過改進經典的交叉熵損失以降低對已經分的很好的樣例的損失值,提出了焦點 (focal) 損失函數,以使模型訓練時更加關注到困難的樣例上。RetinaNet 取得了接近基於直接回歸方法的速度,和超過基於候選區域的方法的性能。
(4) 目標檢測常用技巧
非最大抑制 (non-max suppression, NMS) 目標檢測可能會出現的一個問題是,模型會對同一目標做出多次預測,得到多個包圍盒。NMS 旨在保留最接近真實包圍盒的那一個預測結果,而抑制其他的預測結果。NMS 的做法是,首先,對每個類別,NMS 先統計每個預測結果輸出的屬於該類別概率,並將預測結果按該概率由高至低排序。其次,NMS 認為對應概率很小的預測結果並沒有找到目標,所以將其抑制。然后,NMS 在剩余的預測結果中,找到對應概率最大的預測結果,將其輸出,並抑制和該包圍盒有很大重疊 (如 IoU 大於 0.3) 的其他包圍盒。重復上一步,直到所有的預測結果均被處理。
在線困難樣例挖掘 (online hard example mining, OHEM) 目標檢測的另一個問題是類別不平衡,圖像中大部分的區域是不包含目標的,而只有小部分區域包含目標。此外,不同目標的檢測難度也有很大差異,絕大部分的目標很容易被檢測到,而有一小部分目標卻十分困難。OHEM 和 Boosting 的思路類似,其根據損失值將所有候選區域進行排序,並選擇損失值最高的一部分候選區域進行優化,使網絡更關注於圖像中更困難的目標。此外,為了避免選到相互重疊很大的候選區域,OHEM 對候選區域根據損失值進行 NMS。
在對數空間回歸 回歸相比分類優化難度大了很多。
損失對異常值比較敏感,由於有平方,異常值會有大的損失值,同時會有很大的梯度,使訓練時很容易發生梯度爆炸。而
損失的梯度不連續。在對數空間中,由於數值的動態范圍小了很多,回歸訓練起來也會容易很多。此外,也有人用平滑的
損失進行優化。預先將回歸目標規范化也會有助於訓練。
語義分割 (semantic segmentation)
語義分割是目標檢測更進階的任務,目標檢測只需要框出每個目標的包圍盒,語義分割需要進一步判斷圖像中哪些像素屬於哪個目標。
(1) 語義分割常用數據集
PASCAL VOC 2012 1.5k 訓練圖像,1.5k 驗證圖像,20 個類別 (包含背景)。
MS COCO COCO 比 VOC 更困難。有 83k 訓練圖像,41k 驗證圖像,80k 測試圖像,80 個類別。
(2) 語義分割基本思路
基本思路 逐像素進行圖像分類。我們將整張圖像輸入網絡,使輸出的空間大小和輸入一致,通道數等於類別數,分別代表了各空間位置屬於各類別的概率,即可以逐像素地進行分類。
全卷積網絡 + 反卷積網絡 為使得輸出具有三維結構,全卷積網絡中沒有全連接層,只有卷積層和匯合層。但是隨着卷積和匯合的進行,圖像通道數越來越大,而空間大小越來越小。要想使輸出和輸入有相同的空間大小,全卷積網絡需要使用反卷積和反匯合來增大空間大小。
反卷積 (deconvolution)/ 轉置卷積 (transpose convolution) 標准卷積的濾波器在輸入圖像中進行滑動,每次和輸入圖像局部區域點乘得到一個輸出,而反卷積的濾波器在輸出圖像中進行滑動,每個由一個輸入神經元乘以濾波器得到一個輸出局部區域。反卷積的前向過程和卷積的反向過程完成的是相同的數學運算。和標准卷積的濾波器一樣,反卷積的濾波器也是從數據中學到的。
反最大匯合 (max-unpooling) 通常全卷積網絡是對稱的結構,在最大匯合時需要記下最大值所處局部區域位置,在對應反最大匯合時將對應位置輸出置為輸入,其余位置補零。反最大匯合可以彌補最大匯合時丟失的空間信息。反最大匯合的前向過程和最大匯合的反向過程完成的是相同的數學運算。
(3) 語義分割常用技巧
擴張卷積 (dilated convolution) 經常用於分割任務以增大有效感受野的一個技巧。標准卷積操作中每個輸出神經元對應的輸入局部區域是連續的,而擴張卷積對應的輸入局部區域在空間位置上不連續。擴張卷積向標准卷積運算中引入了一個新的超參數擴張量 (dilation),用於描述輸入局部區域在空間位置上的間距。當擴張量為 1 時,擴張卷積退化為標准卷積。擴張卷積可以在參數量不變的情況下有效提高感受野。例如,當有多層 3×3 標准卷積堆疊時,第 l 層卷積(l 從 1 開始) 的輸出神經元的感受野為 2l +1。與之相比,當有多層 3×3 擴張卷積堆疊,其中第 l 層卷積的擴張量為 2^時,第 l 層卷積的輸出神經元的感受野為 2^{l +1}-1。感受野越大,神經元能利用的相關信息越多。和經典計算機視覺手工特征相比,大的感受野是深度學習方法能取得優異性能的重要原因之一。
條件隨機場 (conditional random field, CRF) 條件隨機場是一種概率圖模型,常被用於微修全卷積網絡的輸出結果,使細節信息更好。其動機是距離相近的像素、或像素值相近的像素更可能屬於相同的類別。此外,有研究工作用循環神經網絡 (recurrent neural networks) 近似條件隨機場。條件隨機場的另一弊端是會考慮兩兩像素之間的關系,這使其運行效率不高。
利用低層信息 綜合利用低層結果可以彌補隨着網絡加深丟失的細節和邊緣信息,利用方式可以是加和 (如 FCN) 或沿通道方向拼接(如 U-net),后者效果通常會更好一些。
實例分割 (instance segmentation)
語義分割不區分屬於相同類別的不同實例。例如,當圖像中有多只貓時,語義分割會將兩只貓整體的所有像素預測為 “貓” 這個類別。與此不同的是,實例分割需要區分出哪些像素屬於第一只貓、哪些像素屬於第二只貓。
基本思路 目標檢測 + 語義分割。先用目標檢測方法將圖像中的不同實例框出,再用語義分割方法在不同包圍盒內進行逐像素標記。
Mask R-CNN 用 FPN 進行目標檢測,並通過添加額外分支進行語義分割 (額外分割分支和原檢測分支不共享參數),即 Mask R-CNN 有三個輸出分支(分類、坐標回歸、和分割)。此外,Mask R-CNN 的其他改進有:(1). 改進了 RoI 匯合,通過雙線性差值使候選區域和卷積特征的對齊不因量化而損失信息。(2). 在分割時,Mask R-CNN 將判斷類別和輸出模板(mask) 這兩個任務解耦合,用 sigmoid 配合對率 (logistic) 損失函數對每個類別的模板單獨處理,取得了比經典分割方法用 softmax 讓所有類別一起競爭更好的效果。
致謝
感謝
、@Vincent 指出的一處筆誤。
的修改建議。
參考文獻
-
- Badrinarayanan, et al. SegNet: A deep convolutional encoder-decoder architecture for image segmentation. TPAMI, 2017.
-
- Bengio, et al. Representation learning: A review and new perspectives. TPAMI, 2013.
- L.-C. Chen, et al. SegNet: A deep convolutional encoder-decoder architecture for image segmentation. PAMI, 2017.
-
- Chetlur, et al. cuDNN: Efficient primitives for deep learning. arXiv: 1410.0759, 2014.
-
- Cong, and B. Xiao. Minimizing computation in convolutional neural networks. ICANN, 2014.
-
- Dai, et al. R-FCN: Object detection via region-based fully convolutional networks. NIPS, 2016.
-
- Garcia-Garcia, et al. A review on deep learning techniques applied to semantic segmentation. arXiv: 1704.06857, 2017.
-
- Girshick, et al. Rich feature hierarchies for accurate object detection and semantic segmentation. CVPR, 2014.
-
- Girshick. Fast R-CNN. ICCV, 2015.
-
- He, et al. Spatial pyramid pooling in deep convolutional networks for visual recognition. ECCV, 2014.
-
- He, et al. Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification. ICCV, 2015.
-
- He, et al. Deep residual learning for image recognition. CVPR, 2016.
-
- He, et al. Identity mappings in deep residual networks. ECCV, 2016.
-
- He, et al. Mask R-CNN. ICCV, 2017.
-
- Hu, et al. Squeeze-and-excitation networks. CVPR, 2018.
-
- Huang, et al. Deep networks with stochastic depth. ECCV, 2016.
-
- Huang, et al. Densely connected convolutional networks. CVPR, 2017.
-
- Huang, et al. Speed/Accuracy trade-offs for modern convolutional object detectors. CVPR, 2017.
-
- Krizhevsky, and G. Hinton. Learning multiple layers of features from tiny images. Technical Report, 2009.
-
- Krizhevsky, et al. ImageNet classification with deep convolutional neural networks. NIPS, 2012.
-
- Lavin, and S. Gray. Fast algorithms for convolutional neural networks. CVPR, 2016.
-
- LeCun, et al. Gradient-based learning applied to document recognition. Proceedings of the IEEE, 1998.
-
- Lin, et al. Network in network. ICLR, 2014.
- T.-Y. Lin, et al. Microsoft COCO: Common objects in context. ECCV, 2014.
- T.-Y. Lin, et al. Feature pyramid networks for object detection. CVPR, 2017.
- T.-Y. Lin, et al. Focal loss for dense object detection. ICCV, 2017.
-
- Liu, et al. SSD: Single shot multibox detector. ECCV, 2016.
-
- Long, et al. Fully convolutional networks for semantic segmentation. CVPR, 2015.
-
- Noh, et al. Learning deconvolution network for semantic segmentation. ICCV, 2015.
-
- Pleiss, et al. Memory-efficient implementation of DenseNets. arXiv: 1707.06990, 2017.
-
- Redmon, et al. You only look once: Unified, real-time object detection. CVPR, 2016.
-
- Ren, et al. Faster R-CNN: Towards real-time object detection with region proposal networks. NIPS, 2015.
-
- Ren, et al. Object detection networks on convolutional feature maps. TPAMI, 2017.
-
- Ronneberger, et al. U-net: Convolutional networks for biomedical image segmentation. MICCAI, 2015.
-
- Russakovsky, et al. ImageNet large scale visual recognition challenge. IJCV, 2015.
-
- Sermanet, et al. OverFeat: Integrated recognition, localization, and detection using convolutional networks. ICLR, 2014.
-
- Shrivastava, et al. Training region-based object detectors with online hard example mining. CVPR, 2016.
-
- Simonyan, and A. Zisserman. Very deep convolutional networks for large-scale image recognition. ICLR, 2015.
-
-
- Springenberg, et al. Striving for simplicity: The all convolutional net. ICLR Workshop, 2015.
-
-
- Sze, et al. Efficient processing of deep neural networks: A tutorial and survey. Proceedings of IEEE, 2017.
-
- Szegedy, et al. Going deep with convolutions. CVPR, 2015.
-
- Szegedy, et al. Rethinking the Inception architecture for computer vision. CVPR, 2016.
-
- Szegedy, et al. Inception v4, Inception-ResNet and the impact of residual connections on learning. AAAI, 2017.
-
- Toshev, and C. Szegedy. DeepPose: Human pose estimation via deep neural networks. CVPR, 2014.
-
- Veit, et al. Residual networks behave like ensembles of relatively shallow networks. NIPS, 2016.
-
- Xie, et al. Aggregated residual transformations for deep neural networks. CVPR, 2017.
-
- Yu, and V. Koltun. Multi-scale context aggregation by dilated convolutions. ICLR, 2016.
-
-
- Zeiler, and R. Fergus. Visualizing and understanding convolutional networks. ECCV, 2014.
-
-
- Zheng, et al. Conditional random fields as recurrent neural networks. ICCV, 2015.