python實(shí)現(xiàn)動(dòng)態(tài)GIF英數(shù)驗(yàn)證碼識(shí)別示例
有哪些特征
由數(shù)字和大寫(xiě)的英文字母隨機(jī)組成
圖片大小100*35
驗(yàn)證碼的內(nèi)容會(huì)上下浮動(dòng)偶爾會(huì)超出上下邊界線,干擾項(xiàng)(也是數(shù)字或字母)從左至右翻滾經(jīng)過(guò)驗(yàn)證碼本身,這兩項(xiàng)會(huì)造成干擾
分幀的起始是亂序的,因此想通過(guò)切出固定第幾幀來(lái)避免干擾不太現(xiàn)實(shí)
識(shí)別思路
分幀
隨便挑幾張下載下來(lái)的gif樣本,來(lái)判斷下有多少幀
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)過(guò)測(cè)試,該類型gif圖有25幀,也就是說(shuō),可以拆分成25張圖片,對(duì)于靜態(tài)的圖片,識(shí)別起來(lái)就輕松多了
收集樣本及整理字符集
我這里就直接說(shuō)結(jié)果了,字符集有:數(shù)字2-9,大寫(xiě)英文:A-Z,其中英文中的大寫(xiě)
I, O這兩個(gè)是沒(méi)有的,因?yàn)檫@兩個(gè)容易和數(shù)字0, 1產(chǎn)生混淆。從這點(diǎn)上來(lái)說(shuō),開(kāi)發(fā)者是動(dòng)了腦子的,減少了折磨,必須點(diǎn)個(gè)贊。建議標(biāo)注完數(shù)據(jù)集后,對(duì)所有標(biāo)簽過(guò)濾下這四個(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)練過(guò)程就是把上面切下來(lái)的靜態(tài)圖,直接無(wú)腦dddd_trainer 訓(xùn)練即可
這里提一句,如果數(shù)據(jù)集質(zhì)量還可以的話,識(shí)別的時(shí)候?qū)嶋H上沒(méi)有必要一張gif圖去識(shí)別25次,這里我是step為3一共識(shí)別了9次,感覺(jué)已經(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í)推送,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Python requests模塊cookie實(shí)例解析
這篇文章主要介紹了Python requests模塊cookie實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Python實(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-10
Python中列表和元組的相關(guān)語(yǔ)句和方法講解
這篇文章主要介紹了Python中列表和元組的相關(guān)語(yǔ)句和方法講解,是Python入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08
python matplotlib保存圖片不全問(wèn)題及解決
這篇文章主要介紹了python matplotlib保存圖片不全問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Python實(shí)現(xiàn)視頻下載與合成的示例代碼
這篇文章主要為大家詳細(xì)介紹了Python是如何實(shí)現(xiàn)視頻的下載以及合成的,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2022-04-04
Python實(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

