• 网易易盾中文点选验证码识别方法


    中文验证码一直是识别的难题,首先他分类的种类很多,常见中文都有3500个,而且一般中文验证码都会有变形,导致每一个文字都需要大量训练样本。假设每一个汉字样本需要100个,100×3500=35万个样本,所以标记的样本数量巨大,训练周期长,成本高。

    而且通常需要点选的文字数量很多,需要同时全对也是一件不容的事情。假设单个字的正确率是90%,假设需要点选4个汉字,全对的正确率就是0.9的4次方,正确率也只有65%。所以非常困难。

    网易易盾又是难上加难,字体模糊,还有变形,有些颜色和背景颜色太过于接近,会导致识别率降低

    下面我们就以网易易盾中文验证码为例提供了一个识别方案。只需要点击的中文大图,决定点击顺序的中文文本(页面上是文本)。如下图所示

    大图样例:

    文本样例:

    "意苗印"

    再配合下面的样例代码,就可以获得正确的识别结果

    1. import base64
    2. import requests
    3. import datetime
    4. from io import BytesIO
    5. from PIL import Image, ImageDraw
    6. t1 = datetime.datetime.now()
    7. #PIL图片保存为base64编码
    8. def PIL_base64(img, coding='utf-8'):
    9. img_format = img.format
    10. if img_format == None:
    11. img_format = 'JPEG'
    12. format_str = 'JPEG'
    13. if 'png' == img_format.lower():
    14. format_str = 'PNG'
    15. if 'gif' == img_format.lower():
    16. format_str = 'gif'
    17. if img.mode == "P":
    18. img = img.convert('RGB')
    19. if img.mode == "RGBA":
    20. format_str = 'PNG'
    21. img_format = 'PNG'
    22. output_buffer = BytesIO()
    23. # img.save(output_buffer, format=format_str)
    24. img.save(output_buffer, quality=100, format=format_str)
    25. byte_data = output_buffer.getvalue()
    26. base64_str = 'data:image/' + img_format.lower() + ';base64,' + base64.b64encode(byte_data).decode(coding)
    27. # base64_str = base64.b64encode(byte_data).decode(coding)
    28. return base64_str
    29. # 加载图片
    30. img1 = Image.open(r'E:\Python\lixin_project\OpenAPI接口测试\test_img\49-1.jpg')
    31. # 图片转base64
    32. img1_base64 = PIL_base64(img1)
    33. # 验证码识别接口
    34. url = "http://www.detayun.cn/openapi/verify_code_identify/"
    35. data = {
    36. # 用户的key
    37. "key":"MNhRvR5V6ArzCXAw16yY",
    38. # 验证码类型
    39. "verify_idf_id":"49",
    40. # 样例图片
    41. "img_base64":img1_base64,
    42. "words":"意苗印",
    43. }
    44. header = {"Content-Type": "application/json"}
    45. # 发送请求调用接口
    46. response = requests.post(url=url, json=data, headers=header)
    47. # 获取响应数据,识别结果
    48. print(response.text)
    49. print("耗时:", datetime.datetime.now() - t1)

    识别效果如下

    想了解更多验证码识别请访问:得塔云

  • 相关阅读:
    浅谈云原生数据库:回顾过去,未来可期
    【漏洞复现】蓝凌EIS智慧协同平台 api.aspx接口处存在任意文件上传漏洞
    亲测解决no module named ‘PyQt5.QtCore‘
    虚拟磁盘discard在qemu中的应用
    【Rust指南】基础语法|基本数据类型|复合数据类型
    记录第一次开源流计算框架Flink代码的贡献
    Java之关于使用com.sun.jna的简单实例
    数字图像处理实验(四)|图像压缩与编码实验{JPGE编码、离散余弦变换DCT、图像分块dctmtx|blkproc}(附matlab实验代码和截图)
    Spring IOC的理解
    UEFI-GCD
  • 原文地址:https://blog.csdn.net/Dxy1239310216/article/details/139727692