AttentionOCR Pytorch中文端到端的文字識別 程序完全可用

Pytorch AttentionOCR 中文端到端的文字識別 程序完全可用

總體結構

本項目在CRNN的基礎上進行修改完成的,基於Pytorch實現,程序完成可用
整體流程爲:encoder+decoder
encoder採用CNN+biLSTM模型
decoder採用Attention模型
在這裏插入圖片描述

encoder

  • encoder部分採用和crnn一樣的模型結構,輸入是32pix高的字符圖片,寬度不定,但爲了batch訓練,圖片的寬度需要統一,輸出爲特徵矩陣。
  • 在cnn特徵提取部分,高度方向經過了4個pooling和一個卷積(valid模式),總共會使得原圖的高度縮小pow(2,5)倍,即縮小32倍,寬度方向只是經歷2個pooling和一個卷積(valid模式),最後的尺寸爲width/4+1。舉個例子,假設輸入的是4張32* 280的彩色圖片,最後的特徵矩陣爲: 4 * 1 * 71* 512
  • encoder第二部分,通過BidirectionalLSTM進行前後序列特徵的增強。舉個例子,前面cnn的特徵矩陣輸出爲4* 1 * 71*512,這裏以一張圖片爲例,一張圖片爲71 * 512,71可以理解爲寬度方向有71個字符,512可理解爲每個字符的特徵向量,送入BiLSTM時,就是第1個字符的512,第2個字符的512,第3個字符的512,…,特徵的寬度方向看成序列,依次送入BiLSTM。總結,其實就是一個特徵增強。看資料這裏也可以用con1d代替,有待實驗。經過BiLSTM之後特徵爲4 * 71 * 256,256爲BiLSTM隱藏節點的個數

Attention decoder

decoder部分主要做不定長文字的識別,和圖像描述很像,就是不定長序列(文字)的生成,所以需要用到RNN。
總體流程

  1. 根據一定的規則求取權值;
  2. CNN特徵乘以權重送入RNN;
  3. RNN後接一個linear,再接一個softmax;

1.求取Attention權重

  • 對前一次的輸出做一個詞嵌入(embedding)升維,
  • 聯合上一次的輸出和RNN隱含層的狀態,做一個linear和softmax,求得Attention權重

2.Attention權重乘以CNN特徵

  • Attention權重乘以CNN輸出的特徵矩陣,最後輸出爲4* 1*256,其實就是將71個字符,根據Attention權重合併成1個最大概率的字符

3.RNN不定長字符識別

  • 現在就可以將4* 1*256輸入RNN,RNN後在接一個linear和softmax,但是很多模型都會對權重CNN特徵在做一些操作,不過最後送入RNN的爲4 * 1 * 256,表示當前時刻最可能(attention權重)出現的字符。

優勢

  1. 可以端到端訓練,不需要進行字符分割等操作
  2. 推理時,只需要將圖片的高度保持爲32pix就行,寬度無限制
  3. 模型小,速度快

效果

picture predict reading confidence
在這裏插入圖片描述 美國人不願意與朝鮮人 0.33920
在這裏插入圖片描述 現之間的一個分享和 0.81095
在這裏插入圖片描述 中國通信學會主辦、《 0.90660
在這裏插入圖片描述 此在戰術上應大膽、勇 0.57111
在這裏插入圖片描述 年同期俱點83.50 0.14481
在這裏插入圖片描述 。留言無惡意心態成 0.31054

程序

詳細程序在本人github倉庫Attention_ocr.pytorch,預訓練模型,數據集,標註文件都做好了,可以直接下載訓練或者使用,最良心的是推理程序都寫好了,克隆下來就能用。

other

本人現在在成都一個公司做圖像識別算法工程師,最近想換工作,求有途徑的人內推或介紹一下,或者有公司需要相關的人員的也可以。本人聯繫方式:[email protected]