EAST文本檢測與Keras實現

1. 引言
    之前介紹了文本檢測中的CTPN方法,詳情可參見《CTPN文本檢測與tensorflow實現》,雖然該方法在水平文本的檢測方面效果比較好,但是對於豎直文本或者傾斜的文本,該方法的檢測就很差,因此,在該方法之後,很多學者也提出了各種改進方法,其中,有一篇比較經典的就是曠世科技在2017年提出來的EAST模型,論文的全稱爲《EAST: An Efficient and Accurate Scene Text Detector》,論文的下載地址如下: 

論文地址:https://arxiv.org/pdf/1704.03155.pdf 
    本文將對該方法進行具體介紹,並利用Keras對其進行復現。 

2.EAST模型介紹
2.1 EAST模型結構

    EAST的網絡結構總共包含三個部分:feature extractor stem(特徵提取分支), feature-merging branch(特徵合併分支) 以及 output layer(輸出層)。


圖1 EAST模型結構
    在特徵提取分支部分,主要由四層卷積層組成,可以是一些預訓練好的卷積層,作者採用的是VGG16中pooling-2到pooling-5每一層得到的feature map。記每一層卷積層卷積後得到feature map爲,如圖1所示,從上到下唉,每一層feature map對應的尺度剛好爲輸入圖像的。

    在特徵合併分支部分,其實作者借鑑了U-net的思想,只是U-net採用的是反捲積的操作,而這裏採用的是反池化的操作,具體的計算大致如下,對於一個,首先經過一層反池化操作,得到與上一層卷積feature map同樣大小的特徵,然後將其與進行拼接,拼接後再依次進入一層和的卷積層,以減少拼接後通道數的增加,得到對應的,在特徵合併分支的最後一層,是一層的卷積層,卷積後得到的feature map最終直接進入輸出層。具體的計算公式如下:

                                                             

                                                    

其中,被稱爲合併基,是合併後得到feature map,表示連接操作。之所以要引入特徵合併分支,是因爲在場景文字識別中,文字的大小非常極端,較大的文字需要神經網絡高層的特徵信息,而比較小的文字則需要神經網絡淺層的特徵信息,因此,只有將網絡不同層次的特徵進行融合才能滿足這樣的需求。

    在輸出層部分,主要有兩部分,一部分是用單個通道的卷積得到score map(分數圖),記爲,另一部分是多個通道的卷積得到geometry map(幾何形狀圖),記爲,在這一部分,幾何形狀可以是RBOX(旋轉盒子)或者QUAD(四邊形)。對於RBOX,主要有5個通道,其中四個通道表示每一個像素點與文本線上、右、下、左邊界距離(axis-aligned bounding box,AABB),記爲,另一個通道表示該四邊形的旋轉角度。對於QUAD,則採用四邊形四個頂點的座標表示,每個點的座標爲,因此,總共有8個通道。關於RBOX和QUAD的表示可以見表1:


表1 RBOX、QUAD通道數和數學表示
2.2 真實標籤生成

    對於score map,不失一般性的,這裏考慮QUAD的情況,在RBOX也似類似的標籤生成方式。EAST對真實標籤的四邊形區域會進行放縮,放縮的方式如下:

    首先,記四邊形,其中,表示四邊形順時針方向的四個頂點,然後計算每個頂點的參考長度,說簡單一點,其實就是計算每個頂點相鄰兩條邊的最短邊的長度,其計算公式如下:

                                            

其中,表示和的歐式距離。

    接着,對於四邊形每一對對邊,將兩條邊的長度與他們的均值進行對比,以確定出哪對對邊是長邊,然後對兩條長邊優先進行放縮,放縮的方式是對每個頂點沿着邊向內部分別移動0.3,如圖2(a)所示。

    對於geometry map,由前面我們知道有兩種類型,分別是QUAD和RBOX,對於score map爲正例的像素點,其QUAD對應的標籤直接是他們與四個頂點的偏移座標,即頂點的差值,而對於RBOX,則首先會選擇一個最小的矩形框住真實的四邊形,然後計算每個正例像素點與該矩形四條邊界的距離。具體的如圖2(c)-(e)所示。


圖2 真實標籤生成
 

2.3 損失函數

    由於輸出層有兩個分支,因此對應着兩個損失函數,可以表達如下: 

                                                                         

其中,和分別表示score map和geometry map的損失函數,表示權重,在論文中作者設置爲1。

    對於,爲了解決類別不平衡的問題,作者引入了平衡交叉熵損失函數,其表達形式如下:

                                                  

其中,是預測出來的分數,是真實的標籤,是每一張圖像中負例的佔比,其計算公式如下:

                                                                      

    對於,當geometry map採用的是RBOX時,對於RBOX中的AABB,作者採用的是損失函數,其表達形式如下:

                                                

其中,表示預測到的矩形,表示真實的矩形,表示兩個矩形的重疊面積,其對應的寬和高計算方式如下:

                                                            

其中,分別代表一個像素點到矩形上、右、下、左邊界的距離,表示兩個矩形的總區域,其計算公式如下:

                                                            

    由於RBOX還有一個通道是表示旋轉角度,因此,對於角度的損失函數計算如下:

                                                              

其中,表示預測到的角度,是真實的角度,最後,RBOX的損失函數如下:

                                                              

其中,表示權重,作者在實驗時取的是10。

    對於,當geometry map採用的是QUAD時,此時損失函數的計算方式與RBOX不一樣,作者採用的是smoothed-L1損失函數。記一個四邊形Q對應的座標集合爲,則QUAD對應的損失函數如下:

                                  

其中,,表示每個四邊形的最小邊長,而是與等價的四邊形集合,唯一的不同就是是經過排序,因爲原始數據中,的標註是無序的。

2.4 局部感知NMS

   當預測結束後,需要對文本線進行構造,爲了提高構造的速度,作者提出了一種局部感知NMS算法,其基本思想是假設相鄰的像素點之間是高度相關的,然後按行逐漸合併幾何形狀,當相鄰兩個幾何形狀滿足合併條件(這裏的合併條件作者沒有具體講清楚)時,對他們的座標按照分數進行加權,其計算公式如下:

                                                                  

                                                                  

                                                                  

其中,分別表示兩個滿足合併的幾何形狀,分別表示他們的分數,分別對應第i個座標,分別對應合併後的座標和分數,當合並完成後,會將合併後的幾何形狀作爲一個整體繼續合併下去,直到不滿足合併條件,將此時合併後的幾何形狀作爲一個文本線保存到當中,重複該過程,直到所有的幾何形狀都遍歷一遍爲止。具體的算法過程如下圖:


圖3 局部感知NMS算法
3.Keras實現
    本文利用Keras框架進行復現,主要參考的是huoyijie的代碼,原始代碼鏈接如下:

參考代碼鏈接:https://github.com/huoyijie/AdvancedEAST 
    由於原始的EAST模型是對文本線內的每一個像素點的座標進行預測,然後對其按照score進行加權平均,作爲最終文本線的預測座標,但是這種方法會有一個缺點,也就是容易導致文本線的座標容易受到內部像素點的影響,導致預測的文本線偏小,沒法準確地框住完整的文本,如下圖所示:


圖4 EAST效果圖
     因此,huoyijie對其進行了改進,他的改進思想是既然對文本線內的所有像素點的座標進行預測比較難,那就只對文本線的邊界點進行預測,然後只對邊界點的座標進行加權平均,這樣就可以加快模型的收斂速度和精度,如下圖所示,是他改進方法之後的效果,其中黃色和綠色點就是邊界點。


圖5 採用邊界點對EAST進行改進後的效果
    這種想法確實是挺妙的,不得不佩服大佬,不過這種方法雖然提高了對文本檢測的精度,但是在構建文本線時確有問題,當對邊界點的預測不準確時,比如漏了左側邊界或者右側邊界時,就會導致整個文本線都構造失敗,因此,反而使得模型的預測效果更差。

    因此,筆者對代碼中的文本線構造方法進行修改,筆者的思想是既然採用邊界預測可以使得對文本的打點更加準確,那可以直接根據這些像素點的分佈,用一個矩形框把它們直接框起來,那這樣計算漏掉了某一測或全部的邊界點,文本線也可以構建成功,但是這種方法也有一個不好的地方就是對於傾斜的文本,只能用矩形框住,而沒法用隨意的四邊形框住。筆者在作者原來代碼的基礎上進行小部分修改後,主要修改的代碼如下:

def nms(predict, activation_pixels, threshold=cfg.side_vertex_pixel_threshold):
    region_list = []
    for i, j in zip(activation_pixels[0], activation_pixels[1]):
        merge = False
        for k in range(len(region_list)):
            if should_merge(region_list[k], i, j):
                region_list[k].add((i, j))
                merge = True
                # Fixme 重疊文本區域處理,存在和多個區域鄰接的pixels,先都merge試試
                # break
        if not merge:
            region_list.append({(i, j)})
    D = region_group(region_list)
    quad_list = np.zeros((len(D), 4, 2))
    score_list = np.zeros((len(D), 4))
    # TODO(linchuhai):這裏確定每個文本框的座標還需要進一步修改
    for group, g_th in zip(D, range(len(D))):
        cord_list = []
        for row in group:
            for ij in region_list[row]:
                cord_list.append((ij[0], ij[1]))
        cord_list = np.array(cord_list)
        min_i, min_j = np.amin(cord_list, axis=0)
        max_i, max_j = np.amax(cord_list, axis=0)
        quad_list[g_th, 0] = np.array([(min_j - 1) * cfg.pixel_size, (min_i - 1) * cfg.pixel_size])
        quad_list[g_th, 1] = np.array([(min_j - 1) * cfg.pixel_size, (max_i + 1) * cfg.pixel_size])
        quad_list[g_th, 2] = np.array([(max_j + 1) * cfg.pixel_size, (max_i + 1) * cfg.pixel_size])
        quad_list[g_th, 3] = np.array([(max_j + 1) * cfg.pixel_size, (min_i - 1) * cfg.pixel_size])
 
    return score_list, quad_list
    另外,huoyijie的代碼裏面還有一個小錯誤,就是對文本線進行放縮時,放縮的順序弄錯了,修改的地方如下:

# cal r length array
# r = [np.minimum(dis[i], dis[(i + 1) % 4]) for i in range(4)]
r = [np.minimum(dis[3], dis[(3 + 1) % 4])]
for i in range(3):
    r.append(np.minimum(dis[i], dis[(i + 1) % 4]))
     因爲參考代碼已經寫的比較完善,所以這次沒有對代碼進行大幅度修改,就不貼出模型其他部分的代碼了。最後,模型的效果如下:

4.優缺點總結
    最後,還是談一下對EAST模型的一些看法吧,首先是優點:

結構簡單,pipeline短,模型訓練和預測的速度快
可以適用於單詞或文本行級別的文本檢測,並且文本框的形狀可以是任意四邊形,對豎直、傾斜文本的檢測效果要比CTPN好
模型採用全卷積神經網絡,參數量更加輕量級,並且速度也更快  
    接着是缺點部分,EAST模型的缺點主要有:

對長文本的檢測不夠準確
模型的感受野有限,當遇到一些比較大的文字時,可能就沒法識別出來 
    不過總而言之,還是很欽佩曠世科技,最近曠世科技又提出了一個新模型,叫SPCnet,可以支持對彎曲文字的檢測, 後面有時間再好好拜讀一下。
 

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