python實(shí)現(xiàn)動(dòng)態(tài)GIF英數(shù)驗(yàn)證碼識(shí)別示例
有哪些特征
由數(shù)字和大寫的英文字母隨機(jī)組成
圖片大小100*35
驗(yàn)證碼的內(nèi)容會(huì)上下浮動(dòng)偶爾會(huì)超出上下邊界線,干擾項(xiàng)(也是數(shù)字或字母)從左至右翻滾經(jīng)過驗(yàn)證碼本身,這兩項(xiàng)會(huì)造成干擾
分幀的起始是亂序的,因此想通過切出固定第幾幀來避免干擾不太現(xiàn)實(shí)
識(shí)別思路
分幀
隨便挑幾張下載下來的gif樣本,來判斷下有多少幀
from io import BytesIO from PIL import Image def get_frame_number(binary): img = Image.open(BytesIO(binary)) _num = 0 while True: try: a = img.tell() _num += 1 img.seek(a + 1) except EOFError: break print(f'當(dāng)前gif有{_num}幀') return _num with open('../error_images/08e3e54f0febfe40f314b6f4a07de6b8.gif', 'rb') as f: binary = f.read() get_frame_number(binary)
經(jīng)過測(cè)試,該類型gif圖有25幀,也就是說,可以拆分成25張圖片,對(duì)于靜態(tài)的圖片,識(shí)別起來就輕松多了
收集樣本及整理字符集
我這里就直接說結(jié)果了,字符集有:數(shù)字2-9,大寫英文:A-Z,其中英文中的大寫
I, O
這兩個(gè)是沒有的,因?yàn)檫@兩個(gè)容易和數(shù)字0, 1
產(chǎn)生混淆。從這點(diǎn)上來說,開發(fā)者是動(dòng)了腦子的,減少了折磨,必須點(diǎn)個(gè)贊。建議標(biāo)注完數(shù)據(jù)集后,對(duì)所有標(biāo)簽過濾下這四個(gè)字符
最后是采集了2.2w+的gif圖,然后每張圖切25幀,最后有55w+的靜態(tài)圖,下面是分幀代碼示例:
from io import BytesIO from PIL import Image def seek_img(img_name): img = Image.open(r'F:\code\hg_gifs\' + img_name) # F:\code\hg_imgs1\ 是gif圖的路徑 for i in range(25): try: b = BytesIO() img.save(b, format='png') _bytes = b.getvalue() img = cv2.imdecode(np.array(bytearray(_bytes), dtype='uint8'), cv2.IMREAD_UNCHANGED) png_name = img_name.split('_')[0] + '_' + str(i) + '.png' cv2.imwrite(r'F:\code\hg_pngs\{}'.format(png_name), img) # F:\code\hg_pngs\ 是靜態(tài)圖保存路徑 img.seek(img.tell() + 1) except EOFError: pass rows = os.listdir(r'F:\code\hg_gifs') # F:\code\hg_imgs1\ 是gif圖的路徑 for row in rows: seek_img(row)
訓(xùn)練與識(shí)別
訓(xùn)練過程就是把上面切下來的靜態(tài)圖,直接無腦dddd_trainer 訓(xùn)練即可
這里提一句,如果數(shù)據(jù)集質(zhì)量還可以的話,識(shí)別的時(shí)候?qū)嶋H上沒有必要一張gif圖去識(shí)別25次,這里我是step為3一共識(shí)別了9次,感覺已經(jīng)夠了
訓(xùn)練完之后小測(cè)1000次,成功967次,其中18次是代理超時(shí),967/982≈98.47%,正確率在98%上下,夠用了
以上就是python實(shí)現(xiàn)動(dòng)態(tài)GIF英數(shù)驗(yàn)證碼識(shí)別示例的詳細(xì)內(nèi)容,更多關(guān)于python識(shí)別GIF驗(yàn)證碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flask使用SocketIO實(shí)現(xiàn)WebSocket與Vue進(jìn)行實(shí)時(shí)推送
本文主要介紹了Flask使用SocketIO實(shí)現(xiàn)WebSocket與Vue進(jìn)行實(shí)時(shí)推送,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Python requests模塊cookie實(shí)例解析
這篇文章主要介紹了Python requests模塊cookie實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Python實(shí)現(xiàn)批量檢測(cè)HTTP服務(wù)的狀態(tài)
本文給大家分享的是一個(gè)使用python實(shí)現(xiàn)的批量檢測(cè)web服務(wù)可用性的腳本代碼,主要功能有測(cè)試一組url的可用性(可以包括HTTP狀態(tài)、響應(yīng)時(shí)間等)并統(tǒng)計(jì)出現(xiàn)不可用情況的次數(shù)和頻率等。2016-10-10Python實(shí)現(xiàn)視頻下載與合成的示例代碼
這篇文章主要為大家詳細(xì)介紹了Python是如何實(shí)現(xiàn)視頻的下載以及合成的,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2022-04-04Python實(shí)現(xiàn)利用最大公約數(shù)求三個(gè)正整數(shù)的最小公倍數(shù)示例
這篇文章主要介紹了Python實(shí)現(xiàn)利用最大公約數(shù)求三個(gè)正整數(shù)的最小公倍數(shù),涉及Python數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-09-09