目錄
- 目標檢測:
- 文本檢測:
- 檢測難點:
- 檢測方法:
- 基于回歸的文本檢測
- 水平文本檢測
- 任意角度文本檢測
- 彎曲文本檢測
- 基于分割的文本檢測
- 基于回歸的文本檢測
- 代碼示例
- 可視化文本檢測預測
- DB文本檢測模型構建
- backbone網路
- FPN網路
- Head網路
目標檢測:
不僅要解決定位問題,還要解決目標分類問題,給定影像或者視頻,找出目標的位置(box),并給出目標的類別;

文本檢測:
給定輸入影像或者視頻,找出文本的區域,可以是單字符位置或者整個文本行位置;

檢測難點:
- 自然場景中文本具有多樣性:文本檢測受到文字顏色、大小、字體、形狀、方向、語言、以及文本長度的影響;
- 復雜的背景和干擾;文本檢測受到影像失真,模糊,低解析度,陰影,亮度等因素的影響;
- 文本密集甚至重疊會影響文字的檢測;
- 文字存在區域一致性,文本行的一小部分,也可視為是獨立的文本;

檢測方法:
目前較為流行的文本檢測演算法可以大致分為基于回歸和基于分割的兩大類文本檢測演算法
- 基于回歸
優點:對規則形狀文本檢測效果較好
缺點:無法準確檢測不規則形狀文本 - 基于分割
優點:對不同形狀文本的檢測效果都比較好
缺點:后處理復雜耗時多,重疊文本效果差


基于回歸的文本檢測
基于回歸文本檢測方法和目標檢測演算法的方法相似,文本檢測方法只有兩個類別,影像中的文本視為待檢測的目標,其余部分視為背景,
水平文本檢測
早期基于深度學習的文本檢測演算法是從目標檢測的方法改進而來,支持水平文本檢測,比如Textbox演算法基于SSD (Single Shot MultiBox Detector)演算法改進而來,CTPN (connection text proposal network)根據二階段目標檢測Fast-RCNN演算法改進而來,
TextBoxes 演算法根據一階段目標檢測器SSD調整,將默認文本框更改為適應文本方向和寬高比的規格的四邊形,提供了一種端對端訓練的文字檢測方法,并且無需復雜的后處理,
- 采用更大長寬比的預選框
- 卷積核從3x3變成了1x5,更適合長文本檢測
- 采用多尺度輸入

TextBoxes整體網路結構如圖1所示,在VGG-16的基礎上新增9個額外的卷積層,共28層,類似于SSD,在不同的層之后都有輸出層,稱之為 text-box layers, text-box layers的輸出通道是72(2個通道預測分數,4個通道預測位置偏移量,共12個anchor(這里說的anchor就是SSD中講的default box),所以共(2+4)*12=72個通道),整合所有的 text-box layers的輸出結果后再使用 NMS (non maximum suppression - 即非極大值抑制) 處理,就得到了最終的結果,
CTPN 基于Fast-RCNN 演算法,擴展RPN模塊并且設計了基于CRNN的模塊讓整個網路從卷積特征中檢測到文本序列,二階段的方法通過ROI Pooling獲得了更準確的特征定位,但是TextBoxes和CTPN只支持檢測橫向文本,

任意角度文本檢測
TextBoxes++ 在TextBoxes基礎上進行改進,支持檢測任意角度的文本,從結構上來說,不同于TextBoxes,TextBoxes++針對多角度文本進行檢測,首先修改預選框的寬高比,調整寬高比aspect ratio為1、2、3、5、1/2、1/3、1/5,其次是將
\(1?5\)的卷積核改為 \(3?5\),更好的學習傾斜文本的特征;最后,TextBoxes++ 的輸出旋轉框的表示資訊,

EAST 針對傾斜文本的定位問題,提出了two-stage的文本檢測方法,包含 FCN特征提取和NMS部分,EAST提出了一種新的文本檢測pipline結構,可以端對端訓練并且支持檢測任意朝向的文本,并且具有結構簡單,性能高的特點,FCN支持輸出傾斜的矩形框和水平框,可以自由選擇輸出格式,
- 如果輸出檢測形狀為RBox,則輸出Box旋轉角度以及AABB文本形狀資訊,AABB表示到文本框上下左右邊的偏移,RBox可以旋轉矩形的文本,
- 如果輸出檢測框為四點框,則輸出的最后一個維度為8個數字,表示從四邊形的四個角頂點的位置偏移,該輸出方式可以預測不規則四邊形的文本,
考慮到FCN輸出的文本框是比較冗余的,比如一個文本區域的鄰近的像素生成的框重合度較高,但不是同一個文本生成的檢測框,重合度都很小,因此EAST提出先按行合并預測框,最后再把剩下的四邊形用原始的NMS篩選,

MOST 提出TFAM模塊動態的調整粗粒度的檢測結果的感受野,另外提出PA-NMS根據位置資訊合并可靠的檢測預測結果,此外,訓練中還提出 Instance-wise IoU 損失函式,用于平衡訓練,以處理不同尺度的文本實體,該方法可以和EAST方法結合,在檢測極端長寬比和不同尺度的文本有更好的檢測效果和性能,

彎曲文本檢測
利用回歸的方法解決彎曲文本的檢測問題,一個簡單的思路是用多點坐標描述彎曲文本的邊界多邊形,然后直接預測多邊形的頂點坐標
CTD 提出了直接預測彎曲文本14個頂點的邊界多邊形,網路中利用Bi-LSTM 層以細化頂點的預測坐標,實作了基于回歸方法的彎曲文本檢測,

LOMO 針對長文本和彎曲文本問題,提出迭代的優化文本定位特征獲取更精細的文本定位,該方法包括三個部分,坐標回歸模塊DR,迭代優化模塊IRM以及任意形狀表達模塊SEM,分別用于生成文本大致區域,迭代優化文本定位特征,預測文本區域、文本中心線以及文本邊界,迭代的優化文本特征可以更好的解決長文本定位問題以及獲得更精確的文本區域定位,

Contournet 基于提出對文本輪廓點建模獲取彎曲文本檢測框,該方法首先使用Adaptive-RPN獲取文本區域的proposal特征,然后設計了區域正交紋理感知LOTM模塊學習水平與豎直方向的紋理特征,并用輪廓點表示,最后,通過同時考慮兩個正交方向上的特征回應,利用Point Re-Scoring演算法可以有效地濾除強單向或弱正交激活的預測,最終文本輪廓可以用一組高質量的輪廓點表示出來,

PCR 提出漸進式的坐標回歸處理彎曲文本檢測問題,總體分為三個階段,首先大致檢測到文本區域,獲得文本框,另外通過所設計的Contour Localization Mechanism預測文本最小包圍框的角點坐標,然后通過疊加多個CLM模塊和RCLM模塊預測得到彎曲文本,該方法利用文本輪廓資訊聚合得到豐富的文本輪廓特征表示,不僅能抑制冗余的噪聲點對坐標回歸的影響,還能更精確的定位文本區域,

基于分割的文本檢測
基于回歸的方法雖然在文本檢測上取得了很好的效果,但是對解決彎曲文本往往難以得到平滑的文本包圍曲線,并且模型較為復雜不具備性能優勢,于是研究者們提出了基于影像分割的文本分割方法,先從像素層面做分類,判別每一個像素點是否屬于一個文本目標,得到文本區域的概率圖,通過后處理方式得到文本分割區域的包圍曲線,

此類方法通常是基于分割的方法實作文本檢測,基于分割的方法對不規則形狀的文本檢測有著天然的優勢,基于分割的文本檢測方法主體思想為,通過分割方法得到影像中文本區域,再利用opencv,polygon等后處理得到文本區域的最小包圍曲線,
Pixellink采用分割的方法解決文本檢測問題,分割物件為文本區域,將同屬于一個文本行(單詞)中的像素鏈接在一起來分割文本,直接從分割結果中提取文本邊界框,無需位置回歸就能達到基于回歸的文本檢測的效果,但是基于分割的方法存在一個問題,對于位置相近的文本,文本分割區域容易出現“粘連“問題,Wu, Yue等人提出分割文本的同時,學習文本的邊界位置,用于更好的區分文本區域,另外Tian等人提出將同一文本的像素映射到映射空間,在映射空間中令統一文本的映射向量距離相近,不同文本的映射向量距離變遠,

MSR 針對文本檢測的多尺度問題,提出提取相同影像的多個scale的特征,然后將這些特征融合并上采樣到原圖尺寸,網路最后預測文本中心區域、文本中心區域每個點到最近的邊界點的x坐標偏移和y坐標偏移,最終可以得到文本區域的輪廓坐標集合,

針對基于分割的文本演算法難以區分相鄰文本的問題,PSENet 提出漸進式的尺度擴張網路學習文本分割區域,預測不同收縮比例的文本區域,并逐個擴大檢測到的文本區域,該方法本質上是邊界學習方法的變體,可以有效解決任意形狀相鄰文本的檢測問題,

假設用了PSENet后處理用了3個不同尺度的kernel,如上圖s1,s2,s3所示,首先,從最小kernel s1開始,計算文本分割區域的連通域,得到(b),然后,對連通域沿著上下左右做尺度擴張,對于擴張區域屬于s2但不屬于s1的像素,進行歸類,遇到沖突點時,采用“先到先得”原則,重復尺度擴張的操作,最終可以得到不同文本行的獨立的分割區域,
Seglink++ 針對彎曲文本和密集文本問題,提出了一種文本塊單元之間的吸引關系和排斥關系的表征,然后設計了一種最小生成樹演算法進行單元組合得到最終的文本檢測框,并提出instance-aware 損失函式使Seglink++方法可以端對端訓練,

雖然分割方法解決了彎曲文本的檢測問題,但是復雜的后處理邏輯以及預測速度也是需要優化的目標,
PAN 針對文本檢測預測速度慢的問題,從網路設計和后處理方面進行改進,提升演算法性能,首先,PAN使用了輕量級的ResNet18作為Backbone,另外設計了輕量級的特征增強模塊FPEM和特征融合模塊FFM增強Backbone提取的特征,在后處理方面,采用像素聚類方法,沿著預測的文本中心(kernel)四周合并與kernel的距離小于閾值d的像素,PAN保證高精度的同時具有更快的預測速度,

DBNet 針對基于分割的方法需要使用閾值進行二值化處理而導致后處理耗時的問題,提出了可學習閾值并巧妙地設計了一個近似于階躍函式的二值化函式,使得分割網路在訓練的時候能端對端的學習文本分割的閾值,自動調節閾值不僅帶來精度的提升,同時簡化了后處理,提高了文本檢測的性能,

FCENet 提出將文本包圍曲線用傅立葉變換的引數表示,由于傅里葉系數表示在理論上可以擬合任意的封閉曲線,通過設計合適的模型預測基于傅里葉變換的任意形狀文本包圍框表示,從而實作了自然場景文本檢測中對于高度彎曲文本實體的檢測精度的提升,

代碼示例
可視化文本檢測預測
# 1. 從paddleocr中import PaddleOCR類
from paddleocr import PaddleOCR
import numpy as np
import cv2
import matplotlib.pyplot as plt
# 2. 宣告PaddleOCR類
ocr = PaddleOCR()
img_path = './PaddleOCR/doc/imgs/12.jpg'
# 3. 執行預測
result = ocr.ocr(img_path, rec=False)
print(f"The predicted text box of {img_path} are follows.")
print(result)
# 4. 可視化檢測結果
image = cv2.imread(img_path)
boxes = [line[0] for line in result]
for box in result:
box = np.reshape(np.array(box), [-1, 1, 2]).astype(np.int64)
image = cv2.polylines(np.array(image), [box], True, (255, 0, 0), 2)
# 畫出讀取的圖片
plt.figure(figsize=(10, 10))
plt.imshow(image)
DB文本檢測模型構建
DB文本檢測模型可以分為三個部分:
- Backbone網路,負責提取影像的特征
- FPN網路,特征金字塔結構增強特征
- Head網路,計算文本區域概率圖
# 首次運行需要打開下一行的注釋,下載PaddleOCR代碼
#!git clone https://gitee.com/paddlepaddle/PaddleOCR
# 安裝PaddleOCR第三方依賴
!pip install --upgrade pip
!pip install -r requirements.txt
backbone網路
DB文本檢測網路的Backbone部分采用的是影像分類網路,論文中使用了ResNet50
import os
# 加快訓練速度,采用MobileNetV3 large結構作為backbone,
from ppocr.modeling.backbones.det_mobilenet_v3 import MobileNetV3
import paddle
fake_inputs = paddle.randn([1, 3, 640, 640], dtype="float32")
# 1. 宣告Backbone
model_backbone = MobileNetV3()
model_backbone.eval()
# 2. 執行預測
outs = model_backbone(fake_inputs)
# 3. 列印網路結構
print(model_backbone)
# 4. 列印輸出特征形狀
for idx, out in enumerate(outs):
print("The index is ", idx, "and the shape of output is ", out.shape)
FPN網路
特征金字塔結構FPN是一種卷積網路來高效提取圖片中各維度特征的常用方法,
FPN網路的輸入為Backbone部分的輸出,輸出特征圖的高度和寬度為原圖的四分之一,假設輸入影像的形狀為[1, 3, 640, 640],FPN輸出特征的高度和寬度為[160, 160]
import paddle
# 1. 從PaddleOCR中import DBFPN
from ppocr.modeling.necks.db_fpn import DBFPN
# 2. 獲得Backbone網路輸出結果
fake_inputs = paddle.randn([1, 3, 640, 640], dtype="float32")
model_backbone = MobileNetV3()
in_channles = model_backbone.out_channels
# 3. 宣告FPN網路
model_fpn = DBFPN(in_channels=in_channles, out_channels=256)
# 4. 列印FPN網路
print(model_fpn)
# 5. 計算得到FPN結果輸出
outs = model_backbone(fake_inputs)
fpn_outs = model_fpn(outs)
# 6. 列印FPN輸出特征形狀
print(f"The shape of fpn outs {fpn_outs.shape}")
Head網路
計算文本區域概率圖,文本區域閾值圖以及文本區域二值圖,
DB Head網路會在FPN特征的基礎上作上采樣,將FPN特征由原圖的四分之一大小映射到原圖大小,
# 1. 從PaddleOCR中imort DBHead
from ppocr.modeling.heads.det_db_head import DBHead
import paddle
# 2. 計算DBFPN網路輸出結果
fake_inputs = paddle.randn([1, 3, 640, 640], dtype="float32")
model_backbone = MobileNetV3()
in_channles = model_backbone.out_channels
model_fpn = DBFPN(in_channels=in_channles, out_channels=256)
outs = model_backbone(fake_inputs)
fpn_outs = model_fpn(outs)
# 3. 宣告Head網路
model_db_head = DBHead(in_channels=256)
# 4. 列印DBhead網路
print(model_db_head)
# 5. 計算Head網路的輸出
db_head_outs = model_db_head(fpn_outs)
print(f"The shape of fpn outs {fpn_outs.shape}")
print(f"The shape of DB head outs {db_head_outs['maps'].shape}")
參考:https://aistudio.baidu.com/aistudio/projectdetail/6232311
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553533.html
標籤:其他
下一篇:返回列表
