日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

营业执照识别项目记录--CTPN使用

發布時間:2023/12/31 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 营业执照识别项目记录--CTPN使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

          • 1. 校驗--判別用戶上傳圖片是否為營業執照
          • 2. 文字區域檢測---CTPN算法
            • 2.1 CTPN算法原理
            • 2.2 直接使用CTPN預訓練模型
          • 參考

1. 校驗–判別用戶上傳圖片是否為營業執照

這一部分目前有兩個已實現的方案:

  • 使用SIFT特征點檢測方法,將用戶上傳圖片與營業執照圖片模板進行SIFT方法匹配,之后因為速度原因,將整個營業執照的模板改變為只有“營業執照”四個字的模板,速度從8s左右提升至1s以內。但是因為模板的改變,會存在偶爾識別錯誤的情況。另,我對這部分的SIFT方法不了解。
  • 使用vgg16進行一個簡單的分類。將用戶上傳圖片使用vgg16模型進行分類,判別是否為營業執照圖片。因為目前營業執照圖片數據較少,所以采用遷移學習。下載vgg16預訓練模型,改變全連接層且只訓練全連接層。這部分的難點為:①數據集較小,采用遷移學習可以彌補。②負樣本的不完全性也會導致模型分類失敗。這樣的情況在幾次實驗過程中已經出現。例如,第一次訓練好的vgg模型,可以識別動物,風景,人物等為負類,但是身份證圖片卻也判別為營業執照。那么接下來就又需要將身份證之類的證件圖片(身份證,駕照,護照等)加入到負樣本中。第二次訓練模型之后,在第一次的基礎上,模型已經可以區分證件照片。但是此時發現,只要是有文字的圖片,模型都判別為正樣本!接下來開始第三次豐富負樣本集,將含有文字信息的照片加入負樣本并重新訓練模型之后,就可以正確區分了。在這里,可以發現如果用戶上傳的非營業執照圖片是模型沒有見過的,它就有可能將其劃分為正類,所以,后續可能還需要進一步的豐富負樣本集合,但是由于正樣本數量較少,所以也不能將負樣本集合持續增大,否則正負樣本不平衡問題就會出現,那么用戶不管上傳什么圖片,模型都會判別為負類。所以,歸根到底還是數據集較小的原因。
  • 所以,目前的想法是同時使用兩個方法,當這兩個方法均投票負類時,才將該圖片判別為負類,否則就開始檢測步驟。

    2. 文字區域檢測—CTPN算法
    2.1 CTPN算法原理

    首先,放上原論文鏈接,有興趣的小伙伴可以看一下原文。還有一個中英文對照版本的可以參考。

    與faster RCNN不同的是,faster RCNN做的是物體檢測,而CTPN方法做文本檢測的其中一個難點就在于文本行的長度變化是非常劇烈的。因此如果是采用基于faster rcnn等通用物體檢測框架的算法都會面臨一個問題?怎么生成好的text proposal?這個問題實際上是比較難解決的。

    CTPN文章作者轉換思路,首先考慮文字目標的特殊性,一個很大的先驗是,文字總是水平排列的。作者認為預測文本水平方向的位置比預測豎直方向上的位置要困難得多。所以檢測的過程中 不妨引入一個類似數學上“微分”的思想,如下圖所示,先檢測一個個小的、固定寬度的文本段。在后處理部分再將這些小文本段連接起來,得到文本行。

    具體的說,作者的基本想法就是去預測文本的豎直方向上的位置,水平方向的位置不預測。因此作者提出了一個vertical anchor的方法。與faster rcnn中的anchor類似,但是不同的是,vertical anchor的寬度都是固定好的了,論文中的大小是16個像素。而高度則從11像素到273像素變化,總共10個anchor。

    整體流程:

    • 首先,使用VGG16作為base net提取特征,得到conv5_3的特征作為feature map,大小是W×H×C。(這里說一下,feature map 的大小一般為batchWHC,但是LSTM的輸入是batchmax_length*word_dim,這里怎么對應起來的呢?從圖中可以看出,將feature map的H作為是batch,也就是一行是一個batch, 將W作為是max_length, 而C作為word_dim.)
    • 然后在這個feature map上做滑窗,窗口大小是3×3。也就是每個窗口都能得到一個長度為3×3×C的特征向量。這個特征向量將用來預測和10個anchor之間的偏移距離,也就是說每一個窗口中心都會預測出10個text propsoal。
    • 將上一步得到的特征輸入到一個雙向的LSTM中,得到長度為W×256的輸出,然后接一個512的全連接層,準備輸出。
    • 輸出層部分主要有三個輸出:
    • 2k個vertical coordinate,因為一個anchor用的是中心位置的高(y坐標)和矩形框的高度兩個值表示的,所以一個用2k個輸出(k=10,對應第二步中的10個anchor)。(注意這里輸出的是相對anchor的偏移)。
    • 2k個score,因為預測了k個text proposal,所以有2k個分數,text和non-text各有一個分數。
    • k個side-refinement,這部分主要是用來精修文本行的兩個端點的,表示的是每個proposal的水平平移量。
    • 這是會得到密集預測的text proposal,所以會使用一個標準的非極大值抑制算法來濾除多余的box。
    • 最后使用基于圖的文本行構造算法,將得到的一個一個的文本段合并成文本行。


    一些細節:

    • vertical anchor
      ① k個anchor的設置如下:寬度都是16像素,高度從11~273像素變化(每次乘以1.4)
      ② 預測的k個vertical coordinate的坐標如下:
      回歸的高度和bounding box的中心的y坐標如下,帶*的表示是groundTruth,帶a的表示是anchor

      ③ score閾值設置:0.7 (+NMS)
      ④ 與真值IoU大于0.7的anchor作為正樣本,與真值IoU最大的那個anchor也定義為正樣本,這個時候不考慮IoU大小有沒有到0.7,這樣做有助于檢測出小文本。
      ⑤ 與真值IoU小于0.5的anchor定義為負樣本。
      ⑥ 只保留score大于0.7的proposal

    • BLSTM
      ① 文章使用了雙向的LSTM,每個LSTM有128個隱層
      ② 加了RNN之后,整個檢測將更加魯棒

    • Side-refinement
      ① 文本線構造算法(多個細長的proposal合并成一條文本線)
      主要思想:每兩個相近的proposal組成一個pair,合并不同的pair直到無法再合并為止(沒有公共元素)
      判斷兩個proposal,Bi和Bj組成pair的條件:
      Bj->Bi, 且Bi->Bj。(Bj->Bi表示Bj是Bi的最好鄰居)
      Bj->Bi 條件1:Bj是Bi的鄰居中距離Bi最近的,且該距離小于50個像素
      Bj->Bi 條件2:Bj和Bi的vertical overlap大于0.7

    固定要regression的box的寬度和水平位置會導致predict的box的水平位置不準確,所以作者引入了side-refinement,用于水平位置的regression。where xside is the predicted x-coordinate of the nearest horizontal side (e.g., left or right side) to current anchor. x? side is the ground truth (GT) side coordinate in x-axis, which is pre-computed from the GT bounding box and anchor location. cax is the center of anchor in x-axis. wa is the width of anchor, which is fixed, wa = 16

    • 訓練
      ① 對于每一張訓練圖片,總共抽取128個樣本,64正64負,如果正樣本不夠就用負樣本補齊。這個和faster rcnn的做法是一樣的。
      ② 訓練圖片都將短邊放縮到600像素。

    • 總結
      這篇文章的方法最大亮點在于把RNN引入檢測問題(以前一般做識別)。文本檢測,先用CNN得到深度特征,然后用固定寬度的anchor來檢測text proposal(文本線的一部分),并把同一行anchor對應的特征串成序列,輸入到RNN中,最后用全連接層來分類或回歸,并將正確的text proposal進行合并成文本線。這種把RNN和CNN無縫結合的方法提高了檢測精度。

    • 問題
      ① 沒有很好地處理多方向的文本行
      ② 訓練的時候由于有regression和LSTM,需要小心控制梯度爆炸。

    2.2 直接使用CTPN預訓練模型

    CTPN論文的作者公開的代碼是基于caffe框架的:代碼鏈接;B站視頻的講解是基于pytorch的,他的代碼放在百度云上(鏈接: https://pan.baidu.com/s/1wToAbOulqpLxFhtOV5wdhg 提取碼: 6y24 (配套視頻請添加微信digexiaozhushou))他的其他資料可以在github上查找;后來有大神基于tensorflow實現了CTPN算法(代碼鏈接),基本上所有基于tensorflow的都是基于此代碼進行的,本文也是基于此代碼進行的。

    如果想直接使用eragonruan寫的CTPN模型進行文本區域定位,可以依照以下步驟進行:

  • 從github下載代碼,鏈接:https://github.com/eragonruan/text-detection-ctpn
  • 環境配置:
    備注:gcc與g++也要求在6.0以上,否則會報錯。
  • 編譯。在項目文件中執行以下命令,最后將會在bbox文件夾中生成nms.so 和 bbox.so這兩個文件.
  • cd utils/bbox chmod +x make.sh ./make.sh
  • 下載作者訓練好的模型。作者給出了 googl drive 和 百度云兩個鏈接,但是到目前為止(2020/08/13),百度云鏈接已經失效, googl drive還可以下載,鏈接:https://drive.google.com/file/d/1HcZuB_MHqsKhKEKpfF1pEU85CYy4OlWO/view。
  • 將下載好的模型zip文件解壓,放在項目一級目錄下即可。如下圖所示。
    (解釋一下為什么main,nets,utils每個包都有兩個,因為python import自己寫的其他模塊時,需要該模塊在包里面,而不是文件夾中。python中嚴格區分包和文件夾。包的定義就是包含__init__.py的文件夾。如果沒有__init__.py,那么就是普通的文件夾。)
  • 打開/main/demo.py文件,將下面代碼中對應的文件位置修改好,就可以直接運行了。
  • tf.app.flags.DEFINE_string('test_data_path', 'data/demo/', '') tf.app.flags.DEFINE_string('output_path', 'data/res/', '') tf.app.flags.DEFINE_string('gpu', '0', '') tf.app.flags.DEFINE_string('checkpoint_path', '../checkpoints_mlt/', '') FLAGS = tf.app.flags.FLAGS
  • 運行demo.py文件后,會在output_path中對每一個圖片產生兩個輸出。如下圖所示。
    原圖:

    輸出圖片:

    備注:CTPN對水平文字的檢測效果不錯,但是對于豎直和傾斜文字的檢測效果不佳,這是由于程序中對于標簽數據進行的水平切分(寬為16的矩形框),在利用rnn進行文本行合并時,一直是水平方向導致的。
  • 輸出文本:
    其中每一行對應一個文本框,八個整數分別對應從左上角開始的(x,y)坐標,按順時針旋轉。最后一個小數數值是概率。

    512,173,544,173,544,200,512,200,0.99868757 624,321,736,321,736,347,624,347,0.99857223 464,415,592,415,592,438,464,438,0.99849284 480,310,624,310,624,324,480,324,0.9982535 304,179,512,179,512,212,304,212,0.9981123 96,339,240,339,240,355,96,355,0.99799806 512,459,720,459,720,479,512,479,0.99753165 80,225,144,225,144,245,80,245,0.99751484 96,370,736,370,736,383,96,383,0.99750817 608,481,704,481,704,499,608,499,0.99740076 96,203,240,203,240,216,96,216,0.99715686 96,278,320,278,320,292,96,292,0.99708265 592,508,752,508,752,521,592,521,0.99705267 416,574,592,574,592,586,416,586,0.9969637 416,564,592,564,592,576,416,576,0.99678135 192,384,480,384,480,396,192,396,0.9967604 608,183,688,183,688,195,608,195,0.9967121 656,567,784,567,784,580,656,580,0.9966543 48,568,288,568,288,582,48,582,0.99655676 176,398,336,398,336,411,176,411,0.9965299 240,226,592,226,592,249,240,249,0.9964445 608,413,752,413,752,443,608,443,0.9963811 96,308,320,308,320,324,96,324,0.9963319 464,281,608,281,608,296,464,296,0.99630785 464,339,560,339,560,355,464,355,0.99630004 368,508,496,508,496,530,368,530,0.9962746 80,178,240,178,240,194,80,194,0.99618113
    參考
  • B站視頻:迪哥有點愁,基于Pytorch框架進行ocr識別實戰 https://www.bilibili.com/video/BV1F7411x7B9?p=1
  • 知乎:晟沚,CTPN論文解讀,https://zhuanlan.zhihu.com/p/31915483
  • Github:eragonruan, text-detection-ctpn, https://github.com/eragonruan/text-detection-ctpn
  • 博客園:python_worm, Python自定義包在linux服務器導入錯誤的解決辦法 https://www.cnblogs.com/fanjp666888/p/9243411.html
  • 總結

    以上是生活随笔為你收集整理的营业执照识别项目记录--CTPN使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。