8 月 26 日,文章《深度 | Facebook 的圖像識別很強大,一次開源了三款機器視覺工具(附論文)》介紹 Facebook 在開源上的新動態(tài)。在這篇文章中,作者對此次開源的 3 款工具分別進行了深度解析。介紹
說到分析圖象,F(xiàn)acebook 毫無疑問在深度卷積神經(jīng)網(wǎng)絡(luò)方面取得了很大成就。一周前,F(xiàn)acebook 人工智能研究團隊發(fā)表了一個 blog,詳細闡述了一些對象分割算法背后的計算機視覺技術(shù)。在這篇文章中,我們將會總結(jié)并解釋 blog 中引用的三篇論文。
Facebook 人工智能研究團隊利用的主要渠道如下。圖象被輸入到 DeepMask 分割構(gòu)架,被分割的部分通過 SharpMask 模型進行精煉,再通過 MultiPathNet 進行分類。讓我們來看看每一個組成部分是怎么單獨運行的吧。
DeepMask簡介
Pedro Pinheiro, Roman Collobert 與 Piotr Dollar 寫了一篇標(biāo)題為「學(xué)習(xí)分割候選對象(Learning to Segment Object Candidates)」的論文。作者通過一個模型著手處理對象分割的任務(wù)。該模型在給定的一個圖像補丁的情況下,首先輸出一個分割掩碼,然后再輸出該圖像補丁在完整對象上居中的概率。那個過程被應(yīng)用在整個圖象上以便每一個對象都可以得到一個創(chuàng)造的掩碼。而這整個過程僅通過一個 CNN 來完成,因為在該網(wǎng)絡(luò)中,這兩個組件都共享了許多層。輸入和輸出
讓我們先可視化出我們想讓這個模型做什么。給定一個輸入圖像后,我們希望這個網(wǎng)絡(luò)可以為每一個對象都輸出一組掩碼或輪廓。我們可以認為每一個輸入圖象都包含一組補?。ㄔ瓐D的一小部分)。對于一個輸入的補丁而言,輸出是一個二進制掩碼,它能勾勒出主要對象的形狀并對輸入補丁有多少可能包括一個對象進行評分(在-1 和 1 之間)。
每個訓(xùn)練樣本都將要包含這 3 個要素(邊注:帶有 1 標(biāo)注的樣本需要在給定大小的范圍內(nèi)包含一個在該圖像中大致居中的對象)。該模型在多個尺寸刻度和位置上將這個過程應(yīng)用在圖像上(這是一個我們之前討論過的補丁集)。然后將結(jié)果匯總形成一個帶有所有掩碼的最終圖像?,F(xiàn)在,讓我們看一看這個模型是這么架構(gòu)起來的。
網(wǎng)絡(luò)架構(gòu)
這個網(wǎng)絡(luò)是為了 ImageNet(遷移學(xué)習(xí)。使用它)上的分類而預(yù)訓(xùn)練的。圖象通過一個含有八個 3x3 的卷積圖層和五個 2x2 maxpool 層的類似 VGG 的模型(不含充分連接的層)流入。根據(jù)輸入圖象的尺寸,你將會得到一個確定的輸出量(在這個案例中是 512x14x14)。
輸入:3 x 高 x 寬
輸出:512 x 高/16 x 寬/16
然后,模型分成了之前描述過的 2 個組件。一個主要處理分割,而另一個判定圖象中是否有一個對象。Segmentation Head
現(xiàn)在我們采用輸出量,將它穿過一個 network-in-network 層和一個 ReLU 層。然后,我們將會得到一個寬乘高(這個寬和高小于原圖的高和寬)像素分類器的層,而這個層將決定已知像素是否是圖象中心的對象的一部分(如果你有一個 28x28 大小的原圖,那么將會少于 784 個分類器)。然后我們來看看這些分類器的輸出,雙線性增采樣的輸出符合完整的原分辨率,取得一個黑白的二進制掩碼(1 代表「是」,0 代表「否」)。Objectness Head
另一個網(wǎng)絡(luò)組件決定了圖象是否包含居中并且比例適中的對象。將 VGG 圖層的輸出穿過一個 2x2 的 maxpool(一個 dropout 單元)和兩個充分相連接的網(wǎng)絡(luò)層,我們就可以得到「objectness」的得分。
訓(xùn)練
由于損失函數(shù)是邏輯回歸損失的總和(一個是 objectness head 的損失,一個是 segmentation head 中每個位置的損失),網(wǎng)絡(luò)的兩個組件是同時訓(xùn)練的。反向傳播在 segmentation head 和 objectness head 之間交替進行。數(shù)據(jù)增加技術(shù)也被用來改善這個模型。這個模型采用隨機梯度下降法在 Nvidia Tesla K40m GPU 上訓(xùn)練了將進 5 天。
為什么這篇論文很酷
一個單獨的卷積神經(jīng)網(wǎng)絡(luò)。我們不需要一個額外的圖片目標(biāo)提議步驟或一些復(fù)雜的訓(xùn)練渠道。很明確的是,這個模型提高了網(wǎng)絡(luò)的效率、速度和靈活性。SharpMask
前面的作者(與 Tsung-Yi Lin 合作)也發(fā)表了一篇標(biāo)題為「學(xué)習(xí)提煉對象分割塊(Learning to Refine Object Segments)」的論文。正如標(biāo)題所示,這篇論文的主旨是提煉 DeepMask 模型生成的分割掩碼。DeepMask 的主要問題在于,它使用了一個簡單的前饋網(wǎng)絡(luò),它在生成「粗糙對象掩碼」時是很成功的,卻并不能生成「精確到像素的分割」。原因是,這里運用了全圖像大小的二元線性采樣。這就導(dǎo)致了對象邊界的粗糙和不精確對齊。為了解決這個問題,SharpMask 模型把網(wǎng)絡(luò)中的淺層(early layers)的低級(low-level)特征與深層(layers deeper)的高級(high-level)的對象信息結(jié)合起來。這個模型通過首先對每一個輸入部分生成一個粗糙掩碼,然后將它傳入網(wǎng)絡(luò)中的不同提煉模型來實現(xiàn)這點。現(xiàn)在我們來介紹細節(jié)。
網(wǎng)絡(luò)的構(gòu)架
SharpMask 模型構(gòu)架的動機源于高級(high-level)的對象信息對精確的分割掩碼十分有用,我們需要一個自上而下的方法:第一步生成粗糙的邊界,然后整合淺層(early layers)中重要的低級(low-level)信息。正如你從上圖中看到的,原始輸入最先傳入 DeepMask 通道來得到粗略的分割。然后它通過一系列精煉模型,增采樣進而還原圖像的原始維度。精煉模型
讓我們深入挖掘下該精煉模塊的特性。該模塊的目標(biāo)通過增采樣將自下而上(你可以認為 DeepMas=bottom-up 和精煉模塊=top-down)創(chuàng)造的特征圖考慮在內(nèi)的方式生成的掩碼,對抗 DeepMask 通道中池化層的影響。看待它的一種數(shù)學(xué)方式是精煉模塊 R 是一個生成增采樣的掩碼 M 的函數(shù),掩碼 M 是前面層中掩碼的函數(shù),也是特征圖 F 的函數(shù)。使用的精煉模塊的數(shù)量等于 DeepMask 通道中使用的池化層的數(shù)量。
現(xiàn)在,函數(shù) R 中到底發(fā)生了什么?一個簡單方法是只要連接(concatenate) M 和 F,因為它們有同樣的寬和高。問題存在于這些每個組件的深度信道中。特征圖中深度信道的數(shù)量要比掩碼的深度信道數(shù)量大的多。因此,M 和 F 的連接將過于偏向 F。解決方案是通過應(yīng)用一個 3×3 卷積層減少 F 深度信道的數(shù)量,然后再連接 M,通過另一個 3 ×3 卷積層,最終使用一個雙線性增采樣。訓(xùn)練
DeepMask 使用的訓(xùn)練數(shù)據(jù)同樣適用于 SharpMask。我們需要輸入二進制掩碼補丁和標(biāo)簽。DeepMask 層先被訓(xùn)練,然后在精煉模塊開始訓(xùn)練的時候,權(quán)重會被凍結(jié)。
為什么這篇論文很酷
在引入一個新的、易于使用的模塊的同時,該論文也能夠建立在 DeepMask 的方法之上。作者們創(chuàng)造性的認識到通過只融合在 DeepMask 通道的較早層中可用的低層信息,就能獲得更精確的分割。
MultiPathNet簡介
DeepMask 用來生成粗糙的分割掩碼,SharpMask 用來精煉這些輪廓。而 MultiPathNet 的職責(zé)是在這些掩碼中進行對象識別或者分類。包括 Sergey Zagoruyko、Adam Lerer、Tsung-Yi Lin、Pedro Pinheiro、Sam Gross、Soumith Chintala、Piotr Dollar 在內(nèi)的幾個人發(fā)表了一篇名為「A MultiPath Network for Object Detection」的論文。這篇文章的目的,是通過專注處理尺度變化、高度遮擋、雜亂的圖片,以及更高的精度定位,來提高對對象的檢測技術(shù)。這個模型是以快速 R-CNN(Fast R-CNN)為起點的??偟膩碇v,這個模型應(yīng)用了快速 R-CNN 以及 DeepMask 和 SharpMask 的對象檢測技術(shù)。這篇論文的三個主要貢獻之處是:忽略連接(skip connections)、黃斑區(qū)域(foveal regions)和一個積分損失函數(shù)(integral loss function)。在詳細介紹這三個方法之前,我們先來看看這個網(wǎng)絡(luò)的架構(gòu)。
網(wǎng)絡(luò)架構(gòu) / 黃斑區(qū)域
使用快速 R-CNN 時,我們首先將輸入圖像傳入一個層與層之間沒有完全連接的 VGG 網(wǎng)絡(luò)。POI 池化(ROI pooling)被用于提取區(qū)域的特征(在 Ross Girshick 的論文中,ROI 池化是一個將圖像的特征映射(mapping)到描述圖像區(qū)域的固定空間的特征圖(feature map)的方法)。對于每一個對象,我們接著創(chuàng)建四個不同的區(qū)域來從多個角度觀察對象。這些區(qū)域就是我們在簡介中介紹的「黃斑區(qū)域」。這些區(qū)域被傳入完全連接的層中,得到的輸出被連接起來,然后網(wǎng)絡(luò)分成一個分類器和一個回歸頭文件?;谶@個網(wǎng)絡(luò)架構(gòu)可以從多個尺度觀察圖像,并可以注意到目標(biāo)對象周圍的事物,這篇論文的作者推測這些黃斑區(qū)域可以幫助精確定位。忽略連接
由于快速 R-CNN 的架構(gòu)問題,一張 32x32 大小的輸入圖像會在最后的 VGG 卷積層迅速縮減到 2x2 的大小。ROI 池化會創(chuàng)建一個 7x7 的映射,但是我們?nèi)匀粊G失了很多原始空間信息。為了解決這個問題,我們將特征從卷積 3、4、5 層就開始連接,然后把它們傳入黃斑分類器(foveal classifier)。這篇論文指出,這些連接「給分類器提供了多種位置的特征信息」。積分損失函數(shù)
我并不想對這個概念深入介紹,在紙上演算數(shù)學(xué)公式無疑更簡明易懂。這個概念的大致意思是,作者發(fā)明了一個損失函數(shù),使得在預(yù)測有多個交除并(intersection-over-union, IoU)值的圖像時有更好的表現(xiàn)。為什么這篇論文很酷
如果你對快速 R-CNN 感興趣,那么你一定喜歡這個模型。它運用了 VGG 網(wǎng)絡(luò)(VGG Net)和 ROI 池化(ROI pooling)的主要思想,同時還介紹了一種通過黃斑區(qū)域(foveal regions)、忽略連接(skip connections)和積分損失函數(shù)(integral loss function)得到更精確的定位和分類的方法。