提供各位開發程式訂票,其中驗證碼破解部分的方法,可直接使用,不須再回傳 image 用人工方式辨識。
此 package 使用 keras & Tensorflow 建模&預測,需要安裝相依 package。
model test data 準確率約為 88%,使用 10 萬張圖進行 training。
pip3 install TaiwanTrainVerificationCode2text
cv2 比較難裝,以下提供安裝方法
conda install -c menpo opencv
# 你還需要這個
pip3 install h5py
input
output
WNBA8S
import os
import platform
from TaiwanTrainVerificationCode2text import verification_code2text
from TaiwanTrainVerificationCode2text import work_vcode
from TaiwanTrainVerificationCode2text import download
import TaiwanTrainVerificationCode2text
PATH = TaiwanTrainVerificationCode2text.__path__[0]
import cv2
import matplotlib.pyplot as plt
import random
from datetime import datetime
# 下載我 train 好的 weight,ttf 是驗證碼字形,用於以下生成模擬驗證碼
download.weight()
download.ttf()
# 生成模擬驗證碼
work_vcode.work_vcode_fun(10,'test_data',5)
work_vcode.work_vcode_fun(10,'test_data',6)
if 'linux' in platform.platform():
file_path = '{}/{}/'.format(PATH,'test_data')
train_image_path = [file_path + i for i in os.listdir(file_path+'/')]
else:
file_path = '{}\\{}\\'.format(PATH,'test_data')
train_image_path = [file_path + i for i in os.listdir(file_path+'\\')]
# 隨機取一個當作 demo
image_name = train_image_path[random.sample( range(len(train_image_path)) ,1)[0]]
# 讀取圖片
image = cv2.imread(image_name)
# 畫圖
plt.imshow(image)
# 辨識,驗證碼轉文字
text = verification_code2text.main(image)
# 印出最後結果
print(text)
最後結果就會類似 demo ,
如果想自己 train,可以使用
build_verification_code_cnn_model.py
稍微介紹主要 code
def main():
import work_vcode
#import time
# 因為台鐵驗整碼是 5~6 隨機,因此必須生成 5 碼驗證碼& 6 碼驗證碼
# 500 是 data 數量,建議數字為30000,500 只是 demo
work_vcode.work_vcode_fun(500,'train_data',5)
work_vcode.work_vcode_fun(500,'train_data',6)
# 生成 test data,可根據自己喜好調整 data 數量
work_vcode.work_vcode_fun(100,'test_data',5)
work_vcode.work_vcode_fun(100,'test_data',6)
self = build_verification_code_cnn_model()
# 建模,最後 weight 會存放在 package_path/cnn_weight/verificatioin_code.h5
self.build_model_process()
train 好後,可再使用以上 example code,會讀取你 train 好的 weight。
由於驗證碼是26個英文字搭配10個數字,再加上隨機 5~6 碼,我將 class 分成 26 + 10 + null,37類,下去做分類。
null 代表沒有此文字, 我將 NN 結構中的 output 設計為 6 dimension,將5碼也看成6碼,只是最後一個是 null,藉此同時處理 5 or 6 碼問題。
面臨到最大的問題是,null 佔比例太大,以上面生成 data 的 code 為例
work_vcode.work_vcode_fun(500,'train_data',5)
work_vcode.work_vcode_fun(500,'train_data',6)
先不管英文&數字數量,有一半的 class 是 null,因此在分類問題上,會造成嚴重的 imbalance 問題,即使 data 增加也不會改善問題,未來將搭配 object detection,改善準確率。
如有問題,可寄信給我 or 留言在 issues。
email : [email protected]