[心得] 以CNN實作台鐵驗證碼辨識

看板Python作者 (jason)時間6年前 (2017/12/24 23:53), 6年前編輯推噓19(19025)
留言44則, 15人參與, 5年前最新討論串1/1
2018/06更新: 後來更新完,已經支援五/六碼的驗證碼,還有英文字了。:) 詳細可以參考:https://github.com/JasonLiTW/simple-railway-captcha-solver 大家好~ 前陣子期中考完很閒,就花了約一週的時間用CNN實作了台鐵驗證碼辨識(搭配Keras) 在版上有看到一些前輩實作時遇到的一些問題(如相黏的數字無法辨識)應該都有解決 但我想可能主要是因為我不是以切割圖片的方式去一個一個字辨識吧 驗證集是手動標記的約1000張,訓練集部分則是用自行模仿產生的約50000張 用自行產生的訓練集 訓練後的模型對驗證集辨識效果很好 單碼辨識率大約有98.84% 整體一次辨識成功率也有91%左右(有些字像6和9旋轉後容易誤判) 繼續訓練下去精準度會更高,不過我想這樣應該夠用了 不過現在還只能辨識固定6碼的驗證碼 5碼+6碼的部分目前有想法(可能加入RNN去做,或是加入空白字元讓CNN辨識) 等之後有空再去實作看看~ 下面附上Github連結,今天寫了很詳盡的README放上去 有興趣的版友們可以看看或一起討論如何改進 :) https://github.com/JasonLiTW/simple-railway-captcha-solver -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.165.33.6 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1514130793.A.2E1.html

12/25 00:06, 6年前 , 1F
12/25 00:06, 1F

12/25 00:07, 6年前 , 2F
原來還有自己產驗證碼這招 學習了
12/25 00:07, 2F

12/25 00:08, 6年前 , 3F
可以先做個model預測是5碼還6碼 再做文字的辨識
12/25 00:08, 3F
有想過這個做法,最後沒辦法的話再試試XD

12/25 00:09, 6年前 , 4F
推,另外提一點,真正要去辨識台鐵驗證碼時,會遇到驗
12/25 00:09, 4F

12/25 00:09, 6年前 , 5F
證碼是js的問題,動態圖,不好抓,你動一次它就變一次
12/25 00:09, 5F

12/25 00:46, 6年前 , 6F
大推,不過我現在對自動訂票程序比較有興趣,之前有
12/25 00:46, 6F

12/25 00:46, 6年前 , 7F
寫個App是真的可以自己loop的,但現在跑不動了,因
12/25 00:46, 7F

12/25 00:46, 6年前 , 8F
為protocol有改變
12/25 00:46, 8F

12/25 00:48, 6年前 , 9F
之前也有類似的:#1Q0cvuAM,某b大似乎很有心得
12/25 00:48, 9F
之後有空應該會寫看看自動訂票,把5碼的完成後再研究看看~~

12/25 01:03, 6年前 , 10F
有重疊的或是旋轉改capsule會好很多
12/25 01:03, 10F

12/25 01:03, 6年前 , 11F
Github上有keras的code你可以參考一下
12/25 01:03, 11F

12/25 01:05, 6年前 , 12F
然後某b幾乎都在嘴砲啦 沒什麼參考價值
12/25 01:05, 12F
Capsule network查了一下覺得很有趣,之後來玩看看,謝謝大大的關鍵字:)

12/25 01:55, 6年前 , 13F
爬蟲還好 我花兩天就做完了 驗證碼花了一個多月
12/25 01:55, 13F

12/25 03:34, 6年前 , 14F
RNN 目的不是解決 input 是前後有關聯的問題嗎
12/25 03:34, 14F

12/25 03:34, 6年前 , 15F
驗證碼是是單純隨機字元吧 用RNN 有什麼效果?
12/25 03:34, 15F
因為不確定圖上的數字個數,如果把CNN取得的特徵按文字的順序(由左至右) 輸入進LSTM之類的RNN Layer,再輸出到全連接層, 我想應該是可以做到按順序去預測數字吧? 不過中間空白的部分還不太確定要怎麼處理 假日研究一下,實作完再丟Github XD

12/25 03:39, 6年前 , 16F
另外產生訓練集的方式可以用GAN試試看 不確定效果好不好 但
12/25 03:39, 16F

12/25 03:39, 6年前 , 17F
可以不用自己找規則來產生圖
12/25 03:39, 17F
GAN對我是一個新名詞XD,看起來挺有趣,研究一下之後先從Mnist開始做看看好了

12/25 05:43, 6年前 , 18F
Gan在這不會是一個好的解 要產生驗證碼的訓練集應該不
12/25 05:43, 18F

12/25 05:43, 6年前 , 19F
難吧 另外rnn在這可以試試image2seq解解看 可以參考sh
12/25 05:43, 19F

12/25 05:43, 6年前 , 20F
ow and tell的架構試試
12/25 05:43, 20F
後來想到GAN雖然有辦法產生驗證碼圖,但是沒有辦法標記答案上去,所以應該也用不著 show and tell 拿去google有看到一篇google的paper,等一下來看看他的架構

12/25 15:24, 6年前 , 21F
好強!
12/25 15:24, 21F

12/25 18:41, 6年前 , 22F
這篇討論串都有講到關鍵點 蠻不錯的
12/25 18:41, 22F

12/25 23:07, 6年前 , 23F
大致上看完 寫的蠻不錯的 很有幫助
12/25 23:07, 23F
謝謝:)

12/26 18:06, 6年前 , 24F
GAN可以給condition啊 所以其實你可以取值,但是太廢
12/26 18:06, 24F

12/26 18:06, 6年前 , 25F
功夫了 而且gan非常的難train training的時間又長 所
12/26 18:06, 25F

12/26 18:06, 6年前 , 26F
以才不建議
12/26 18:06, 26F
原來如此,GAN我還在研究架構中,見笑了XD ※ 編輯: jason860421 (36.233.146.211), 12/26/2017 19:20:08

12/26 20:45, 6年前 , 27F
用gan來產資料在這個case可能有點太誇張 如果想用模型
12/26 20:45, 27F

12/26 20:48, 6年前 , 28F
autoencoder類應該就ok了 不過我認為常規的數據增強就夠
12/26 20:48, 28F
大概了解,不過可能還是會試試看用GAN,因為有趣XD

12/27 19:08, 6年前 , 29F
我也有做個訂票程式,目前成功機率大概8成,約10秒訂完票
12/27 19:08, 29F

12/27 19:09, 6年前 , 30F
主要是先自己分割號碼,再丟進三層CNN算
12/27 19:09, 30F
分割好像還是會有不能辨識黏在一起的問題嗎?

12/28 16:27, 6年前 , 31F
感激不盡!!看了這篇對期末有了很多新想法,如果能實作出
12/28 16:27, 31F

12/28 16:27, 6年前 , 32F
延伸或相關的內容,能不能和大大討論個或者交流呢?
12/28 16:27, 32F
可以站內信跟我討論呀:)

12/28 23:11, 6年前 , 33F
我都直接硬A 我先跪了 XD
12/28 23:11, 33F
※ 編輯: jason860421 (123.50.42.131), 12/29/2017 01:56:00

12/30 00:24, 6年前 , 34F
會有不能辨識黏在一起或是背景特別雜的時候,但我覺得成功
12/30 00:24, 34F

12/30 00:24, 6年前 , 35F
率不低
12/30 00:24, 35F

12/30 00:25, 6年前 , 36F
應該可以用了啦
12/30 00:25, 36F

12/30 00:25, 6年前 , 37F
有想過用rcnn試試看,但是最近很懶
12/30 00:25, 37F

12/30 01:04, 6年前 , 38F
用GAN會太難吧
12/30 01:04, 38F

12/30 02:27, 6年前 , 39F
如果想用gan的話可以試試wgan-gp 應該會舒服一點
12/30 02:27, 39F

12/30 02:31, 6年前 , 40F
剛剛寫完正在跑 看訓練過程的確比DCGAN穩定很多
12/30 02:31, 40F

01/01 18:20, 7年前 , 41F
自己產驗證碼練習好猛
01/01 18:20, 41F
※ 編輯: jason860421 (36.235.66.128), 06/07/2018 03:17:04

06/19 17:39, 7年前 , 42F
推 寫得很棒
06/19 17:39, 42F

07/28 00:39, 6年前 , 43F
推 寫得很詳細 很猛
07/28 00:39, 43F

04/08 16:02, 5年前 , 44F
很強大 這個分享我給100分
04/08 16:02, 44F
文章代碼(AID): #1QFyrfBX (Python)