国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[譯]OpenCV Text Detection (EAST text detector)

VincentFF / 1881人閱讀

摘要:的文本檢測器是一種基于新穎架構和訓練模式的深度學習模型。深度學習文本檢測器圖文本檢測全卷積網絡的結構等人的圖。隨著和的發布,我們現在可以使用一種名為的基于深度學習的文本檢測器,它基于等人的年論文一種高效精確的場景文本檢測器。

by Adrian Rosebrock on August 20, 2018 in Deep Learning, Optical Character Recognition (OCR), Tutorials
點擊這里下載這篇文章的源代碼

在本教程中,您將學習如何使用EAST文本檢測器使用OpenCV檢測自然場景圖像中的文本。
OpenCV的EAST文本檢測器是一種基于新穎架構和訓練模式的深度學習模型。它能夠(1)在720p圖像上以13 FPS接近實時運行,并且(2)獲得最先進的文本檢測精度。
在本教程的其余部分,您將學習如何使用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場景文本檢測器即使在模糊和模糊的圖像中也能檢測到。

EAST深度學習文本檢測器


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

隨著OpenCV 3.4.2和OpenCV 4的發布,我們現在可以使用一種名為EAST的基于深度學習的文本檢測器,它基于Zhou等人的2017年論文“EAST:一種高效精確的場景文本檢測器”。
我們將算法稱為“EAST”,因為它是:高效且準確的場景文本檢測管道。
據作者說,EAST管道能夠在720p圖像上以任意方向預測文本的單詞和行,并且能夠以13 FPS運行。
也許最重要的是,由于深度學習模型是端到端的,因此可以回避其他文本檢測器通常應用的計算上昂貴的子算法,包括候選聚合和字分區。
為了構建和訓練這樣一種深度學習模型,EAST方法采用了新穎,精心設計的損失函數。
有關EAST的更多詳細信息,包括架構設計和培訓方法,請務必參考作者的出版物。

項目結構

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

$ tree --dirsfirst
.
├── images
│   ├── car_wash.png
│   ├── lebron_james.jpg
│   └── sign.jpg
├── frozen_east_text_detection.pb
├── text_detection.py
└── text_detection_video.py

1 directory, 6 files

請注意,我在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的EAST文本檢測器,因此如果您尚未安裝OpenCV 3.4.2或更高版本在您的系統上,請參閱我的OpenCV安裝指南。

接下來,確保您的系統上還安裝/升級了imutils:
pip install --upgrade imutils
此時您的系統已配置好,因此打開text_detection.py并插入以下代碼:

首先,我們在第2-6行導入我們所需的包和模塊。值得注意的是,我們從imutils.object_detection導入NumPy,OpenCV和我的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列表:
第一層是我們的輸出sigmoid激活,它給出了包含文本或不包含文本的區域的概率。
第二層是表示圖像“幾何”的輸出要素圖 - 我們將能夠使用此幾何來導出輸入圖像中文本的邊界框坐標

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

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

然后我們通過將其轉換為第50行和第51行的blob來準備我們的圖像。要了解有關此步驟的更多信息,請參閱深度學習:OpenCV的blobFromImage如何工作。

要預測文本,我們可以簡單地將blob設置為輸入并調用net.forward(第53和54行)。這些行被抓取時間戳包圍,以便我們可以在第58行打印經過的時間。

通過將layerNames作為參數提供給net.forward,我們正在指示OpenCV返回我們感興趣的兩個特征映射:
輸出幾何圖用于導出輸入圖像中文本的邊界框坐標
類似地,分數圖包含包含文本的給定區域的概率

我們需要逐個遍歷每個值:

我們首先抓住得分量的維度(第63行),然后初始化兩個列表:
rects:存儲文本區域的邊界框(x,y) - 坐標
置信度:存儲與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行的分數和幾何體積,這將是一個很好的例子,你可以利用Cython來大大加速你的管道。我已經展示了Cython在Fast中的強大功能,使用OpenCV和Python優化了"for"像素循環。
OpenCV文本檢測結果

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

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

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

$ python text_detection.py --image images/lebron_james.jpg 
    --east frozen_east_text_detection.pb
[INFO] loading EAST text detector...
[INFO] text detection took 0.142082 seconds

您的結果應類似于以下圖像:


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

勒布朗詹姆斯確定了三個文本區域。

現在讓我們嘗試檢測商業標志的文字:

$ python text_detection.py --image images/car_wash.png 
    --east frozen_east_text_detection.pb
[INFO] loading EAST text detector...
[INFO] text detection took 0.142295 seconds


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

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

$ python text_detection.py --image images/sign.jpg 
    --east frozen_east_text_detection.pb
[INFO] loading EAST text detector...
[INFO] text detection took 0.141675 seconds


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

此場景包含西班牙停車標志。 OpenCV和EAST正確檢測到“ALTO”這個詞。

正如您所知,EAST非常準確且相對較快,每張圖像的平均時間約為0.14秒。

使用OpenCV在視頻中進行文本檢測

現在我們已經看到了如何檢測圖像中的文本,讓我們繼續使用OpenCV檢測視頻中的文本。

這個解釋非常簡短;有關詳細信息,請參閱上一節。

打開text_detection_video.py并插入以下代碼:

# import the necessary packages
from imutils.video import VideoStream
from imutils.video import FPS
from imutils.object_detection import non_max_suppression
import numpy as np
import argparse
import imutils
import time
import cv2

我們首先導入我們的包。我們將使用VideoStream訪問網絡攝像頭和FPS以對此腳本的每秒幀數進行基準測試。其他所有內容與上一節中的相同。

為方便起見,讓我們定義一個新函數來解碼我們的預測函數 - 它將被重用于每個幀并使我們的循環更清晰

def decode_predictions(scores, geometry):
    # grab the number of rows and columns from the scores volume, then
    # initialize our set of bounding box rectangles and corresponding
    # confidence scores
    (numRows, numCols) = scores.shape[2:4]
    rects = []
    confidences = []

    # loop over the number of rows
    for y in range(0, numRows):
        # extract the scores (probabilities), followed by the
        # geometrical data used to derive potential bounding box
        # coordinates that surround text
        scoresData = scores[0, 0, y]
        xData0 = geometry[0, 0, y]
        xData1 = geometry[0, 1, y]
        xData2 = geometry[0, 2, y]
        xData3 = geometry[0, 3, y]
        anglesData = geometry[0, 4, y]

        # loop over the number of columns
        for x in range(0, numCols):
            # if our score does not have sufficient probability,
            # ignore it
            if scoresData[x] < args["min_confidence"]:
                continue

            # compute the offset factor as our resulting feature
            # maps will be 4x smaller than the input image
            (offsetX, offsetY) = (x * 4.0, y * 4.0)

            # extract the rotation angle for the prediction and
            # then compute the sin and cosine
            angle = anglesData[x]
            cos = np.cos(angle)
            sin = np.sin(angle)

            # use the geometry volume to derive the width and height
            # of the bounding box
            h = xData0[x] + xData2[x]
            w = xData1[x] + xData3[x]

            # compute both the starting and ending (x, y)-coordinates
            # for the text prediction bounding box
            endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x]))
            endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x]))
            startX = int(endX - w)
            startY = int(endY - h)

            # add the bounding box coordinates and probability score
            # to our respective lists
            rects.append((startX, startY, endX, endY))
            confidences.append(scoresData[x])

    # return a tuple of the bounding boxes and associated confidences
    return (rects, confidences)

我們定義了decode_predictions函數。此函數用于提取:
文本區域的邊界框坐標
以及文本區域檢測的概率

這個專用函數將使代碼在以后的腳本中更易于閱讀和管理。

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-east", "--east", type=str, required=True,
    help="path to input EAST text detector")
ap.add_argument("-v", "--video", type=str,
    help="path to optinal input video file")
ap.add_argument("-c", "--min-confidence", type=float, default=0.5,
    help="minimum probability required to inspect a region")
ap.add_argument("-w", "--width", type=int, default=320,
    help="resized image width (should be multiple of 32)")
ap.add_argument("-e", "--height", type=int, default=320,
    help="resized image height (should be multiple of 32)")
args = vars(ap.parse_args())

我們的命令行參數解析:
--east:EAST場景文本檢測器模型文件路徑。
--video:輸入視頻的路徑。可選 - 如果提供了視頻路徑,則不會使用網絡攝像頭。
--min-confidence:確定文本的概率閾值。可選,默認值= 0.5。
--width:調整后的圖像寬度(必須是32的倍數)。可選,默認值= 320。
--height:調整后的圖像高度(必須是32的倍數)。可選,默認值= 320。

上一節中僅使用圖像的腳本(就命令行參數而言)的主要變化是我用--video替換了--image參數。

重要提示:EAST文本要求輸入圖像尺寸為32的倍數,因此如果您選擇調整--width和--height值,請確保它們是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將文本檢測應用于視頻,請務必使用此博客文章的“下載”部分。

從那里,打開一個終端并執行以下命令(這將啟動你的網絡攝像頭,因為我們沒有通過命令行參數提供--video):

$ python text_detection_video.py --east frozen_east_text_detection.pb 
[INFO] loading EAST text detector...
[INFO] starting video stream...
[INFO] elasped time: 59.76
[INFO] approx. FPS: 8.85

我們的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文本檢測教程!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43439.html

相關文章

  • []OpenCV OCR and text recognition with Tesseract

    摘要:納入深度學習模型來進一步提升準確率只是時間問題,事實上,這個時間已經到來。最新版本支持基于深度學習的,準確率顯著提高。該函數使用基于深度學習的文本檢測器來檢測不是識別圖像中的文本區域。高效使用概率最高的文本區域,刪除其他重疊區域。 By Adrian Rosebrock on September 17, 2018 in Deep Learning, Optical Character ...

    gnehc 評論0 收藏0
  • 】讓你的電腦學會同時識別多個物體

    摘要:工作原理以前的檢測系統通過重復利用分類器和定位器來實現目標識別。修改檢測閾值缺省情況下,只顯示信心大于的對象。用法如下這個,呵呵,不完美把白馬識別成綿羊了,把黑狗識別成奶牛了,但確實很快。 原標題:YOLO: Real-Time Object Detection英文原文:https://pjreddie.com/darknet/... 強烈推薦(TED視頻):https://www....

    duan199226 評論0 收藏0
  • 】讓你的電腦學會同時識別多個物體

    摘要:工作原理以前的檢測系統通過重復利用分類器和定位器來實現目標識別。修改檢測閾值缺省情況下,只顯示信心大于的對象。用法如下這個,呵呵,不完美把白馬識別成綿羊了,把黑狗識別成奶牛了,但確實很快。 原標題:YOLO: Real-Time Object Detection英文原文:https://pjreddie.com/darknet/... 強烈推薦(TED視頻):https://www....

    leap_frog 評論0 收藏0
  • 10分鐘學會使用YOLO及Opencv實現目標檢測(下)|附源碼

    摘要:摘要本文介紹使用和完成視頻流目標檢測,代碼解釋詳細,附源碼,上手快。將應用于視頻流對象檢測首先打開文件并插入以下代碼同樣,首先從導入相關數據包和命令行參數開始。 摘要:?本文介紹使用opencv和yolo完成視頻流目標檢測,代碼解釋詳細,附源碼,上手快。 在上一節內容中,介紹了如何將YOLO應用于圖像目標檢測中,那么在學會檢測單張圖像后,我們也可以利用YOLO算法實現視頻流中的目標檢...

    songze 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<