主頁 > 軟體設計 > 『OCR_detection』PSENet

『OCR_detection』PSENet

2021-01-25 11:36:47 軟體設計

文章目錄

  • 前言
  • 一、網路結構
  • 二、后處理演算法(漸進式擴展演算法)
  • 三、標簽的生成
  • 四、損失函式 loss
  • 五、OHEM 演算法的思想
  • 六、訓練自己的資料集
    • 6.1 資料準備
    • 6.2 資料增強
    • 6.3 pse_general 引數設定
    • 6.4 issue


前言

論文: Shape Robust Text Detection with Progressive Scale Expansion Network
代碼: https://github.com/whai362/PSENet

  • 自然場景的文本檢測是當前深度學習的重要應用,在之前的文章中已經介紹了基于深度學習的文本檢測模型 CTPN、CRAFT、Seglink、EAST(見文章:『OCR_detection』CTPN、『OCR_detection』CRAFT、『OCR_detection』Seglink、『OCR_detection』EAST),
  • 形狀魯棒性文本檢測面臨的挑戰主要有兩個方面:1)現有的基于四邊形邊界盒的文本檢測方法很難找到任意形狀的文本,很難完全封閉在矩形中;2)大多數基于像素的分割檢測器可能不會將彼此非常接近的文本實體分開,為了解決這些問題,我們提出了一種新的漸進尺度擴展網路(PSEnet),它是一種基于分割的檢測器,對每個文本實體都有多個預測,這些預測對應于通過將原始文本實體縮小到不同的尺度而產生的不同的“內核”,因此,最終的檢測可以通過我們的漸進尺度擴展演算法進行,該演算法將最小尺度的核逐步擴展到最大和完全形狀的文本實體,由于這些極小核間存在較大的幾何邊緣,因此我們的方法能夠有效地區分相鄰文本實體,并且對任意形狀具有魯棒性,

一、網路結構

在 ImageNet 資料集上預訓練的 ResNet+FPN 作為特征提取的網路結構,

  1. 首先,將高層特征和低層特征 融合 后得到 (P2, P3, P4, P5) 四個特征層,其中每個特征層的 channel 數量為 256,
  2. 之后,將四個特征層 concat 得到 F (將低層次的特征和高層次的分割實體特征進行融合,最后得到與原圖尺寸相同的輸出 F), 其中 F = C(P2,P3,P4,P5) = P2 || Upx2(P3) || Upx4(P4) || Upx8(P5) ,其中的 || 就代表 concat,x2,x4,x8 分別代表 2 倍、4 倍和 8 倍的上采樣,F 的維度大小為 [ B, C, H, W ],其中 C 的大小為確定的 kernel_num, 將 F 送入 Conv(3,3)-BN-ReLU 層,并將特征層的 channel 數量變為 256,
  3. 最后,將 F 送入多個 Conv(1,1)-Up-Sigmod 層來得到 n 個分割結果 S 1 , S 2 , … , S n S_1,S_2,…,S_n S1?,S2?,,Sn?,其中的 Up 代表上采樣,sigmoid 來預測 n 個 mask

注: S 1 , S 2 , S 3 , ? , S n S_1,S_2,S_3,?,S_n S1?,S2?,S3?,?,Sn? 是影像文字的分割結果,他們的不同點在于他們分割出的文字區域大小不同,例如 S1 給出的是最小的文字區域分割結果, 是預測的圖片中目標文字的核心區域(并不是全部范圍),而 Sn 給出的是最大的文字區域分割結果(理想下就是 GroundTruth)

二、后處理演算法(漸進式擴展演算法)

  • 實際文章中 n=6,但是為了更方便解釋,這里假設 n=3,即網路最終輸出了 3 張分割結果
  • 假設用了 3 個不同尺度的 kernel(如圖a,e,f),其中 S 1 S_1 S1? (上圖a)代表最小 kernel 的分割結果,它內部有四個連通域 C={c1,c2,c3,c4},CC 操作得到 S1 中的四個連通域,得圖 b(四個連通區域使用不同顏色標記),
  • 現在我們已經得到了圖 b 中的四個連通域(小 kernel,不同文本行之間的 margin 很大,很容易區分開),且我們已知 S 2 S_2 S2? 中的 kernel 是比 S 1 S_1 S1? 中的 kernel 大的,也就是可以說 S 2 S_2 S2? 中的 kernel 是包含 S 1 S_1 S1? 中的 kernel 的,現在我們的任務就是將屬于 S 2 S_2 S2? 中的 kernel 的但不屬于 S 1 S_1 S1? 中的 kernel 的像素點(即圖 g 左圖中的灰色的部分,藍色和橘色部分分別表示 S 1 S_1 S1? 中的兩個連通域)進行分配,
  • 如圖所示,在灰色區域( S 2 S_2 S2? 的 kernel 范圍)內,將 b 圖所找到的連通域的每個 pixel 以 BFS 的方式,逐個向上下左右擴展,即相當于把 S 1 S_1 S1? 中預測的文本行的區域逐漸變寬(或者換種說法:對于 S 2 S_2 S2? 中 kernel 的每個像素點,把它們都分別分配給 S 1 S_1 S1? 中的某個連通域),這里還有一個問題,如圖 g 右圖所示,圖中值為 2 的點為沖突點,例子中的兩個連通域都可能擴展到這個pixel,論文中對這種沖突的解決方法就是“先到先得”原則,這對最后的結果沒什么影響,后面的 S 3 S_3 S3? 同理,最終我們抽取圖 d 中不同顏色標注的連通區域作為最后的文本行檢測結果,
  • 如何分離靠的很近的文字塊?
    直接用語意分割來檢測文字又會遇到新的問題:很難分離靠得很近的文字塊,因為語意分割只關心每個像素的分類問題,所以即使文字塊的一些邊緣像素分類錯誤對 loss 的影響也不大,
    解決方案:引入 kernel,文字塊的核心,利用 kernel 可以有效的分離靠的很近的文字塊,
  • 如何通過 kernel 來構建完整的文字塊?
    kernel 只是文字塊的核心,并不是完整的文字塊,不能作為最終的檢測效果,
    方法: 基于 廣度優先搜索 的 漸近擴展演算法 來構建完整的文字塊
    核心思想: 從每個 kernel 出發,利用廣度優先搜索來不斷地合并周圍的像素,使得 kernel 不斷地擴展,最后得到完整的文字塊

基于 廣度優先搜索(BFS) 由三個步驟組成:

step 1: 從具有最小尺度的核 S1 開始(在此步驟中可以區分實體,不同實體有不同的連通域);
step 2: 通過逐步在較大的核中加入更多的像素來擴展它們的區域;
step 3: 完成直到發現最大的核,

三、標簽的生成

  • 首先從網路結構中可以看出,需要生成不同尺度的 kernel,這是需要有標簽的影像來進行訓練的,因為網路輸出有 n 個分割結果,所以對于一張輸入圖片來說 groundtruth 也要有 n 個,這里 groundtruth 就是簡單的將標定的文本框進行不同尺度的縮小
  • 為了生成訓練時不同尺寸 kernels 所對應的 groundtruths,作者采用 Vatti clipping algorithm 將原始多邊形 P n P_n Pn? 縮放 d i d_i di? 個像素從而得到 P i P_i Pi?,其中每個縮放的 P i P_i Pi? 都是使用 0/1 的二進制 mask 來表示分割后的標簽的,
  • 需要縮小的像素通過右邊式子得到: d i = A r e a ( P n ) × ( 1 ? r i 2 ) P e r i m e t e r ( P n ) d_{i} = \frac{Area(P_{n})\times(1-r_{i}^{2})}{Perimeter(P_{n})} di?=Perimeter(Pn?)Area(Pn?)×(1?ri2?)?, 其中 r i = 1 ? ( 1 ? m ) ( n ? i ) n ? 1 r_{i} = 1 - \frac{(1-m)(n-i)}{n-1} ri?=1?n?1(1?m)(n?i)?
    Note:
    • r i r_{i} ri? 表示縮小的比例
    • m: 最小的縮放比例,是一個超引數,取值范圍為(0,1],本文取得是 m=0.5
    • n: 最終輸出多少個尺度的分割結果,即 kernel 的數量

四、損失函式 loss

  • 損失由完整的 mask 的 loss 加上腐蝕后的 mask 的 loss,其中兩項是加權相加:
    L = λ L c + ( 1 ? λ ) L s L = \lambda L_{c} + (1-\lambda)L_{s} L=λLc?+(1?λ)Ls?
    其中, L c L_{c} Lc? 表示沒有進行縮放時候的損失函式,即相對于原始大小的groundtruth的損失函式, L s L_{s} Ls? 表示的是相對于縮放后的框的損失函式,
  • 由于正常狀態下非文本區域遠大于文本區域,所以使用二分類的交叉熵損失會使得結果更加偏向于非文本區域,故 PSE 模型使用的是 dice cofficient :
    D ( S i , G i ) = 2 × ∑ x , y ( S i , x , y × G i , x , y ) ∑ x , y S i , x , y 2 + ∑ x , y G i , x , y 2 D(S_i, G_{i})=\frac{2\times\sum_{x, y}(S_{i, x, y}\times G_{i, x, y})}{\sum_{x, y}S_{i, x, y}^{2} + \sum_{x, y}G_{i, x, y}^{2}} D(Si?,Gi?)=x,y?Si,x,y2?+x,y?Gi,x,y2?2×x,y?(Si,x,y?×Gi,x,y?)?
    Note:
    • S x , y S_{x, y} Sx,y? 為預測實體中像素點 (x, y) 的值,
    • G x , y G_{x, y} Gx,y? 為 label 中像素點 (x, y) 的值,
      在這里插入圖片描述

五、OHEM 演算法的思想

在線難例挖掘(online hard example mining),根據輸入樣本的損失進行篩選,篩選出難例,表示對分類和檢測影響較大的樣本,然后將篩選得到的這些樣本應用在隨機梯度下降中訓練,具體到該模型中,選取所有正樣本(主要是正樣本本來就偏少,所以就全取)以及困難樣本,過濾掉 easy 的負樣本,被選中的像素點取值為 1,未選中的取值為 0 ,

六、訓練自己的資料集

6.1 資料準備

step 1: 資料獲取:手動標注,獲得 8 個點坐標(或者矩形框,獲得 4 個坐標),得到 xml 檔案;[ PSE也可以檢測多邊框圖,即點坐標可以不止 8 個 ]
step 2: xml 檔案轉換成 txt 檔案,只包含 8 個坐標資訊,以 , 分割;(xml2txt.py)
step 3: draw_small_box:畫出 16px 的小框;驗證小框是否正確 (draw_small_box.py) [ PSE 不需要此步驟,需要的話也僅僅是為了驗證框的標注正確性 ]

6.2 資料增強

1. img_transform.py
2. data_aug.py

6.3 pse_general 引數設定

  • –arch: resnet50
  • –batchsize: 8
  • –lr: 0.001
  • –imgsize: 640
  • –n_epoch: 50
  • –resume: 中間訓練結束,繼續訓練的起始位
  • –pretrain: 加載預訓練模型,僅相當于匯入初始權重
  • –schedule: [ 10, 25, 40 ] 學習率衰減位置

Note: 訓練速度太慢,可以調整學習率改變的位置
輸入影像維度為:[ B, 3, H, W ] 經過特征融合,上采樣程序 得到 feature map : [ B, C, H, W ],其中 C 的大小為確定的 kernel_num,設定為7,
對于一個文本實體,有幾個對應的內核,每個內核與原始的整個文本實體共享相似的形狀,并且它們都位于相同的中心點但在比例上不同,

6.4 issue

  1. 當 long_size 設定到 2240+ 時速度慢,但是設定小一點的時候出現檢測框往上飄的情況?

  2. 當出現 ImportError: libopencv_dnn.so.3.4: cannot open shared object file: No such file or directory 的錯誤時,將 opencv-3.4.6 復制過來,然后執行

    export LD_LIBRARY_PATH=/mnt/libo/opencv-3.4.6/build/lib/:$LD_LIBRAR
    

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/252173.html

標籤:其他

上一篇:有序資料程式設計

下一篇:淺談漢諾塔

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more