Python+opencv+EAST做自然場景文本檢測

在本教程中,您將學習如何使用OpenCV通過EAST文本檢測器檢測自然場景圖像中的文本。

OpenCV的EAST文本檢測器是一種深度學習模型,基於新穎的架構和訓練模式。它的優勢是

(1)可以以13 FPS的速度、幾乎實時地在720p圖像上檢測運行,並且

(2)文本檢測精度較高。

在本教程的接下來的部分,您將學習如何使用OpenCV和EAST檢測器自動檢測圖像和視頻流中的文本。

EAST文本檢測器要求我們在系統上運行OpenCV3.4.2或OpenCV 4-如果尚未安裝OpenCV3.4.2或更好的版本,請參閱我的OpenCV安裝指南,並按照各自的操作系統進行相應操作 。

在今天的教程的第一部分中,我將討論為什麼在自然場景圖像中檢測文本如此具有挑戰性的原因。

然後,我將簡要討論EAST文本檢測器、我們為什麼使用它以及使該算法如此新穎的原因—我還將附上包括原始論文的鏈接,以便您願意時可以閱讀詳細信息。

最後,我將提供我的Python + OpenCV文本檢測實現,以便您可以開始在自己的應用程序中應用文本檢測。

首先,為什麼自然場景文本檢測如此具有挑戰性?

Python+opencv+EAST做自然場景文本檢測

圖1:由於光照條件,圖像質量和非平面物體而導致文本檢測非常困難的自然場景圖像示例

在受約束的受控環境中檢測文本通常可以通過使用基於啟發式的方法來完成,例如利用漸變信息或通常將文本分組為段落且字符顯示在直線上這一事實。這種基於啟發式文本檢測器的示例可以在我之前的博客文章Detecting machine-readable zones inpassport images中看到。

因此,自然場景文本檢測是不同的,而且更具挑戰性。

由於廉價數碼相機和智能手機的普及,我們需要高度關注圖像拍攝時的條件。Celine Mancas-Thillou和Bernard Gosselin在其2017年發表的優秀論文《自然場景文本理解》中描述了的自然場景文本檢測面對的主要挑戰:

圖像/傳感器噪聲:手持相機的傳感器噪聲通常高於傳統掃描儀的噪聲。此外,低價相機通常會插值原始傳感器的像素以產生真實色彩。

視角:自然的場景文字自然會具有與文字不平行的視角,從而使文字難以識別。

模糊:不受控制的環境傾向於模糊,特別是如果最終用戶使用的智能手機沒有某種形式的穩定性。

光照條件:我們無法對自然場景圖像中的光照條件做出任何假設。可能接近黑暗,相機的閃光燈可能打開,或者陽光可能明亮,使整個圖像飽和。

分辨率:並非所有攝像機都是一樣的—我們可能正在處理分辨率低於標準的攝像機。

非紙張對象:大多數(但不是全部)紙張不是反射性的(至少在您嘗試掃描的紙張中)。自然場景中的文字可能具有反射性,包括徽標,標誌等。

非平面物體:考慮將文字包裹在瓶子上時會發生什麼—表面上的文字變形和變形。儘管人類仍然可以輕鬆“檢測”並閱讀文本,但我們的算法仍會遇到困難。我們需要能夠處理此類用例。

未知的佈局:我們無法使用任何先驗信息來為算法提供有關文本所處位置的“線索”。

接下來的部分我們將學習到,OpenCV的EAST文本檢測器實現功能非常強大,即使在文本模糊,反射或部分被遮擋的情況下,也可以對文本進行本地化:

Python+opencv+EAST做自然場景文本檢測

圖2:OpenCV的EAST場景文本檢測器甚至可以檢測到模糊和模糊的圖像。

如果您對自然場景圖像中的文本檢測相關的挑戰進一步感興趣,建議您閱讀Mancas-Thillou和Gosselin的相關著作。

EAST深度學習文本檢測器的結構框圖如下:

Python+opencv+EAST做自然場景文本檢測

圖3:EAST文本檢測全卷積網絡的結構(Zhou等人的圖3)。

隨著OpenCV 3.4.2和OpenCV 4的發佈,我們現在可以使用基於深度學習的文本檢測器EAST,該檢測器基於Zhou等人在2017年發表的論文《 EAST:高效準確的場景文本檢測器》EAST: An Efficient and Accurate Scene Text Detector

論文作者說,EASTpipeline能夠在720p圖像上以任意方向預測單詞和文本行,而且可以以13 FPS的速度運行。

也許最重要的是,由於EAST深度學習模型是端到端的,因此可能繞開一般文本識別器用的計算成本高昂的子算法,比如候選對象聚合和詞彙分割等。

為了建立和訓練這種深度學習模型,EAST方法利用了經過精心設計的新穎損失函數。

有關EAST的更多詳細信息,包括體系結構設計和培訓方法,請務必參考作者的論文。

項目結構

首先,請確保通過訪問“下載”部分來獲取源代碼和圖像到今天的帖子中。從那裡,只需使用tree terminal命令查看項目結構:

Python+opencv+EAST做自然場景文本檢測

請注意,我在images /目錄中提供了三張示例圖片。您可能希望添加通過智能手機收集的自己的圖像或在網上找到的圖像。

我們今天將解釋兩個.py文件:

text_detection.py:檢測靜態圖像中的文本。

text_detection_video.py:通過網絡攝像頭或輸入視頻文件檢測文本。

這兩個腳本都使用了序列化的EAST模型(Frozen_east_text_detection.pb),以便在“下載”中方便使用。

使用說明

我今天要實現的文本檢測是基於OpenCV的官方C ++示例;但是,我必須承認將其轉換為Python時遇到了一些麻煩。

首先,Python中沒有Point2f和RotatedRect函數,因此,我不能100%模仿C ++實現。C ++實現可以產生旋轉的邊界框,但是不幸的是,我今天與您共享的邊界框無法實現。

其次,NMSBoxes函數不為Python綁定返回任何值(至少對於我的OpenCV 4預發行版安裝而言),最終導致OpenCV引發錯誤。NMSBoxes函數可能在OpenCV 3.4.2中可用,但我無法對其進行詳盡的測試。

我在imutils中使用自己的非最大值抑制實現解決了這個問題,但是同樣,由於NMSBoxes似乎接受其他參數,因此我不認為這兩者是100%可互換的。

考慮到所有這些,我將盡力利用現有的功能和資源為您提供最佳的OpenCV文本檢測實現。如果您對該方法有任何改進,請隨時在下面的評論中分享。

使用OpenCV實現我們的文本檢測器

在開始之前,我想指出,您至少需要在系統上安裝OpenCV 3.4.2(或OpenCV 4)才能使用OpenCV的EAST文本檢測器,因此,如果尚未安裝OpenCV 3.4.2或更高版本, 在您的系統上,請參閱我的OpenCV安裝指南。

接下來,確保您的系統上也已安裝/升級了imutils:


至此,您的系統現已配置完畢,因此打開text_detection.py並插入以下代碼:





















首先,我們在2-6行中導入所需的包和模塊。值得注意的是,我們導入了NumPy,OpenCV和從我的imutils.object_detection中導入non_max_suppression實現。

然後,我們繼續分析第9-20行的五個命令行參數:

--image:輸入圖像的路徑。

--east:EAST場景文本檢測器模型文件路徑。

--min-confidence:確定文本的概率閾值。可選,默認為0.5。

--width:調整後的圖像寬度—必須為32的倍數。可選,默認為320。

--height:調整後的圖像高度—必須為32的倍數。可選,默認為320。

重要提示:EAST文本要求您輸入的圖像尺寸必須是32的倍數,因此,如果您選擇調整--width和--height值,請確保它們是32的倍數!

從那裡開始,讓我們加載圖片並調整其大小:
















在第23和24行,我們加載並複製輸入圖像。

從那裡,第30行和第31行確定原始圖像尺寸與新圖像尺寸的比率(基於為--width和--height提供的命令行參數)。

然後我們調整圖像大小,忽略寬高比(第34行)。

為了使用OpenCV和EAST深度學習模型執行文本檢測,我們需要提取兩層的輸出特徵圖:







我們在第40-42行構造一個layerNames列表:

第一層是我們的輸出S形激活,它為我們提供了一個區域是否包含文本的概率。

第二層是代表圖像“幾何形狀”的輸出要素圖-我們將能夠使用該幾何形狀來得出輸入圖像中文本的邊界框座標

讓我們加載OpenCV的EAST文本檢測器:
















我們使用cv2.dnn.readNet將神經網絡加載到內存中,方法是將路徑傳遞到EAST檢測器(包含在命令行args詞典中)作為第46行的參數。

然後,通過將其轉換為第50行和第51行上的斑點來準備圖像。要了解有關此步驟的更多信息,請參閱深度學習:OpenCV的blobFromImage的工作方式。

為了預測文本,我們可以簡單地將blob設置為輸入並調用net.forward(第53和54行)。這些行周圍都帶有時間戳,因此我們可以在58行上打印經過的時間。

通過將layerNames作為參數提供給net.forward,我們指示OpenCV返回我們感興趣的兩個功能圖:

輸出幾何圖,用於導出輸入圖像中文本的邊界框座標

同樣,分數圖包含給定區域包含文本的概率

我們需要一個一個地遍歷以下每個值:



















首先,獲取分數卷的大小(第63行),然後初始化兩個列表:

rects:存儲文本區域的邊界框(x,y)座標

置信度:將與每個邊界框相關的概率存儲在矩形中

稍後我們將對這些區域應用非最大值抑制。

行的循環從第68行開始。

第72-77行提取了當前行y的分數和幾何數據。

接下來,我們遍歷當前選定行的每個列索引:

































對於每一行,我們開始循環瀏覽第80行的列。

我們需要通過忽略沒有足夠高概率的區域來過濾掉弱文本檢測(第82和83行)。

當圖像通過網絡時,EAST文本檢測器自然會減小體積大小-我們的體積大小實際上比輸入圖像小4倍,因此我們乘以四以使座標重新回到原始圖像的範圍內。

我已經介紹瞭如何在91-93行中提取角度數據;但是,正如我在上一節中提到的那樣,我無法像在C ++實現中那樣由它構造一個旋轉的邊界框-如果您想完成任務,那麼從第91行的角度開始將是您的第一個 步。

97-105行從此處導出文本區域的邊界框座標。

然後,我們分別更新我們的矩形和置信度列表(第109行和第110行)。

我們快完成了!

最後一步是對邊界框應用非最大值抑制,參考(https://www.pyimagesearch.com/2014/11/17/non-maximum-suppression-object-detection-python/)

,以抑制弱重疊邊界框,然後顯示結果文本預測:




















如前一節所述,我無法在我的OpenCV 4安裝(cv2.dnn.NMSBoxes)中使用非最大值抑制,因為Python綁定沒有返回值,最終導致OpenCV出錯。我沒有完全能夠在OpenCV 3.4.2中進行測試,因此它可以在v3.4.2中運行。

相反,我使用了imutils軟件包(第114行)中提供的非最大化抑制實現。結果仍然看起來不錯;但是,我無法將我的輸出與NMSBoxes函數進行比較,以查看它們是否相同。

117-126行在我們的邊界框上循環,將座標縮放回原始圖像尺寸,然後將輸出繪製到我們的原始圖像。顯示原始圖像,直到按下某個鍵(第129和130行)。

作為最後的實現說明,我想提到我們兩個嵌套的for循環,用於循環68-110行上的得分和幾何體體積,這是一個很好的例子,您可以在其中利用Cython極大地加速您的管線。我已經通過OpenCV和Python在經過優化的快速“像素”像素循環中展示了Cython的功能。

您準備好對圖像應用文本檢測了嗎?

首先抓住此博客文章的“下載”,然後解壓縮文件。

從那裡,您可以在終端中執行以下命令(注意兩個命令行參數):





輸入結果如下

Python+opencv+EAST做自然場景文本檢測

圖4:著名的籃球運動員LebronJames的球衣文本已通過OpenCV和EAST文本檢測成功識別。





Python+opencv+EAST做自然場景文本檢測

圖5:在這個自然的洗車場中,使用EAST使用Python和OpenCV可以輕鬆識別文本。

最後,我們將嘗試一個路標:





Python+opencv+EAST做自然場景文本檢測

圖6:使用Python +OpenCV進行場景文本檢測,並且EAST文本檢測器成功檢測到此西班牙停車標誌上的文本。


分享到:


相關文章: