精华内容
下载资源
问答
  • 我对上面的代码进行了一些小修改,同时升级为python3的代码。 还是以这张图片为例: 在以前的我们已经知道这种简单的粘连可以通过控制阈值来实现分割,这里我们使用滴水算法。 首先使用之前文章中介绍的垂直投影...
  • 相应的,验证码识别大体可以分为下面几个步骤: 灰度处理 增加对比度(可选) 二值化 降噪 倾斜校正分割字符 建立训练库 识别 由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码...
  • python验验证证码码识识别别教教程程之之灰灰度度处处理理二二值值化化降降噪噪与与tesserocr识识别别 这篇文章主要给大家介绍了关于python验证码识别教程之灰度处理二值化降噪与tesserocr识别的相关资料 文中通过...
  • 相应的,验证码识别大体可以分为下面几个步骤: 灰度处理 增加对比度(可选) 二值化 降噪 倾斜校正分割字符 建立训练库 识别 由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码...
  • python验证码识别

    2019-03-22 21:18:06
    几个验证码识别示例, python 调用 tessreact-ocr 完成的识别验证码识别的数字, python简单的进行了图片处理
  • python验证码识别

    热门讨论 2012-10-10 22:34:13
    python验证码识别库,大家可以研究一下
  • 主要给大家介绍了关于python验证码识别教程之滑动验证码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要给大家介绍了关于python验证码识别教程之利用投影法、连通域法分割图片的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧
  • python验验证证码码识识别别的的示示例例代代码码 本篇文章主要介绍了python验证码识别的示例代码小编觉得挺不错的现在分享给大家也给大家做个参考 一起跟 小编过来看看吧 写爬虫有一个绕不过去的问题就是验证码现在...
  • 详解Python验证码识别

    2020-09-21 18:49:24
    几天在写一个程序的时候需要识别验证码,因为程序是Python写的自然打算用Python进行验证码识别。下面把实现思路分享在脚本之家平台,感兴趣的朋友可以参考下
  • python 验证码图片识别源代码,适合学生课程设计、毕业设计参考资料。
  • (2)pytesser:下载解压后直接放C:\Python27\Lib\site-packages(根据你安装的Python路径而不同),同时,新建一个pytheeer.pth,内容就写pytesser,注意这里的内容一定要和pytesser这个文件夹同名,意思就是pytesser...
  • 现在的网站为了防止机器人提交表单,图片验证码是很常见的应对手段之一。这里就不详细介绍了,相信大家都遇到过。现在这篇文章就给出用Python识别验证码的详细示例代码,文中介绍的很详细,有需要的可以参考借鉴。
  • 本文研究的主要是Python验证码识别的相关代码,具体如下。 Talk is cheap, show you the Code! import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from PIL import Image #...
  • 本文实例讲述了Python验证码识别的方法。分享给大家供大家参考。具体实现方法如下: #encoding=utf-8 import Image,ImageEnhance,ImageFilter import sys image_name = "./22.jpeg" #去处 干扰点 im = Image.open...
  • python验证码识别 语言 python 版本3.7 语言工具 pycharm 版本2018.2.2 工具 selenium 版本3.14 技术1 接口识别库 request 技术2 图片切割库 pillow 二、传统技术 1、万能...

    一、环境准备:

    任务python验证码识别
    语言python 版本3.7
    语言工具pycharm 版本2018.2.2
    工具selenium 版本3.14
    技术1接口识别库 request
    技术2图片切割库 pillow

    二、方法
    1、万能能验证码—(缺点:不算模拟用户行为)
    2、注释验证码相关的后台代码(缺点:繁琐,需要修改代码)
    3、OCR技术(python库缺点,识别率低于20%)
    4、保存服务端的cookie值(保留成功状态。缺点:并未做登录操作,跳过这个问题,而不是解决这个问题)
    5、电脑使用内网ip地址,根据绑定的ip,不需要输入验证码
    6、通过第三方工具,根据图片识别文字的工具。缺点:准确率低
    7、通过第三方网站,易源网站,识别验证码。优点:准确率高,收费
    8、输入验证码前,加入时间等待15秒。手动输入验证码。这个方式很笨

    三、方法详解:万能验证码的设置:
    1、如何查看系统是否存在万能验证码
    (1)确认源代码位置
    (2)了解MVC设计模式

    12
    model 模型层数据库相关。新增用户信息时,通过user类创建一个user对象,就会向数据库保存用户信息。(user类里有和表对应的属性,user表存储用户信息)
    view界面层前端界面相关。用于收集和显示,用户的输入数据和服务器端的输出数据
    control 控制层处理业务逻辑 ,负责系统所有的业务逻辑处理

    判断验证码是否登录成功,属于业务逻辑,代码在control层。找验证码代码,需要先找登录功能代码。分析登录页面网址

    #登录页面地址
    http://127.0.0.1/index.php?m=admin&c=public&a=login
    
    #分析这三个参数
    m=admin&c=public&a=login
    m是模块,一个模块就是一个文件夹,一个文件夹对应某一个包名
    c是controller,一个控制器,一般是一个类,也就是一个类文件
    a是action,是一个行为动作,一个动作就是代码里的某个方法
    

    根据这三个参数,找到对应的文件,在代码里找到验证码相关的代码
    分析:假如代码中,含有:

    #验证码不正确的时候,if条件的判断代码,代码里有
    if((..........)!='1234')
    	验证码不正确
    #所以,万能验证码为1234
    

    2、添加万能验证码

    四、方法详解:第三方网站,识别验证码
    1、要求:
    UI自动化,需要测试时,尽量仿真的模拟用户行为
    2、知识拓展:
    易源网站(万维易源)封装了很多人工智能算法,登录网站搜索“验证码识别”,查询到相关接口。(收费)
    网站:https://www.showapi.com/
    3、使用此处的验证码接口需要什么东西?
    (1)接口的使用环境,本质:调用了python的request库。所以使用时,需要request库。
    如图,右侧【SDK下载】下载SDK是个压缩文件,解压后是一个py文件,放到工程目录下在这里插入图片描述
    (2)接口地址(识别英文_文件):http://route.showapi.com/184-4
    接口收费,访问地址需要如下(购买后得到)
    (a)App_ID:用户id、
    (b)App_sceret:密码
    (3)接口参数:
    image:图片的地址
    typeId:告诉接口,识别验证码的类型,(使用方法见网站内解释)
    convert_to_jpg:不需要图片转换

    3、解决方案:通过接口识别方法
    优点:能识别具体内容,识别率为90%
    缺点:只能是中文验证码和数字验证码、英文验证码(12306的无法识别)

    四、实现
    步骤:
    (1)通过selenium启动浏览器,识别用户名和密码
    (2)将浏览器中的登录信息进行截图,切割验证码(使用pillow库)
    (3)针对浏览器中的验证码图片进行识别(易源网站的验证码识别接口)

    五、原代码

    #1.准备  使用Selenium启动浏览器识别用户名和密码
    from PIL import Image
    from selenium import webdriver
    from ShowapiRequest import ShowapiRequest
    
    jwdriver=webdriver.Chrome() #调用chrome浏览器
    # 打开浏览器
    jwdriver.get("http://127.0.0.1/iwebshop/index.php?controller=systemadmin")
    #定位用户名输入框 并且输入内容
    jwdriver.find_element_by_name("admin_name").send_keys("admin")
    #定位密码输入框 并且输入内容
    jwdriver.find_element_by_name("password").send_keys("123456")
    
    #2.截图浏览器中的图片   进行切割(Pillow库)
    # 从网页中提取出验证码图片
    def  jietu():
        jwdriver.save_screenshot("C:/jw123all.png")
        # 使用坐标方式
        # 拿到验证码左上角坐标
        left_top=jwdriver.find_element_by_id("captchaImg").location
        print("左上角坐标",left_top)
        #左上角的x轴坐标
        #左上角的y轴坐标
        left=left_top['x']
        top= left_top['y']
    # 取出右下角坐标
        # 获取图片的宽度+left x1 =====》  右坐标
        #获取图片的高度+top y1 =====》  下坐标
        #定位图片
        img=jwdriver.find_element_by_id("captchaImg")
        right=img.size['width']+left
        down=img.size['height']+top
        print("四个点的坐标",left,top,right,down)
        # 利用这四个坐标切割图片
        # 1.打开图片
        jw_img=Image.open("C:/jw123all.png")
        jw_img22=jw_img.crop((left,top,right,down))
        # 保存到硬盘上
        jw_img22.save("C:/jwyanzhengma.png")
    #3.再针对验证码进行识别(易源的接口)
    def   shibieyanzhengma():
        # 使用接口环境访问接口地址===>前提要注意联网
        jw1=ShowapiRequest("http://route.showapi.com/184-4","75989","10186a47079e4b8085ddb9bf168d3f70")
    # 增加接口请求的参数
        jw1.addBodyPara("typeId","25")
        jw1.addBodyPara("convert_to_jpg","0")
        # 告诉接口识别的验证码图片文件
        jw1.addFilePara("image","c:/jwyanzhengma.png")
        #访问接口
        result=jw1.post().json()
        #从json提炼出有效的数据
        text=result['showapi_res_body']['Result']
        print("验证码是",text)
        return  text
    
    
    if  __name__=="__main__":
        jietu()
        # 调用验证码函数获取结果
        yanzhengma=shibieyanzhengma()
        #将验证码放到网页上
        jwdriver.find_element_by_name("captcha").send_keys(yanzhengma)
    

    六、我的练习代码

    #导入webdriver类包
    from PIL import Image
    from selenium import webdriver
    from ShowapiRequest import ShowapiRequest
    
    #调用谷歌浏览器
    webdriver = webdriver.Chrome()
    
    #打开谷歌浏览器
    webdriver.get('网址')
    #定位元素,用户名,输入内容
    webdriver.find_element_by_id('用户名的id').send_keys('user')
    #定位元素,密码,输入内容
    webdriver.find_element_by_id('密码的id').send_keys('111111')
    
    #定义函数,截取验证码图片
    def picture_screenshoot():
        #从网页中提取验证码图片
        webdriver.save_screenshot('D:\图片文件名.png')
    
        #获取验证码左上角坐标,格式:{'x':100,'y':200}
        left_top = webdriver.find_element_by_id('验证码的id').location
        print('左上角坐标',left_top)
        #X轴坐标
        x = left_top['x']
        #Y轴坐标
        y = left_top['y']
    
        #获取右下角的图标,先获取验证码的长和宽
        #宽度+x = x1
        ver_img = webdriver.find_element_by_id('验证码的id')
        x1 = ver_img.size['width']+x
        #高度+y = y1
        y1 = ver_img.size['hight']+y
    
        #使用四个坐标,切割验证码(使用pillow库),
        #需要安装pillow库,否则没有Imag对象
    
        #打开图片,在硬盘中的图片加载到内存中
        ver_img2 = Image.open('D:\图片文件名.png')
        #传入四个坐标值
        ver_img2.crop(x,y,x1,y1)
        #将截取的验证码保存到硬盘上
        ver_img2.save('D:\验证码图片名.png')
    
    #定义函数,识别验证码
    def verif_pic_identified():
        #使用接口环境,访问接口地址,必须联网访问
        req = ShowapiRequest('http://route.showapi.com/184-4')
        #增加接口请求参数
        req.addBodyPara('typeId','25')
        req.addBodyPara('convert_to_jpg', '0' )
        #告诉接口识别的验证码图片文件
        req.addFilePara('imag','D:\验证码图片名.png')
        #访问接口
        response = req.post().json()
        print(response)
        #从json中,提取有效验证码数据
        text = response['shouapi_res_body']['Result']
        print(text)
        return text
    
    
    if __name__ == '__main__':
        picture_screenshoot()
        yanzhengma = verif_pic_identified()
        webdriver.find_element_by_id('验证码id').send_keys(yanzhengma)
    
    

    七、无注释代码

    from PIL import Image
    from selenium import webdriver
    from ShowapiRequest import ShowapiRequest
    
    jwdriver=webdriver.Chrome() 
    jwdriver.get("http://127.0.0.1/iwebshop/index.php?controller=systemadmin")
    jwdriver.find_element_by_name("admin_name").send_keys("admin")
    jwdriver.find_element_by_name("password").send_keys("123456")
    
    
    def  jietu():
        jwdriver.save_screenshot("C:/jw123all.png")
        left_top=jwdriver.find_element_by_id("captchaImg").location
        print("左上角坐标",left_top)
        left=left_top['x']
        top= left_top['y']
    
        img=jwdriver.find_element_by_id("captchaImg")
        right=img.size['width']+left
        down=img.size['height']+top
        print("四个点的坐标",left,top,right,down)
    
        jw_img=Image.open("C:/jw123all.png")
        jw_img22=jw_img.crop((left,top,right,down))
    
        jw_img22.save("C:/jwyanzhengma.png")
        
    #3.再针对验证码进行识别(易源的接口)
    def   shibieyanzhengma():
        jw1=ShowapiRequest("http://route.showapi.com/184-4","75989","10186a47079e4b8085ddb9bf168d3f70")
        jw1.addBodyPara("typeId","25")
        jw1.addBodyPara("convert_to_jpg","0")
        jw1.addFilePara("image","c:/jwyanzhengma.png")
        result=jw1.post().json()
        text=result['showapi_res_body']['Result']
        print("验证码是",text)
        return  text
    
    if  __name__=="__main__":
        jietu()
        yanzhengma=shibieyanzhengma()
        jwdriver.find_element_by_name("captcha").send_keys(yanzhengma)
    
    展开全文
  • 自动识别验证码源码
  • 在本篇内容里小编给大家整理的是一篇关于python识别验证码的思路及解决方案,有需要的朋友们可以参考下。
  • Python验证码识别 | 源码+通用识别模型

    万次阅读 多人点赞 2019-01-30 17:45:50
    关键词:Python验证码识别,基于CRNN(CNN+Bi-GRU+CTC)实现的验证码识别方案,无论是简单或者复杂的验证码均可一键99%通杀,包含源码和通用识别模型,可秒杀绝大多数验证码。我可以向你们保证,它绝对会是你所见过...

    Python验证码识别 | 源码+通用识别模型


    项目地址:https://github.com/kerlomz/captcha_trainer

    编译版下载地址: https://github.com/kerlomz/captcha_trainer/releases/tag/v1.0

    注意:若使用云服务器 (Windows Server版) 遇到闪退,请按照步骤:我的电脑——属性——管理——添加角色和功能——勾选桌面体验,点击安装,安装之后重启即可。

    2020/06/01编外:

    想必各位只是偶然间搜到这篇文章,网上文章参差不齐,标题党很多,能跑起来的开源代码很少,对于能跑起来的代码,也经常遇到以下问题如:内存泄漏,网络参数写死导致更换训练集报错,网络跑其他样本识别率低,没有调用示例等等。

    再往下看之前,我可以向你们保证,它绝对会是你所见过的所有验证码有关的文章中最实用,最接近生产水平的。

    1. 对小白: 你可以不需要动手写任何一行代码。
    2. 对小企业: 它的可用性和稳定性是经得起考验的,在性能上也是同行领先的,可以放心入坑。

    因为小编打算转行了,离开这个行业之前总要留下点什么证明自己来过,总有人和我说的这个部署不会调用,可能你们想要的是一行pip就搞定环境的,所以今天给你们安排了麻瓜OCR(MuggleOCR)。
    https://pypi.org/project/muggle-ocr
    它整合了简单验证码识别通用模型+印刷文字通用识别,并且支持调用本文框架训练的模型。调用只需要三行核心代码:

    import time
    # STEP 1
    import muggle_ocr
    import os
    # STEP 2
    sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)
    root_dir = r"./imgs"
    for i in os.listdir(root_dir):
        n = os.path.join(root_dir, i)
        with open(n, "rb") as f:
            b = f.read()
        st = time.time()
        # STEP 3
        text = sdk.predict(image_bytes=b)
        print(i, text, time.time() - st)
    

    这真的很简单,应付一般的文字识别和验证码都足够了。(文字识别过几天会更新一下新模型,毕竟0601模型就跑了半天。

    1. 前言

    本项目适用于Python3.7,GPU>=NVIDIA GTX1050Ti,原master分支新增了GUI配置界面以及编译版本了,是时候写一篇新的文章了。

    **长话短说,开门见山,**网络上现有的代码以教学研究为主,本项目是为实用主义者定制的,只要基本的环境安装常识,便可很好的训练出期望的模型,重定义几个简单的参数任何人都能使用深度学习技术训练一个商业化成品。

    笔者选用的时下最为流行的CNN+BLSTM+CTC(CRNN)进行端到端的不定长验证码识别,代码中预留了CNNX(搜不到因为是小编自己拼凑的)/MobileNet/DenseNet121/ResNet50等选项,可以在配置界面中直接选用。首先,介绍个大概吧。
    main.png

    网格结构predict-CPUpredict-GPU模型大小
    CNN5+Bi-LSTM+H64+CTC15ms8ms2mb
    CNN5+CrossEntropy8ms2ms1.5mb

    H16/H64指的是Bi-LSTM的隐藏神经元个数UnitsNum,所以本项目使用GPU训练,使用CPU进行预测。预测服务部署项目源码请移步此处:https://github.com/kerlomz/captcha_platform
    部署项目的编译版下载地址:https://github.com/kerlomz/captcha_platform/releases

    2.环境依赖:

    花了超长篇幅介绍了训练环境的基本搭建,主要是给尚未入门的读者看的,老鸟们随便跳过,若不希望在环境上面浪费时间的,欢迎使用编译版,可在文章开头找到下载地址。

    关于CUDA和cuDNN版本的问题,不少人很纠结,这里就列出官方通过pip安装的TensorFlow的版本对应表:

    Linux

    VersionPython versionCompilerBuild toolscuDNNCUDA
    tensorflow_gpu-1.14.03.7GCC 4.8Bazel 0.15.07.69

    Windows

    VersionPython versionCompilerBuild toolscuDNNCUDA
    tensorflow_gpu-1.14.03.7MSVC 2015 update 3Bazel 0.15.07.610

    如果希望使用上面对应之外的搭配的CUDA和cuDNN,可以自行编译TensorFlow,或者去Github上搜索TensorFlow Wheel找到第三方编译的对应版本的whl安装包。提前预警,若是自己编译将会苦难重重,坑很多,这里就不展开了。

    2.1 本项目环境依赖

    目前在以下主流操作系统平台均测试通过:

    操作系统最低支持版本
    Ubuntu16.04
    Windows7 SP1
    MacOSN/A

    本训练项目主要的环境依赖清单如下

    依赖最低支持版本
    Python3.7
    TensorFlow-GPU1.14.0
    Opencv-Python4.1.2.30
    Numpy1.16.0
    Pillow4.3.0
    PyYaml3.13
    tqdmN/A

    2.1.1 Ubuntu 16.04 下的 Python 3.7

    1)先安装Python环境(有Python 3.7环境的可以忽略)

    sudo apt-get install openssl  
    sudo apt-get install libssl-dev
    sudo apt-get install libc6-dev gcc  
    sudo apt-get install -y make build-essential zlib1g-dev libbz2-dev libreadline-dev $ libsqlite3-dev wget curl llvm tk-dev 
    wget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tgz
    tar -vxf Python-3.7.6.tar.xz
    cd Python-3.7.6
    ./configure --prefix=/usr/local  --enable-shared
    make -j8
    sudo make install -j8
    

    经过上面指令就安装好Python3.7环境了,如果提示找不到libpython3.7m.so.1.0就到/usr/local/lib路径下将该文件复制一份到/usr/lib和/usr/lib64路径下。
    2)安装相关依赖(这一步Windows和Linux通用)
    可以直接在项目路径下执行pip3 install -r requirements.txt安装所有依赖,注意这一步是安装在全局Python环境下的,强烈建议使用虚拟环境进行项目间的环境隔离,如VirtualenvAnaconda等等。
    我一般使用的是Virtualenv,有修改代码需要的,建议安装PyCharm作为Python IDE

    virtualenv -p /usr/bin/python3 venv # venv is the name of the virtual environment.
    cd venv/ # venv is the name of the virtual environment.
    source bin/activate # to activate the current virtual environment.
    cd captcha_trainer # captcha_trainer is the project path.
    pip3 install -r requirements.txt
    

    2.1.2 Ubuntu 16.04 下的 CUDA/cuDNN

    网上看到过很多教程,我自己也部署过很多次,Ubuntu 16.04遇到的坑还是比较少的。14.04支持就没那么好,如果主板不支持关闭SecureBoot的话千万不要安装Desktop版,因为安装好之后一定会无限循环在登陆界面无法进入桌面。
    网上教程说要加驱动黑名单什么的我直接跳过了,亲测没那个必要。就简单的几步:
    1. 下载好安装包
    注意下载runfile类型的安装包,deb安装会自动安装默认驱动,极有可能导致登陆循环
    NVIDIA 驱动下载:https://www.geforce.cn/drivers
    CUDA 下载地址:https://developer.nvidia.com/cuda-downloads
    cuDNN 下载地址:https://developer.nvidia.com/cudnn (需要注册NVIDIA账号且登陆,下载deb安装包)

    2. 关闭图形界面
    Ctrl+alt+F1进入字符界面,关闭图形界面

    sudo service lightdm stop
    

    3. 安装Nvidia Driver

    命令中的版本自己对应下载的版本改,在上面的下载地址根据自己的显卡型号下载最新版,切记是runfile格式的安装包。

    sudo chmod a+x NVIDIA-Linux-x86_64-384.90.run //获取执行权限
    sudo ./NVIDIA-Linux-x86_64-384.90.run –no-x-check –no-nouveau-check –no-opengl-files //安装驱动
    

    安装成功以后使用以下命令验证,如果显示显卡信息则表示安装成功

    nvidia-smi
    

    4. 安装CUDA

    1)先安装一些系统依赖库

    sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
    
    1. 执行安装程序,按指示无脑继续就好了,如果提示是否安装驱动选不安装。
    sudo sh cuda_9.0.176_384.81_linux.run
    

    安装完如果环境变量没配上去,就写到 ~/.bashrc 文件的尾部

    export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
    export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
    

    然后在终端执行 sudo ldconfig更新,安装完毕就可以重启机器重启图形界面了。

    sudo service lightdm start
    

    2.1.3 Windows 系统

    在Windows其实简单很多,只要到官网下载安装包无脑安装就可以了,下载连接同Ubuntu,先安装Python,显卡驱动,CUDA,然后下载对应的cuDNN替换到对应路径即可。

    3 使用

    在训练之前,有不少群友经常问我“训练4位数英文数字需要多少样本?”诸如此类的问题,我这里统一做个回复,样本数量主要是看样本的特征复杂度而定。

    这里可以提供几个参考依据: 是否变形?是否旋转?是否有复杂背景干扰?是否多种字体?字符集(分类数)多大?位数(标签数)多少?

    1. 一般简单的几百个样本(需要自行调整 验证集大小验证批次大小 )即可。
    2. 稍微复杂的几千个样本一般都能搞定。
    3. 特别复杂的几万样本起。
    4. 中文这种几千个分类的一般十万起。

    注:只准备一百个不到样本的亲们,千万不要尝试训练测试,因为根本跑不起来。

    入手的第一步环境搭建好了,那就是准备跑代码了,还是有几个必要的条件,巧妇难为无米之炊,首先,既然是训练,要先有训练集,有一个新手尝鲜的训练集,是mnist手写识别的例子,可以在腾讯云下载:https://share.weiyun.com/5pzGF4V
    ,现在万事俱备,只欠东风。

    3.1 定义一个模型

    本项目基于参数化配置,不需要改动任何代码,可以通过可视化界面操作训练几乎任何字符型图片验证码。训练框架界面可以大致划分为几个部分:

    1. Neural Network - 神经网络区
      0.png
    2. Project Configuration - 项目配置区
      1.png
    3. Sample Source - 样本源配置区
      2.png
    4. Training Configuration - 训练配置区
      3.png
    5. Buttons - 功能控制区
      4.png

    依此类推的训练配置的步骤如下:

    1. 神经网络区 的配置项看起来很多,对于新手来说,可以直接使用默认的配置:CNNX+GRU+CTC+C1组合(CNN前置网络+GRU+CTC+单通道)。
    2. 项目配置区 的配置项在网络选好之后配置项目名,按回车或者点击空白处确认。
    3. 样本源配置区 的配置项用来配置样本源的路径,训练样本是根据此路径进行打包成TFRecords格式,验证样本可以不指定,使用[Validation Set Num]参数随机从训练集总抽样成验证集。
    4. 训练配置区 的配置项负责定义训练完成的条件如:结束准确率,结束COST,结束Epochs,批次大小
    5. 功能控制区 的配置项,设置完上面步骤,先点击[Make Dataset] 打包样本,再点击[Start Training]开始训练。

    以下部分有基础的读者们可以了解一下:

    如若使用CrossEntropy作为解码器需要注意标签数LabelNum和图片尺寸需要满足的关系,因为网络为多标签而设计(一般的多标签采用直接连接多个分类器),卷积层的输出 outputs 经过了以下变换:

    Reshape([label_num, int(outputs_shape[1] / label_num)])
    

    为了保证运算 int(outputs_shape[1] / label_num) 能够取得正整数,也意味着他们之间存在某种关系,对于CNN5+Cross Entropy的网络结构,Conv2D层的步长皆为1,那么需要保证以下关系成立:

    m o d ( 输 入 宽 度 × 输 入 高 度 × 输 出 层 参 数 池 化 步 长 池 化 层 数 × 标 签 数 ) = 0 mod(\frac{输入宽度\times输入高度\times输出层参数}{池化步长^{池化层数}\times标签数})= 0 mod(×××)=0

    所以有时候需要Resize网络输入的Shape

    网络池化步长^池化层数输出层参数
    CNN51664
    CNNX864
    ResNet50161024
    DenseNet322048

    例如使用CNN5+CrossEntropy组合,则输入宽度与输入高度需要满足:
    m o d ( 输 入 宽 度 × 输 入 高 度 × 64 16 × 标 签 数 ) = 0 mod(\frac{输入宽度\times输入高度\times64}{16\times标签数})= 0 mod(16×××64)=0
    同理如果CNN5+RNN+CTC,卷积层之后的输出经过以下变换:

    Reshape([-1, outputs_shape[2] * outputs_shape[3]])
    

    原输出(batch_size, outputs_shape[1], outputs_shape[2], outputs_shape[3]),RNN层的输入输出要求为(batch, timesteps, num_classes),为了接入RNN经过以上操作,那么又引出一个Time Step的概念,所以timesteps的值也是 outputs_shape[1],而CTC Loss要求的输入为 [batch_size, frames, num_labels],若是 timesteps 小于标签数则无法计算损失,也就无法找损失函数中找到极小值,梯度何以下降。timesteps 最合理的值一般是标签数的2倍,为了达到目的,也可以通过Resize网络输入的Shape解决,一般情况timesteps直接关联于图片宽度,大多情况只要按比例放大宽度即可。

    ExtractRegex 参数:

    注意:如果训练集的命名格式和我提供的新手训练集不一样,请根据实际情况修改ExtractRegex的正则表达式。目前只支持在yaml配置文件中直接修改,尚未提供GUI界面修改的支持。 DatasetPath 和SourcePath参数允许多个路径,这种操作适用于需要将多种样本训练为一个模型,或者希望训练一套通用泛化模型的人。
    字符集Category其实大多数情况下不需要修改,一般的图形验证码离不开数字和英文,而且一般来说是大小写不敏感的,不区分大小写,因为打码平台收集的训练集质量参差不齐,有些大写有些小写,不如全部统一为小写,默认ALPHANUMERIC_LOWER则会自动将大写的转为小写,字符集可定制化很灵活,除了配置备注上提供的几种类型,还可以训练中文,自定义字符集用list表示,示例如下:

    Category: ['常', '世', '宁', '慢', '南', '制', '根', '难']
    

    如果是单标签分类,可以配合LabelNum=1,例如:

    Category: ["航母", "雨靴", "毛线", "安全帽", "调色板", "海鸥", "日历", "网球拍", ......]
    

    其文件名示例:航母_1231290424123.png

    如果是多标签分类,可以配合LabelSplit=&,例如:

    Category: ["航母", "雨靴", "毛线", "安全帽", "调色板", "海鸥", "日历", "网球拍", ......]
    

    其文件名示例:航母&雨靴&毛线_1231290424123.png

    可以自己根据收集训练集的实际字符集使用率来定义,也可以无脑网上找3500常用字来训练,注意:中文字符集一般比数字英文大很多,刚开始收敛比较慢,需要更久的训练时间,也需要更多的样本量,请量力而行
    QQ截图20181204150924.png
    形如上图的图片能轻松训练到95%以上的识别率。
    ImageWidth、ImageHeight只要和当前图片尺寸匹配即可,其实这里的配置主要是为了方便后面的部署智能策略。

    Pretreatment参数:

    该参数是用来做图片预处理的,例如形如以下的GIF动图,
    2pc5uv_8989.gif

    可以使用ConcatFrames参数选取帧对两帧进行水平拼接,适用于处理滚动型GIF,而闪烁型GIF可以使用BlendFrames参数进行融合。

    3.2 开始训练

    1. 经过 采集标注样本形如 xxx_随机数.png
      QQ截图20200531182034.png
    2. 打包样本
      通过GUI界面的 [Make Dataset] 或者 make_dataset.py 直接打包。
      注意:使用源码运行本项目的功能模块需要具备一定的语言基础,参数修改的部分和示例已预留好,尽量不修改核心类或函数的代码以免出现错误。

    按照上面的介绍,配置只要修改极少数的参数对应的值,就可以开启正式的训练之旅了,具体操作如下:
    可以直接使用 PyCharm 的 Run,执行 trains.py,也可以在激活Virtualenv下使用终端亦或在安装依赖的全局环境下执行,但本文建议全程使用GUI界面进行操作,使用GUI仅需启动 app.py 即可。

    python3 trains.py
    

    剩下的就是等了,看过程,等结果。
    正常开始训练的模样应该是这样的:

    训练结束会在项目的out路径下生成一个包含pb文件的graph目录和包含yaml文件的model目录,下面该到部署环节了。

    3.3 部署

    真的很有必要认真的介绍一下部署项目,比起训练,这个部署项目倾注了笔者更多的心血,为什么呢?
    项目地址:https://github.com/kerlomz/captcha_platform

    如希望将本系统集成于自己的项目中的可以参考python-sdk的使用:
    https://pypi.org/project/muggle-ocr/
    该项目的核心基于 captcha_platform/sdk/pb/sdk.py 可以根据需要自行修改,抑或直接使用MuggleOCR 调用训练框架生产的模型。(具体调用方法可点击上面链接有对应的文档介绍)

    编译版:https://github.com/kerlomz/captcha_platform/releases,使用编译版无需安装Python和TensorFlow环境。

    真的值得了解的几点

    1. 同时管理多个模型,支持模型热拔插
    2. 灵活的版本控制
    3. 支持批量识别
    4. 服务智能路由策略

    首先笔者重写了TensorFlow的Graph会话管理,设计会话池,允许同时管理多模型,实现多模型动态部署方案。

    1) 训练好的 pb模型只要放在部署项目的graph路径下,yaml模型配置文件放在model, 即可被服务发现并加载。(用SDK调用时,两者置于同一目录下)

    2) 如果需要卸载一个正在服务的模型,只需要在model中删除该模型的yaml配置文件,在graph中删除对应的pb模型即可。

    3) 如果需要更新一个已经服务中的模型,只需修改新版的模型yaml配置文件的版本号高于原模型的版本号,按先放pb后放yaml的顺序,服务便会自动发现新版的模型并加载使用,旧的模型将因版本低于新版模型不会被调用,可以按照上述的卸载方法卸载已被弃用的模型释放内存。
    上面的操作中无需重启服务,完全的无缝切换

    其次,一套服务想要服务于各式各样的图像识别需求,可以定义一套策略,训练时将所有尺寸一样的图片训练成一个模型,服务根据图片尺寸自动选择使用哪个模型,这样的设计使定制化和通用性共存,等积累到一定多样的训练集时可以将所有的训练集合到一起训练一个通用模型,亦可以彼此独立,每个模型的叠加仅仅增加了少量的内存或显存,网上的方案大多是不同的模型单独部署一套服务,每个进程加载了一整套TensorFlow框架势必是过于庞大和多余的。

    用到批量识别需求的人相对少很多这里就不展开介绍了。但是这里给出一个12306的例子:

    FieldParam:
      CorpParams: [
        {
          "start_pos": [118, 0],
          "interval_size": [0, 0],
          "corp_num": [1, 1],
          "corp_size": [60, 30]
        },
        {
          "start_pos": [5, 40],
          "interval_size": [5, 5],
          "corp_num": [4, 2],
          "corp_size": [66, 66]
        }
      ]
      OutputCoord: True
    

    该参数可以用于大图的裁剪组成一批小图作为一个批次的输入,改用法可以避免多次调用。

    但是识别项目提供了多套可选的服务有:gRPC,Flask,Tornado,Sanic,其中Flask和Tornado提供了加密接口,类似于微信公众号开发接口的SecretKey和AccessKey接口,感兴趣的可以在demo.py中阅读调用源码了解。

    部署的使用可以经过package.py编译为可执行文件,这样可以免去更换机器环境安装的烦恼,部署项目安装流程同训练项目,项目中提供的requirements.txt已经将所需的依赖都列清楚了,强烈建议部署项目安装cpu版TensorFlow。

    本项目部署推荐使用Tornado版,功能最齐全,性能最为稳定。

    Linux:

    1. Tornado:
    # 端口 19952
    python3 tornado_server.py
    
    1. Flask
    # 方案1,裸启动, 端口 19951
    python flask_server.py 
    # 方案2,使用gunicorn,端口 5000
    pip install gunicorn 
    gunicorn -c deploy.conf.py flask_server:app
    
    1. Sanic:
    # 端口 19953
    python3 sanic_server.py
    
    1. gRPC:
    # 端口 50054
    python3 grpc_server.py
    
    1. 编译版(基于Tornado)
    # 前台运行
    ./captcha_platform_tornado
    #后台运行
    nohup ./captcha_platform_tornado &
    

    Windows:
    Windows平台下都是通过python3 xxx_server.py启动对应的服务,注意,Tornado、Flask、Sanic的性能在Windows平台都大打折扣,gRPC是Google开源的RPC服务,有较为优越的性能。
    编译版直接运行编译后的exe可执行文件即可。

    3.4 调用/测试

    1. Tornado服务:

    请求地址Content-Type参数形式请求方法
    http://localhost:19952/captcha/v1application/jsonJSONPOST

    具体参数:

    参数名必选类型说明
    imageYesStringBase64 编码
    model_nameNoString模型名,yaml配置中可绑定
    need_colorNoString颜色过滤,black/red/blue/yellow/green/white
    output_splitNoString多标签分割字符

    请求为JSON格式,形如:{“image”: “base64编码后的图像二进制流”}

    返回结果:

    参数名类型说明
    messageString识别结果或错误消息
    codeString状态码
    successString是否请求成功

    该返回为JSON格式,形如:{“message”: “xxxx”, “code”: 0, “success”: true}

    2. Flask服务:

    请求地址Content-Type参数形式请求方法
    http://localhost:19951/captcha/v1application/jsonJSONPOST

    请求参数和返回格式同上

    3. Sanic服务:

    请求地址Content-Type参数形式请求方法
    http://localhost:19953/captcha/v1application/jsonJSONPOST

    请求参数和返回格式同上

    4. gRPC服务:
    需要安装依赖,grpcio、grpcio_tools和对应的grpc.proto文件,可以直接从项目中的示例代码demo.py中提取。

    python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./grpc.proto
    

    grpcio、grpcio_tools 是根据 grpc.proto 使用上述命令生成的。

    class GoogleRPC(object):
    
        def __init__(self, host: str):
            self._url = '{}:50054'.format(host)
            self.true_count = 0
            self.total_count = 0
    
        def request(self, image, model_type=None, model_site=None):
    
            import grpc
            import grpc_pb2
            import grpc_pb2_grpc
            channel = grpc.insecure_channel(self._url)
            stub = grpc_pb2_grpc.PredictStub(channel)
            response = stub.predict(grpc_pb2.PredictRequest(
                image=image, split_char=',', model_type=model_type, model_site=model_site
            ))
            return {"message": response.result, "code": response.code, "success": response.success}
    
    if __name__ == '__main__':
        result = GoogleRPC().request("base64编码后的图片二进制流")
        print(result)
    

    3.5 奇技淫巧

    该项目还可以直接用于识别带颜色的验证码,部署项目middleware/impl/color_extractor.py基于k-means实现了颜色分离模块,可用于处理如下形式的验证码:

    红色.png

    还有一种方案是同时预测验证码和每个字符对应的颜色,不过这需要修改现有的神经网络进行支持,在最后一层修改为双输出,一个输出颜色,一个输出对应字符,这对于样本标注的要求较高,也提高的成本,所以如果能用无限生成样本,那问题就迎刃而解了,比如上图,笔者就写了样本生成代码,感兴趣的可以移步:
    https://www.jianshu.com/p/da1b972e24f2
    其实还有很多很多技巧,例如,用生成的样本代替训练集,其实网上的图片验证码大多是采用开源的,稍作修改而已,大多数情况都能被近似生成出来,上述展示的验证码图片不代表任何实际的网站,如有雷同,纯属巧合,该项目只能用于学习和交流用途,不得用于非法用途。

    后记

    如果文章描述不够详尽或需要技术支持的,可以加群 857149419 咨询,或在开源项目中提issue,很荣幸能为开源社区贡献绵薄之力。

    展开全文
  • (一)python爬虫验证码识别(去除干扰线)https://blog.csdn.net/weixin_40267472/article/details/81384624
  • Python验证码识别初探(tesserocr库)

    千次阅读 2019-03-09 14:28:00
    那就是验证码,比如像某乎,如果不先登陆,连里面的内容数据都爬不到,而验证码就是网站进行发爬虫的一种措施,随着技术的发展,验证码越来越复杂,爬虫的工作越来越艰苦,所以这次就来讲解,怎么来识别验证码;...

    转载自:https://juejin.im/post/5b1b3cd26fb9a01e700ffe5b

    前言

    写爬虫有一个绕不过去的问题,那就是验证码,比如像某乎,如果不先登陆,连里面的内容数据都爬不到,而验证码就是网站进行发爬虫的一种措施,随着技术的发展,验证码越来越复杂,爬虫的工作越来越艰苦,所以这次就来讲解,怎么来识别验证码;(听上去口气很大的感觉)

    [图片上传失败...(image-481fc8-1552112841682)]

    <figcaption></figcaption>

    先来看看,目前遇到的验证码种类有哪些?

    1)图形验证码
    图形验证码应该是最简单的一种验证码,这种验证码是最早出现,也是目前最常见的,一般组成规则是4个字母或数字或混合组成;

    [图片上传失败...(image-631d4b-1552112841682)]

    <figcaption></figcaption>

    2)滑动验证码

    [图片上传失败...(image-50e2f6-1552112841682)]

    <figcaption></figcaption>

    3)点触验证码

    [图片上传失败...(image-f5e571-1552112841682)]

    <figcaption></figcaption>

    [图片上传失败...(image-b119ee-1552112841682)]

    <figcaption></figcaption>

    Ok,上面这3种验证码方式,应该是目前PC上比较常见的验证码种类的,当然手机app上还会有手势验证,宫格验证,语音验证等等,这里就不介绍,主要针对上面常见的3种介绍;

    1 图形验证码

    某乎的验证码有2种,一种是图形验证码,一种是点触验证码,经过测试发现,一开始是显示图形验证码,但当登陆退出次数逐渐增多,就会变成点触验证码,这种验证码的切换机制,也算是防爬虫的一种手段,闲话不多说,先喵喵:

    某乎链接:https://www.zhihu.com/signup?next=%2F
    打开后默认是在注册页面,点击下登陆按钮,如果还是没有验证码,刷新几次网页就行了;

    [图片上传失败...(image-a00e41-1552112841682)]

    <figcaption></figcaption>

    下面这种,下2篇文章会介绍;

    [图片上传失败...(image-3c41e6-1552112841682)]

    <figcaption></figcaption>

    2 信息介绍

    识别图形验证码需要安装tesserocr这个库,下面介绍下tesserocr;
    tesserocr是Python的一个OCR识别库,但其实是对tesseract做了一层Python Api的封装,
    核心还是tesseract,所以在安装tesserocr之前,需要先安装tesseract;

    等下,懵逼中,tesserocr这个能看明白,是一个库,但OCR是什么?tesseract又是什么?

    OCR
    OCR,全称叫 Optical Character Recognition,中文翻译叫光学字符识别,是指通过扫描字符,通过其形状将其翻译成电子文本的过程;

    举例:
    当有一个图形验证码,先使用OCR技术将其转化成电子文本,然后爬虫将识别的结果提交到服务器,便达到自动识别验证码的过程;

    tesseract
    tesseract是google开源的OCR

    OK,貌似对概念有所理解了,还有个疑问,之前有在图形识别领域,还有个opencv的玩意,那这两者有什么区别?
    opencv专注机器视觉
    tesseract专注字符识别

    所以从领域来说,opencv更广,而图形验证码,opencv也可以做,但杀鸡焉用牛刀~

    3 环境准备

    windows下的安装

    在Windows下,要先下载tesseract,它为tesserocr提供了支持;
    tesseract下载地址:https://digi.bib.uni-mannheim.de/tesseract/
    打开后,可以看到各种exe的列表,可以随便挑选;
    其中文件名中带有dev的为开发版本,不带dev则为稳定版本,例如jb是下载 tesseract-ocr-setup-3.05.01.exe;

    [图片上传失败...(image-24f3a4-1552112841682)]

    <figcaption></figcaption>

    下载后双击,一路点击,直到出现下面这个页面

    [图片上传失败...(image-450403-1552112841682)]

    <figcaption></figcaption>

    这里需要勾选红框里的Additional language data(download),这个选项是安装OCR识别支持的语言包,这样OCR就可以识别多国语言,然后再一路点击NEXT即可,因为要下载语言包,所以需要点时间,大概10-20分钟左右,跟网速有关,如果不需要支持多国语言的话,也可以不勾选,自由选择
    需要说明:默认包含英文字库
    如果,觉得一次下载那么多语言占空间,又或者觉得网速慢,也可以选择单独安装中文字库;
    字库下载地址:https://github.com/tesseract-ocr/tessdata
    打开后,直接搜索chi_sim.traineddata,这个代表的就是中文,下载下来;
    然后找到刚刚tesseract安装目录,里面会有一个叫tessdata的目录,直接把刚下载的语言包放到这个目录下即可;

    [图片上传失败...(image-2f0ccc-1552112841682)]

    <figcaption></figcaption>

    如何验证tesseract是否安装成功?直接cmd下输入tesseract即可;
    成功会直接显示信息;

    [图片上传失败...(image-e4152d-1552112841682)]

    <figcaption></figcaption>

    如果提示'tesseract' 不是内部或外部命令,则是因为没有配置环境变量,手动把tesseract根目录配置到path参数下即可,这块不详细说明;

    到此为止,tesseract安装成功啦~

    接下来就安装tesserocr,直接pip命令即可:

    pip3 install tesserocr install
    复制代码
    

    但jb在安装的时候,直接报错:

    [图片上传失败...(image-9bb5ad-1552112841682)]

    <figcaption></figcaption>

    试过很多种方式,就算使用conda install tesserocr,也一样报错。

    [图片上传失败...(image-b2ed56-1552112841682)]

    <figcaption></figcaption>

    经历千辛万苦,终于找到一条可行的命令:

    conda install -c simonflueckiger tesserocr
    复制代码
    

    [图片上传失败...(image-b0883e-1552112841682)]

    <figcaption></figcaption>

    最终就安装上tesserocr啦~

    如何验证是否真的安装了?很简单,直接import tesserocr,不报错就说明安装好了;

    [图片上传失败...(image-6101ac-1552112841682)]

    <figcaption></figcaption>

    对了,如果有同学不知道conda这条命令的话,请访问下面的链接,直接搜索scrapy安装,会有介绍conda:
    https://juejin.im/post/5afcb91251882565bd257097|

    OK,windows下的tesserocr跟tesseract的环境已经安装好了;

    别着急,顺便介绍下Linux跟Mac,但以下方式均未经过jb验证,信息来源于网上,仅供参考:

    Linux下的安装
    对于Liunx来说,不同系统已经有了不同的发行包了,它可能叫做tesseract-ocr或者tesseract,直接用对应的命令安装即可;

    • Ubuntu、Debian和Deepin
      在Ubuntu、Debian和Deepin系统下,安装命令如下:

        sudo apt-get install-y tesseract-ocr libtesseract-dev libleptioica-dev
      复制代码
      
    • CentOS、Red Hat 在CentOS和Red Hat系统下,安装命令如下:

        yum install -y tesseract
      复制代码
      

    在不同发行版本运行如上命令,即可完成tesseract的安装;
    安装完成后,便可以调用tesseract命令;
    默认也是指安装英文语言,如果需要安装其他语言,请看下上面Windows的介绍,一样的处理方案,这里不重复说明;

    接下来就是安装tesserocr,直接使用pip安装:

    pip3 install tesserocr pillow
    复制代码
    

    Mac下的安装
    在Mac下,首先使用Homebrew 安装ImageMagick 和tesseract库:

    brew install imagemagick
    brew install tesseract --all-languages
    复制代码
    

    接下来再安装tesserocr即可:

    brew install tesserocr pillow
    复制代码
    

    4 识别测试

    为了方便测试,需要把验证码的图片保存到本地;
    打开weibo.com,随便输入账号密码,会提示输入验证码,打开开发者工具,找到验证码元素,它的src属性就是一个链接,copy出来直接打开,会看到一个验证码,而且刷新的验证码会变化,由此推断这是个验证码的接口,右键保存验证码即可,就得到一张验证码;
    验证码链接:
    https://login.sina.com.cn/cgi/pin.php?r=9967937&s=0&p=gz-d0dc363f6a4523cbd602a5a10f00c59b4784

    [图片上传失败...(image-f3a7fe-1552112841681)]

    <figcaption></figcaption>

    [图片上传失败...(image-afd087-1552112841681)]

    <figcaption></figcaption>

    ok,完事具备,那就开始吧,新建项目,把验证码放到项目根目录下;
    用tesserocr库来识别验证码:

    import tesserocr
    from PIL import Image
    
    #新建Image对象
    image = Image.open("3.jpg")
    #调用tesserocr的image_to_text()方法,传入image对象完成识别
    result = tesserocr.image_to_text(image)
    print(result)
    复制代码
    

    [图片上传失败...(image-467ae7-1552112841681)]

    <figcaption></figcaption>

    结果,运行后,啥都没有???
    接下来jb陷入了困扰,包括调试,找各种文档,最终,把上面调试的验证码换了一个:

    [图片上传失败...(image-4c4e95-1552112841681)]

    <figcaption></figcaption>

    替换下图片,再执行一次代码:

    [图片上传失败...(image-9bb8b6-1552112841681)]

    <figcaption></figcaption>

    OK,看到是有数据了,不过输出的是MEEE,跟验证码的ME8E还是有点不一样;

    目前两个问题:
    1)微博的验证码识别失败,输出空
    2)第二章验证码部分词识别有误

    心想,这库是网上都推荐用的,是Google开源的,理论上没问题,而且人家也都这么用,为什么这里就有问题?难道还需要额外的处理?

    怀着疑问跟梦想,继续学习;

    题外话: tesserocr还有一个更加简单的方法,这个方法可直接将图片文件转换成字符串,代码如下:

    import tesserocr
    print(tesserocr.file_to_text("1.jpg"))
    复制代码
    

    [图片上传失败...(image-47278c-1552112841681)]

    <figcaption></figcaption>

    结果也跟上面的一样,但网上不建议这么用,原因是据说这种识别效果不如上一种的好;

    关于微博验证码为空,使用tesseract输出下原因:

    tesseract 图片路径 output 
    复制代码
    

    [图片上传失败...(image-e8ce79-1552112841681)]

    <figcaption></figcaption>

    leptonica 在解析时没有检测到任何dpi;

    5 验证码处理

    网上找了下信息,比如这张验证码:

    [图片上传失败...(image-8e7a15-1552112841681)]

    <figcaption></figcaption>

    可能是验证码内的多余线条干扰了图片的识别;

    又比如微博这张:

    [图片上传失败...(image-858d87-1552112841681)]

    <figcaption></figcaption>

    可能是字体位置,跟图案等因素干扰了图标的识别;

    解决方案还是有的,需要对图片进行额外的处理,如转灰度,二值化等操作;

    转灰度处理: 利用Image对象的convert()方法参数传入L,即可将图片转成为灰度图像:

    from PIL import Image
    
    image = Image.open("1.jpg")
    image = image.convert('L')
    image.show()
    复制代码
    

    [图片上传失败...(image-f22f8e-1552112841681)]

    <figcaption></figcaption>

    图片成功转灰了;此时我们再校验一下,发现校验还是MEEE,失败;[图片上传失败...(image-c3c54a-1552112841681)]

    <figcaption></figcaption>

    传入1的后,即可将图片进行二值化处理:
    (二值化是指将图像上的像素点的灰度值设置为0或255,也就是将整个图片呈现出明显的只有黑和百的视觉效果)

    import tesserocr
    from PIL import Image
    
    image = Image.open("1.jpg")
    image = image.convert('1')
    image.show()
    复制代码
    

    [图片上传失败...(image-6a2b17-1552112841681)]

    <figcaption></figcaption>

    这个一看,比上面更模糊了,理所当然的,校验结果会错的更加离谱:[图片上传失败...(image-b4154e-1552112841681)]

    <figcaption></figcaption>

    二值化的阈值是可以指定的,上面的方法采用的是默认阈值127;但一般很少直接转换原图,原因如上可看到,错误的更加离谱了;

    一般是先将原图转为灰度图像,然后再指定二值化的阈值,代码如下:

    import tesserocr
    from PIL import Image
    
    #新建Image对象
    image = Image.open("1.jpg")
    #进行置灰处理
    image = image.convert('L')
    #这个是二值化阈值
    threshold = 150   
    table = []
    
    for i in  range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    #通过表格转换成二进制图片,1的作用是白色,不然就全部黑色了
    image = image.point(table,"1")
    image.show()
    result = tesserocr.image_to_text(image)
    print(result)
    复制代码
    

    这里说明下,可能有同学对256不明白,这是什么?
    首先,我们是把图片置灰处理,灰度图像是一种具有从黑到白256级灰度色阶或等级的单色图像;
    对于灰度图像利用阈值得到二值化的图像, 也就是说,我们设定了一个阈值,从0到256,如果灰度图像少于阈值则设置0,大于阈值则设置1,0是黑色,1是白色,这样做,就可以把一个灰度图完全转换二值化图;
    可能还是懵逼,直接贴图:
    原图

    [图片上传失败...(image-136781-1552112841680)]

    <figcaption></figcaption>

    灰度图:

    [图片上传失败...(image-d250a7-1552112841680)]

    <figcaption></figcaption>

    二值图:

    [图片上传失败...(image-9065a-1552112841680)]

    <figcaption></figcaption>

    在灰度图上,部分色彩是介于白色跟黑色之间,所以通过设置阈值的方法,把这些中间色彩全部转换成黑色跟白色;

    ok,扯远了,上面把验证码二值图后是长这样的:

    [图片上传失败...(image-61abbe-1552112841680)]

    <figcaption></figcaption>

    而校验结果:

    [图片上传失败...(image-4b528-1552112841680)]

    <figcaption></figcaption>

    good,有所变化, 至少不是MEEE了,那我们继续调,调到一个合适的值;
    调了半天,jb放弃了,原因是这个8,不管怎么调都调不到一个合适的值,一直在S、R、B之间徘徊;

    JB换了个验证码:

    [图片上传失败...(image-458247-1552112841680)]

    <figcaption></figcaption>

    上面同样的代码,无修改,二值图如下:

    [图片上传失败...(image-7e83e0-1552112841680)]

    <figcaption></figcaption>

    校验结果:

    [图片上传失败...(image-94537a-1552112841680)]

    <figcaption></figcaption>

    oh year,这个能校验出来了~

    还记得我们一开始那个微博验证码吗?我们也来试试,处理后的验证码是这样的~

    [图片上传失败...(image-be6724-1552112841680)]

    <figcaption></figcaption>

    结果校验的时候,基本上都空,只有在138的时候会有一点点识别效果,但是压根不搭边;[图片上传失败...(image-74a09c-1552112841680)]

    <figcaption></figcaption>

    对比了下,微博验证码跟上面能识别的验证码:

    [图片上传失败...(image-f677e4-1552112841680)]

    <figcaption></figcaption>

    [图片上传失败...(image-27e8d9-1552112841680)]

    <figcaption></figcaption>

    能别识别的,是实心,而不能被识别的,是空心;
    实心的好处在于,图像处理后,黑白分明,但是空心在图像处理后,由于线条本来就很细,处理后可能都识别不出来了;

    6 中文情况如何?

    更新于18.6.11
    突然想起,上面安装的时候有提及到安装不同语言包,那如果要看看其他语言,怎么搞?因此就补充这点了~

    先上图~

    [图片上传失败...(image-6609fb-1552112841680)]

    <figcaption></figcaption>

    直接上代码:

    import tesserocr
    from PIL import Image
    
    image = Image.open("juejin.jpg")
    result = tesserocr.image_to_text(image, lang='chi_sim')
    print(result)
    复制代码
    

    因为默认是英文,所以英文不需要指定lang,但中文就需要啦,chi_sim就是简体中文了;

    [图片上传失败...(image-f74b26-1552112841680)]

    <figcaption></figcaption>

    从输出的结果来看,小册那估计有个sale,不然估计开源库也能匹配出来~
    但依然可以看出,中文也不是很精准~

    这里说明下,中午不需要置灰跟二值哈,不然颜色加深了,估计更难辨别了~

    7 小结

    本章学习了tesserocr及tesseract的环境搭建,以及如何对图形验证码进行噪音处理,并且讲解灰色图跟二值图的概念;

    作者:jb
    链接:https://juejin.im/post/5b1b3cd26fb9a01e700ffe5b
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 本文介绍了python使用tensorflow深度学习识别验证码 ,分享给大家,具体如下: 除了传统的PIL包处理图片,然后用pytessert+OCR识别意外,还可以使用tessorflow训练来识别验证码。 此篇代码大部分是转载的,只改了很少...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,500
精华内容 6,600
关键字:

python验证码识别

python 订阅