爬虫:验证码识别准确率(Tesseract-OCR)

 爬虫:验证码识别准确率(Tesseract-OCR)

现在的网站为了防止人们轻易的获取登陆后的页面信息,在登陆上设置了很多的障碍,验证码就是其中的一种,所谓道高一尺,魔高一丈,人们总能想出办法来予以应对,但是,应对的成本可能在不断加大,这在一定程度上提升了反反爬虫的门槛。本文的目的在于验证Tesseract对普通验证码图片的识别准确率,以便为后续的工作做准备。

Tesseract是一个开源的 OCR 引擎,可以识别多种格式的图像文件并将其转换成文本,由HP公司开发,后来由Google进行维护。下载地址:https://digi.bib.uni-mannheim.de/tesseract/

有关的安装教程和使用方法,大家可以直接去百度,很多博主对此介绍的非常详细,这篇博文的主要目的是利用该OCR来分析它对验证码识别的准确率。所以,对于安装及有关环境的配置就不再多讲了。

  •    思路:
  • (1)获取批量验证码图片(利用某高校登录页面的验证码图片) ;
  • (2)为验证码图片做信息标注(虽然很不想手动标记,但这是必须的,因为我们要确保百分百正确);
  • (3)利用Tesseract-OCR对验证码图片进行识别并测试识别效果;
  • (4)后续工作思路,如何提高识别的精度。

 一、爬取某高校页面的验证码图片100张

 

打开该网址,就可以看到该验证码图片,并且没刷新一次就会产生新的图片;

使用代理不断访问该网址获取验证码图片,并保存为png格式文件;

from urllib import request
import time
import random
def get_and_save_verify(i):
    try:
        url = 'http://jwxt.qlu.edu.cn/verifycode.servlet'
        request.urlretrieve(url, './verify_pictures/' + 'verify_' + str(i) + '.png')
        print('第' + str(i) + '张图片下载成功')
    except Exception:
        print('第' + str(i) + '张图片下载失败')


def get_proxy():
    # 使用代理步骤
    # - 1、设置代理地址
    proxys = [{'http': '39.137.69.10:8080'},
              {'http': '111.206.6.101:80'},
              {'http': '120.210.219.101:8080'},
              {'http': '111.206.6.101:80'},
              {'https': '120.237.156.43:8088'}]
    # - 2、创建ProxyHandler
    proxy = random.choice(proxys)
    proxy_handler = request.ProxyHandler(proxy)
    # - 3、创建Opener
    opener = request.build_opener(proxy_handler)
    # - 4、导入Opener
    request.install_opener(opener)


if __name__ == '__main__':
    for i in range(1, 101):
        get_proxy()
        time.sleep(random.randint(1, 4))
        get_and_save_verify(i)

 保存之后的图片;

二、对验证码图片手动信息标注,将图片上的验证信息放入图片的名称内,便于后续测试

这个过程比较无聊,标注完成之后的图片是这样的(无论数据分析还是图像处理,信息标注很多时候对于程序员来说都是一个体力活,眼力活);

 三、利用Tesseract-OCR进行图像信息识别,并将图像的识别结果与藏在图片文件名中的标签进行比对,测试识别的准确率

这里涉及到图像识别和数据处理,利用pytesseract库来利用tesseract接口来进行识别,并比较结果,输出准确率;

import pytesseract
import cv2
import os
import numpy as np
path = 'F:/文件存放处/picture2/'

file_name = []
for k in os.walk(path):
    file_name = k[-1]

print('识别值' + '-----' + '真实值')
num = 0
for i in file_name:
    img = cv2.imdecode(np.fromfile(path + i, dtype=np.uint8), 1)
    a = pytesseract.image_to_string(img)
    true_value = i[-8:-4]
    print(a + '-----' + true_value)
    if a == true_value:
        num += 1

print('识别的准确率为:' + str(num/100))

 查看结果;

四、分析结果

改进结果不涉及对识别方法的改进,只涉及对数据和识别结果的改进。 

  1. 通过测试结果可以看出,识别的准确率并不是很好,通过下面的两种改进策略来提高识别的准确率,或者两者联合使用;
  2. 改进策略一:(对识别结果的改进)

(1)观察数据就可以看出,验证中的信息是由字母和数字组成,不存在特殊字符,由于图片中含有部分噪音,导致识别出现较大误差,如果去除识别结果中的特殊字符,只保留数字和字母,识别的效果会在一定程度上改进。 

(2)真实数据都是只占四个位置,所以,可以在第一条的基础上,对字符的数量进行限制,设置为小于等于4

(3)真实数据中不存在大写字母,将识别结果一律转换为小写

  1. 改进策略二:(对数据来源的降噪处理)

(1)通过观察可以看到图片上有很多噪音,利用OpenCV对图片进行降噪处理

后续处理:下一篇博文:https://blog.csdn.net/qq_40962368/article/details/89331608

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
首先,感谢您对OCR技术的关注。针对您的问题,我来为您提供一些解答。 Tesseract-OCR是一个免费的OCR引擎,可用于将图像中的文字转换为文本。而jTessBoxEditor是Tesseract-OCR提供的一个GUI界面,可以用于训练OCR识别模型,以提准确率。 以下是使用jTessBoxEditor提OCR识别准确率的一些步骤: 1. 准备训练数据。首先需要准备一些训练图像和相应的文本文件,用于训练OCR模型。 2. 打开jTessBoxEditor。在菜单栏中选择“Tools”->“Merge Tiff”,将训练图像合并成一个多页Tiff文件。 3. 生成Box文件。在菜单栏中选择“Tools”->“Generate Box File”,对合并后的Tiff文件进行分页,并生成对应的Box文件。 4. 编辑Box文件。在菜单栏中选择“Tools”->“Box Editor”,打开Box文件并进行编辑。可以通过手动添加和删除Box框,来指定OCR识别的区域和内容。 5. 训练OCR模型。在菜单栏中选择“Tools”->“Train Tesseract”,进行OCR模型训练。训练完成后,会生成一个新的OCR语言包文件。 6. 测试OCR识别效果。在菜单栏中选择“Tools”->“Test Image”,用训练好的OCR语言包来对新的图像进行OCR识别,并评估识别准确率。 希望这些步骤能对您有所帮助,提OCR识别率。同时,需要注意的是,OCR技术的准确率还受到许多因素的影响,如图像质量、文字大小、字体等。因此,在实际应用中,还需要针对具体的场景进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值