天天看點

【資料競賽】CV賽題總結:人民币面值與編碼識别

CV

人民币面值與編碼

在2019年6月份參加了TinyMind人民币面值及編碼識别比賽,最終獲得了面試識别并列第二、編碼識别初賽第三/複賽第五的成績,在文本我将分享這次比賽的曆程和我的學習收獲,比賽代碼和參考文獻在文章末尾。

PART

01

賽題分析與解決方案

人民币作為我國法定貨币,與生俱來,人見人愛。它在我們日常生活中的重要性不言而喻,每張人民币紙币都有一串唯一的字元号碼,是人民币的重要辨別。由于這串序列号的唯一性,若能在紙币識别裝置上添加編碼識别,讓每張人民币的行走軌迹都可以被記錄并存儲,這樣人民币都能進入銀行監管之内,不僅有助于識别假币,還可以很大程度上協助攻破搶劫,盜竊人民币等非法事件。人民币編碼識别技術在日常生活中具有很好的實用價值。

【資料競賽】CV賽題總結:人民币面值與編碼識别

賽題任務1:⼈⺠币⾯值識别

要求參賽者根據訓練集圖檔訓練模型,識别人民币面值,并按要求送出驗證集訓練結果進行驗證。評分采⽤top1準确率。

【資料競賽】CV賽題總結:人民币面值與編碼識别

顯而易見不同面值的人民币的圖像具有很大差別,在賽題1中我們目标是将不同面值的人民币進行分類,即根據不同面值的圖檔進行分類操作。

解題思路:顯然賽題1是一個典型的圖像分類任務,直接使用CNN圖像分類的流程就可以解決。具體的解決流程是Fine-Tune一個分類網絡,并在測試集上進行TTA(Test Time Augmentation)操作,就可以解決。

【資料競賽】CV賽題總結:人民币面值與編碼識别

賽題任務2:人民币編碼識别

人民币編碼識别目的是識别人民币具體的編碼,人民币編碼由10位組成,具體由冠号和編碼兩個部分。冠号一般為兩個字母或者兩個字母中間夾上一個數字的情況,編碼則都是阿拉伯數字。編碼識别使用編碼整體準确率和字元logloss打分;

原始賽題隻給定了人民币圖像的類别和編碼,但沒有給定人民币具體的編碼位置。,是以我自己标注200張帶有位置資訊的标注檔案。具體來說編碼識别任務進一步可以拆分為:編碼定位和編碼識别兩個步驟。

【資料競賽】CV賽題總結:人民币面值與編碼識别

在編碼定位階段,需要定位編碼具體的位置;編碼識别階段則需要對具體編碼進行識别。或許你可能會問,能不能直接将整張圖直接進行編碼識别,不進行編碼定位的操作。但直接用整圖進行識别的方式是不太可取的,首先整圖噪音比較多,模型容易學習到噪音,其次圖檔太大占用的模型需要顯存越大。那麼在編碼識别階段能不能拆分成字元進行單個字元識别呢?這種方法也不可取,首先字元并不能完全切割徹底,其次字元與字元之間可能存在分布關鍵。比如冠号兩個字元并不是獨立的,是以切割成字元的形式也不太合理。

【資料競賽】CV賽題總結:人民币面值與編碼識别

其實編碼識别這個任務本質就是一個OCR任務,在OCR任務中也是具體包括編碼定位和編碼識别兩個步驟。首先來看編碼定位任務,編碼定位任務目标是找到編碼的位置。我的解決思路是使用物體檢測的模型來定位編碼,當然你也可以使用傳統圖像處理的方法來定位。

【資料競賽】CV賽題總結:人民币面值與編碼識别

具體來說我是選擇Faster-RCNN模型來訓練了一個編碼定位模型,為了定位的精度我沒有選擇SSD和YOLO模型。

在定位了人民币的編碼之後,就是編碼識别的步驟了。人民币編碼的圖檔都是定長字元組成的,是以是一個定長字元識别的問題。有兩種解決方法,思路1直接對編碼圖檔進行多分類操作,10個字元則進行10個多分類;思路2使用CRNN+CTC的模型。

【資料競賽】CV賽題總結:人民币面值與編碼識别

思路1編碼圖檔的多分類操作(Multi-CNN),就是在分類CNN後面加上10個全連接配接層,進行10個分類操作,然後将10個分類loss求和訓練即可。這種方法思路簡單,模型僅包含卷積層和全連接配接層,模型收斂快;但這種思路是将每個字元單獨進行分類的,是以沒有考慮到字元與字元之間的關系,在精度上有一些欠缺。

思路2是直接使用CRNN+CTC的思路,這也是OCR字元識别的常見模型。當然現在也有一些後序的改進,比如Attention+CTC或者CNN+CTC的論文。後序的改進我在比賽中沒有嘗試,因為我覺得CRNN模型應該就能夠解決水準編碼識别的問題了。CRNN模型的優點是模型拟合能力強,模型的精度高;缺點是模型包含RNN/LSTM層,訓練會稍微慢一些,也會受到訓練字元分類的影響。

【資料競賽】CV賽題總結:人民币面值與編碼識别

​​

https://arxiv.org/pdf/1709.04303.pdf

​​

CRNN我是用了Pytorch開源版本的,并修改了輸入圖檔的尺寸,增加了max-pooling層(參考CRNN論文),使用resnet18提取CNN特征。

【資料競賽】CV賽題總結:人民币面值與編碼識别

CRNN模型結構

在這個比賽中可以拆分K折訓練,我們得到K個模型,并對測試集進行TTA操作,那麼會對一個樣本會有不同的預測結果,則需要對結果編碼結果進行合并。具體可以進行結果平均和字元結果投票的操作。

【資料競賽】CV賽題總結:人民币面值與編碼識别

樣本變換

以上就是編碼識别的兩個模型,那麼如何有效的對兩個模型的結果進行有效融合呢?這裡我是考慮到兩個模型的差異:将Multi-CNN與CRNN模型進行結果融合,如果CRNN識别的編碼結果存在問題,則使用Multi-CNN結果進行代替。

PART

02

比賽總結與展望

以上就是我對本次比賽的總結,流程上還是比較簡單的。隻需要将具體的任務進行拆分解決,最後Have Fun!有任何問題可以直接私信,謝謝!

  1. arxiv.org/pdf/1312.6082
  2. arxiv.org/pdf/1507.0571
  3. ​​https://arxiv.org/pdf/1709.04303.pdf​​
  4. ​​https://github.com/chongyangtao/Awesome-Scene-Text-Recognition​​

比賽代碼開源:

繼續閱讀