天天看點

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(輸出層)。

EAST文本檢測與Keras實作

圖1 EAST模型結構

    在特征提取分支部分,主要由四層卷積層組成,可以是一些預訓練好的卷積層,作者采用的是VGG16中pooling-2到pooling-5每一層得到的feature map。記每一層卷積層卷積後得到feature map為

EAST文本檢測與Keras實作

,如圖1所示,從上到下唉,每一層feature map對應的尺度剛好為輸入圖像的

EAST文本檢測與Keras實作

    在特征合并分支部分,其實作者借鑒了U-net的思想,隻是U-net采用的是反卷積的操作,而這裡采用的是反池化的操作,具體的計算大緻如下,對于一個

EAST文本檢測與Keras實作

,首先經過一層反池化操作,得到與上一層卷積feature map同樣大小的特征,然後将其與

EAST文本檢測與Keras實作

進行拼接,拼接後再依次進入一層

EAST文本檢測與Keras實作

EAST文本檢測與Keras實作

的卷積層,以減少拼接後通道數的增加,得到對應的

EAST文本檢測與Keras實作

,在特征合并分支的最後一層,是一層

EAST文本檢測與Keras實作

的卷積層,卷積後得到的feature map最終直接進入輸出層。具體的計算公式如下:

EAST文本檢測與Keras實作
EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

被稱為合并基,

EAST文本檢測與Keras實作

是合并後得到feature map,

EAST文本檢測與Keras實作

表示連接配接操作。之是以要引入特征合并分支,是因為在場景文字識别中,文字的大小非常極端,較大的文字需要神經網絡高層的特征資訊,而比較小的文字則需要神經網絡淺層的特征資訊,是以,隻有将網絡不同層次的特征進行融合才能滿足這樣的需求。

    在輸出層部分,主要有兩部分,一部分是用單個通道的

EAST文本檢測與Keras實作

卷積得到score map(分數圖),記為

EAST文本檢測與Keras實作

,另一部分是多個通道的

EAST文本檢測與Keras實作

卷積得到geometry map(幾何形狀圖),記為

EAST文本檢測與Keras實作

,在這一部分,幾何形狀可以是RBOX(旋轉盒子)或者QUAD(四邊形)。對于RBOX,主要有5個通道,其中四個通道表示每一個像素點與文本線上、右、下、左邊界距離(axis-aligned bounding box,AABB),記為

EAST文本檢測與Keras實作

,另一個通道表示該四邊形的旋轉角度

EAST文本檢測與Keras實作

。對于QUAD,則采用四邊形四個頂點的坐标表示,每個點的坐标為

EAST文本檢測與Keras實作

,是以,總共有8個通道。關于RBOX和QUAD的表示可以見表1:

EAST文本檢測與Keras實作

表1 RBOX、QUAD通道數和數學表示

2.2 真實标簽生成

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

    首先,記四邊形

EAST文本檢測與Keras實作

,其中,

EAST文本檢測與Keras實作

表示四邊形順時針方向的四個頂點,然後計算每個頂點

EAST文本檢測與Keras實作

的參考長度

EAST文本檢測與Keras實作

,說簡單一點,其實就是計算每個頂點相鄰兩條邊的最短邊的長度,其計算公式如下:

EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

表示

EAST文本檢測與Keras實作

EAST文本檢測與Keras實作

的歐式距離。

    接着,對于四邊形每一對對邊,将兩條邊的長度與他們的均值進行對比,以确定出哪對對邊是長邊,然後對兩條長邊優先進行放縮,放縮的方式是對每個頂點沿着邊向内部分别移動0.3

EAST文本檢測與Keras實作

,如圖2(a)所示。

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

EAST文本檢測與Keras實作

圖2 真實标簽生成

2.3 損失函數

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

EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

EAST文本檢測與Keras實作

分别表示score map和geometry map的損失函數,

EAST文本檢測與Keras實作

表示權重,在論文中作者設定為1。

    對于

EAST文本檢測與Keras實作

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

EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

是預測出來的分數,

EAST文本檢測與Keras實作

是真實的标簽,

EAST文本檢測與Keras實作

是每一張圖像中負例的占比,其計算公式如下:

EAST文本檢測與Keras實作

    對于

EAST文本檢測與Keras實作

,當geometry map采用的是RBOX時,對于RBOX中的AABB,作者采用的是

EAST文本檢測與Keras實作

損失函數,其表達形式如下:

EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

表示預測到的矩形,

EAST文本檢測與Keras實作

表示真實的矩形,

EAST文本檢測與Keras實作

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

EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

分别代表一個像素點到矩形上、右、下、左邊界的距離,

EAST文本檢測與Keras實作

表示兩個矩形的總區域,其計算公式如下:

EAST文本檢測與Keras實作

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

EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

表示預測到的角度,

EAST文本檢測與Keras實作

是真實的角度,最後,RBOX的損失函數如下:

EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

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

    對于

EAST文本檢測與Keras實作

,當geometry map采用的是QUAD時,此時損失函數的計算方式與RBOX不一樣,作者采用的是smoothed-L1損失函數。記一個四邊形Q對應的坐标集合為

EAST文本檢測與Keras實作

,則QUAD對應的損失函數如下:

EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

,表示每個四邊形的最小邊長,而

EAST文本檢測與Keras實作

是與

EAST文本檢測與Keras實作

等價的四邊形集合,唯一的不同就是

EAST文本檢測與Keras實作

是經過排序,因為原始資料中,

EAST文本檢測與Keras實作

的标注是無序的。

2.4 局部感覺NMS

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

EAST文本檢測與Keras實作
EAST文本檢測與Keras實作
EAST文本檢測與Keras實作

其中,

EAST文本檢測與Keras實作

分别表示兩個滿足合并的幾何形狀,

EAST文本檢測與Keras實作

分别表示他們的分數,

EAST文本檢測與Keras實作

分别對應第i個坐标,

EAST文本檢測與Keras實作

分别對應合并後的坐标和分數,當合并完成後,會将合并後的幾何形狀作為一個整體繼續合并下去,直到不滿足合并條件,将此時合并後的幾何形狀作為一個文本線儲存到

EAST文本檢測與Keras實作

當中,重複該過程,直到所有的幾何形狀都周遊一遍為止。具體的算法過程如下圖:

EAST文本檢測與Keras實作

圖3 局部感覺NMS算法

3.Keras實作

    本文利用Keras架構進行複現,主要參考的是huoyijie的代碼,原始代碼連結如下:

  • 參考代碼連結:https://github.com/huoyijie/AdvancedEAST 

    由于原始的EAST模型是對文本線内的每一個像素點的坐标進行預測,然後對其按照score進行權重平均,作為最終文本線的預測坐标,但是這種方法會有一個缺點,也就是容易導緻文本線的坐标容易受到内部像素點的影響,導緻預測的文本線偏小,沒法準确地框住完整的文本,如下圖所示:

EAST文本檢測與Keras實作

圖4 EAST效果圖

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

EAST文本檢測與Keras實作

圖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]))
           

     因為參考代碼已經寫的比較完善,是以這次沒有對代碼進行大幅度修改,就不貼出模型其他部分的代碼了。最後,模型的效果如下:

EAST文本檢測與Keras實作
EAST文本檢測與Keras實作
EAST文本檢測與Keras實作

4.優缺點總結

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

  • 結構簡單,pipeline短,模型訓練和預測的速度快
  • 可以适用于單詞或文本行級别的文本檢測,并且文本框的形狀可以是任意四邊形,對豎直、傾斜文本的檢測效果要比CTPN好
  • 模型采用全卷積神經網絡,參數量更加輕量級,并且速度也更快  

    接着是缺點部分,EAST模型的缺點主要有:

  • 對長文本的檢測不夠準确
  • 模型的感受野有限,當遇到一些比較大的文字時,可能就沒法識别出來 

    不過總而言之,還是很欽佩曠世科技,最近曠世科技又提出了一個新模型,叫SPCnet,可以支援對彎曲文字的檢測, 後面有時間再好好拜讀一下。

繼續閱讀