east文本檢測

一.簡介

 近年來,提取和理解在自然場景中的文本信息變得越來越重要和普遍,ICDAR系列競賽的參與者的數量以及NIST發起的TRAIT 2016評估都證明了這一點。文本檢測作爲文本識別、機器翻譯等後續過程的前提條件,其核心是區分文本和背景。傳統方法使用手動設計特徵以獲得文本屬性,而現在基於深度學習直接從訓練數據中學習有效特徵,可獲得更加魯棒的高級特徵。

        現有的無論是傳統的還是基於深度神經網絡的方法,大多由多個階段組成,在準確性和效率還遠遠不能令人滿意。因此,本文提出了一個快速而準確的輕量級場景文本檢測pipeline,它只有兩個階段。該pipeline第一個階段是基於全卷積網絡(FCN)模型,直接產生文本框預測;第二個階段是對生成的文本預測框(可以是旋轉矩形或矩形)經過非極大值抑制以產生最終結果。該模型放棄了不必要的中間步驟,進行端到端的訓練和優化。

 本文的貢獻有三個方面:

1.提出了一個由兩階段組成的場景文本檢測方法:全卷積網絡階段和NMS階段。

2.該pipeline可靈活生成word level或line level上文本框的預測,預測的幾何形狀可爲旋轉框或水平框。

3.算法在準確性和速度上優於最先進的方法。

算法被命名爲EAST(Efficient and Accuracy Scene Text),因爲它是一個高效和準確的場景文本檢測pipeline。

        首先,將圖像送到FCN網絡結構中並且生成單通道像素級的文本分數特徵圖和多通道幾何圖形特徵圖。文本區域採用了兩種幾何形狀:旋轉框(RBOX)和水平(QUAD),併爲每個幾何形狀設計了不同的損失函數;然後,將閾值應用於每個預測區域,其中評分超過預定閾值的幾何形狀被認爲是有效的,並且保存以用於隨後的非極大抑制。NMS之後的結果被認爲是pipeline的最終結果。

二.網絡結構

因爲文本區域的大小差別很大,所以定位大文本將需要更深層的特徵(大感受野),而定位小文本則需要淺層特徵(小感受野)。 因此,網絡必須使用不同級別的特徵來滿足這些要求,但是在大型特徵圖上合併大量通道會顯着增加後期計算開銷。爲了彌補這一點,本文采用U-shape的思想逐步合併特徵圖,同時保持上採樣分支較小。共同建立一個網絡,既可以利用不同級別的特徵,又可以節省很少的計算成本。

       該網絡結構可以分解爲三個部分:特徵提取,特徵合併和輸出層.

文中特徵提取使用了PVANet和VGG16,下圖是原文的網絡結構圖(PVANet)

 

                                 

論文的思想非常簡單,結合了DenseBox和Unet網絡中的特性,具體流程如下:

Pipeline:

  • 先用一個通用的網絡(論文中採用的是Pvanet,實際在使用的時候可以採用VGG16,Resnet等)作爲base net ,用於特徵提取
  • 基於上述主幹特徵提取網絡,抽取不同level的feature map(它們的尺寸分別是inuput-image的1/4,1/8,1/16,1/32),這樣可以得到不同尺度的特徵圖.目的是解決文本行尺度變換劇烈的問題,ealy stage可用於預測小的文本行,late-stage可用於預測大的文本行.
  • 特徵合併層,將抽取的特徵進行merge.這裏合併的規則採用了U-net的方法,合併規則:從特徵提取網絡的頂部特徵按照相應的規則向下進行合併,這裏描述可能不太好理解,具體參見下述的網絡結構圖
  • 網絡輸出層,包含文本得分和文本形狀.根據不同文本形狀(可分爲RBOX和QUAD),輸出也各不相同,具體參看網絡結構圖

1.特徵提取

首先,利用在ImageNet數據集上預訓練的卷積網絡參數初始化;然後,基於模型從特徵提取階段中提取四個級別的特徵圖(記爲fi),其大小分別爲輸入圖像的1/32 1/16 1/8和1/4。

2.特徵融合

進行特徵的逐層合併。

                                        

在每個合併階段,首先,將來自上一個階段的特徵圖首先被輸入到一個unpooling層來擴大其大小;然後,與當前層特徵圖進行合併(通道);最後,通過conv1×1 減少通道數量和計算量;conv3×3,將局部信息融合以最終產生該合併階段的輸出。在最後一個合併階段之後,conv3×3層會生成合並分支的最終特徵圖並將其送到輸出層。

最終特徵圖:M*N* 32

3.輸出層

在M*N*32的feature map上用1*1的卷積進行輸出操作。

包含若干個conv1×1操作,以將32個通道的特徵圖投影到1個通道的分數特徵圖Fs和一個多通道幾何圖形特徵圖Fg。

分數特徵圖score map:用1*1的1個卷積核,得到一個通道的score map,表示相應區域是文本區域的score

幾何圖形特徵圖geometry map:用1*1的卷積核得到RBOX和QUAD的

幾何形狀輸出可以是RBOX或QUAD中的任意一種,如表所示:

                          

 其中,RBOX的幾何形狀由4個通道的水平邊界框(AABB)R和1個通道的旋轉角度θ表示;AABB 4個通道分別表示從像素位置到矩形的頂部,右側,底部,左側邊界的4個距離;QUAD使用8個數字來表示從矩形的四個頂點到像素位置的座標偏移,由於每個距離偏移量都包含兩個數字(Δxi;Δyi),因此幾何形狀輸出包含8個通道。

文中對文本框的定義有兩種,一種是旋轉矩形(RBOX),另一種是四邊形(QUAD)。

對於RBOX的表示法,有如下解釋:

得到最終的feature map後,使用一個大小爲1×1通道數爲1的卷積核得到一張score map用F_s表示。在feature map上使用一個大小爲1×1通道數爲4的卷積核得到text boxes,使用一個大小1×1通道數爲1的卷積核得到text rotation angle,這裏text boxes和text rotation angle合起來稱爲geometry map用Fg示。

關於上述的F_s,F_g,要說明幾點(如下圖2所示):

  • F_s大小爲原圖的\frac{1}{4},通道數爲1,每個像素表示對應於原圖中像素爲文字的概率值,所以值在[0,1]範圍內。
  • F_g大小也爲原圖的\frac{1}{4},通道數爲5,即4+1(text boxes + text rotation angle)。
  • text boxes通道數爲4,其中text boxes每個像素如果對應原圖中該像素爲文字,四個通道分別表示該像素點到文本框的四條邊的距離,範圍定義爲輸入圖像大小,如果輸入圖像爲512,那範圍就是[0,512]。下圖d表示
  • text rotation angle通道數爲1,其中text rotation angle每個像素如果對應原圖中該像素爲文字,該像素所在框的傾斜角度,角度範圍定義爲[-45,45]度。下圖e表示

                                 

 (a) 中黃色的爲人工標註的框,綠色爲對黃色框進行0.3倍邊長的縮放後的框,這樣做可以進一步去除人工標註的誤差,拿到更準確的label信息。

(b) 爲根據(a)中綠色框生成的score map的label信息

(c) 中先生成一個(b)中白色區域的最小外接矩,然後算每一個(b)中白色的點到粉色最小外接矩的上下左右邊的距離,即生成(d),然後生成粉色的矩形和水平方向的夾角,即生成角度信息(e),e中所有灰色部分的角度信息一樣,都是同樣的角度。

訓練標籤的生成

訓練標籤由兩個部分組成,一個是score map的標籤,一個是geometry map標籤。
注意:程序要求輸入的四邊形標定點是以順時針方向標定的,這點很重要

1. score map標籤的生成方法

  • 首先生成一個與圖片大小一樣的矩陣,值都爲0
  • 根據標定好的四邊形框對該四邊形框進行縮小,縮小方法下面會詳細說明,得到最終結果如上圖a中的綠框
  • 將綠框中的像素賦值1表示正樣本的score,其他爲負樣本的score
  • 最後按照每隔4個像素採樣,得到圖片大小\frac{1}{4}的score map

上述縮小四邊形的方法:

  • 首先定義四個頂點Q=\left\{p_{i} | i \epsilon\{1,2,3,4\}\right\},這四個頂點按照順時針方向排列
  • 計算縮小的參考大小如下式所示,下式表示的是選取與頂點相連的兩條邊中最小的邊的大小記爲r_i                                                               其中D(p_i,p_j)表示點p_ip_j之間的L2距離
  • 對於邊p_{i}, p(i m o d 4)+1,縮小0.3r_i0.3r_{(i \,mod \, 4) +1}的和的像素大小

2. geometry map標籤的生成方法

  • 首先生成一個與圖片大小一樣的5通道矩陣用來製作text boxes 與 text rotation angle
  • 根據標定的四邊形生成一個面積最小 的平行四邊形(黃色框),進而得到平行四邊形的外接旋轉矩形(粉色框)
  • 根據旋轉矩形的四個點座標,可以選擇出y值最大的座標頂點和該頂點逆時針方向的頂點(也可以稱該頂點右邊的頂點),根據這兩個點的連線可以求出連線與x軸的夾角,這個夾角取值在(0,90)度之間,稱這個夾角爲angle
  • 當angle<45度時,定義y值最大的點爲p_3點,其它點按順時針方向依次類推。當angle>45度時,定義y值最大的點爲p_2點,此時angle角變換爲-(\pi / 2-\text {angle}),這樣就保證了angle角度[-45,45]度
  • 上述還有一種特殊情況要考慮,當y值最大的點有兩個時,說明矩形與x軸平行,angle定義爲0度,這時候將x與y座標相加最小的點定義爲p_0點,其它點依次類推
  • 根據得到的旋轉矩形和angle值將geometry map的五個通道賦值,賦值方法爲,對於text boxes的四個通道,每個通道表示圖像中的像素點座標到旋轉矩形的四個邊的距離順序爲,0通道表示點到p_0p_1邊的距離,1通道表示點到p_1p_2邊的距離,按照順時針依次賦值四個通道,也分別稱爲到top、right、bottom、left邊的距離,對於text rotation angle這一個通道,將旋轉矩形中所有像素都賦值上述計算出的angle大小
  • 最後得到的五個通道按照每隔4個像素採樣,這樣就可以得到圖片大小\frac{1}{4}的geometry map了

首先,生成一個旋轉矩形,以最小面積覆蓋該區域;然後,對於RBOX標註框,計算每個有正分數的像素與文本框4個邊界的距離;對於QUAD 標註框,計算每個有正分數的像素與文本框4個頂點的座標偏移。

三.損失函數

損失函數定義如下

                                                                             L=L_{s}+\lambda_{g} L_{g}

其中和分別表示score map和geometry map的損失, 表示兩個損失的權重,文章設爲1 

1. score map的損失計算

論文中採用的是類平衡交叉熵,用於解決類別不平衡訓練,避免通過 平衡採樣和硬負挖掘 解決目標物體的不不平衡分佈,簡化訓練過程,具體公式如下:

                                                      \begin{aligned} L_{\mathrm{s}} &=\text { balanced-xent }\left(\hat{\mathbf{Y}}, \mathbf{Y}^{*}\right) \\ &=-\beta \mathbf{Y}^{*} \log \hat{\mathbf{Y}}-(1-\beta)\left(1-\mathbf{Y}^{*}\right) \log (1-\hat{\mathbf{Y}}) \end{aligned}

提出類平衡係數\beta,其計算方法如下:

                                                                          \beta=1-\frac{\sum_{y^{*} \in \mathbf{Y} *} y^{*}}{\left|\mathbf{Y}^{*}\right|}

不過類平衡交叉熵收斂速度較慢,所以在實際使用中,往往使用dice loss。

                                                                              L_{s}=1-\frac{2 y_{s} p_{s}}{y_{s}+p_{s}} 

其中y_s代表位置敏感圖像分割(position-sensitive segmentation)的label,p_s代表預測的分割值 

def dice_coefficient(y_true_cls, y_pred_cls,training_mask):
    '''
    dice loss
    :param y_true_cls:
    :param y_pred_cls:
    :param training_mask:
    :return:
    '''
    eps = 1e-5
    intersection = tf.reduce_sum(y_true_cls * y_pred_cls * training_mask)
    union = tf.reduce_sum(y_true_cls * training_mask) + tf.reduce_sum(y_pred_cls * training_mask) + eps
    loss = 1. - (2 * intersection / union)
    tf.summary.scalar('classification_dice_loss', loss)
    return loss

首先需要說明一下training_mask,

if min(poly_h, poly_w) < FLAGS.min_text_size:
    cv2.fillPoly(training_mask,poly.astype(np.int32)[np.newaxis, :, :], 0)

 training_mask就是爲了將長或寬小於某個閾值的框當做hard-example,這些樣本太難訓練,所以需要將這些樣本去掉。所以,將包含這些樣本的框裏面置爲黑色。正好和score_map的取值相反,從而去掉。

dice_loss 實現的就是交併比,由於loss需要不斷減少,所以使用了1-操作。

2. geometry map的損失計算

文本檢測的一個挑戰是自然場景圖像中文本的大小差別很大,而直接使用L1或L2損失進行迴歸會導致損失偏向較大和較長的文本區域。所以這裏採用對scale不敏感的IOU loss。

因此,對於RBOX迴歸,採用AABB部分的IoU損失。對於QUAD迴歸,採用scale-normalized平滑L1損失。

RBOX:

1.AABB部分:

                                                           L_{\mathrm{AABB}}=-\log \operatorname{IoU}\left(\hat{\mathbf{R}}, \mathbf{R}^{*}\right)=-\log \frac{\left|\hat{\mathbf{R}} \cap \mathbf{R}^{*}\right|}{\left|\hat{\mathbf{R}} \cup \mathbf{R}^{*}\right|}

其中\left|\hat{\mathbf{R}} \cap \mathbf{R}^{*}\right| 部分的w和h的計算方法如下:

                                                                      \begin{array}{l}{w_{\mathbf{i}}=\min \left(\hat{d}_{2}, d_{2}^{*}\right)+\min \left(\hat{d}_{4}, d_{4}^{*}\right)} \\ {h_{\mathbf{i}}=\min \left(\hat{d}_{1}, d_{1}^{*}\right)+\min \left(\hat{d}_{3}, d_{3}^{*}\right)}\end{array} 

而並集部分的計算如下: 

                                                                    \left|\hat{\mathbf{R}} \cup \mathbf{R}^{*}\right|=|\hat{\mathbf{R}}|+\left|\mathbf{R}^{*}\right|-\left|\hat{\mathbf{R}} \cap \mathbf{R}^{*}\right|

2.Angle部分

                                                                         L_{\theta}\left(\hat{\theta}, \theta^{*}\right)=1-\cos \left(\hat{\theta}-\theta^{*}\right)

AABB的總的loss如下:

                                                                                   L_{\mathrm{g}}=L_{\mathrm{AABB}}+\lambda_{\theta} L_{\theta}

這裏的\lambda _\theta=10

 

QUAD: 

 文本矩形框的預測偏移量:

                                                                           \mathrm{C}_{\mathrm{Q}}=\left\{x_{1}, y_{1}, x_{2}, y_{2}, \ldots, x_{4}, y_{4}\right\}

  損失可以被寫爲:

                                                                        \begin{aligned} L_{\mathrm{g}} &=L_{\mathrm{QUAD}}\left(\hat{\mathbf{Q}}, \mathbf{Q}^{*}\right) \\ &=\min _{\mathbb{Q} \in P_{\mathbf{Q}^{*}}} \sum_{c_{i} \in \mathrm{C}_{\mathrm{Q}}} \frac{\mathrm{smoothed}_{L 1}\left(c_{i}-\tilde{c}_{i}\right)}{8 \times N_{\mathrm{Q}^{*}}} \\ & \tilde{c}_{i} \in \mathrm{C}_{\tilde{\mathbf{Q}}} \end{aligned}

其中,歸一化項NQ*是四邊形的短邊長度,由下式給出:

                                                                           N_{\mathrm{Q}^{*}}=\min _{i=1}^{4} D\left(p_{i}, p_{(i \bmod 4)+1}\right)

四.局部感知NMS

1.先對所有的output box集合結合相應的閾值(大於閾值則進行合併,小於閾值則不合並),將置信度得分作爲權重加權合併,得到合併後的bbox集合;

2.對合並後的bbox集合進行標準的NMS操作。

 因爲本文會預測成千上萬個幾何框,一個簡單的NMS算法的時間複雜度是O(n^2),其中n是候選框的數量,這個時間複雜度太高。所以本文提出逐行合併幾何圖形,假設來自附近像素的幾何圖形傾向於高度相關,在合併同一行中的幾何圖形時,將迭代合併當前遇到的幾何圖形與最後一個合併圖形,改進後的時間複雜度爲O(n)。

                                  

locality_aware_nms在標準nms的基礎上加了weighted_merge,所謂weighted_merge就是將2個IOU高於某個threshold的輸出框,進行基於得分的合併。合併後的輸出框的座標數值介於2個合併的輸入框之間,感覺這樣操作可以將所有迴歸出的框的座標信息都利用起來,有助於減少位置誤差,而不是像傳統的nms一樣,直接取分數最高的那個。

def weighted_merge(g, p):
    g[:8] = (g[8] * g[:8] + p[8] * p[:8])/(g[8] + p[8])
    g[8] = (g[8] + p[8])
    return g

假設,2個點g和p,假設其分數分別爲k1,k2,

上面程序表達是公式就是:

weighted_merge(g, p)=(k1*g+k2*p)/(k1+k2)

 

舉例如下:

其中g和p分別爲2個輸出框,假設都爲1*9的大小,前8個爲4個座標的(x,y),最後一個爲框的置信度分數。

g=[ 114.08222961 , 29.94154549 , 270.02160645 , 28.1983242 , 

270.58172607, 78.30197144 , 114.64233398 , 80.04519653 ,  0.87047273]

P=[ 110.07213085 , 29.98007349 , 267.0800416 , 27.57254931 , 

267.85499947 , 78.08751085 , 110.84708252 , 80.49503197 , 7.11734003]

weighted_merge(g,p)=[110.50913178 , 29.9758749 , 267.40059893 , 27.64074319 ,    268.15214478 , 78.11088172 , 111.26067044 , 80.4460111 , 7.98781276]

訓練參數設置

        基於Adam優化算法進行端對端訓練;統一輸入圖像爲512x512;mini-batch爲24;Adam的學習速率從1e-3開始;每27300 mini-batch衰減十分之一,並停在1e-5。

五.侷限性

1. 檢測器可以處理的文本實例的最大大小與網絡的感受野成正比。這限制了網絡預測長文本區域的能力,例如跨越圖像的文本行。

2. 該算法可能會遺漏或給出不精確的垂直文本實例預測,因爲它們ICDAR 2015訓練集中僅有一小部分此種類型的圖片。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章