[論文筆記]DenseCap: Fully Convolutional Localization Networks for Dense Captioning



DenseCap: Fully Convolutional Localization Networks for Dense Captioning
一個模型幫你圈出圖裡好幾個框,每個框說一句簡短描述,這就是 dense captioning 的核心。

年份:2015年 
史丹佛大學 電腦科學系
Justin Johnson ,Andrej Karpathy ,Li Fei-Fei



研究問題
  • 首次正式定義「dense captioning」任務:同時在影像中定位多個區域並為每個區域產生自然語言敘述。
  • 提出Fully Convolutional Localization Network (FCLN),以 CNN backbone + dense localization layer + RNN captioner,一次 forward 同時做區域候選與描述,無需額外 region proposal,端到端訓練。


把「偵測」與「描述」整合在一個共享特徵與梯度的架構中,避免傳統兩階段 pipeline(先 region proposal 再 caption)帶來的速度與訓練不一致問題。和那時候既有最先進方法基準相比,在生成與檢索兩種設定上皆觀察到速度與準確度的提升。





研究背景
人類能輕鬆指出並描述影像中所有面向,仰賴對視覺場景及其所有元素的深刻語意理解。然而,儘管有許多潛在應用,這項能力對於當前最先進的視覺辨識系統而言仍然是一大挑戰。

使用Visual Genome 資料集,包含 94,313 張影像與 4,100,413 副文本片段(每張影像平均 43.5 副),每則皆對應至影像的一個區域。影像來源為 MS COCO 與 YFCC100M [46] 的交集,標註工作透過 Amazon Mechanical Turk 蒐集,要求作業者在影像上繪製一個邊界框並以文字描述其內容。資料集中範例說明包括「貓在栖架上玩掛著的玩具」、「報紙散落在桌上」、「女子將紅酒倒入杯中」、「斑馬的鬃毛」以及「紅燈」。

學者在論文中探討於當下時空背景相關研究,參考如下論文文獻,也開始有將標籤空間的複雜度從固定的類別集合擴展為可以表達更豐富概念的文字序列研究趨勢。

[4]Microsoft COCO Captions: Data Collection and Evaluation Server
X. Chen, H. Fang, T.-Y. Lin, R. Vedantam, S. Gupta, P. Dollar, and C. L. Zitnick

[5]Learning a recurrent visual representation for image caption generation
X. Chen and C. L. Zitnick

[9]Long-term recurrent convolutional networks for visual recognition and description
J. Donahue, L. A. Hendricks, S. Guadarrama, M. Rohrbach, S. Venugopalan, K. Saenko, and T. Darrell

[22]Deep visual-semantic alignments for generating image descriptions
A. Karpathy and L. Fei-Fei

[32]Explain images with multimodal recurrent neural networks
J. Mao, W. Xu, Y. Yang, J. Wang, and A. L. Yuille

[48]Show and tell: A neural image caption generator
O. Vinyals, A. Toshev, S. Bengio, and D. Erhan

[50]Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
K. Xu, J. Ba, R. Kiros, A. Courville, R. Salakhutdinov, R. Zemel, and Y. Bengio

儘管在標註密度與標註複雜度這兩個方向上已有令人鼓舞的進展,但這兩個方向仍然是分離的。在本研究中,學者們朝將這兩個互相連結的任務統一為一個共同框架邁出了一步。

模型架構
模型由三大模組組成:
  1. 一個卷積網路 (CNN):萃取影像特徵。
    使用 VGG‑16 作為骨幹,移除最後一層 pooling,輸入 3×W×H 的影像會被轉成 512×W/16×H/16 的特徵圖,代表在均勻網格上抽樣的高階外觀特徵。這個特徵圖不再做分類,而是當作後續定位層的輸入,用來預測區域與抽取區域特徵。
    CNN 以 ImageNet 預訓練權重初始化,其餘權重以標準差 0.01 的高斯初始化。
    CNN 用帶 momentum 0.9 的 SGD 訓練,其餘部分用 Adam。


  2. 一個可微分的區域定位層 (localization layer):負責提出候選框並抽取區域特徵。
    找出 B 個框 + 幫每個框切出固定大小的特徵。

    輸入是 CNN 特徵圖,輸出三個東西:每個區域的座標 (B×4)、每個區域的分數 (B)、以及對應的區域特徵 (B×C×X×Y)。

    內部先在特徵圖上定義多個「anchor」方框,對每個 anchor 用卷積預測「是否為有意義區域」的分數與 bounding box 偏移量,類似 Faster R‑CNN 的 RPN,但後續不是用 RoI pooling,而是用可微分的雙線性插值(bilinear interpolation)來取區域特徵。
    可以理解拆為3步驟
    (1) Anchors
    在特徵圖的每一個格子位置,都放 k 個不同長寬比的「anchor box」,等於在原圖上鋪滿一堆預設框。對每個 anchor,用卷積算出這個框像不像一個「有東西的區域」的分數。要把這個框往哪邊移動、放大縮小(4 個偏移量)才更貼近真正的有意義區域。
    (2) Box regression + 抽樣
    把不重要的框丟掉,只留幾百個。用 (tx,ty,tw,th) 這種參數把 anchor 調成「預測框」,大概就是:x,y 往左右上下移一點,w,h 乘上一個指數縮放。
    訓練時:抽樣 256 個 box,IoU 高的當正樣本,IoU 低的當負樣本,拿來訓練「這個框是不是好框」跟「偏移量」這兩件事。
    測試時:用 NMS 只留下分數最高、互相不太重疊的 300 個框,後面就只對這 300 個框做 caption。
    (3) 雙線性插值:把裁下來的大小不一的區塊縮放成固定大小。
    每個框在特徵圖上大小都不同,但全連接網路和 LSTM 只會吃固定大小的輸入,所以必須把每個框「重取樣」成同樣的 X×Y 網格(DenseCap 用 7×7,從論文中的Figure 2可看到)。先在這個框裡畫一個 7×7 的「規則網格」,但是這些網格點的座標是小數,可以落在特徵圖的任意位置。每個網格點都用周圍 4 個格子的值做平滑插值(就像把影像放大縮小時的插值),這樣得到一個「平順」的 7×7×C 特徵塊。
    因為這個 sampling grid 的座標是「框座標」的線性函數,所以梯度可以回傳到框的位置,模型就可以學「框往這邊移一點會更好」。
    相較於Fast R‑CNN 用 RoI pooling,粗略切格子之後做max pooling,缺點是格子邊界被四捨五入,導致框座標沒辦法學得很平滑。

  3. 一個 RNN 語言模型:產生文字敘述。
    對每個「正樣本框」,先把 4096 維 region code 壓成一個向量 x1 丟進 LSTM,等於先告訴它「這張圖裡、這個框長這樣」。接著步驟是
    給一個 START token 的向量 x0依序餵進每個字的向量 x1xT,LSTM 每一步輸出一個分布 yt,代表下一個字的機率(加上一個 END token)。

    訓練時做 cross‑entropy,逼它在每個時間步都預測出正確的下一個字,最後一步預測 END。測試時:先給 x1,然後一直「選機率最大的下一個字」,直到吐出 END 為止,這就形成這個框的 caption。
這三部分組成 FCLN (Fully Convolutional Localization Network),可以在單一影像上一次前向就產生多個區域與對應 caption,並能整體端到端訓練。

實驗方法
實作是用 Torch 7 實現,並採用 VGG-16 作為卷積骨幹網路。

實驗使用 Visual Genome (VG) region captions 資料集
預處理階段將出現次數少於 15 次的詞彙合併為一個特殊的 <UNK> 標記,得到一個包含 10,497 個詞彙的字典。學者們會去除像「there is…」或「this seems to be a」這類的指稱短語。

此外考量效率,也捨棄所有超過 10 個字的標註(佔標註的 7%)。也捨棄所有標註數少於 20 或多於 50 的影像,以減少每張影像中區域數量的變異。最後剩下 87,398 張影像;各分配 5,000 張到驗證/測試集,其餘則為訓練集。

於測試評估階段,對驗證/測試影像中的真實區域進行預處理,將重疊嚴重的框合併為具有多個參考說明的單一框。對於每張影像,反覆選擇與其他框重疊數最多的框(基於 IoU,閾值為 0.7),並將這些框合併(取平均)成一個具有多個參考說明的單一框。然後排除這一群組並重複該過程。

在密集描述任務中,模型接收一張影像並產生一組區域,每個區域都標註一個置信度和一個描述。
DenseCap 的實驗章節主要是在比較不同「候選區域來源」和不同模型架構的效能與速度,如表1
表 1:可看到每列各自不同模型架構做法
  • Full image RNN:只看整張圖產生一句話,不做 dense captioning。
  • Region RNN:先用外部 proposal,再對每個框單獨跑 CNN + RNN。
  • FCLN on EB:DenseCap 架構,但訓練/測試時用 EdgeBoxes 框。
  • FCLN(主方法):用 RPN 端到端訓練的 DenseCap。

在 5,000 張測試影像上的密集描述評估。語言指標為 METEOR(數值越高越好),學者們的密集描述指標為Average Precision(AP,數值越高越好),

對於一張包含 300 個proposals的 720×600影像,在 Titan X GPU 上的測試執行時間以毫秒為單位表示(ms,數值越低越好)。

EB、RPN 與 GT 分別對應於 EdgeBoxes [53]、Region Proposal Network [37]與在測試時使用的真實標註方框。GT 欄位中的數字(斜體)在假設定位完美的情況下作為上限。

評估指標
直覺上,學者們希望模型能同時產生良好定位的預測(物件偵測)與準確的描述(圖像描述)。
針對語言學者們使用 METEOR 分數門檻 0、0.05、0.1、0.15、0.2、0.25。
因為在參考句數較少的情境下該指標被發現與人工判斷的相關性最高 [47]

EB:EdgeBoxes
一種傳統的候選區域演算法,利用邊緣資訊產生很多可能的物體框(proposal),DenseCap 把這些框當作輸入區域來做描述。

RPN:Region Proposal Network
來自 Faster R-CNN 的「區域提議網路」,用卷積網路學習出哪些位置可能有物體(或有語義區域)。DenseCap 裡有自己訓練一個 RPN,讓整個系統可以端到端學習,實驗表裡「RPN」那欄就是用這個 RPN 產生的框做 dense captioning。

GT:Ground Truth boxes 
標註資料裡的人類標準答案框,也就是資料集附的「正確區域位置」。代表如果框的位置是完美的,上限能到哪裡。



實驗環境
附上論文研究公開的Girhub Repo

RAM 記憶體需求
在特徵提取任務中,處理約 13,000 張圖像,每張圖像 100 個邊界框,每個框使用 4096 維特徵,大約需要 20GB 的記憶體。

儲存空間需求
預處理數據集:使用 preprocess.py 生成的 HDF5 文件會非常大,超過 100GB。
預訓練模型:壓縮檔案約 1.1 GB,解壓後約 1.2 GB。
`data/models/densecap/densecap-pretrained-vgg16.t7.zip`


DenseCap repository 並沒有提供一個集中的硬體需求規格文檔,根據官方repo註解與說明檔。
  • GPU:使用 NVIDIA GTX TITAN X 等級或更高的 GPU,並安裝 CUDA 和 cuDNN 以獲得最佳性能
  • RAM:至少 32GB 系統記憶體用於訓練,20GB+ 用於特徵提取任務
  • 儲存空間:至少 150GB 可用空間(100GB+ 用於數據集,加上模型和其他文件)

主要使用兩種程式語言:
  • Lua - 主要程式語言,用於模型訓練和推論
  • Python 2.7 - 用於資料預處理和 webcam server
核心框架
  • Torch - 深度學習框架
Torch 套件
  • torch/torch7
  • torch/nn
  • torch/nngraph
  • torch/image
  • lua-cjson
  • qassemoquab/stnbhwd
  • jcjohnson/torch-rnn
Python 套件(用於訓練)
  • numpy
  • scipy
  • Pillow
  • h5py
Python 套件(用於 Webcam Server)
  • Flask
  • Flask-Cors
  • Flask-RESTful
  • Pillow
運行環境需求
  • Linux/Unix(推薦 Ubuntu)
  • Java JDK 1.5 或更高版本(用於 METEOR 評估)
  • Python 2.7(用於資料預處理和評估)
如果只是要運行預訓練模型,不需要安裝訓練相關的依賴。GPU 模式需要 NVIDIA GPU 和 CUDA 支援,若僅用CPU方式可多加 -gpu -1 參數來運行。

根據repo程式碼中有明確針對特定 GPU 型號進行了優化,包括 GeForce GTX TITAN X 和 GeForce GTX TITAN Z。



核心貢獻
1.開發了一種全卷積定位網路架構(Fully Convolutional Localization Network,FCLN)來處理密集描述(dense captioning)任務。該模型受到當時影像描述研究的啟發 [48, 22, 32, 9, 5],其結構由卷積神經網路接上一個遞迴神經網路語言模型所組成。

2.提出了一個新的密集定位層。該層是完全可微分的,且可插入任何處理影像的神經網路中,以實現區域層級的訓練與預測。
在內部,定位層會預測影像中的一組感興趣區域(regions of interest),然後使用雙線性插值(bilinear interpolation)[20, 17],平滑地擷取每個區域內的激活值。

FCLN 架構基於近期為影像描述所發展的 CNN-RNN 模型,但加入了一個創新的、可微分的定位層,該定位層可以插入任何神經網路以啟用空間定位的預測。

3.已公開釋出程式碼與資料,以促進密集描述任務的進一步研究與進展。

研究仍具有改善空間與不足的地方
模型可以偵測到動物部位(「長頸鹿的頭部」、「斑馬的腿」),也能理解某些物體屬性(「紅白標誌」、「白色網球鞋」)以及物體間的互動(「手拿著手機」)。
片語「公車的前輪」是一個失敗案例:模型正確辨識出公車的輪子,但無法區分前輪與後輪。
  • 定位精度受限:DenseCap 用的是類似 Faster R-CNN 的 region proposal + fully convolutional network 架構,對小物體或重疊物體的框有錯誤與偏移,作者在結果分析中指出有錯誤檢測與漏檢情況。
  • 語言品質與多樣性有限:作者在實驗中承認,產生的描述雖然能抓到物體與局部區域,但句子結構相對簡單、重複,無法產生像人工那樣豐富多變的敘述。
  • 架構設計偏局部,不擅長全局語意:DenseCap 的卷積與 region-based 設計非常擅長做「局部區域 + 短描述」,但缺乏專門建模全圖關係與長距離依存的模組,因此對整體場景、物體間關係的掌握有限。
  • 訓練資料與標註限制:論文使用的資料集(如 Visual Genome)雖然有大量區域描述,但標註本身就偏短句、片語,容易讓模型學到「短、模板化」句型,而不是自然語言中更複雜的語法與敘事。






留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

外貿Payment Term 付款條件(方式)常見的英文縮寫與定義

鼎新ERP_會計系統_總帳管理_財務參數設定_傳票處理