請直接看原文
文本檢測 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編輯