0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用EAST文本檢測(cè)器在自然場(chǎng)景下檢測(cè)文本

DPVg_AI_era ? 來源:未知 ? 作者:李倩 ? 2018-08-24 08:40 ? 次閱讀

眾所周知,自然場(chǎng)景下的文本檢測(cè)是極具挑戰(zhàn)性的。本文便使用OpenCV和EAST文本檢測(cè)器在自然場(chǎng)景下對(duì)文本進(jìn)行了檢測(cè),包括圖像中的文本檢測(cè),以及視頻中的文本檢測(cè),并對(duì)其原理與實(shí)現(xiàn)過程做了詳盡的描述。

在本教程中,您將學(xué)習(xí)如何使用EAST文本檢測(cè)器在自然場(chǎng)景下檢測(cè)文本。

本教程的主要目的是教讀者利用OpenCV和EAST文本檢測(cè)器來檢測(cè)文本。

運(yùn)行環(huán)境:

EAST文本檢測(cè)器需要OpenCV3.4.2或更高版本,有需要的讀者可以先安裝OpenCV。

主要內(nèi)容:

教程第一部分分析為何在自然場(chǎng)景下進(jìn)行文本檢測(cè)的挑戰(zhàn)性是如此之高。

接下來簡要探討EAST文本檢測(cè)器,為何使用,算法新在何處,并附上相關(guān)論文供讀者參考。

最后提供 Python + OpenCV文本檢測(cè)實(shí)現(xiàn)方式,供讀者在自己的應(yīng)用中使用。

為何在自然場(chǎng)景下進(jìn)行文本檢測(cè)的挑戰(zhàn)性是如此之高

由于光照條件、圖片質(zhì)量以及目標(biāo)非線性排列等因素的限制,自然場(chǎng)景下的文本檢測(cè)任務(wù)難度較大

受約束的受控環(huán)境中的文本檢測(cè)任務(wù)通??梢允褂没趩l(fā)式的方法來完成,比如利用梯度信息或文本通常被分成段落呈現(xiàn),并且字符一般都是成直線排列等信息。

但自然場(chǎng)景下文本檢測(cè)則不同,而且更具挑戰(zhàn)性。

由于廉價(jià)數(shù)碼相機(jī)和智能手機(jī)的普及,我們需要高度關(guān)注圖像拍攝時(shí)的條件。Celine Mancas-Thillou和Bernard Gosselin在其2017年發(fā)表的優(yōu)秀論文《自然場(chǎng)景文本理解》中描述了的自然場(chǎng)景文本檢測(cè)面對(duì)的主要挑戰(zhàn):

圖像/傳感器噪音:手持式相機(jī)的傳感器噪音通常要高于傳統(tǒng)掃描儀。此外,廉價(jià)相機(jī)通常會(huì)介入原始傳感器的像素以產(chǎn)生真實(shí)的顏色。

視角:自然場(chǎng)景中的文本存在不平行的觀測(cè)角度問題,使文本更難以識(shí)別。

模糊:不受控制的環(huán)境下,文本往往會(huì)變模糊,尤其是如果最終用戶使用的智能手機(jī)的拍攝穩(wěn)定性不足時(shí),問題就更明顯。

照明條件:我們無法對(duì)自然場(chǎng)景圖像中的照明條件做出任何假設(shè)??赡茉诮咏诎档臈l件下,相機(jī)上的閃光燈可能會(huì)亮起,也可能在艷陽高照的條件下,使整個(gè)圖像趨于飽和。

分辨率:每臺(tái)圖像捕捉設(shè)備都是不同的,可能存在分辨率過低的攝像機(jī)拍出的圖像。

非紙質(zhì)對(duì)象:大多數(shù)(但不是全部)紙張是不反光的。而自然場(chǎng)景中的文字可能是反光的,比如徽標(biāo),標(biāo)志等。

非平面目標(biāo):想象文字印在瓶子上的情況,瓶子表面上的文本會(huì)扭曲和變形。雖然我們自己仍可以輕松地“檢測(cè)”并閱讀文本,但算法做起來就會(huì)很困難。我們需要能夠處理這種情況的用例。

處理?xiàng)l件未知:我們不能使用任何先驗(yàn)信息來為算法提供關(guān)于文本所在位置的“線索”。

OpenCV’sEAST文本檢測(cè)器甚至可以識(shí)別模糊圖片中的文字

EAST深度學(xué)習(xí)文本檢測(cè)器

EAST文本檢測(cè)器全卷積網(wǎng)絡(luò)結(jié)構(gòu)

EAST是一種基于深度學(xué)習(xí)的文本探測(cè)器,即高效、準(zhǔn)確的場(chǎng)景文本檢測(cè)(Efficient andAccurateSceneText detectionpipeline)。更重要的是,深度學(xué)習(xí)模型是端對(duì)端的,因此可能繞開一般文本識(shí)別器用的計(jì)算成本高昂的子算法,比如候選對(duì)象聚合和詞匯分割等。

項(xiàng)目結(jié)構(gòu)

首先使用Tree終端命令來瀏覽項(xiàng)目結(jié)構(gòu):

1$tree--dirsfirst 2. 3├──images 4│├──car_wash.png 5│├──lebron_james.jpg 6│└──sign.jpg 7├──frozen_east_text_detection.pb 8├──text_detection.py 9└──text_detection_video.py10111directory,6files

在images/目錄下已有三張樣圖,讀者可以自己添加更多圖片。

我們使用兩個(gè).py文件:

text_detection.py: 檢測(cè)靜態(tài)圖像中的文本

text_detection_video.py: 檢測(cè)網(wǎng)絡(luò)攝像頭或輸入圖像文件中的文本

兩個(gè)腳本都使用EAST模型 (frozen_east_text_detection.pb)

注意事項(xiàng)

本文中介紹的實(shí)例基于OpenCV的官方C++實(shí)例,在轉(zhuǎn)換為Python的過程中可能會(huì)遇見一些問題。

比如,Python中沒有Point2f和RotatedRect函數(shù),所以不能完全再現(xiàn)C++環(huán)境下的實(shí)現(xiàn)。

其次,NMSBoxes函數(shù)不返回Python綁定的任何值,最終導(dǎo)致OpenCV報(bào)錯(cuò)。 NMSBoxes函數(shù)可以在OpenCV3.4.2中使用,但我無法對(duì)其進(jìn)行詳盡的測(cè)試。

使用OpenCV實(shí)現(xiàn)文本檢測(cè)器的構(gòu)建

在開始之前,我想再次指出,您至少需要在系統(tǒng)上安裝OpenCV 3.4.2(或OpenCV 4)才能使用OpenCV的EAST文本檢測(cè)器,因此如果您還沒有安裝OpenCV 3.4.2或更高版本,請(qǐng)參閱后文的OpenCV安裝指南。

接下來,安裝或升級(jí)你的系統(tǒng)中的imutils。

1$pipinstall--upgradeimutils

此時(shí),系統(tǒng)設(shè)置已經(jīng)完成,打開text_detection.py,輸入以下代碼:

1#importthenecessarypackages 2fromimutils.object_detectionimportnon_max_suppression 3importnumpyasnp 4importargparse 5importtime 6importcv2 7 8#constructtheargumentparserandparsethearguments 9ap=argparse.ArgumentParser()10ap.add_argument("-i","--image",type=str,11help="pathtoinputimage")12ap.add_argument("-east","--east",type=str,13help="pathtoinputEASTtextdetector")14ap.add_argument("-c","--min-confidence",type=float,default=0.5,15help="minimumprobabilityrequiredtoinspectaregion")16ap.add_argument("-w","--width",type=int,default=320,17help="resizedimagewidth(shouldbemultipleof32)")18ap.add_argument("-e","--height",type=int,default=320,19help="resizedimageheight(shouldbemultipleof32)")20args=vars(ap.parse_args())

首先,我們?cè)诘?-6行導(dǎo)入所需的包和模塊。注意,我們從imutils.object_detection導(dǎo)入NumPy,OpenCV和non_max_suppression實(shí)現(xiàn)。

然后我們繼續(xù)解析第9-20行的五個(gè)命令行參數(shù)

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

--east:EAST場(chǎng)景文本檢測(cè)器模型文件路徑。

--min-confidence:確定文本的概率閾值??蛇x,默認(rèn)值= 0.5。

--width:調(diào)整后的圖像寬度 - 必須是32的倍數(shù)??蛇x,默認(rèn)值= 320。

--height:調(diào)整后的圖像高度 - 必須是32的倍數(shù)??蛇x,默認(rèn)值= 320。

重要提示:EAST文本要求輸入圖像尺寸為32的倍數(shù),因此如果您選擇調(diào)整圖像的寬度和高度值,請(qǐng)確保這兩個(gè)值是32的倍數(shù)!

然后加載圖像并調(diào)整大?。?/p>

22#loadtheinputimageandgrabtheimagedimensions23image=cv2.imread(args["image"])24orig=image.copy()25(H,W)=image.shape[:2]2627#setthenewwidthandheightandthendeterminetheratioinchange28#forboththewidthandheight29(newW,newH)=(args["width"],args["height"])30rW=W/float(newW)31rH=H/float(newH)3233#resizetheimageandgrabthenewimagedimensions34image=cv2.resize(image,(newW,newH))35(H,W)=image.shape[:2]

第23和24行加載并復(fù)制輸入圖像。

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

然后我們調(diào)整圖像大小,忽略縱橫比(第34行)。

為了使用OpenCV和EAST深度學(xué)習(xí)模型執(zhí)行文本檢測(cè),我們需要提取兩層的輸出特征映射:

37#definethetwooutputlayernamesfortheEASTdetectormodelthat38#weareinterested--thefirstistheoutputprobabilitiesandthe39#secondcanbeusedtoderivetheboundingboxcoordinatesoftext40layerNames=[41"feature_fusion/Conv_7/Sigmoid",42"feature_fusion/concat_3"]

我們?cè)?0-42行構(gòu)建了layerNames的表:

第一層是我們的輸出sigmoid激活,它給出了包含文本或不包含文本的區(qū)域的概率。

第二層是表示圖像“幾何”的輸出要素圖。我們使用它來導(dǎo)出輸入圖像中文本的邊界框坐標(biāo)。

加載OpenCV的EAST文本檢測(cè)器:

44#loadthepre-trainedEASTtextdetector45print("[INFO]loadingEASTtextdetector...")46net=cv2.dnn.readNet(args["east"])4748#constructablobfromtheimageandthenperformaforwardpassof49#themodeltoobtainthetwooutputlayersets50blob=cv2.dnn.blobFromImage(image,1.0,(W,H),51(123.68,116.78,103.94),swapRB=True,crop=False)52start=time.time()53net.setInput(blob)54(scores,geometry)=net.forward(layerNames)55end=time.time()5657#showtiminginformationontextprediction58print("[INFO]textdetectiontook{:.6f}seconds".format(end-start))

我們使用cv2.dnn.readNet將神經(jīng)網(wǎng)絡(luò)加載到內(nèi)存中,方法是將路徑傳遞給EAST檢測(cè)器作為第46行的參數(shù)。

然后我們通過將其轉(zhuǎn)換為第50行和第51行的blob來準(zhǔn)備我們的圖像。要了解有關(guān)此步驟的更多信息,請(qǐng)參閱深度學(xué)習(xí):OpenCV的blobFromImage如何工作。

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

通過將layerNames作為參數(shù)提供給net.forward,我們指示OpenCV返回我們感興趣的兩個(gè)特征映射:

輸出幾何圖用于導(dǎo)出輸入圖像中文本的邊界框坐標(biāo)

類似地,分?jǐn)?shù)圖包含文本的給定區(qū)域的概率:

我們需要逐一循環(huán)這些值:

60#grabthenumberofrowsandcolumnsfromthescoresvolume,then61#initializeoursetofboundingboxrectanglesandcorresponding62#confidencescores63(numRows,numCols)=scores.shape[2:4]64rects=[]65confidences=[]6667#loopoverthenumberofrows68foryinrange(0,numRows):69#extractthescores(probabilities),followedbythegeometrical70#datausedtoderivepotentialboundingboxcoordinatesthat71#surroundtext72scoresData=scores[0,0,y]73xData0=geometry[0,0,y]74xData1=geometry[0,1,y]75xData2=geometry[0,2,y]76xData3=geometry[0,3,y]77anglesData=geometry[0,4,y]

我們首先抓取score的維度(第63行),然后初始化兩個(gè)列表:

rects:存儲(chǔ)文本區(qū)域的邊界框(x,y)坐標(biāo)

置信度:存儲(chǔ)與每個(gè)邊界框相關(guān)的概率

我們稍后將對(duì)這些區(qū)域使用non-maximasuppression。

在第68行開始循環(huán)。

第72-77行提取當(dāng)前行的分?jǐn)?shù)和幾何數(shù)據(jù)y。

接下來,我們遍歷當(dāng)前所選行的每個(gè)列索引

79#loopoverthenumberofcolumns 80forxinrange(0,numCols): 81#ifourscoredoesnothavesufficientprobability,ignoreit 82ifscoresData[x]

對(duì)于每一行,我們開始循環(huán)第80行的列。

我們需要通過忽略概率不高的區(qū)域來過濾弱文本檢測(cè)(第82行和第83行)。

當(dāng)圖像通過網(wǎng)絡(luò)時(shí),EAST文本檢測(cè)器自然地減少了體積大小——我們的體積實(shí)際上比輸入圖像小4倍,所以我們乘以4,使坐標(biāo)回到原始圖像。

我已經(jīng)包含了如何在第91-93行提取角度數(shù)據(jù);然而,正如我在前一節(jié)中提到的,不能像在C++中那樣構(gòu)造一個(gè)旋轉(zhuǎn)的邊界框——如果你想要處理這個(gè)任務(wù),那么從第91行角度開始將是你的第一步。

第97-105行派生出文本區(qū)域的邊框坐標(biāo)。

然后我們分別更新rects和confi數(shù)據(jù)庫列表(第109行和第110行)。

最后一步是將非最大值抑制應(yīng)用于我們的邊界框以抑制弱重疊邊界框,然后顯示結(jié)果文本預(yù)測(cè):

112#applynon-maximasuppressiontosuppressweak,overlappingbounding113#boxes114boxes=non_max_suppression(np.array(rects),probs=confidences)115116#loopovertheboundingboxes117for(startX,startY,endX,endY)inboxes:118#scaletheboundingboxcoordinatesbasedontherespective119#ratios120startX=int(startX*rW)121startY=int(startY*rH)122endX=int(endX*rW)123endY=int(endY*rH)124125#drawtheboundingboxontheimage126cv2.rectangle(orig,(startX,startY),(endX,endY),(0,255,0),2)127128#showtheoutputimage129cv2.imshow("TextDetection",orig)130cv2.waitKey(0)

正如我在上一節(jié)中提到的,我無法在我的OpenCV 4安裝(cv2.dnn.NMSBoxes)中使用非最大值抑制,因?yàn)镻ython綁定沒有返回值,最終導(dǎo)致OpenCV出錯(cuò)。我無法完全在OpenCV 3.4.2中進(jìn)行測(cè)試,因此它可以在v3.4.2中運(yùn)行。

相反,我使用了imutils包中提供的非最大值抑制實(shí)現(xiàn)(第114行)。結(jié)果仍然很好;但是,我無法將我的輸出與NMSBoxes函數(shù)進(jìn)行比較,看它們是否相同。

第117-126行循環(huán)遍歷邊界框,將坐標(biāo)縮放到原始圖像尺寸,并將輸出繪制到orig圖像。直到按下一個(gè)按鍵為止,原始圖像將一直顯示(129-130行)。

最后一個(gè)實(shí)驗(yàn)需要注意的是,我們的兩個(gè)嵌套for循環(huán)用于循環(huán)第68-110行上的分?jǐn)?shù)和幾何體(geometry volume),這是一個(gè)很好的例子,說明你可以利用Cython極大地加快pipeline的速度。我已經(jīng)用OpenCV和Python演示了Cython在快速優(yōu)化“for”像素循環(huán)中的強(qiáng)大功能。

OpenCV文本檢測(cè)器結(jié)果

在終端可以執(zhí)行一下命令(注意兩個(gè)命令行參數(shù)):

1$pythontext_detection.py--imageimages/lebron_james.jpg2--eastfrozen_east_text_detection.pb3[INFO]loadingEASTtextdetector...4[INFO]textdetectiontook0.142082seconds

結(jié)果應(yīng)該如下圖所示:

文本檢測(cè)器成功識(shí)別出籃球巨星勒布朗·詹姆斯球衣上的文字

詹姆斯身上有三個(gè)文本區(qū)域。

現(xiàn)在讓我們嘗試檢測(cè)業(yè)務(wù)標(biāo)志的文本:

1$pythontext_detection.py--imageimages/car_wash.png2--eastfrozen_east_text_detection.pb3[INFO]loadingEASTtextdetector...4[INFO]textdetectiontook0.142295seconds

使用EAST文本檢測(cè)器很容易識(shí)別出路邊洗車店的招牌文字

最后,我們將嘗試一個(gè)路標(biāo):

1$pythontext_detection.py--imageimages/sign.jpg2--eastfrozen_east_text_detection.pb3[INFO]loadingEASTtextdetector...4[INFO]textdetectiontook0.141675seconds

基于Python和OpenCV的場(chǎng)景文本檢測(cè)器和EAST文本檢測(cè)器成功檢測(cè)出西班牙語的停車指示路牌

該場(chǎng)景中包含一個(gè)西班牙的停車標(biāo)志。“ALTO”可以準(zhǔn)確的被OpenCV和EAST識(shí)別出來。

如你所知,EAST非常精確,且相對(duì)較快,平均每張圖片耗時(shí)約0.14秒。

OpenCV在視頻中進(jìn)行文本檢測(cè)

我們可以基于上述工作,進(jìn)一步使用OpenCV在視頻中進(jìn)行文本檢測(cè)。

開啟text_detection_video.py,然后插入如下代碼:

1#importthenecessarypackages2fromimutils.videoimportVideoStream3fromimutils.videoimportFPS4fromimutils.object_detectionimportnon_max_suppression5importnumpyasnp6importargparse7importimutils8importtime9importcv2

首先,我們導(dǎo)入一些包。我們將使用VideoStream訪問網(wǎng)絡(luò)攝像頭并用FPS來為這個(gè)腳本測(cè)試每秒幀數(shù)。其他內(nèi)容與前一節(jié)相同。

為方便起見,定義一個(gè)新函數(shù)來為我們的預(yù)測(cè)函數(shù)進(jìn)行解碼 - 它將被重用于每個(gè)幀并使循環(huán)更清晰:

11defdecode_predictions(scores,geometry):12#grabthenumberofrowsandcolumnsfromthescoresvolume,then13#initializeoursetofboundingboxrectanglesandcorresponding14#confidencescores15(numRows,numCols)=scores.shape[2:4]16rects=[]17confidences=[]1819#loopoverthenumberofrows20foryinrange(0,numRows):21#extractthescores(probabilities),followedbythe22#geometricaldatausedtoderivepotentialboundingbox23#coordinatesthatsurroundtext24scoresData=scores[0,0,y]25xData0=geometry[0,0,y]26xData1=geometry[0,1,y]27xData2=geometry[0,2,y]28xData3=geometry[0,3,y]29anglesData=geometry[0,4,y]3031#loopoverthenumberofcolumns32forxinrange(0,numCols):33#ifourscoredoesnothavesufficientprobability,34#ignoreit35ifscoresData[x]

在第11行,我們定義decode_prediction函數(shù)。該函數(shù)用于提取:

文本區(qū)域的邊界框坐標(biāo);

文本區(qū)域檢測(cè)的概率。

這個(gè)專用函數(shù)將使代碼更易于閱讀和管理。

讓我們來解析命令行參數(shù):

68#constructtheargumentparserandparsethearguments69ap=argparse.ArgumentParser()70ap.add_argument("-east","--east",type=str,required=True,71help="pathtoinputEASTtextdetector")72ap.add_argument("-v","--video",type=str,73help="pathtooptinalinputvideofile")74ap.add_argument("-c","--min-confidence",type=float,default=0.5,75help="minimumprobabilityrequiredtoinspectaregion")76ap.add_argument("-w","--width",type=int,default=320,77help="resizedimagewidth(shouldbemultipleof32)")78ap.add_argument("-e","--height",type=int,default=320,79help="resizedimageheight(shouldbemultipleof32)")80args=vars(ap.parse_args())

69-80行代碼中命令行參數(shù)解析:

--east:EAST場(chǎng)景文本檢測(cè)器模型文件路徑。

--video:輸入視頻的路徑(可選)。如果提供了視頻路徑,那么網(wǎng)絡(luò)攝像頭將不會(huì)被使用。

--Min-confidence:確定文本的概率閾值(可選)。default=0.5。

--width:調(diào)整圖像寬度(必須是32的倍數(shù),可選)。default=320。

--Height:調(diào)整圖像高度(必須是32的倍數(shù),可選)。default=320。

與上一節(jié)中僅使用圖像的腳本(就命令行參數(shù)而言)的不同之處在于,用視頻替換了圖像參數(shù)。

接下里,我們將進(jìn)行重要的初始化工作:

82#initializetheoriginalframedimensions,newframedimensions,83#andratiobetweenthedimensions84(W,H)=(None,None)85(newW,newH)=(args["width"],args["height"])86(rW,rH)=(None,None)8788#definethetwooutputlayernamesfortheEASTdetectormodelthat89#weareinterested--thefirstistheoutputprobabilitiesandthe90#secondcanbeusedtoderivetheboundingboxcoordinatesoftext91layerNames=[92"feature_fusion/Conv_7/Sigmoid",93"feature_fusion/concat_3"]9495#loadthepre-trainedEASTtextdetector96print("[INFO]loadingEASTtextdetector...")97net=cv2.dnn.readNet(args["east"])

第84-86行上的高度、寬度和比率初始化將允許我們稍后適當(dāng)?shù)乜s放邊界框。

我們定義了輸出層的名稱,并在第91-97行加載了預(yù)先訓(xùn)練好的EAST文本檢測(cè)器。

下面的代碼設(shè)置了我們的視頻流和每秒幀數(shù)計(jì)數(shù)器:

99#ifavideopathwasnotsupplied,grabthereferencetothewebcam100ifnotargs.get("video",False):101print("[INFO]startingvideostream...")102vs=VideoStream(src=0).start()103time.sleep(1.0)104105#otherwise,grabareferencetothevideofile106else:107vs=cv2.VideoCapture(args["video"])108109#starttheFPSthroughputestimator110fps=FPS().start()

我們的視頻流設(shè)置為:

一個(gè)攝像頭(100-103行)

或一個(gè)視頻文件(106-107行)

我們?cè)诘?10行初始化每秒幀計(jì)數(shù)器,并開始循環(huán)傳入幀:

112#loopoverframesfromthevideostream113whileTrue:114#grabthecurrentframe,thenhandleifweareusinga115#VideoStreamorVideoCaptureobject116frame=vs.read()117frame=frame[1]ifargs.get("video",False)elseframe118119#checktoseeifwehavereachedtheendofthestream120ifframeisNone:121break122123#resizetheframe,maintainingtheaspectratio124frame=imutils.resize(frame,width=1000)125orig=frame.copy()126127#ifourframedimensionsareNone,westillneedtocomputethe128#ratioofoldframedimensionstonewframedimensions129ifWisNoneorHisNone:130(H,W)=frame.shape[:2]131rW=W/float(newW)132rH=H/float(newH)133134#resizetheframe,thistimeignoringaspectratio135frame=cv2.resize(frame,(newW,newH))

我們從113行開始在視頻/攝像頭框架上進(jìn)行循環(huán)。

我們的框架調(diào)整了大小,保持了縱橫比(第124行)。從129-132行中獲取維度并計(jì)算比例。然后我們?cè)俅握{(diào)整幀的大小(必須是32的倍數(shù)),這一次忽略了長寬比,因?yàn)槲覀円呀?jīng)存儲(chǔ)了用于安全維護(hù)(safe keeping)的比率(第135行)。

推理和繪制文本區(qū)域邊框發(fā)生在以下幾行:

137#constructablobfromtheframeandthenperformaforwardpass138#ofthemodeltoobtainthetwooutputlayersets139blob=cv2.dnn.blobFromImage(frame,1.0,(newW,newH),140(123.68,116.78,103.94),swapRB=True,crop=False)141net.setInput(blob)142(scores,geometry)=net.forward(layerNames)143144#decodethepredictions,thenapplynon-maximasuppressionto145#suppressweak,overlappingboundingboxes146(rects,confidences)=decode_predictions(scores,geometry)147boxes=non_max_suppression(np.array(rects),probs=confidences)148149#loopovertheboundingboxes150for(startX,startY,endX,endY)inboxes:151#scaletheboundingboxcoordinatesbasedontherespective152#ratios153startX=int(startX*rW)154startY=int(startY*rH)155endX=int(endX*rW)156endY=int(endY*rH)157158#drawtheboundingboxontheframe159cv2.rectangle(orig,(startX,startY),(endX,endY),(0,255,0),2)

在這一代碼塊中:

創(chuàng)建一個(gè)blob并通過網(wǎng)絡(luò)傳遞文本區(qū)域(第139-142行);

解碼預(yù)測(cè)并應(yīng)用NMS(第146行和第147行)。使用之前在這個(gè)腳本中定義的decode_forecasts函數(shù)和imutils non_max_suppression函數(shù)。

循環(huán)包圍框并在框架上繪制它們(150-159行)。這涉及到按前面收集的比率縮放方框。

而后我們將關(guān)閉框架處理循環(huán)以及腳本本身:

161#updatetheFPScounter162fps.update()163164#showtheoutputframe165cv2.imshow("TextDetection",orig)166key=cv2.waitKey(1)&0xFF167168#ifthe`q`keywaspressed,breakfromtheloop169ifkey==ord("q"):170break171172#stopthetimeranddisplayFPSinformation173fps.stop()174print("[INFO]elaspedtime:{:.2f}".format(fps.elapsed()))175print("[INFO]approx.FPS:{:.2f}".format(fps.fps()))176177#ifweareusingawebcam,releasethepointer178ifnotargs.get("video",False):179vs.stop()180181#otherwise,releasethefilepointer182else:183vs.release()184185#closeallwindows186cv2.destroyAllWindows()

我們?cè)谘h(huán)的每次迭代中更新fps計(jì)數(shù)器(第162行),以便當(dāng)我們跳出循環(huán)時(shí)可以計(jì)算和顯示計(jì)時(shí)(第173-175行)。

我們?cè)诘?65行顯示了EAST文本檢測(cè)的輸出,并處理按鍵(第166-170行)。如果“q”鍵代表“退出”,并被按下,我們將跳出循環(huán),繼續(xù)清理和釋放指針。

視頻文本檢測(cè)結(jié)果

要使用OpenCV對(duì)視頻進(jìn)行文本檢測(cè),請(qǐng)務(wù)必點(diǎn)擊本文底部“下載內(nèi)容”鏈接獲取相應(yīng)資源。

而后,打開終端并執(zhí)行以下命令(將會(huì)開啟攝像頭,因?yàn)橥ㄟ^命令行參數(shù)不提供- -video):

1$pythontext_detection_video.py--eastfrozen_east_text_detection.pb2[INFO]loadingEASTtextdetector...3[INFO]startingvideostream...4[INFO]elaspedtime:59.765[INFO]approx.FPS:8.85

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 檢測(cè)器
    +關(guān)注

    關(guān)注

    1

    文章

    847

    瀏覽量

    47555
  • EAST
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    9492
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5422

    瀏覽量

    120587

原文標(biāo)題:10分鐘上手,OpenCV自然場(chǎng)景文本檢測(cè)(Python代碼+實(shí)現(xiàn))

文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ECD檢測(cè)器的原理是什么?

    ECD的發(fā)現(xiàn)是一系列射線電離檢測(cè)器發(fā)展的結(jié)果。1952 年首次出現(xiàn)了 β-射線橫截面電離檢測(cè)器;1958 年 Lovelock 提出 β-射線氬電離檢測(cè)器
    發(fā)表于 10-16 09:01

    場(chǎng)強(qiáng)突變檢測(cè)器的性能很優(yōu)秀嗎?

    文本介紹的場(chǎng)強(qiáng)突變檢測(cè)器其性能優(yōu)于許多其他同類的探測(cè)儀。
    發(fā)表于 04-15 06:34

    【KV260視覺入門套件試用體驗(yàn)】七、VITis AI字符和文本檢測(cè)(OCR&Textmountain)

    技術(shù),包括傳統(tǒng)文檔圖像識(shí)別與場(chǎng)景文字識(shí)別技術(shù)。 計(jì)算機(jī)視覺領(lǐng)域,文本檢測(cè)是其重要的一個(gè)子任務(wù)。文本
    發(fā)表于 09-26 16:31

    新的文本隱寫分析方法

    通過對(duì)自然文本的建模和特征統(tǒng)計(jì)發(fā)現(xiàn),自然文本中,文本單詞平均長度與該
    發(fā)表于 04-11 09:39 ?16次下載

    基于詞組學(xué)習(xí)的視頻文本檢測(cè)方法

    提出一種以詞組作為模式識(shí)別對(duì)象的中英文視頻文本檢測(cè)算法,其根據(jù)視頻中文本的筆畫結(jié)構(gòu)特點(diǎn)和聚集特性構(gòu)造一個(gè)18維的特征向量,利用支持向量機(jī)將視頻幀分為文本和非
    發(fā)表于 04-18 09:51 ?27次下載

    電子俘獲檢測(cè)器檢測(cè)方法

    電子俘獲檢測(cè)器檢測(cè)方法 電子俘獲檢測(cè)器(ECD)是靈敏度最高的氣相色譜檢測(cè)器,同時(shí)又是最早出現(xiàn)的選擇性檢測(cè)器。它僅對(duì)那些能俘
    發(fā)表于 11-28 21:00 ?1356次閱讀
    電子俘獲<b class='flag-5'>檢測(cè)器</b>及<b class='flag-5'>檢測(cè)</b>方法

    檢測(cè)器,光檢測(cè)器是什么?

    檢測(cè)器,光檢測(cè)器是什么?  光信號(hào)經(jīng)過光纖傳輸?shù)竭_(dá)接收端后,接收端有一個(gè)接收光信號(hào)的元件。但是由于目前我們對(duì)光的認(rèn)
    發(fā)表于 02-27 17:44 ?1026次閱讀

    電荷注入檢測(cè)器(CID),電荷注入檢測(cè)器原理

    電荷注入檢測(cè)器(CID),電荷注入檢測(cè)器原理 CID檢測(cè)器發(fā)明于1973年。CID 讀出方法是將電荷檢測(cè)單元內(nèi)部移動(dòng),
    發(fā)表于 03-02 10:28 ?5563次閱讀

    檢測(cè)一段文本是否為全中文

    易語言是一門以中文作為程序代碼編程語言學(xué)習(xí)例程:易語言-檢測(cè)一段文本是否為全中文
    發(fā)表于 06-06 17:01 ?4次下載

    文本數(shù)據(jù)分析:文本挖掘還是自然語言處理?

    自然語言處理(NLP)關(guān)注的是人類的自然語言與計(jì)算機(jī)設(shè)備之間的相互關(guān)系。NLP是計(jì)算機(jī)語言學(xué)的重要方面之一,它同樣也屬于計(jì)算機(jī)科學(xué)和人工智能領(lǐng)域。而文本挖掘和NLP的存在領(lǐng)域類似,它關(guān)注的是識(shí)別
    的頭像 發(fā)表于 04-10 14:58 ?1.8w次閱讀
    <b class='flag-5'>文本</b>數(shù)據(jù)分析:<b class='flag-5'>文本</b>挖掘還是<b class='flag-5'>自然</b>語言處理?

    一篇包羅萬象的場(chǎng)景文本檢測(cè)算法綜述

    提到文本檢測(cè)識(shí)別,我們會(huì)聯(lián)想到的一個(gè)詞就是 OCR,OCR 是光學(xué)字符識(shí)別 Optical Character Recognition的簡稱,是指對(duì)文本資料的圖像文件進(jìn)行分析識(shí)別處理,獲取文字的過程 [19]。
    的頭像 發(fā)表于 08-21 14:18 ?5905次閱讀

    VOCs檢測(cè)器是什么,有哪些應(yīng)用

    電子捕獲檢測(cè)器(ECD)是靈敏度最高的氣相色譜檢測(cè)器,同時(shí)又是最早出現(xiàn)的選擇性檢測(cè)器。
    的頭像 發(fā)表于 12-21 16:44 ?3610次閱讀
    VOCs<b class='flag-5'>檢測(cè)器</b>是什么,有哪些應(yīng)用

    一篇包羅萬象的場(chǎng)景文本檢測(cè)算法綜述

    提到文本檢測(cè)識(shí)別,我們會(huì)聯(lián)想到的一個(gè)詞就是 OCR,OCR 是光學(xué)字符識(shí)別 Optical Character Recognition的簡稱,是指對(duì)文本資料的圖像文件進(jìn)行分析識(shí)別處理,獲取文字的過程 [19]。
    的頭像 發(fā)表于 04-15 14:52 ?3547次閱讀
    一篇包羅萬象的<b class='flag-5'>場(chǎng)景</b><b class='flag-5'>文本</b><b class='flag-5'>檢測(cè)</b>算法綜述

    基于注意力機(jī)制的復(fù)雜場(chǎng)景文本檢測(cè)方法

    統(tǒng)是不同的視覺粒度下完成文本檢測(cè)任務(wù)的,而這些自底向上的傳統(tǒng)方法的性能很大程度上依賴于低級(jí)特征的檢測(cè),難以魯棒地適應(yīng)不同粒度
    發(fā)表于 05-18 15:14 ?5次下載

    利用視覺語言模型對(duì)檢測(cè)器進(jìn)行預(yù)訓(xùn)練

    預(yù)訓(xùn)練通常被用于自然語言處理以及計(jì)算機(jī)視覺領(lǐng)域,以增強(qiáng)主干網(wǎng)絡(luò)的特征提取能力,達(dá)到加速訓(xùn)練和提高模型泛化性能的目的。該方法亦可以用于場(chǎng)景文本檢測(cè)當(dāng)中,如最早的使用ImageNet預(yù)訓(xùn)練
    的頭像 發(fā)表于 08-08 15:33 ?1251次閱讀