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碼,
