文字識別分爲兩個具體步驟:文字的檢測和文字的識別,二者缺一不可,尤爲是文字檢測,是識別的前提條件,若文字都找不到,那何談文字識別。今天咱們首先來談一下當今流行的文字檢測技術有哪些。算法
文本檢測不是一件簡單的任務,尤爲是複雜場景下的文本檢測,很是具備挑戰性。天然場景下的文本檢測有以下幾個難點:網絡
咱們先從直觀上理解文本檢測任務。給定一張圖片,咱們須要找出這張圖裏文字出現的全部位置位置,那這個任務其實跟目標檢測任務差異不大,即找出每一個物體在圖片中的位置,並標出該包圍框裏的物體的類別。而文本檢測就是,找出每一個文本在圖片中出現的位置,由於咱們的類別只有2個(有文字和沒文字),看起來就像一個簡單的單類別目標檢測的任務,天然而然咱們就會想到用經典的目標檢測網絡來進行文本檢測,好比經典的Faster R-CNN。架構
Faster RCNN來作文本檢測從任務上分析是可行的,畢竟文本說到底仍是一個Object。咱們回顧一下Faster RCNN作目標檢測的關鍵步驟有哪些:框架
Faster RCNN作文本檢測感受問題不大,可是從效果來看,僅套用Faster RCNN來作文本檢測效果並很差,緣由在於,文本有本身獨有的特色,這種通用的文本檢測框架並不能很好地解決文本的這些特色。那文本有什麼特色呢?我總結以下:ide
基於以上文本檢測的特色,咱們必須對Faster RCNN這類通用網絡進行改進,設計出適合文本檢測的全新網絡架構。函數
2016年出了一篇頗有名的文本檢測的論文:《Detecting Text in Natural Image with
Connectionist Text Proposal Network》,這個深度神經網絡叫作CTPN,直到今天這個網絡框架一直是OCR系統中作文本檢測的一個經常使用網絡,極大地影響了後面文本檢測算法的方向。學習
這個算法頗有創新,我打算一步一步介紹其閃光點。咱們回顧一下Faster RCNN作目標檢測的一個缺點就是,沒有考慮帶文本自身的特色。文本行通常以水平長矩形的形式存在,並且文本行中每一個字都有間隔。針對這個特色,CTPN剔除一個新奇的想法,咱們能夠把文本檢測的任務拆分,第一步咱們檢測文本框中的一部分,判斷它是否是一個文本的一部分,當對一幅圖裏全部小文本框都檢測以後,咱們就將屬於同一個文本框的小文本框合併,合併以後就能夠獲得一個完整的、大的文本框了,也就完成了文本的檢測任務。這個想法真的頗有創造性,有點像「分治法」,先檢測大物體的一小部分,等全部小部分都檢測出來,大物體也就能夠檢測出來了。字體
如圖所示,左邊的圖是直接使用Faster RCNN中的RPN來進行候選框提取,能夠看出,這種候選框太粗糙了,效果並很差。而右圖是利用許多小候選框來合併成一個大文本預測框,能夠看出這個算法的效果很是不錯,須要說明的是,紅色框表示這個小候選框的置信度比較高,而其餘顏色的候選框的置信度比較低,咱們能夠看到,一個大文本的邊界都是比較難預測的,那怎麼解決這個邊界預測不許的問題呢?後面會提到。優化
剛提到CTPN的其中一個閃光點,即檢測小框代替直接檢測大文本框。除了這個新意,CTPN還提出了在文本檢測中應加入RNN來進一步提高效果。爲何要用RNN來提高檢測效果?文本具備很強的連續字符,其中連續的上下文信息對於作出可靠決策來講很重要。咱們知道RNN經常使用於序列模型,好比事件序列,語言序列等等,那咱們CTPN算法中,把一個完整的文本框拆分紅多個小文本框集合,其實這也是一個序列模型,能夠利用過去或將來的信息來學習和預測,因此一樣可使用RNN模型。並且,在CTPN中,用的仍是BiLSTM(雙向LSTM),由於一個小文本框,對於它的預測,咱們不只與其左邊的小文本框有關係,並且還與其右邊的小文本框有關係!這個解釋就頗有說服力了,若是咱們僅僅根據一個文本框的信息區預測該框內含不含有文字實際上是很草率的,咱們應該多參考這個框的左邊和右邊的小框的信息後(尤爲是與其緊挨着的框)再作預測準確率會大大提高。spa
如上圖所示,若是咱們單純依靠1號框內的信息來直接預測1號框中否存在文字(或者說是否是文本的一部分),其實難度至關大,由於1號框只包含文字的很小一部分。可是若是咱們把2號框和3號框的信息都用上,來預測1號框是否存在文字,那麼咱們就會有比較大的把握來預測1號框確實有文字。咱們還能夠看看爲何邊緣的文本框的置信度會較中間的低呢?我的認爲很大一部分緣由就在於由於這些框都位於總文本的邊緣,沒有辦法充分利用左右相鄰序列的信息作預測(好比位於最左的文本框丟失了其右邊的信息)。這就是雙向LSTM的做用,把左右兩個方向的序列信息都加入到學習的過程當中去。
咱們已經對CTPN這個算法的整體思路有了一點理解,那關鍵問題來了,咱們怎麼把這些小文本框準確地檢測出來呢?
CTPN藉助了Faster RCNN中anchor迴歸機制,使得RPN能有效地用單一尺寸的滑動窗口來檢測多尺寸的物體。固然CTPN根據文本檢測的特色作了比較多的創新。好比RPN中anchor機制是直接回歸預測物體的四個參數(x,y,w,h),可是CTPN採起之迴歸兩個參數(y,h),即anchor的縱向偏移以及該anchor的文本框的高度,由於每一個候選框的寬度w已經規定爲16個像素,不須要再學習,而x座標直接使用anchor的x座標,也不用學習,因此CTPN的思路就是隻學習y和h這兩個參數來完成小候選框的檢測!跟RPN相相似,CTPN中對於每一個候選框都使用了K個不一樣的anchors(k在這裏默認是10),可是與RPN不一樣的是,這裏的anchors的width是固定的16個像素,而height的高度範圍爲11~273(每次對輸入圖像的height除以0.7,一共K個高度)。固然CTPN中仍是保留了RPN大多數的思路,好比仍是須要預測候選框的分數score(該候選框有文本和無文本的得分)。
這麼多小尺度候選框怎麼才能串聯成一個完整的文本行呢?
文本行構建很簡單,經過將那些text/no-text score > 0.7的連續的text proposals相鏈接便可。文本行的構建以下。首先,爲一個proposal Bi定義一個鄰居(Bj):Bj−>Bi,其中:
另外,若是同時知足Bj−>Bi和Bi−>Bj,會將兩個proposals被彙集成一個pair。接着,一個文本行會經過連續將具備相同proposal的pairs來進行鏈接來構建。
接下來咱們就較爲細節地學習一下這個CTPN經典網絡。
首先CTPN的基礎網絡使用了VGG16用於特徵提取,在VGG的最後一個卷積層CONV5,CTPN用了3×3的卷積核來對該feature map作卷積,這個CVON5 特徵圖的尺寸由輸入圖像來決定,而卷積時的步長卻限定爲16,感覺野被固定爲228個像素。卷積後的特徵將送入BLSTM繼續學習,最後接上一層全鏈接層FC輸出咱們要預測的參數:2K個縱向座標y,2k個分數,k個x的水平偏移量。看到這裏你們可能有個疑問,這個x的偏移究竟是什麼,爲何須要回歸這個參數?若是須要X的參數,爲何不在候選框參數迴歸時直接預測成(x,y,h)三個參數呢,而要畫蛇添足把該參數單獨預測?這個X的做用做者提到這也是他們論文的一大亮點,稱之爲Side-refinement,我理解爲文本框邊緣優化。咱們回顧一下上面提到的一個問題,文本框檢測中邊緣部分的預測並不許確。那麼改咋辦,CTPN就是用這個X的偏移量來精修邊緣問題。這個X是指文本框在水平方向的左邊界和右邊界,咱們經過迴歸這個左邊界和右邊界參數進而可使得咱們對文本框的檢測更爲精準。在這裏想舉個例子說明一下回歸這個x參數的重要性。
咱們觀察下圖,第一幅圖張咱們看到咱們有不少小候選框,位於左邊的候選框我標記爲一、二、三、4號框,1號框和2號框爲藍色,代表得分不高咱們不把這兩個框合併到大文本框內,對於3號框和4號框那就比較尷尬了,若是取3號框做爲文本框的邊緣框,那麼顯然左邊邊緣留白太多,精準度不夠,但若是去掉3號框而使用4號框做爲左邊緣框,則有些字體區域沒有檢測出來,一樣檢測精度不足。這種狀況其實很是容易出現,因此CTPN採起了Side-refinement 思路進一步優化邊緣位置的預測即引入迴歸X參數,X參數直接標定了完整文本框的左右邊界,作到精確的邊界預測。第二幅圖中的紅色框就是通過Side-refinement後的檢測結果,能夠看出檢測準確率有了很大的提高。 side-refinement確實能夠進一步提高位置準確率,在SWT的Multi-Lingual datasets上產生2%的效果提高。
再看多幾幅圖,體驗一下Side-refinement後的效果。
最後總結一下CTPN這個流行的文本檢測框架的三個閃光點:
固然,CTPN也有一個很明顯的缺點:對於非水平的文本的檢測效果並很差。CTPN論文中給出的文本檢測效果圖都是文本位於水平方向的,顯然CTPN並無針對多方向的文本檢測有深刻的探討。那對於任意角度的文本檢測應該採起什麼的算法思路呢?下面的SegLink算法給出了一個新奇的解決方案。
CVPR2017的一篇spotlight論文《Detecting Oriented Text in Natural Images by Linking Segments》介紹以一種能夠檢測任意角度文本的檢測算法,咱們通常稱這個算法爲SegLink,這篇論文既融入CTPN小尺度候選框的思路又加入了SSD算法的思路,達到了當時天然場景下文本檢測state-of-art的效果。
如今我想先介紹爲何要針對多方向的文本檢測作特定的研究。對於普通目標檢測,咱們並不須要對其作所謂的多方向目標檢測,好比下面這個檢測任務,咱們直接把單車和狗的位置找出來便可。
可是對於文本檢測任務可不同,文本的特色就是高寬比特別大或小,並且文本一般存在必定的旋轉角度,若是咱們對於帶角度的文本仍然使用目標檢測那個思路迴歸四個參數(x,y,w,h)來指定一個目標的位置的話(以下圖紅色框),那顯然偏差太大了,這個檢測效果並非咱們所能接受的。做爲對比,下圖的綠色框的檢測效果纔是咱們的終極目標。那麼怎麼基於原來經典的目標檢測算法作相應的優化以適應這種檢測效果的要求呢?
一個最直接的思路就是讓模型再學習一個參數\(\theta\)!這個\(\theta\)表示文本框的旋轉角度,也就是咱們最終要回歸的參數從原來的\((x,y,w,h)\)變成
\((x,y,w,h,\theta)\)。SegLink確實也採起了這個思路,除此以外,他還提出了Segment和Linking兩個重要概念,這個纔是這篇CVPR論文的核心創新點。
什麼是segment?segment從中文上理解爲文本行的一部分,這一部分能夠是一個字符或文本行的任意一部分。以下圖示,黃色框表示一個segment,一個完整的文本行中包含多個segment,每一個sgment之間經過link(圖中的綠色線)鏈接組合起來。那麼Segment作文本檢測的思路其實跟CTPN的思路很像,先檢測文本行的一部分,再把他們鏈接起來構成一個完整文本行。
咱們把圖片的關鍵部位放大看看細節:首先每一個segment是有必定的重合區域的,而後每兩個segment鏈接的部位是兩個segment的中心點。每個segment和link僅依靠局部圖像的紋理信息便可完成檢測,而無需整張圖像的信息。
接下來咱們經過分析SegLink的網絡架構進一步理解SegLink如何作到高效的多角度文本檢測。下圖是SegLink的網絡架構,顯然這個架構採起了SSD的思路,首先使用VGG16做爲backbone進行特徵提取,其中VGG16的全鏈接層(fc6,fc7)替換成卷積層(conv6,conv7),再接卷積層conv8到conv11。值得說明的是,conv4~conv11之間的尺寸依次減小(每一層是前一層的1/2)。這個作法是爲了作多尺度下的目標檢測,即大的feature map擅長作小物體的檢測,而小的feature map則擅長檢測大物體。藉助多個不一樣尺度的feature map,從6個feature layer上檢測segment和link,咱們就能夠檢測出不一樣尺寸的文本行了。
觀察後面的卷積層能夠發現,對不一樣層的feature map使用3×3的卷積層產生最終的輸出(包括segment和link),不一樣特徵層輸出的維度是不同的,由於除了conv4_3層外,其它層存在跨層的link。這裏segment是text的帶方向bbox信息(它多是個單詞,也多是幾個字符,總之是文本行的部分),link是不一樣segment的鏈接信息(文章將其也增長到網絡中自動學習)。
當全部segments都被檢測出來後,咱們就能夠經過融合規則(combining segments),將各個feature map的segment的box信息和link信息進行融合,獲得最終的文本行。
SegLink所使用的目標函數由三個部分構成,是不是text的二類分類的softmax損失,box的smooth L1 regression損失,是否link的二類的softmax損失。λ1和λ2控制權重,最後都設爲1。
如今計算一下每一個feature map輸出的參數有哪些呢?
下圖很清楚地表示出每一個feature map輸出的參數有多少個,輸出參數總數爲(2+5+16+8=31)。假設當前的feature map的尺度爲(w,h),那麼該層卷積後輸出爲w×h×31。
這裏想再談談Within-Layer Link和Cross-Layer Link的做用。
within-layer link表示在同一層feature layer裏,每一個Segment與8鄰域內的segment的鏈接情況,以下圖(a)所示。且每一個link有2維,一維是正分,表示兩個segment屬於同一文本,一維是負分,表示兩個segment不屬於同一文本。因此,每一個predictor輸出16(8×2)維向量。
cross-layer link:在不一樣的feature layer上有可能會檢測到同一文本的segments,形成冗餘,cross-layer link的提出就是爲了解決這個問題。cross-layer link鏈接了兩個相鄰feature layer上的segments,如圖(b)所示。須要注意的是,因爲下采樣使後一層爲前一層scale的1/2,定義一個segment的cross-layer鄰居爲前一層4鄰域更小的segment,即前一層是後一層的鄰居,但後一層不是前一層的鄰居,因此conv4_3的feature layer沒有cross-layer鄰居。圖中所示的黃框爲當前層的segment,藍框爲上一層更小更細的segment,綠色的線表明cross-layer link有鏈接,屬於同一文本,在後續的combine算法中會將他們融合,即去除了冗餘。
讀到這裏咱們已經知道如何獲取segment和相應的link了,那接下來要作的就是怎麼把這些link和segment合併成一個完整的文本行。先貼一下論文中使用到的合併算法:
看起來真的是頭都大,其實思想很簡單,我嘗試用中文解釋一下:
我畫了下圖輔助理解合併算法,橙色直線是擬合出的最佳直線,紅色點表示segment的中心,黃點表示紅點在直線上的投影,綠框就是合併後的完整本文框。
這樣子咱們就求解完一個完整文本框的全部參數,也就完成了segment合併成文本行的任務。
SegLink算法對於各類角度的文本檢測具備很強的魯棒性。
SegLink論文中並無提到該算法能不能檢測彎曲的文本,從理論上解讀,SegLink是能夠作到的。好比下圖,只是合併算法要作一些改變而已。
對於以上把完整文本行先分割檢測再合併的思路,有人提出質疑,以爲這種作法比較麻煩,把文本檢測切割成多個階段來進行,這無疑增大了文本檢測精度的損失和時間的消耗,對於文本檢測任務上中間處理越多可能效果越差。因此有篇CVPR2017的文章提出,咱們有一種方法能優雅且簡潔地完成多角度文本檢測,這個算法叫作EAST,論文爲《EAST: An Efficient and Accurate Scene Text Detector》。
經過下圖咱們知道,一個文本檢測有多個階段,就以region proposals系的檢測算法爲例,他們一般包含候選框提取、候選框過濾、bouding box迴歸、候選框合併等階段,EAST的做者認爲,一個文本檢測算法被拆分紅多個階段其實並無太多好處,實現真正端到端的文本檢測網絡纔是正確之舉。因此EAST的pipeline至關優雅,只分爲FCN生成文本行參數階段和局部感知NMS階段,網絡的簡潔是的檢測的準確性和速度都有了進一步的提升。
咱們從網絡架構來理解EAST作文本檢測的優點。首先EAST採起了FCN的思路,一開始我覺得EAST是一個經過語義分割來解決文本檢測的難題,深刻閱讀後才發現並非,而只是藉助了FCN的架構作特徵提取和學習,最終仍是一個迴歸問題,在EAST最後預測出相應的文本行參數。
EAST網絡分爲特徵提取層+特徵融合層+輸出層三大部分。
特徵提取層: backbone採起PVANet來作特徵提取,接下來送入卷積層,並且後面的卷積層的尺寸依次遞減(size變爲上一層的一半),並且卷積核的數量依次遞增(是前一層的2倍)。抽取不一樣level的feature map,這樣能夠獲得不一樣尺度的特徵圖,目的是解決文本行尺度變換劇烈的問題,size大的層可用於預測小的文本行,size小的層可用於預測大的文本行。
特徵合併層,將抽取的特徵進行merge.這裏合併的規則採用了U-net的方法,合併規則:從特徵提取網絡的頂部特徵按照相應的規則向下進行合併,這裏描述可能不太好理解,具體參見下述的網絡結構圖。
網絡輸出層:網絡的最終輸出有5大部分,他們分別是:
因此從總體看來,EAST就是藉助FCN架構直接回歸出文本行的\((x,y,w,h,\theta)\)+置信度+四邊形的四個座標!很是簡潔!可是看到這裏或許會有個問題,爲何要生成四邊形的四個座標呢?\((x,y,w,h,\theta)\)這個參數不足以解決文本行定位問題?還真不能,看看下面這個圖片。
對於這種帶放射變換的文本行(可能還有的是透視變換),呈現出來的形狀是平行四邊形(黃色虛線爲ground true),若是咱們以\((x,y,w,h,\theta)\)來表示這個文本的位置,就是粉色框所示,顯然不合適。因此對於這種場合,直接預測四邊形的四個頂點座標纔是正確之舉。
EAST目標函數分兩部分,以下,第一部分是分類偏差,第二部分是幾何偏差,文中權衡重要性,λg=1。
Ls稱爲分類偏差函數
,採用 class-balanced cross-entropy,這樣作能夠很實用的處理正負樣本不均衡的問題。
其中β=反例樣本數量/總樣本數量 (balance factor)
Lg爲幾何偏差函數
對於RBOX,採用IoU loss
角度偏差則爲:
對於QUAD採用smoothed L1 loss
CQ={x1,y1,x2,y2,x3,y3,x4,y4},NQ*指的是四邊形最短邊的長度
下面看看EAST文本檢測的效果,注意觀察一些帶放射變換or透視變換的文本行的檢測效果。
文本介紹了我一直關注且實驗效果都至關不錯的三個經典的文本檢測算法,他們都是基於深度學習,能夠這麼說,如今作文本檢測都是深度學習的天下了。固然深度學習流派作文本檢測遠不止以上幾個思路,好比基於語義分割的思路作文本檢測的、基於角點檢測作文本檢測、各類方法混合的文本檢測的論文也很是多,同時也取得很是不錯的效果。能夠說,如今基於深度學習的文本檢測論文可謂百花齊放。