上一讲我们学习的是人脸检测,只是检测到人脸所在的区域,这一讲说的是图片验证码识别,是要有识别在里面的。先介绍什么叫做OCR:
利用pytesseract实现图片验证码识别
我们用到的核心模块是pytesseract,关于这个模块如何配置,参考:https://www.cnblogs.com/zhangxinqi/p/9297292.html#_label1
这个地方我的选择是把所有的都勾上了,当然你可以选择自己想要的勾上,我只是觉得这样省事。这个安装位置也不一定非要在c盘,只要配置一下环境变量就行了。下载过程中可能会出现很多次:
不过没有问题的,点确定就行了,这样只是有一些小语种的包安装错误。或者你可以按照上面说的用github装,然后解压到安装的文件夹。配置环境变量我们已经很熟悉了,这个过程相当于在linux下把bin文件放在/usr/bin或者/usr/sbin下面。在命令行输入tesseract,显示
说明已经配置成功了。
这是一些帮助信息。
-l是指定语言的,eng是英语,指定语言应该会识别速度快很多了。我们来试一张:
结果为什么是这样的呢?这是因为图片中有噪声,所以需要在opencv里面或者其它可以图像处理软件中先进行预处理,我们用的是python-opencv,我们想要实现的是用python实现一条龙处理,而不是用python-opencv预处理,然后再在命令行里处理。这也是我们为什么要安装pytesseract的原因,因为不安装这个tesseract和python之间没有接口。
看来我以前已经装过了。如果配置了环境变量,在用的时候是不会出现上述问题的。
这里读图像用的是PIL而不是opencv自带的,我们需要安装。参考了:https://jingyan.baidu.com/article/fea4511a20d98af7ba912551.html
PIL这个模块的介绍,参考:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140767171357714f87a053a824ffd811d98a83b58ec13000
感兴趣的可以去看原文,我比较好奇它读进来的数据和opencv读进来的有什么不同吗?
这个读进来并不是一个数组,而是一个文件对象。看来都是可以识别到的啊,无论是opencv读进来的还是PIL读进来的,只不过结果稍微不太一样,虽然都是错的,这需要我们先预处理。先来简单看一下pytesseract有哪些函数:
我们常用的是image_to_string,这个函数应该是用现成
原文中还有和爬虫结合实现验证码识别的,不过这种方式其实会有很多问题的,下面试验的时候就会看得到了。我们要先对这张图片进行一些预处理。我上豆瓣找了一些图片验证码,说实话,现在用图片验证码的其实比较少,很多都是拼图形式的或者是扫码,因为图片验证码确实太容易被破解了。我们可以随便找几个验证码来试一试,我用的是tx的一个网站:http://captcha.qq.com/getimage?aid=10079010r=0.38687027756482356
只需要改aid就可以得到不同的验证码,用这个的原因是这个比较纯净。
这个验证码就很好,噪声几乎没有,这个字母的封闭性很好。
前两个字母识别的是有问题的。怎么看都是DawZ。两种识别的结果都一样,都是错的。指定
语言也是错的。
输入彩色图像还是这样:
其实识别错很正常,毕竟没有方法可以做到百分百识别的。我们再试一个:
这个识别不出来?这个字母的封闭性就差一些。没关系,再试一个:
还是识别不了。enmmm,再试一个:
效果还是特别差。
这个视频里面做例子用的都是:
这种验证码,这种验证码最大的特点就是数字和字母都是没有倾斜的,但是现在基本上不会有这么好的验证码。我又找了豆瓣的两个验证码:
这识别难度都挺大的,不仅是字母是歪的,还有很多噪声。我们也不用试tesseract自带的字库了,它用的训练集估计就没有这样歪的字,或者它用的方法没有考虑到字体歪斜,前面的光是字母歪就难识别,还要带噪声更是识别不了,不过姑且还是试验一下:
效果果然很差。我在网上又找了一个OCR的网站:
https://www.onlineocr.net/
我们可以试一试:
效果也很差。我来看看大企业的表现。
用百度的API识别
参考https://cloud.baidu.com/doc/OCR/OCR-Python-SDK.html#.AD.45.25.42.6F.4C.89.80.FE.B7.28.00.A2.07.E8.17
先创建一个百度云账号,然后进入控制台:
https://console.bce.baidu.com/ai/#/ai/ocr/overview/index
一开始这个已建应用应该是0个,这个是我已经创建好的,点击创建应用就可以创建,然后填几个空就可以。
然后立即创建。
我们就算用高精度的,一天也可以免费用500次,这完全足够我们个人用了,下面我们要试一试效果:
创建成功后,点击管理应用
这里有几个东西我们待会要用。
按照上面步骤做好。
好,我们来写一下这段代码:
看看结果还不错,
但是还是错了一个字母,这个识别出来试一个单词,因为中间没有空格,总得来说,效果要比上面好多了,这种输出格式叫做json,以前也是见过的。如果我们只要结果。
再试几个:
完全正确。
错了两个字母。
这个效果就不太理想了。其实前面用的并不是高精度,因为函数是basicGeneral,这个是通用的,basicAccurate才是高精度的。
效果更差了。
效果还是不是很好,不过感觉其实已经很不错了,可能需要预处理一下图片,不过预处理没有通用的办法啊,这个事其实还是挺难办,不过百度做的确实已经很好了。图像处理这东西本来其实就挺难的,因为有很强的环境性,如果你想破解某个网站的验证码,最好的办法就是用这个网站的验证码做数据集去训练一个神经网络,因为每家网站图片加噪声的方式可能都不一样。不过数据集的标记是个问题,要想网络泛化性强,就必须要有足够大的数据集,图片验证码可以用爬虫,但是标记就得人为标记,这个比较费时间,虽然网上有可以花钱请人标记的,不过我是花不起。