論文解讀:DenseCap: Fully Convolutional Localization Networks for Dense Captioning

本篇論文解讀的排版主要參見原文的格式,針對原文中的每一個小節(jié)進行展開,有的是對原文的一個提煉和簡單概括,有的是對原文中涉及但是又沒有詳細介紹的技術(shù)的補充和說明。
原文連接:https://cs.stanford.edu/people/karpathy/densecap/
作者個人主頁:https://cs.stanford.edu/people/jcjohns/
PS:本篇博文不是對原文的簡單翻譯,論文中每一處涉及到的知識點以及論文中沒有提及的技術(shù)細節(jié),本文都會做一定的補充說明,如果還有什么看不懂的地方的話,可以留言一起討論,我會盡量在24小時內(nèi)回復(fù)。

<div align=center>

[圖片上傳失敗...(image-f8be6-1540209330519)]

0.摘要

??這篇文章的主要工作是對圖像的dense captioning。所謂dense captioning,就是要描述的對象不再是一幅簡單的圖片,而是要將圖片中的許多局部細節(jié)都都用自然語言描述出來。這篇文章所做的工作可以說是object detection和image captioning的一般化,即當(dāng)描述的語言是一個單詞的時候,就可以看作是object detection,當(dāng)描述的對象是整幅圖片的時候,就成了普通的image captioning。
這篇文章的主要貢獻在于提出了一個Fully Convolutional Localization Network(FCLN)網(wǎng)絡(luò)結(jié)構(gòu),該網(wǎng)絡(luò)結(jié)構(gòu)可以進行端到端式的訓(xùn)練,無需額外的候選區(qū)域生成模型(以及整合到網(wǎng)絡(luò)內(nèi)部),只需要進行一輪優(yōu)化和前饋計算就可以得到輸出結(jié)果。
網(wǎng)絡(luò)模型有三部分組成:卷積網(wǎng)絡(luò)(Convolutional Network)、密集定位層(dense localization layer)和RNN語言模型。

1.介紹

??本小節(jié)主要介紹了dense cationing任務(wù)的定義,以及相對應(yīng)的object detection和image caotioning方面的研究。大家可以自己看一下原文

2.相關(guān)工作

??這里只給出重要的2篇論文(作者主要是在這兩篇論文的幾處上進行模型構(gòu)建的),其他的可以參見原文
Faster R-CNN
http://papers.nips.cc/paper/5638-faster-r-cnn-towards-real-time-object-detection-with-region-proposal-networks
Deep Visual-Semantic Alignments for Generating Image Descriptions
https://cs.stanford.edu/people/karpathy/deepimagesent/

3.模型

3.0總覽

目標(biāo):設(shè)計一個可以標(biāo)定出感興趣區(qū)域并且用自然語言描述其中內(nèi)容的網(wǎng)絡(luò)框架模型
挑戰(zhàn)與難點:在兼顧高效性和有效性的前提下,開發(fā)出一個可以支持端到端訓(xùn)練并且只需一次優(yōu)化的模型

3.1模型框架

<div align=center>
[圖片上傳失敗...(image-417379-1540209330519)]

3.1.1卷積網(wǎng)絡(luò)(Convalutional Network)

??作者采用了基于VGG-16的網(wǎng)絡(luò)結(jié)構(gòu),包含13層卷積核為3×3的卷積層和4層池化核為2×2的最大池化層(原本的VGG是5層池化層,這里作者做了一些小改動,改為4層),因此,對于大小為3×W×H的圖片,經(jīng)過卷積網(wǎng)絡(luò)后,輸出結(jié)果是C×W'×H'的特征圖譜,這里C=512,W’=\lfloor\frac{W}{16}\rfloor,H’=\lfloor\frac{H}{16}\rfloor,該特征圖譜就是下一層Fully Convolutional Localization Layer的輸入。

3.1.2全卷積定位層(Fully Convolutional Localization Layer)

輸入和輸出

輸入
: 來自卷積網(wǎng)絡(luò)的特征圖譜C×W'×H'(size任意)

輸出
: 輸出B個候選區(qū)域的表征向量(定長),每個特征向量都包含下面三個關(guān)鍵信息:

  • 候選區(qū)域的坐標(biāo):輸出形式是一個B×4的矩陣,每行代表一個候選區(qū)域的坐標(biāo)
  • 候選區(qū)域的置信分數(shù):一個長度為B的一維列向量,向量內(nèi)每個元素都給出了候選區(qū)域的得分。得分越高說明越可能是真實區(qū)域
  • 候選區(qū)域的特征:輸出形式為B×C×X×Y的特征集合,這里B代表區(qū)域個數(shù),X×Y表示特征圖譜的大小(注意,這里的size已經(jīng)是固定的),C代表特征的維度

??這里額外說明一下,在CNN階段我們不需要指定輸入圖片的大?。▊鹘y(tǒng)CNN分類任務(wù)由于FC全連接層的限制,使得輸入圖片的大小是固定的),因為這里我們關(guān)心的是圖片的特征,而卷積層和池化層根本不care輸出尺寸的多少,它們只負責(zé)拿到前一層的特征圖譜(feature map)。
??但是為什么這里的輸出必須是定長的向量呢?主要是因為后面RNN模型的制約,由于RNN模型接受的數(shù)據(jù)必須的定長的,所以在全卷積定位層(FCL)階段的最后一步,我們需要使用雙線性插值的方法來使輸出成為定長的特征向量。

卷積錨點(Convolutional Anchors)
??這里的工作主要參考自Faster R-CNN。主要思想是借助一系列具有平移不變性的錨點(anchors)來預(yù)測候選區(qū)域的位置和大小,具體做法如下:
??對于大小為W'×H'的特征圖譜來說,將圖譜中的每一個像素點都做為一個錨點(anchor)(錨點數(shù)量為W'×H'個),將該點反向映射會原始圖像W*H中,然后基于該錨點,畫出不同寬高比和大小的若干個“錨箱”(anchor box)。下圖所示是3個具有相同大小但是不同寬高比的錨箱示例(分別為1:1,1:2,2:1)。

<div align=center>
[圖片上傳失敗...(image-491a01-1540209330519)]
??如果采用Faster R-CNN的設(shè)置,即每個錨點對應(yīng)3個不同的size取值(128^2,256^2,512^2)和3個不同的寬高比取值(1:1,1:2,2:1),因此,每個錨點對應(yīng)的錨箱數(shù)量為k=9,在本文中采用的是k=12,具體對應(yīng)多少個size和寬高比文中并沒有給出。對于這k個錨箱,定位層(localization layer)會通過回歸模型來預(yù)測相應(yīng)的置信分數(shù)(score)和位置信息(scalars)。具體的計算過程是將特征圖片作為輸入,經(jīng)過一個卷積核為3×3的卷積層(filter個數(shù)為256),然后再經(jīng)過一個卷積核為1×1卷積層(filter個數(shù)為5k,這里k代表anchor box的數(shù)量),所以這一層的最終輸出是5k×W'×H'的張量,包含了所有錨點對應(yīng)的置信分數(shù)和位置信息。

邊界回歸(Box Regression)
??邊界回歸主要是對剛剛預(yù)測的候選區(qū)域的一次精修,進行邊界回歸的原因主要是當(dāng)前的候選區(qū)域可能與真實區(qū)域并不是特別匹配,如下圖所示:

<div align=center>
[圖片上傳失敗...(image-151951-1540209330519)]

??圖中,綠色框代表真實區(qū)域,紅色框代表目前的候選區(qū)域,我們可以看到,候選區(qū)域雖然可以判斷出區(qū)域內(nèi)存在物體(飛機),但是它的定位并不是很準(zhǔn)取,這時候就可以利用box regression來對邊框進行微調(diào)。核心思想是利用線性回歸得到關(guān)于邊框的四個位移參數(shù)(t_x,t_y,t_w,t_h),然后通過下面的式子對候選區(qū)域的中點(x,y)和size(w,h)進行更新
x=x_a+t_xw_a$$$$ y=y_a+t_yh_a$$$$ w=w_aexp(t_w) $$$$h=h_aexp(h_w)
有關(guān)box regression的詳細講解可以參考這篇論文:
https://blog.csdn.net/zijin0802034/article/details/77685438
(PS:這篇論文的講解是基于R-CNN的,其中的符號表示與本文有些出入,如t_x,t_y在R-CNN中代表的是真實區(qū)域的中心坐標(biāo),看的時候注意一下各個符號都表達了什么,不要搞混了)

區(qū)域采樣
??以圖像大小為W=720,H=540,錨箱(anchor box)數(shù)量為k=12的情況為例,得到的候選區(qū)域的個數(shù)應(yīng)該為\lfloor\frac{720}{16}\rfloor×\lfloor\frac{540}{16}\rfloor×12=17820(文章中寫的是17280,我感覺應(yīng)該是寫錯了)。
為了降低成本,我們只取這些候選區(qū)域的子集來參與訓(xùn)練過程和測試過程,具體選取原則如下:

在訓(xùn)練階段
: 采用Faster R-CNN的方法,采集一個大小為B=256的minibatch來進行訓(xùn)練,在這B個候選區(qū)域中,有至多B/2個正樣本,其余均為負樣本。采集時,如果所有的候選區(qū)域中(這里為17280個)正樣本的數(shù)量不足B/2個,那么就由負樣本補充,所以,最終的minibatch中正樣本的數(shù)量B_P\le B/2,而負樣本的數(shù)量B_N=B-B_P。正樣本和負樣本的定義如下:

  • 正樣本:候選區(qū)域與一個或多個真實區(qū)域的面積相交部分大于70%
  • 負樣本: 候選區(qū)域與所有真實區(qū)域的面積相交部分小于30%

在測試階段
: 基于每個候選區(qū)域的置信分數(shù),采用非極大抑制選取B=300個置信分數(shù)最高的候選區(qū)域

??非極大抑制:這里的抑制就是忽略的意思,非極大抑制的意思就是忽略那些與具有最高score值的候選區(qū)域的相交面積大于設(shè)定閾值的其他候選區(qū)域。這樣做的目的主要是為了減少重疊區(qū)域的輸出,從而更精細化的定位目標(biāo)位置。

??經(jīng)過以上操作,最終我們可以得到關(guān)于這B個候選區(qū)域的位置坐標(biāo)和置信分數(shù),表示為B×4和B×1的張量,這就是定位層(localization layer)的輸出

雙線性插值(Bilinear Interpolaion)

??在經(jīng)過采樣后,我們得到的各個候選區(qū)域是具有不同大小和寬高比的矩形框。為了與全連接層(主要進行識別分類)和RNN語言模型的進行建立連接,我們必須將候選區(qū)域提取成固定大小的特征表示向量。對于這一問題,F(xiàn)aster R-CNN提出了感興趣區(qū)域池化層(RoI pooling layer),具體方法是大小為W'×H'的卷積特征圖譜進行劃分,得到具有X×Y個小網(wǎng)格的網(wǎng)格圖,然后根據(jù)最大池化的原理,將小網(wǎng)格內(nèi)的像素最大值作為代表該網(wǎng)格的特征像素,最終可以得到定長為X×Y的特征向量。劃分示意圖如下所示。

<div align=center>
[圖片上傳失敗...(image-b55193-1540209330519)]

??RoI pooling layer需要兩個輸入:卷積特征圖譜和候選區(qū)域坐標(biāo)。但是在應(yīng)用梯度下降時,該方法只能對特征圖譜采用反向傳播(BP)算法,而不能對候選區(qū)域坐標(biāo)使用BP算法,為了克服這個缺點,在本文中,作者采用了雙線性插值。
??具體來說,就是對于任意的特征圖譜U(C×W'×H')和候選區(qū)域,我們要將其放縮成大小為(C×X×Y)的特征圖譜V,放縮過程按照如下步驟進行:

  1. 計算VU的反向投影坐標(biāo)值,例如對于特征圖譜V中的任意一點坐標(biāo)(x_{i,j}^V,y_{i,j}^V),投影到U中的坐標(biāo)值為x_{i,j}=x_{i,j}^V*\frac{W'}{X},y_{i,j}=y_{i,j}^V*\frac{H'}{Y}很容易看出,這里x_{i,j}和y_{i,j}的值均為浮點數(shù),然而圖像的像素坐標(biāo)在計算機中必須為整數(shù),所以這里坐標(biāo)(x_{i,j},y_{i,j})對應(yīng)的像素點是虛擬像素點,并不是U中實際存在的點。
  2. 按照雙線性插值法,得到U(x_{i,j}^U,y_{i,j}^U)坐標(biāo)點的像素值,該像素值就是V中對應(yīng)點的像素值V_{c,i,j},計算公式如下V_{c,i,j}=\sum_{i'=1}^{W’}\sum_{j'=1}^{H'}U_{c,j',j'}k(i'-x_{i,j})k(j'-y_{i,j}),其中 ,k(d)=max(0,1-|d|)
  3. 利用上面的方法,計算V中所有像素點的坐標(biāo)值,得到C×X×Y的特征圖譜

??對于上面的步驟可能理解起來不太直觀,下面我們利用一個例子來幫助理解,我們假定源圖譜U的大小為4×4,目的圖譜V的大小為3×3,如下圖所示
<div align=center>
[圖片上傳失敗...(image-fb0cea-1540209330519)]

如果我們想要知道V中某點的坐標(biāo)值,以V的中心點為例,我們先計算出V反向投影到U的坐標(biāo)值(x_{i,j},y_{i,j})
<div align=center>
[圖片上傳失敗...(image-764299-1540209330519)]
x_{i,j}=1*\frac{4}{3}=1.333,y_{i,j}=1*\frac{4}{3}=1.333

然后,利用上面的公式計算V_{c,i,j}的值
V_{c,i,j}=95*0.667*0.667+32*0.667*0.333+156*0.333*0.667+84*0.333*0.333=93.336\approx 93

<div align=center>
[圖片上傳失敗...(image-f21ef2-1540209330519)]

最終,對于B個候選區(qū)域,我們會得到形式為B×C×X×Y的一個張量,這就是localization layer的最終輸出。

3.1.3識別網(wǎng)絡(luò)(Recognition Network)

??識別網(wǎng)絡(luò)以一個全連接的神經(jīng)網(wǎng)絡(luò),它接受的是來自定位層的候選區(qū)域的特征矩陣(定長)。將每個候選區(qū)域的特征拉伸成一個一維列向量,令其經(jīng)過兩層全連接層,每次都使用ReLU激活函數(shù)和Dropout優(yōu)化原則。最終,對于每一個候選區(qū)域,都會生成一個長度為D=4096的一維向量。
??將所有的正樣本的存儲起來,形成一個B×D形狀的矩陣,將該矩陣傳送到RNN語言模型中。
另外,我們允許識別網(wǎng)絡(luò)對候選區(qū)域的置信分數(shù)和位置信息進行二次精修,從而生成每個候選區(qū)域最終的置信分數(shù)和位置信息,這一次的精修與之前的box regression基本是一樣的,只不過是針對這個長度D的向量又進行了一次box regression而已(在R-CNN論文中已經(jīng)指出,理論上是可以通過迭代使用box regression來不斷讓候選區(qū)域無限逼近真實區(qū)域的,不過實現(xiàn)表明,對最終的結(jié)果提升并不大)。

3.1.4 RNN語言模型(RNN Language Model)

??將圖片的特征圖譜輸入到RNN語言模型當(dāng)中,從而獲得基于圖片內(nèi)容的自然語言序列?;痉椒ㄊ菍⒆R別網(wǎng)絡(luò)的輸出結(jié)果進行編碼(每一個候選區(qū)域到對應(yīng)一個編碼),記為x_{-1}=CNN(I),然后將該區(qū)域?qū)?yīng)的真實描述s_1,...,s_T也進行編碼,記為x_1,...x_T,這里,x_i就是對應(yīng)的s_i的向量編碼。于是,我們就得到了長度為T+2的單詞向量序列x_{-1},x_0,x_1,...,x_T,其中x_{-1}代表這候選區(qū)域的圖像信息,x_0是特殊的開始標(biāo)志,x_1,...x_T代表每一個單詞的向量編碼,將這T+2長度的向量序列feed到RNN中,訓(xùn)練出一個預(yù)測模型。
接著,在預(yù)測階段,訓(xùn)練好的RNN語言模型的輸入是x_{-1}x_0(START token),然后根據(jù)公式h_t,y_t=f(h_{t-1},x_t)分別計算出隱藏狀態(tài)h_0和單詞向量y_0。這里,y_t是一個長度為|V|+1的向量,V代表詞庫的size,多出來的1是一個特殊的END標(biāo)志,根據(jù)y_0預(yù)測出第一個word,然后將該word再作為下一層LSTM網(wǎng)絡(luò)(RNN中的語言模型網(wǎng)絡(luò))的輸入,預(yù)測出第二個word,一直遞歸的重復(fù)這個過程,直到輸出的word是END標(biāo)志為止。該預(yù)測過程可以用下面的公式和兩張示意圖表示。
x_{-1}=CNN(I)$$$$x_t=W_eS_t,t\in \{ 0...N-1 \} $$$$p_{t+1}=LSTM(x_t),t\in \{ 0...N-1\}

??上式中,x_{-1}代表CNN生成的D維圖像特征向量,并且它將作為整個RNN語言模型的初始輸入,S_t代表RNN模型生成的一個個單詞(word),其中S_0是一個特殊的開始標(biāo)志,p_{t+1}代表第t+1個單詞在整個單詞表中的分布率,它是p(S_{t+1}|I,S_0,...,S_t)的簡寫形式,之后,選取p_t概率最大的元素作為句子中第t個單詞的輸出,如果概率最大的元素對應(yīng)的是END標(biāo)識符,則句子生成結(jié)束,迭代終止。

<div align=center>
[圖片上傳失敗...(image-a2b94f-1540209330519)]

<div align=center>
[圖片上傳失敗...(image-dbbb53-1540209330519)]

有關(guān)RNN模型生成圖片描述的詳細介紹可以參考下面兩篇論文:
Show and Tell: A Neural Image Caption Generator
https://arxiv.org/abs/1411.4555
Deep Visual-Semantic Alignments for Generating Image Descriptions
https://arxiv.org/abs/1412.2306

3.2損失函數(shù)(Loss function)

??這篇文章訓(xùn)練時的損失函數(shù)有五個,如下圖所示,首先是lacalization layer定位層的邊框位置回歸和置信分數(shù)兩處損失函數(shù),前者使用smooth L1 loss,后者使用binary logistic loss。損失函數(shù)的數(shù)學(xué)定義可以參考Fast R-CNN和Faster R-CNN里面的損失函數(shù)。
??接下來是Recognition Network的兩處損失函數(shù),該層和localization layer一樣,也是邊框位置和置信分數(shù)兩個損失函數(shù),最后是語言模型的損失函數(shù),采用的取交叉熵(cross-entropy)損失函數(shù)。
??作者利用bathch size和sequence length對所有的損失函數(shù)都進行了歸一化。經(jīng)過不斷測試,作者發(fā)現(xiàn)將后續(xù)區(qū)域邊框的初始權(quán)重設(shè)為0.1,將圖片描述的置信權(quán)重設(shè)為1.0,是比較高效率的初始化設(shè)置。
文中并沒有對損失函數(shù)給出詳細定義,通過查閱相關(guān)論文后,得到了各個損失函數(shù)的詳細定義如下:

置信度損失函數(shù)(binary logistic loss)
: l(w,b)=-\sum_{i=1}^{m}lnP(y_i|x_i;w,b)$$$$P(y=1|x)=\frac{e^{w^Tx+b}}{1+e^{w^Tx+b}}$$$$P(y=0|x)=\frac{1}{1+e^{w^Tx+b}}這里,w為矩陣,b為向量,x_i是輸入的圖像區(qū)域的特征圖譜,y_i為期望的真實輸出(is or not object)

邊框位置回歸損失函數(shù)(smooth L1 loss)
: L_{loc}(t^u,v)=\sum_{i\in \{x,y,w,h\}}smooth_{L_1}(t_i^u-v_i)
smooth_{L_1}(x)=\begin{cases} 0.5x^2& \text{if |x|<1} \\|x|-0.5& \text{otherwise} \end{cases}
公式中,t^u=(t_x^u,t_y^u,t_w^u,t_h^u)代表了預(yù)測邊框的位置信息,v=(v_x,v_y,v_w,v_h)代表了真實邊框的位置信息

交叉熵損失函數(shù)
: L(I,S)=-\frac {1}{T} \sum_{t=1}^{T}logp_t(x_t)這里,I代表image,S代表sentence,S_t代表sentence中的第t個word,p_t代表第t個word的預(yù)測分布,因為要使損失函數(shù)最小,所以每次我們都選擇概率最大的word。注意到這里的交叉熵損失函數(shù)比起完整的定義來說,缺少了真實分布P,這是因為在自然語言模型中,我們無法獲取語句的真實分布,因此,需要用交叉熵的估計值進行代替。

<div align=center>
[圖片上傳失敗...(image-3a025-1540209330519)]

3.2訓(xùn)練和優(yōu)化

??我們用預(yù)訓(xùn)練ImageNet的權(quán)重來初始化CNN,其他權(quán)重的取值來源于標(biāo)準(zhǔn)差為0.01的高斯分布。CNN中權(quán)重的訓(xùn)練使用了momentum為0.9的SGD,其他的權(quán)重使用了Adam算法。學(xué)習(xí)速率分別為\beta _1=0.9\beta _2=0.99。CNN的fune-tuning在迭代一輪后就開始了,但是不包含CNN中的前四個卷積層的微調(diào)。
??訓(xùn)練時的batches由一張長邊為720像素的圖片構(gòu)成(在該圖片中選取B個候選區(qū)域組成mini-batch)。源碼實現(xiàn)采用的是Torch7,在Titan X GPU上面一次mini batch的運行時間是300ms。訓(xùn)練模型直到收斂的運行時間總共花費了3天
源碼地址:https://github.com/jcjohnson/densecap
源碼實現(xiàn)教程(中文):https://github.com/jcjohnson/densecap

4.實驗

程序運行示例:

<div align=center>
[圖片上傳失敗...(image-4bbc49-1540209330519)]

圖片描述精確度以及程序運行時間

<div align=center>
[圖片上傳失敗...(image-8dbafc-1540209330519)]

bonus task:根據(jù)語言圖片檢索圖片
<div align=center>
[圖片上傳失敗...(image-36bc9d-1540209330519)]

5.總結(jié)

這篇論文的亮點在于提出了一個FCLN結(jié)構(gòu),并且利用雙線性插值使得localization layer可導(dǎo),從而可以支持從圖片區(qū)域到自然語言描述之間的端到端訓(xùn)練,并且實驗結(jié)果表現(xiàn),當(dāng)前的網(wǎng)絡(luò)結(jié)構(gòu)相較于以前的網(wǎng)絡(luò)結(jié)構(gòu),不論是在生成的圖片描述的質(zhì)量上,還是在生成速度上,都有一定的提升。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容