任書瑋
Data Scientists Playground
4 min readDec 18, 2019

--

驗證碼辨識實作-part1 製作training testing資料

這裏記錄下驗證碼辨識的實作過程, 這裏先簡單敘述一下目標任務

此任務會輸入一張固定大小的彩色圖片, 圖片大小為(120,60), 裡面有1~3碼, 每碼都是小寫英文字, 顏色和旋轉不固定, 並且有雜點, 以下為範例圖片

可以看到就算同樣都是u 也有不同的顏色和旋轉, 字母位置也不是那麼固定

製作training 資料

首先我們先設定字母數量和範圍, 還有圖片大小, 這裏我們用10000張訓練, 100張測試

MIN_LEN = 1
MAX_LEN = 3
width = 120
height = 60
CHARSET = list(string.ascii_lowercase)
TestImgFolder = "./testImg"
NumTest = 100
TrainImgFolder = "./trainImg"
NumTrain = 10000

用gen_rand決定要產生哪種英文字組合, 先決定幾碼再決定是哪些英文字

def gen_rand():
buf = ""
max_len = random.randint(cfg.MIN_LEN, cfg.MAX_LEN)
for _ in range(max_len):
buf += random.choice(cfg.CHARSET)
return buf

產生圖片, 這裏不設定字型, 如果要指定也是可以,

def generateImg(folder, idx):
captcha=ImageCaptcha(fonts=[], width=cfg.width, height=cfg.height)
theChars=gen_rand()
captcha.write(theChars, folder + "/" + theChars + "_" + str(idx) + '.png')
return 0

接下來跑個 for 迴圈就好啦

if __name__ == '__main__':
if os.path.isdir(cfg.TestImgFolder):
shutil.rmtree(cfg.TestImgFolder)
print('delete old ' + cfg.TestImgFolder)
os.mkdir(cfg.TestImgFolder)
for idx in range(cfg.NumTest):
generateImg(cfg.TestImgFolder, idx)

if os.path.isdir(cfg.TrainImgFolder):
shutil.rmtree(cfg.TrainImgFolder)
print('delete old ' + cfg.TrainImgFolder)
os.mkdir(cfg.TrainImgFolder)
for idx in range(cfg.NumTrain):
generateImg(cfg.TrainImgFolder, idx)

下一篇會介紹用的 model, 至於如何讀檔可以參考

--

--