darknet影像定位+tornado實現票據識別API,識別率達到95%以上

  • 2020 年 2 月 24 日
  • 筆記

此項目用於對中國購車發票進行內容識別,目前完成的是身份證,vin,發動機號,價格的識別提供了展示的demo頁,以及提供了傳入文件,路徑,base64碼的多種方式調用的api,返回識別出來的json數據。

完整程式碼下載地址:

關注微信公眾號 datanlp 然後回復 發票 即可獲取。

Quick Start

  • 首先找一張發票的圖片:

http://club2.autoimg.cn/album/g13/M0F/A4/A3/userphotos/2015/10/10/21/500_wKgH1FYZE2mALP-JAAJQY1pp49o236.jpg

  • 啟動識別服務(web介面服務) ./api_invoice/main.py 開啟的是8888埠,暫時未做配置化,可以直接在main.py中修改
  • 訪問demo頁
    • 訪問http://128.0.0.1:8888/invoice/index
    • 選擇上傳圖片,會識別出來圖片並將結果顯示在頁面上
    • 並顯示識別的方法和識別定位的圖片
  • 訪問介面:
    • http://127.0.0.1:8888/invoice/url?url=http%3A%2F%2Fclub2.autoimg.cn%2Falbum%2Fg13%2FM0F%2FA4%2FA3%2Fuserphotos%2F2015%2F10%2F10%2F21%2F500_wKgH1FYZE2mALP-JAAJQY1pp49o236.jpg
    • 傳入圖片連接,返回json數據,例如: {"cardno": "130102198707041249", "vinno":"LSGHD5289FD298030", "engineno": "152306132", "price": "¥61500.00"}
    • 還支援上傳文件,圖片base64字元串傳參等多種方式

程式碼執行過程說明

  • 使用tornado啟動web服務,json格式化數據
  • 首先對圖片做處理,opencv,PIL,找到需要識別的局部圖片並截取出來
    • 使用darknet的yolo定位的方法,標識一批樣本中關鍵數據的局部圖片的位置
    • 然後進行訓練
    • 訓練完成後會得出一個權重文件
    • 改造darknet的程式碼
    • 為了能夠更快的處理,在darknet裡面啟動了一個web服務
    • 可以傳入圖片地址(伺服器絕對地址,無後綴)
    • 識別後返回圖片中關鍵局部位置的坐標點
    • 再使用坐標點將圖片的關鍵部位切割出來
    • 效果還好,主要是識別速度稍慢,作為第二方案,還有優化餘地,甚至可以替代第一方案
    • 使用二值化加上輪廓等方法找到圖片中最大方格,然後找到四個點
    • 對四個點對應的四邊形進行矯正,變成正方形,使得字體不會是歪的
    • 檢查長寬,處理橫豎圖片問題,這裡還可以改進優化
    • 縮放到固定大小
    • 生成一張翻轉的圖片,因為暫時無法確定是否倒過來的,暫時做識別兩次的處理,可以優化
    • 然後按照比例切出對應識別區域
    • 最後把這個局部的圖片切割出來
    • 缺點是部分圖片的方格不完整,圖片列印的比較歪,明暗度差異的問題會導致識別準確率下降
    • 影像處理方式
    • 深度學習圖片定位方式
  • 圖片定位切割完成之後,做正向反向識別- 首先使用機器識別- 先將圖片再次切割,根據灰度值和波峰波谷演算法將每個字元切割開- 使用訓練好的但字元模型鏡像識別,有三個不同的模型,依次進行識別- 其次使用tesseract識別- 原圖識別- 灰度圖識別- 默認閾值二值化識別- 批量默認閾值二值化識別- 遍歷閾值二值化識別
  • 識別結果校驗
    • 如果不通過校驗,則繼續往下走

識別率校驗

  • 將圖片網路地址放到img.txt中,文件放到data/invoice目錄下
  • 執行ipi_invoice/test.py,將文件導入到資料庫
  • 然後刪除img.txt文件
  • 繼續執行執行ipi_invoice/test.py,將會逐個識別並將結果記錄到資料庫,
  • 通過sql可以判斷出來識別率

模型訓練

  • 訓練出的模型包括:識別10個數字類別模型;用於身份證識別的 識別"數字+X" 11個類別的模型;識別"大寫字母+數字" 26個類別的模型。
  • 訓練樣本處理的目錄為/creatTrainDataSet, 模型訓練的目錄為 /train/ -準備圖片:本項目將發票系統中的數字,字母圖片切割出來,轉換成統一的28*28圖片
    • 為儘可能提高訓練模型識別率,將圖片做相應處理,剔除雜訊較多的圖片,尤其是每一類別有相同雜訊的圖片。
    • 已經處理好的訓練樣本圖片見壓縮包:/dataset/numberAndX.tar.gz,/dataset/numberAndUpper.tar.gz,解壓縮到自定義目錄
    • 修改/train目錄下相應的模型訓練文件,生成對應訓練模型,已有模型在目錄/trainmodel/下
    • 修改/train/keras_predict.py中需要識別的的圖片路徑或目錄,使用已有模型識別圖片類型。

darknet圖片定位

給服務傳入一個發票圖片文件的路徑,就可以返回對這個圖片預測出來的身份證,vin碼,

Tags: