全卷積網路:從圖像級理解到像素級理解
卷積神經網路(CNN):圖像級語義理解的利器
自2012年AlexNet提出並刷新了當年ImageNet物體分類競賽的世界紀錄以來,CNN在物體分類、人臉識別、圖像檢索等方面已經取得了令人矚目的成就。通常CNN網路在卷積層之後會接上若干個全連接層, 將卷積層產生的特徵圖(feature map)映射成一個固定長度的特徵向量。以AlexNet為代表的經典CNN結構適合於圖像級的分類和回歸任務,因為它們最後都期望得到整個輸入圖像的一個數值描述, 比如AlexNet的ImageNet模型輸出一個1000維的向量表示輸入圖像屬於每一類的概率。例如,下圖中的貓, 輸入AlexNet, 得到一個長為1000的輸出向量, 表示輸入圖像屬於每一類的概率, 其中在「tabby cat」這一類上響應最高。
全卷積網路:從圖像級理解到像素級理解
與物體分類要建立圖像級理解任務不同的是,有些應用場景下要得到圖像像素級別的分類結果,例如:1)語義級別圖像分割(semantic image segmentation), 最終要得到對應位置每個像素的分類結果。2) 邊緣檢測, 相當於對每個像素做一次二分類(是邊緣或不是邊緣)。以語義圖像分割為例,其目的是將圖像分割為若干個區域, 使得語義相同的像素被分割在同意區域內。下圖是一個語義圖像分割的例子, 輸入圖像, 輸出的不同顏色的分割區域表示不同的語義:背景、人和馬。 針對語義分割和邊緣檢測問題,經典的做法就是以某個像素點為中心取一個圖像塊, 然後取圖像塊的特徵作為樣本去訓練分類器。在測試階段, 同樣的在測試圖片上以每個像素點為中心采一個圖像塊進行分類, 分類結果作為該像素點的預測值。沈為等在CVPR2015上發表的DeepContour就採用這一思路檢測圖像邊緣。然而,這種逐像素取圖像塊進行分類的方法非常耗時, 另外一個不足是受到圖像塊的限制, 無法建模較大的上下文信息(context), 從而影響演算法的性能。以語義圖像分割(semantic image segmentation)為例, 數據集圖像中的物體有時候非常大, 比如上圖中馬的分割例子, 如果不取比較大的圖像塊,難以抽取到有效的特徵區分該像素塊是否屬於一匹馬。
Lonjong等發表在CVPR2015的論文提出了全卷積網路(FCN)進行像素級的分類從而高效的解決了語義級別的圖像分割(semantic segmentation)問題。與經典的CNN在卷積層之後使用全連接層得到固定長度的特徵向量進行分類不同,FCN可以接受任意尺寸的輸入圖像,採用反卷積層對最後一個卷積層的feature map進行上採樣, 使它恢復到輸入圖像相同的尺寸,從而可以對每個像素都產生了一個預測, 同時也保留了原始輸入圖像中的空間信息, 最後在上採樣的特徵圖上進行逐像素分類。論文中逐像素計算softmax分類的損失, 相當於每一個像素對應一個訓練樣本。
由於步長(stride)不為一的卷積層和池化層產生的特徵圖(feature map)大小會有一些向下取整操作, 導致最後的feature map大小與原圖不是嚴格的倍數關係。例如對如下的一個pooling層,
{ name:"pool1" type: "Pooling" bottom: "conv1_2" top: "pool1" pooling_param { kernel_size: 2 stride: 2 }}
前層輸入大小為 11x11 的特徵圖, 其輸出的特徵圖大小為(11 - 2) / 2 + 1 = 5, 並不是輸入大小11的整數倍。上採樣不能完全保證最後的perpixel prediction 結果與原圖大小嚴格相同, 因此在上採樣(Deconvlution)之後會有一個crop層, 將上採樣的結果進行裁剪, 使之大小與輸入圖像嚴格相等。
下圖是Longjon用於語義分割所採用的全卷積網路(FCN)的結構示意圖, 在Alexnet基礎上, 最後的channel=4096的feature map經過一個1x1的卷積層, 變為channel=21的feature map, 然後經過上採樣和crop, 變為與輸入圖像同樣大小的channel=21的feature map, 也就是圖中的pixel-wise prediction。 在Longjon的試驗中一共有20個語義類別, 加上背景類別每個像素應該有21個softmax預測類, 因此pixel-wise prediction中channel=21。
FCN能夠端到端(end to end)得到每個像素的預測結果, 目前也湧現了一大批基於FCN的演算法, 例如邊緣檢測(edge detection), 視覺跟蹤(visual tracking)等。同時FCN也可以省去傳統識別中複雜的逐patch計算過程, 我們曾經在一個燃氣表數字識別的項目中使用FCN直接得到如下圖所示燃氣表圖片中的數字識別結果, 如果使用經典的用於數字識別的LeNet-5網路, 就需要對下圖進行字元檢測然後取patch歸一化後進行分類。
在訓練階段, 我們標定燃氣表數字中心一塊區域的像素點為該類數字的正樣本, 如下圖所示, 不同數字的中心區域的像素被標定為不同的類別, 十種數字加上背景一共十一類, 不同顏色表示不同類別的標註, 其他的都是背景類。最後對每個像素計算softmax loss。
測試階段通過全卷積網路得到輸入燃氣表圖像每一個像素的分類結果, 接著進行非極大值抑制, 形態學變換等後續操作, 可直接得到上圖的識別結果"001832", 整個系統十分高效。我們開源了基於Caffe的實現,代碼鏈接 GitHub - SHUCV/digit: digital meter numbers detection.
HED: FCN用於邊緣檢測
上一節講到FCN適用於需要像素級預測的場景, 下面就介紹一個基於FCN的邊緣檢測的工作HED, 來自於屠卓文老師組, 發表在ICCV2015並且獲得了Marr獎提名。HED提出了side-output的概念, 在網路的中間的卷積層也對其輸出上採樣得到一個與原圖一樣的map, 並與ground-truth計算loss, 這些中間的卷積層輸出的map稱為side-output。 多個side-output產生的loss直接反向傳導到對應的卷積層, 一定程度避免了梯度消失, 同時也在不同的卷積層(不同的感受野)學到了不同尺度的feature, 在edge-detection這個計算機視覺中古老的問題上取得了state-of-art的效果。
FSDS:我們發表於CVPR16的骨架檢測方法
在HED的基礎上, 我們進一步提出了「尺度相關的邊輸出」(scale-associated side-output)的概念, 根據卷積層感受野的不同, 給予不同的監督, 使得最終的side-output具有尺度信息。由於HED解決的是邊緣檢測問題, 對於一個邊緣點即使很小的感受野也能捕捉到邊緣信息, 所以HED在多個side-output上進行優化的時候使用的是同一個ground-truth, 不同的side-output(具有不同的感受野)用同一個ground-truth監督是合理的。但是在骨架檢測(skeleton detection)的問題中,骨架尺度有很大的變化, 不同感受野的卷積單元能感受到的骨架信息是不同的。
正如下圖, 只有卷積核(圖中綠色方框)正好略大於骨架尺度(對應下圖第1,第3個卷積核), 卷積核提取的特徵才能有效檢測出骨架。
基於以上的分析, 我們提出了FSDS(fusing scale-associated deep side-output),不同side-output是尺度相關的。 首先將骨架點根據其尺度從小到大分為離散的五類, 然後根據不同的side-output感受野的不同, 使用不同的ground-truth去監督side-output。 在這裡, 物體骨架的尺度定義為骨架點到最近的輪廓點的距離的兩倍。
具體的, 在淺層的side-output(更小的感受野), groundtruth只標註第一類(尺度最小的)為正樣本,其它所有點為負樣本進行二分類; 由淺到深隨著side-output感受野的增加, 逐漸增加監督的類別, 進行三分類、四分類等等。
另外, 在HED中多個side-output的結果最後是平均累加的。 在我們的結構中, 由於淺層side-output產生的小尺度骨架的map置信度更高, 而深層side-output產生的大尺度骨架map的置信度高, 設計了帶有權重的side-output融合策略, 多個由多個side-output產生的不同的尺度的分類結果使用不同的權重進行融合, 該權重在優化過程中自動學到。
上圖是我們方法(FSDS)的網路結構, 多個side-output使用不同尺度的監督, 最後使用不同的權重進行融合。最上一排表示卷積; 第二排灰色背景表示不同side-output不同的groundtruth; 第三排表示side-output, 網路由淺到深, side-output產生的分類類別逐漸增多; 第四排將不同side-output上產生的同一尺度的骨架點的概率圖連接到一起,骨架尺度用顏色區分, 數據流向為箭頭指向。
我們已經開源了該方法基於Caffe的實現, 源代碼鏈接GitHub - zeakey/DeepSkeleton: code for cvpr2016 paper "Object Skeleton Extraction in Natural Images by Fusing Scale-associated Deep Side Outputs"
致謝:感謝中科院計算所博士生所劉昕, 在撰本文期間本文與他進行了深入討論並對本文提出了建設性的修改意見。
該文章屬於「深度學習大講堂原創」,不允許隨意轉載,如需要轉載,請聯繫果果是枚開心果。
如果您也關注人工智慧,請別忘了關注我們哦~如果想關注微信公眾號,請識別下圖中的二維碼!
推薦閱讀:
※Zeroth.ai 正在尋找亞洲最好的人工智慧以及機器學習的新銳力量
※如何看待人工智慧用於配音?
※景觀設計會被人工智慧代替嗎?
※教 Chatbot 生成更有營養的對話
TAG:深度学习DeepLearning | 卷积神经网络CNN | 人工智能 |