提示!本文章仅供学习交流,严禁用于非法用途,文章如有不当可联系本人删除!

一.目标网址

aHR0cDovL2NyZWRpdC5jdXN0b21zLmdvdi5jbg==

二.有哪些特征

  • 由数字和大写的英文字母随机组成
  • 图片大小100*35
  • 验证码的内容会上下浮动偶尔会超出上下边界线,干扰项(也是数字或字母)从左至右翻滚经过验证码本身,这两项会造成干扰
  • 分帧的起始是乱序的,因此想通过切出固定第几帧来避免干扰不太现实

三.识别思路

3.1) 分帧

随便挑几张下载下来的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'当前gif有{_num}帧')
    return _num

with open('../error_images/08e3e54f0febfe40f314b6f4a07de6b8.gif', 'rb') as f:
    binary = f.read()
get_frame_number(binary)

经过测试,该类型gif图有25帧,也就是说,可以拆分成25张图片,对于静态的图片,识别起来就轻松多了

3.2) 收集样本及整理字符集

  • 我这里就直接说结果了,字符集有:数字2-9,大写英文:A-Z,其中英文中的大写I, O 这两个是没有的,因为这两个容易和数字 0, 1 产生混淆。从这点上来说,开发者是动了脑子的,减少了折磨,必须点个赞。
  • 建议标注完数据集后,对所有标签过滤下这四个字符
  • 这里我采集了2.2w+的gif图,然后每张图切25帧,最后有55w+的静态图,下面是分帧代码示例:

    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\ 是静态图保存路径
                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)

四.训练与识别

  • 训练过程就是把上面切下来的静态图,直接无脑dddd_trainer 训练即可
  • 这里提一句,如果数据集质量还可以的话,识别的时候实际上没有必要一张gif图去识别25次,这里我是step为3一共识别了9次,感觉已经够了
  • 训练完之后小测1000次,成功967次,其中18次是代理超时,967/982≈98.47%,正确率在98%上下,够用了

    image-20231025102816475

这次的文章就到这了,下次再会~

最后修改:2023 年 11 月 27 日
如果觉得我的文章对你有用,请随意赞赏