請直接看原文
文本檢測 OpenCV EAST文本檢測器 源代碼 https://hotdog29.com/?p=643
在 2019年7月11日 上張貼 由 hotdog發表回覆
文本檢測
文本檢測
在本教程中,您將學習如何使用 EAST 文本檢 測器使用 OpenCV 檢測自然場景圖像中的文本。
OpenCV 的 EAST 文本檢測器是一種基於新穎架構和訓練模式的深度學習模型。它能夠(1)在720p圖像上以13 FPS接近實時運行,並且(2)獲得最先進的 文本檢測 精度。
在本教程的其餘部分,您將學習如何使用 OpenCV 的 EAST檢測器 自動檢測圖像和視頻流中的文本。
OpenCV 文本檢測(EAST文本檢測器)
在本教程中,您將學習如何使用EAST文本檢測器使用OpenCV檢測圖像中的文本。
EAST文本檢測器要求我們在我們的系統上運行OpenCV 3.4.2或OpenCV 4 – 如果您還沒有安裝OpenCV 3.4.2或更高版本,請參閱我的OpenCV安裝指南並按照各自的操作系統進行操作。
在今天的教程的第一部分中,我將討論爲什麼在自然場景圖像中檢測文本會如此具有挑戰性。
從那裏我將簡要討論EAST文本檢測器,爲什麼我們使用它,以及什麼使算法如此新穎 – 我還將包括原始論文的鏈接,以便您可以閱讀詳細信息.
最後,我將提供我的Python + OpenCV文本檢測實現,以便您可以開始在自己的應用程序中應用文本檢測。
爲什麼自然場景文本檢測如此具有挑戰性
圖1:自然場景圖像的示例,其中文本檢測由於光照條件,圖像質量和非平面物體而具有挑戰性(Mancas-Thillou和Gosselin的圖1 )。
在受約束的受控環境中檢測文本通常可以通過使用基於啓發式的方法來完成,例如利用梯度信息或者文本通常被分組成段落並且字符出現在直線上的事實。在我之前關於檢測護照圖像中的機器可讀區域的博客文章中可以看到這種基於啓發式的文本檢測器的示例 。
自然場景文本檢測不同 – 而且更具挑戰性。
由於廉價數碼相機的普及,更不用說幾乎每部智能手機現在都有攝像頭這一事實,我們需要高度關注拍攝圖像的條件 – 此外,我們能做什麼和不能做什麼假設。我已經包含了Celine Mancas-Thillou和Bernard Gosselin在2017年優秀論文“ 自然場景文本理解”中描述的自然場景文本檢測挑戰的總結版本:
圖像/傳感器噪聲:手持式攝像機的傳感器噪聲通常高於傳統掃描儀的噪聲。此外,低價相機通常會插入原始傳感器的像素以產生真實的顏色。
視角:自然場景文本自然可以具有與文本不平行的視角,使文本更難識別。
模糊:不受控制的環境往往會模糊,特別是如果最終用戶使用的智能手機沒有某種形式的穩定性。
照明條件:我們無法對自然場景圖像中的照明條件做出任何假設。它可能接近黑暗,相機上的閃光燈可能打開,或者太陽可能會照亮,使整個圖像飽和。
分辨率:並非所有攝像機都是相同的 – 我們可能正在處理分辨率低的攝像機。
非紙質對象:大多數(但不是全部)紙張都不是反光的(至少在您嘗試掃描的紙張環境中)。自然場景中的文字可能是反光的,包括徽標,標誌等。
非平面物體:考慮當您將文本環繞在瓶子周圍時會發生什麼 – 表面上的文本變得扭曲和變形。雖然人類仍然可以輕鬆地“檢測”並閱讀文本,但我們的算法會很困難。我們需要能夠處理這樣的用例。
未知佈局:我們不能使用任何先驗信息來爲我們的算法提供關於文本所在位置的“線索”。
正如我們將要了解的那樣,OpenCV的EAST文本檢測器實現非常強大,即使文本模糊,反射或部分模糊,也能夠對文本進行本地化:
圖2: OpenCV的EAST場景文本檢測器即使在模糊和模糊的圖像中也能檢測到。
如果您對自然場景圖像中的文本檢測相關的挑戰更感興趣,我建議閱讀Mancas-Thillou和Gosselin的作品。
EAST深度學習文本檢測器
圖3: EAST文本檢測全卷積網絡的結構(Zhou等人的圖3 )。
隨着OpenCV 3.4.2和OpenCV 4的發佈,我們現在可以使用一種名爲EAST的基於深度學習的文本檢測器,它基於Zhou等人的2017年論文“ EAST:一種高效精確的場景文本檢測器”。
我們將算法稱爲“EAST”,因爲它是: E fficient 和A ccurate S cene T ext檢測管道。
據作者說,EAST管道能夠在720p圖像上以任意方向預測文本的單詞和行,並且能夠以13 FPS運行。
也許最重要的是,由於深度學習模型是端到端的,因此可以迴避其他文本檢測器通常應用的計算上昂貴的子算法,包括候選聚合和字分區。
爲了構建和訓練這樣一種深度學習模型,EAST方法採用了新穎,精心設計的損失函數。
有關EAST的更多詳細信息,包括架構設計和培訓方法,請務必參考作者的出版物。
項目結構
首先,請訪問“下載”部分,確保將源代碼+圖像抓取到今天的帖子 。從那裏,只需使用 tree terminal命令查看項目結構
請注意,我在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中使用我自己的 非最大值抑制實現,但同樣,我不相信這兩個是100%可互換的,因爲看起來 NMSBoxes 接受其他參數。
鑑於這一切,我盡力使用我的工作功能和資源爲您提供最好的OpenCV文本檢測實現。如果您對方法有任何改進,請隨時在下面的評論中分享。
使用OpenCV實現我們的文本檢測器
在我們開始之前,我想指出的是,你將需要至少OpenCV的3.4.2(或OpenCV的4)安裝在您的系統利用OpenCV的東部文本探測器上,因此,如果您尚未安裝的OpenCV 3.4.2或更高在您的系統上,請參閱我的OpenCV安裝指南。
接下來,確保您的系統上還 安裝/升級了imutils
1 $ pip install --upgrade imutils
此時您的系統已配置好,因此打開 text_detection .py
首先,我們在第2-6行導入所需的包和模塊。值得注意的是,我們 從 imutils導入NumPy,OpenCV和我的 non_max_suppression 實現。object_detection 。
然後我們繼續解析第9-20行的五個命令行參數:
– image :輸入圖像的路徑。
– east :EAST場景文本檢測器模型文件路徑。
– min – confidence :確定文本的概率閾值。可選, 默認值= 0.5 。
– width :調整後的圖像寬度 – 必須是32的倍數。可選, 默認值= 320 。
– height :調整後的圖像高度 – 必須是32的倍數。可選, 默認值= 320 。
重要提示: EAST文本要求輸入圖像尺寸爲32的倍數,因此如果您選擇調整 – 寬度 和 – 高度 值,請確保它們是32的倍數!
從那裏,讓我們加載我們的圖像並調整它的大小
在 第23和24行,我們加載並複製輸入圖像。
從那裏, 第30行和第31行確定原始圖像尺寸與新圖像尺寸的比率(基於爲- width 和 -height提供的命令行參數 )。
然後我們調整圖像大小,忽略縱橫比(第34行)。
爲了使用OpenCV和EAST深度學習模型執行文本檢測,我們需要提取兩層的輸出特徵映射
我們 在40-42行構建一個layerNames列表 :
第一層是我們的輸出sigmoid激活,它給出了包含文本或不包含文本的區域的概率。
第二層是表示圖像“幾何”的輸出要素圖 – 我們將能夠使用此幾何來導出輸入圖像中文本的邊界框座標
讓我們加載OpenCV的EAST文本檢測器
我們使用cv2將神經網絡加載到內存中 。dnn 。readNet 將路徑傳遞給EAST檢測器(包含在我們的命令行 args 字典中)作爲第46行的參數 。
然後,我們通過轉換準備好圖像,形成 blob 第50和51行。要了解有關此步驟的更多信息,請參閱 深度學習:OpenCV的blobFromImage如何工作。
要預測文本,我們可以簡單地將blob設置 爲輸入並調用 net 。前進 (第53和54行)。這些行被抓取時間戳包圍,以便我們可以 在第58行打印經過的時間 。
通過提供 layerNames 作爲net的參數 。前進 ,我們正在指導的OpenCV返回兩個特徵的地圖
輸出 geometry 圖用於導出輸入圖像中文本的邊界框座標
類似地, scores 圖包含包含文本的給定區域的概率
我們需要逐個遍歷每個值
我們首先抓住 scores 的維度 (第63行),然後初始化兩個列表:
rects :存儲文本區域的邊界框(x,y) –座標
confidences 置信度 :存儲與 rects中每個邊界框關聯的概率
我們稍後將對這些區域應用非最大值抑制。
在第68行開始循環 。
第72-77行提取當前行的分數和幾何數據 y 。
接下來,我們遍歷當前所選行的每個列索引
對於每一行,我們開始循環第80行 。
我們需要通過忽略不具有足夠高概率的區域來過濾掉弱文本檢測(第82和83行)。
當文本通過網絡時,EAST文本檢測器自然地減小了體積大小 – 我們的體積大小實際上比輸入圖像小4倍,所以我們乘以4使座標回到原始圖像的方向。
我已經介紹瞭如何 在第91-93行提取 角度數據; 但是,正如我在上一節中提到的,我無法像在C ++實現中那樣構建一個旋轉的邊界框 – 如果你想要處理任務,從第91行的角度開始將是你的第一個步。
從那裏,第97-105行導出文本區域的邊界框座標。
然後,我們 分別更新我們的 rects 和 confidences列表(第109和110行)。
我們差不多完成了!
最後一步是將非最大值抑制應用於我們的邊界框以抑制弱重疊邊界框,然後顯示結果文本預測
正如我在上一節中提到的,我不能使用非最大值抑制在我的OpenCV 4安裝( cv2.dnn.NMSBoxes )作爲Python綁定沒有返回值,最終導致OpenCV的錯誤了。我無法完全在OpenCV 3.4.2中進行測試,因此它 可以在v3.4.2中運行。
相反,我使用 了imutils 包中提供的 非最大值抑制實現(第114行)。結果仍然很好; 但是,我無法將輸出與NMSBoxes 函數進行比較 ,看它們是否相同。
第117-126行環繞我們的邊界 框 ,將座標縮放回原始圖像尺寸,並將輸出繪製到我們的 原始 圖像。顯示 原始 圖像,直到按下一個鍵(第129和130行)。
作爲最後的實現說明,我想提一下,我們的兩個嵌套 for 循環用於循環第68-110行的 scores 和 geometry ,這將是一個很好的例子,你可以利用Cython來大大加速你的管道。我已經展示了Cython在Fast中的強大功能, 使用OpenCV和Python優化了’for’像素循環。
OpenCV文本檢測結果
你準備好對圖像應用文本檢測了嗎?
首先抓住 此博客文章的“下載”並解壓縮文件。
從那裏,您可以在終端中執行以下命令(記下兩個 命令行參數)
12 $ python text_detection.py --image images/lebron_james.jpg \ --east frozen_east_text_detection.pb
您的結果應類似於以下圖像:
圖4:着名的籃球運動員,Lebron James的球衣文字通過OpenCV和EAST文本檢測成功識別。
勒布朗詹姆斯確定了三個文本區域。
現在讓我們嘗試檢測商業標誌的文字
12 $ python text_detection.py --image images/car_wash.png \ --east frozen_east_text_detection.pb
圖5:在洗車站的這個自然場景中使用EAST和Python以及OpenCV可以輕鬆識別文本。
最後,我們將嘗試一個路標
12 $ python text_detection.py --image images/sign.jpg \ --east frozen_east_text_detection.pb
圖6:使用Python + OpenCV進行場景文本檢測,EAST文本檢測器成功檢測到此西班牙語停止標誌上的文本。
此場景包含西班牙停車標誌。OpenCV和EAST正確檢測到“ALTO”這個詞。
正如您所知,EAST非常準確且相對較快,每張圖像的平均時間約爲0.14秒。
使用OpenCV在視頻中進行文本檢測
現在我們已經看到了如何檢測圖像中的文本,讓我們繼續使用OpenCV檢測視頻中的文本。
這個解釋非常簡短; 有關詳細信息,請參閱上一節。
打開 text_detection_video 。py
我們首先導入我們的包。我們將使用 VideoStream 訪問網絡攝像頭和 FPS 來對此腳本的每秒幀進行基準測試。其他所有內容與上一節中的相同。
爲方便起見,讓我們定義一個新函數來解碼我們的預測函數 – 它將被重用於每個幀並使我們的循環更清晰
在第11行,我們定義了 decode_predictions 函數。此函數用於提取:
文本區域的邊界框座標
以及文本區域檢測的概率
此專用函數將使代碼在此腳本中更易於閱讀和管理。
讓我們解析我們的命令行參數
我們的命令行參數在第69-80 行解析:
– east :EAST場景文本檢測器模型文件路徑。
– video :輸入視頻的路徑。可選 – 如果提供了視頻路徑,則不會使用網絡攝像頭。
–min-confidence :確定文本的概率閾值。可選, 默認值= 0.5 。
– width :調整後的圖像寬度(必須是32的倍數)。可選, 默認值= 320 。
– height :調整後的圖像高度(必須是32的倍數)。可選, 默認值= 320 。
上一節中僅使用圖像的腳本(就命令行參數而言)的主要變化是我 用- video替換了 -image參數 。
重要提示: EAST文本要求輸入圖像尺寸爲32的倍數,因此如果您選擇調整 – 寬度 和 – 高度 值,請確保它們是32的倍數!
接下來,我們將執行模仿前一個腳本的重要初始化
第84-86行的高度/寬度和比率初始化將允許我們稍後正確地縮放我們的邊界框。
定義了輸出層名稱,我們在第91-97行加載了預訓練的EAST文本檢測器。
以下塊設置我們的視頻流和每秒幀數計數器
我們的視頻流設置爲:
網絡攝像頭(100-103行)
或視頻文件(第106-107行)
從那裏我們初始化我們在第110行的每秒幀數, 並開始循環傳入幀
我們開始在113行的視頻/網絡攝像頭幀上循環 。
我們的框架調整大小,保持縱橫比(第124行)。從那裏,我們抓住尺寸並計算比例比(第129-132行)。然後,我們調整框架再次(必須是32的倍數),此時忽略縱橫比,因爲我們已經存儲保管在比(135行)。
推理和繪圖文本區域邊界框發生在以下行
在這個塊中我們:
使用EAST通過創建blob 並將其傳遞通過網絡來檢測文本區域 (第139-142行)
解碼預測並應用NMS(第146和147行)。我們使用 此腳本中先前定義的decode_predictions函數和我的imutils non_max_suppression 便利函數。
環繞邊界框並在框架上繪製它們 (第150-159行)。這涉及通過先前收集的比率來縮放框。
從那裏我們將關閉幀處理循環以及腳本本身
我們 在循環的每次迭代中更新我們的 fps計數器(第162行),以便在我們突破循環時計算並顯示計時(第173-175行)。
我們在165行顯示EAST文本檢測的輸出 並處理按鍵(第166-170行)。如果按“q”進行“退出”,我們就會 跳出 循環並繼續清理並釋放指針。
視頻文本檢測結果
要使用OpenCV將文本檢測應用於視頻,請務必使用此博客文章的“下載”部分。
從那裏,打開一個終端並執行以下命令(這將啓動你的網絡攝像頭,因爲我們沒有 通過命令行參數提供 – 視頻)
12 $ python text_detection_video.py --east frozen_east_text_detection.pb
我們的OpenCV文本檢測視頻腳本可實現7-9 FPS。
這個結果並不像作者報道的那麼快(13 FPS); 但是,我們使用的是Python而不是C ++。通過使用Cython優化for循環,我們應該能夠提高文本檢測管道的速度。
摘要
在今天的博客文章中,我們學習瞭如何使用OpenCV的新EAST文本檢測器來自動檢測自然場景圖像中是否存在文本。
文本檢測器不僅準確,而且能夠在720p圖像上以大約13 FPS的近實時速度運行。
爲了提供OpenCV的EAST文本檢測器的實現,我需要轉換OpenCV的C ++示例 ; 然而,我遇到了許多挑戰,例如:
無法使用OpenCV的 NMSBox 進行非最大值抑制,而是必須使用imutils的實現 。
由於缺少RotatedRect的Python綁定,無法計算真正的旋轉邊界框 。
我試圖讓我的實現儘可能接近OpenCV,但請記住,我的版本與C ++版本沒有100%完全相同,並且可能會有一兩個小問題需要隨着時間的推移而解決。
無論如何,我希望你喜歡今天的OpenCV文本檢測教程!
源代碼下載
https://hotdog29.com/?p=620
文章轉自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/2018/09/24/opencv-face-recognition/,2009年7月11日訪問
相關文章
YOLO 對象檢測 OpenCV 源代碼
代碼下載
dlib 使用OpenCV,Python和深度學習進行人臉識別 源代碼
OpenCV 人臉識別 源代碼
OpenCV教程 ,資源和指南
張貼在技術博客、opencv標籤:opencv、深度學習、文本檢測、EAST編輯