眾所周知,自然場(chǎng)景下的文本檢測(cè)是極具挑戰(zhàn)性的。本文便使用OpenCV和EAST文本檢測(cè)器在自然場(chǎng)景下對(duì)文本進(jìn)行了檢測(cè),包括圖像中的文本檢測(cè),以及視頻中的文本檢測(cè),并對(duì)其原理與實(shí)現(xiàn)過(guò)程做了詳盡的描述。
在本教程中,您將學(xué)習(xí)如何使用EAST文本檢測(cè)器在自然場(chǎng)景下檢測(cè)文本。
本教程的主要目的是教讀者利用OpenCV和EAST文本檢測(cè)器來(lái)檢測(cè)文本。
運(yùn)行環(huán)境:
EAST文本檢測(cè)器需要OpenCV3.4.2或更高版本,有需要的讀者可以先安裝OpenCV。
主要內(nèi)容:
教程第一部分分析為何在自然場(chǎng)景下進(jìn)行文本檢測(cè)的挑戰(zhàn)性是如此之高。
接下來(lái)簡(jiǎ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ā)式的方法來(lái)完成,比如利用梯度信息或文本通常被分成段落呈現(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è)角度問(wèn)題,使文本更難以識(shí)別。
模糊:不受控制的環(huán)境下,文本往往會(huì)變模糊,尤其是如果最終用戶使用的智能手機(jī)的拍攝穩(wěn)定性不足時(shí),問(wèn)題就更明顯。
照明條件:我們無(wú)法對(duì)自然場(chǎng)景圖像中的照明條件做出任何假設(shè)??赡茉诮咏诎档臈l件下,相機(jī)上的閃光燈可能會(huì)亮起,也可能在艷陽(yáng)高照的條件下,使整個(gè)圖像趨于飽和。
分辨率:每臺(tái)圖像捕捉設(shè)備都是不同的,可能存在分辨率過(guò)低的攝像機(jī)拍出的圖像。
非紙質(zhì)對(duì)象:大多數(shù)(但不是全部)紙張是不反光的。而自然場(chǎng)景中的文字可能是反光的,比如徽標(biāo),標(biāo)志等。
非平面目標(biāo):想象文字印在瓶子上的情況,瓶子表面上的文本會(huì)扭曲和變形。雖然我們自己仍可以輕松地“檢測(cè)”并閱讀文本,但算法做起來(lái)就會(huì)很困難。我們需要能夠處理這種情況的用例。
處理?xiàng)l件未知:我們不能使用任何先驗(yàn)信息來(lái)為算法提供關(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終端命令來(lái)瀏覽項(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的過(guò)程中可能會(huì)遇見一些問(wèn)題。
比如,Python中沒(méi)有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中使用,但我無(wú)法對(duì)其進(jìn)行詳盡的測(cè)試。
使用OpenCV實(shí)現(xiàn)文本檢測(cè)器的構(gòu)建
在開始之前,我想再次指出,您至少需要在系統(tǒng)上安裝OpenCV 3.4.2(或OpenCV 4)才能使用OpenCV的EAST文本檢測(cè)器,因此如果您還沒(méi)有安裝OpenCV 3.4.2或更高版本,請(qǐng)參閱后文的OpenCV安裝指南。
接下來(lái),安裝或升級(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:確定文本的概率閾值。可選,默認(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ū)域的概率。
第二層是表示圖像“幾何”的輸出要素圖。我們使用它來(lái)導(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ù)。
然后我們通過(guò)將其轉(zhuǎn)換為第50行和第51行的blob來(lái)準(zhǔn)備我們的圖像。要了解有關(guān)此步驟的更多信息,請(qǐng)參閱深度學(xué)習(xí):OpenCV的blobFromImage如何工作。
要預(yù)測(cè)文本,我們可以簡(jiǎn)單地將blob設(shè)置為輸入并調(diào)用net.forward(第53和54行)。這些行被抓取時(shí)間戳包圍,以便我們可以在第58行打印經(jīng)過(guò)的時(shí)間。
通過(guò)將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。
接下來(lái),我們遍歷當(dāng)前所選行的每個(gè)列索引:
79#loopoverthenumberofcolumns 80forxinrange(0,numCols): 81#ifourscoredoesnothavesufficientprobability,ignoreit 82ifscoresData[x]
對(duì)于每一行,我們開始循環(huán)第80行的列。
我們需要通過(guò)忽略概率不高的區(qū)域來(lái)過(guò)濾弱文本檢測(cè)(第82行和第83行)。
當(dāng)圖像通過(guò)網(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ù)庫(kù)列表(第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é)中提到的,我無(wú)法在我的OpenCV 4安裝(cv2.dnn.NMSBoxes)中使用非最大值抑制,因?yàn)镻ython綁定沒(méi)有返回值,最終導(dǎo)致OpenCV出錯(cuò)。我無(wú)法完全在OpenCV 3.4.2中進(jìn)行測(cè)試,因此它可以在v3.4.2中運(yùn)行。
相反,我使用了imutils包中提供的非最大值抑制實(shí)現(xiàn)(第114行)。結(jié)果仍然很好;但是,我無(wú)法將我的輸出與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è)很好的例子,說(shuō)明你可以利用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è)出西班牙語(yǔ)的停車指示路牌
該場(chǎng)景中包含一個(gè)西班牙的停車標(biāo)志?!癆LTO”可以準(zhǔn)確的被OpenCV和EAST識(shí)別出來(lái)。
如你所知,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èn)網(wǎng)絡(luò)攝像頭并用FPS來(lái)為這個(gè)腳本測(cè)試每秒幀數(shù)。其他內(nèi)容與前一節(jié)相同。
為方便起見,定義一個(gè)新函數(shù)來(lái)為我們的預(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ù)將使代碼更易于閱讀和管理。
讓我們來(lái)解析命令行參數(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ù)),這一次忽略了長(zhǎng)寬比,因?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并通過(guò)網(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)橥ㄟ^(guò)命令行參數(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
-
檢測(cè)器
+關(guān)注
關(guān)注
1文章
870瀏覽量
47792 -
EAST
+關(guān)注
關(guān)注
0文章
22瀏覽量
9528 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5516瀏覽量
121583
原文標(biāo)題:10分鐘上手,OpenCV自然場(chǎng)景文本檢測(cè)(Python代碼+實(shí)現(xiàn))
文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
ECD檢測(cè)器的原理是什么?
場(chǎng)強(qiáng)突變檢測(cè)器的性能很優(yōu)秀嗎?
【KV260視覺入門套件試用體驗(yàn)】七、VITis AI字符和文本檢測(cè)(OCR&Textmountain)
新的文本隱寫分析方法
基于詞組學(xué)習(xí)的視頻文本檢測(cè)方法
電子俘獲檢測(cè)器及檢測(cè)方法
![電子俘獲<b class='flag-5'>檢測(cè)器</b>及<b class='flag-5'>檢測(cè)</b>方法](https://file1.elecfans.com//web2/M00/A4/7B/wKgZomUMNGaAAcfpAADgO9fCSBo729.jpg)
光檢測(cè)器,光檢測(cè)器是什么?
電荷注入檢測(cè)器(CID),電荷注入檢測(cè)器原理
檢測(cè)一段文本是否為全中文
文本數(shù)據(jù)分析:文本挖掘還是自然語(yǔ)言處理?
![<b class='flag-5'>文本</b>數(shù)據(jù)分析:<b class='flag-5'>文本</b>挖掘還是<b class='flag-5'>自然</b>語(yǔ)言處理?](https://file.elecfans.com/web1/M00/4E/DF/pIYBAFrMYTeAaS4EAAAvXnkcrbE398.png)
一篇包羅萬(wàn)象的場(chǎng)景文本檢測(cè)算法綜述
一篇包羅萬(wàn)象的場(chǎng)景文本檢測(cè)算法綜述
![一篇包羅萬(wàn)象的<b class='flag-5'>場(chǎng)景</b><b class='flag-5'>文本</b><b class='flag-5'>檢測(cè)</b>算法綜述](https://file.elecfans.com/web1/M00/EB/26/pIYBAGB3406ASm9sAACkYTLv-SQ044.jpg)
評(píng)論