作者jason860421 (jason)
看板Python
標題[心得] 以CNN實作台鐵驗證碼辨識
時間Sun Dec 24 23:53:09 2017
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
推 vi000246: 推 12/25 00:06
→ vi000246: 原來還有自己產驗證碼這招 學習了 12/25 00:07
→ vi000246: 可以先做個model預測是5碼還6碼 再做文字的辨識 12/25 00:08
有想過這個做法,最後沒辦法的話再試試XD
推 f496328mm: 推,另外提一點,真正要去辨識台鐵驗證碼時,會遇到驗 12/25 00:09
→ f496328mm: 證碼是js的問題,動態圖,不好抓,你動一次它就變一次 12/25 00:09
推 alan23273850: 大推,不過我現在對自動訂票程序比較有興趣,之前有 12/25 00:46
→ alan23273850: 寫個App是真的可以自己loop的,但現在跑不動了,因 12/25 00:46
→ alan23273850: 為protocol有改變 12/25 00:46
→ alan23273850: 之前也有類似的:#1Q0cvuAM,某b大似乎很有心得 12/25 00:48 之後有空應該會寫看看自動訂票,把5碼的完成後再研究看看~~
推 liang1230: 有重疊的或是旋轉改capsule會好很多 12/25 01:03
→ liang1230: Github上有keras的code你可以參考一下 12/25 01:03
→ liang1230: 然後某b幾乎都在嘴砲啦 沒什麼參考價值 12/25 01:05
Capsule network查了一下覺得很有趣,之後來玩看看,謝謝大大的關鍵字:)
→ vi000246: 爬蟲還好 我花兩天就做完了 驗證碼花了一個多月 12/25 01:55
→ ckvir: RNN 目的不是解決 input 是前後有關聯的問題嗎 12/25 03:34
→ ckvir: 驗證碼是是單純隨機字元吧 用RNN 有什麼效果? 12/25 03:34
因為不確定圖上的數字個數,如果把CNN取得的特徵按文字的順序(由左至右)
輸入進LSTM之類的RNN Layer,再輸出到全連接層,
我想應該是可以做到按順序去預測數字吧?
不過中間空白的部分還不太確定要怎麼處理 假日研究一下,實作完再丟Github XD
→ ckvir: 另外產生訓練集的方式可以用GAN試試看 不確定效果好不好 但 12/25 03:39
→ ckvir: 可以不用自己找規則來產生圖 12/25 03:39
GAN對我是一個新名詞XD,看起來挺有趣,研究一下之後先從Mnist開始做看看好了
→ liang1230: Gan在這不會是一個好的解 要產生驗證碼的訓練集應該不 12/25 05:43
→ liang1230: 難吧 另外rnn在這可以試試image2seq解解看 可以參考sh 12/25 05:43
→ liang1230: ow and tell的架構試試 12/25 05:43
後來想到GAN雖然有辦法產生驗證碼圖,但是沒有辦法標記答案上去,所以應該也用不著
show and tell 拿去google有看到一篇google的paper,等一下來看看他的架構
推 smartree: 好強! 12/25 15:24
推 f496328mm: 這篇討論串都有講到關鍵點 蠻不錯的 12/25 18:41
推 f496328mm: 大致上看完 寫的蠻不錯的 很有幫助 12/25 23:07
謝謝:)
→ liang1230: GAN可以給condition啊 所以其實你可以取值,但是太廢 12/26 18:06
→ liang1230: 功夫了 而且gan非常的難train training的時間又長 所 12/26 18:06
→ liang1230: 以才不建議 12/26 18:06
原來如此,GAN我還在研究架構中,見笑了XD
※ 編輯: jason860421 (36.233.146.211), 12/26/2017 19:20:08
推 Kazimir: 用gan來產資料在這個case可能有點太誇張 如果想用模型 12/26 20:45
推 Kazimir: autoencoder類應該就ok了 不過我認為常規的數據增強就夠 12/26 20:48
大概了解,不過可能還是會試試看用GAN,因為有趣XD
推 why702: 我也有做個訂票程式,目前成功機率大概8成,約10秒訂完票 12/27 19:08
→ why702: 主要是先自己分割號碼,再丟進三層CNN算 12/27 19:09
分割好像還是會有不能辨識黏在一起的問題嗎?
推 pht45616: 感激不盡!!看了這篇對期末有了很多新想法,如果能實作出 12/28 16:27
→ pht45616: 延伸或相關的內容,能不能和大大討論個或者交流呢? 12/28 16:27
可以站內信跟我討論呀:)
推 TakiDog: 我都直接硬A 我先跪了 XD 12/28 23:11
※ 編輯: jason860421 (123.50.42.131), 12/29/2017 01:56:00
推 why702: 會有不能辨識黏在一起或是背景特別雜的時候,但我覺得成功 12/30 00:24
→ why702: 率不低 12/30 00:24
→ why702: 應該可以用了啦 12/30 00:25
→ why702: 有想過用rcnn試試看,但是最近很懶 12/30 00:25
推 p00o99o: 用GAN會太難吧 12/30 01:04
推 Kazimir: 如果想用gan的話可以試試wgan-gp 應該會舒服一點 12/30 02:27
→ Kazimir: 剛剛寫完正在跑 看訓練過程的確比DCGAN穩定很多 12/30 02:31
推 saito2190: 自己產驗證碼練習好猛 01/01 18:20
※ 編輯: jason860421 (36.235.66.128), 06/07/2018 03:17:04
推 Luluemiko: 推 寫得很棒 06/19 17:39
推 a2323269: 推 寫得很詳細 很猛 07/28 00:39
推 Angesi: 很強大 這個分享我給100分 04/08 16:02