深度學習文本定位


文字檢測可以使用的方法:形態學、MSER、CTPN、SegLink、EAST等。

可以使用的深度學習文本行定位:CTPN、YOLO、EAST、PSE、DB等。

文字檢測的目的是為了文字識別。文字檢測是文字識別的必經之路。文字檢測的場景分為兩種,一種是簡單場景,另一種是復雜場景。其中,簡單場景的文字檢測較為簡單,例如像書本掃描、屏幕截圖、或者清晰度高、規整的照片等;而復雜場景,主要是指自然場景,情況比較復雜,例如像街邊的廣告牌、產品包裝盒、設備上的說明、商標等等,存在着背景復雜、光線忽明忽暗、角度傾斜、扭曲變形、清晰度不足等各種情況,文字檢測的難度更大。

 

 

 

 

1、形態學操作

 1 # -*- coding: utf-8 -*-
 2 
 3 import cv2
 4 import numpy as np
 5 
 6 # 讀取圖片
 7 imagePath = 'D:/documents/pycharm/text_line_detect/test.jpg'
 8 img = cv2.imread(imagePath)
 9 cv2.imshow('org', img)
10 # 轉化成灰度圖
11 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
12 
13 cv2.imshow('gray', gray)
14 # cv2.waitKey(0)
15 # 利用Sobel邊緣檢測生成二值圖
16 sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)
17 # 二值化
18 ret, binary = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
19 cv2.imshow('binary', binary)
20 # 膨脹、腐蝕
21 element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 9))
22 element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (24, 6))
23 
24 # 膨脹一次,讓輪廓突出
25 dilation = cv2.dilate(binary, element2, iterations=1)
26 cv2.imshow('dilation', dilation)
27 # 腐蝕一次,去掉細節
28 erosion = cv2.erode(dilation, element1, iterations=1)
29 cv2.imshow('erosion', erosion)
30 # 再次膨脹,讓輪廓明顯一些
31 # dilation2 = cv2.dilate(erosion, element2, iterations=2)
32 # cv2.imshow('dilation2', dilation2)
33 #  查找輪廓和篩選文字區域
34 region = []
35 contours, hierarchy = cv2.findContours(erosion, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
36 for i in range(len(contours)):
37     cnt = contours[i]
38 
39     # 計算輪廓面積,並篩選掉面積小的
40     area = cv2.contourArea(cnt)
41     if (area < 600):
42         continue
43 
44     # 找到最小的矩形
45     rect = cv2.minAreaRect(cnt)
46     print ("rect is: ")
47     print (rect)
48 
49     # box是四個點的坐標
50     box = cv2.boxPoints(rect)
51     box = np.int0(box)
52 
53     # 計算高和寬
54     height = abs(box[0][1] - box[2][1])
55     width = abs(box[0][0] - box[2][0])
56 
57     # 根據文字特征,篩選那些太細的矩形,留下扁的
58     if (height > width * 1.3):
59         continue
60 
61     region.append(box)
62 
63 # 繪制輪廓
64 for box in region:
65     cv2.drawContours(img, [box], 0, (0, 255, 0), 2)
66 
67 cv2.imshow('img', img)
68 cv2.waitKey(0)
69 cv2.destroyAllWindows()

 

 

 

 文本框坐標:

rect is: 
((341.5, 428.5), (65.0, 15.0), 0.0)
rect is: 
((114.0, 428.5), (84.0, 15.0), -0.0)
rect is: 
((227.5, 350.5), (59.0, 13.0), -0.0)
rect is: 
((227.0, 327.5), (332.0, 13.0), -0.0)
rect is: 
((228.49996948242188, 303.4999694824219), (328.99993896484375, 12.999998092651367), 0.0)
rect is: 
((227.99996948242188, 252.0), (175.99996948242188, 15.999998092651367), 0.0)
rect is: 
((231.27243041992188, 192.2310333251953), (66.85161590576172, 51.90342712402344), -85.2363510131836)
rect is: 
((370.0, 39.0), (126.0, 10.0), -0.0)
rect is: 
((63.5, 39.5), (21.0, 127.0), -90.0)

 優缺點:這種方法的特點是計算簡單、處理起來非常快,但在文字檢測中的應用場景非常有限,例如如果圖片是拍照的,光線有明有暗或者角度有傾斜、紙張變形等,則該方法需要不斷重新調整才能檢測,而且效果也不會很好。

 

 

2、簡單場景:MSER+NMS檢測法

MSER(Maximally Stable Extremal Regions,最大穩定極值區域)是一個較為流行的文字檢測傳統方法(相對於基於深度學習的AI文字檢測而言),在傳統OCR中應用較廣,在某些場景下,又快又准。

MSER算法是在2002提出來的,主要是基於分水嶺的思想進行檢測。分水嶺算法思想來源於地形學,將圖像當作自然地貌,圖像中每一個像素的灰度值表示該點的海拔高度,每一個局部極小值及區域稱為集水盆地,兩個集水盆地之間的邊界則為分水嶺。

 MSER的處理過程是這樣的,對一幅灰度圖像取不同的閾值進行二值化處理,閾值從0至255遞增,這個遞增的過程就好比是一片土地上的水面不斷上升,隨着水位的不斷上升,一些較低的區域就會逐漸被淹沒,從天空鳥瞰,大地變為陸地、水域兩部分,並且水域部分在不斷擴大。在這個“漫水”的過程中,圖像中的某些連通區域變化很小,甚至沒有變化,則該區域就被稱為最大穩定極值區域。在一幅有文字的圖像上,文字區域由於顏色(灰度值)是一致的,因此在水平面(閾值)持續增長的過程中,一開始不會被“淹沒”,直到閾值增加到文字本身的灰度值時才會被“淹沒”。該算法可以用來粗略地定位出圖像中的文字區域位置。

 

# -*- coding: utf-8 -*-

import cv2

# 讀取圖片
imagePath = 'D:/documents/pycharm/text_line_detect/test111.jpg'
img = cv2.imread(imagePath)
cv2.imshow('org', img)
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
vis = img.copy()
orig = img.copy()
cv2.imshow('gray', gray)
# 調用 MSER 算法
mser = cv2.MSER_create()
regions, _ = mser.detectRegions(gray)  # 獲取文本區域
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions]  # 繪制文本區域
cv2.polylines(img, hulls, 1, (0, 255, 0))
cv2.imshow('img', img)

# cv2.waitKey(0)
# 將不規則檢測框處理成矩形框
keep = []
for c in hulls:
    x, y, w, h = cv2.boundingRect(c)
    keep.append([x, y, x + w, y + h])
    cv2.rectangle(vis, (x, y), (x + w, y + h), (255, 255, 0), 1)
cv2.imshow("hulls", vis)
cv2.waitKey(0)

檢測效果如下圖:

檢測后的結果是存在各種不規則的檢測框形狀,通過對這些框的坐標作重新處理,變成一個個的矩形框。如下圖:

 

 從上圖可以看出,檢測框有很多是重疊的,大框里面有小框,框與框之間有交叉,有些框只是圈出了漢字的偏旁或者某些筆划,而我們期望是能圈出文字的外邊框,這樣便於后續的文字識別。為了處理這些很多重疊的大小框,一般會采用NMS方法(Non Maximum Suppression,非極大值抑制),也就是抑制非極大值的元素,即抑制不是最大尺寸的框,相當於去除大框中包含的小框,達到去除重復區域,找到最佳檢測位置的目的。

NMS算法的主要流程如下:

  • 將所有框按置信度得分進行排序(如果邊框沒有置信度得分,也可以按坐標進行排序)
  • 取其中得分最高的框出來
  • 遍歷該框與其余框的重疊面積(IoU)
  • 刪除IoU大於某個閾值的框(閾值可按需設定,例如0.3、0.5、0.8等)
  • 取下一個得分最高的框出來,重復以上過程

經過以上步驟,最后剩下的就是不包含重疊部分的文本檢測框了。核心代碼如下:

 

 接下來要介紹的方法,就主要是基於深度學習的AI文字檢測法,可應用於復雜的自然場景中。

3、復雜場景:CTPN檢測法

CTPN(Detecting Text in Natural Image with Connectionist Text Proposal Network,基於連接預選框網絡的文本檢測)是基於卷積神經網絡和循環神經網絡的文本檢測方法,其基本做法是生成一系列適當尺寸的文本proposals(預選框)進行文本行的檢測,示意圖如下,具體的技術原理請見之前的文章(文章:大話文本檢測經典模型:CTPN

 

 

 

 

參考博客:https://www.csdn.net/gather_25/MtTaggxsNjU4OS1ibG9n.html

參考博客:https://www.cnblogs.com/skyfsm/p/10054386.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM