python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

avatar 2020年2月9日14:39:01 评论 12,104

加入VIP,可以享受无广告视频播放!更可享受教程提前看!详情猛戳:VIP介绍

记这一次踩坑专题记录。

最近在自己研究学习python的tesserocr识别库,据大牛说这个神奇的工具可以进行验证码的识别,于是我来亲自试一下。

其中,tesserocr这个库是tesseract这个软件的一个python封装,所以要在python中使用它,首先需要安装tesseract这个软件。

在 Windows 下,首先需要下载 tesseract,它为 tesserocr 提供了支持。

进入下载页面,可以看到有各种 .exe 文件的下载列表,注意,太高版本的tesseract,可能tesserocr库的最新版本还不能支持,你可以安装不那么高的版本的。其中文件名中带有 dev 的为开发版本,不带 dev 的为稳定版本,可以选择下载不带 dev 的版本。

这里我选择了tesseract-ocr-setup-3.05.01.exe。

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

下载完成后安装时,我们可以选择安装额外的语言包,此时可以勾选 Additional language data (download) 选项来安装 OCR 识别支持的语言包,这样 OCR 便可以识别多国语言。

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

但是特别需要注意的这里有个坑,就是这些语言包都是download下载安装的,不知道他连接到哪里下载,但亲测如果你电脑不能科学上网(懂的人都懂,不懂可以来问我)的话,到安装的时候一般会报错的。所以我首先使用科学上网,然后选择我想要的包来安装。

这里我怕有问题,将包安装在了没有任何中文的路径下,你也可以考虑下这个。

有些同学问,我没办法科学上网怎么办呢?

也有办法的,你可以手动到Github上面下载。

官方叫作 tessdata,其下载链接为:

https://github.com/tesseract-ocr/tessdata

下载完成后,将所有内容放在tessdata文件夹中,复制进你的tesseract的安装目录即可。

安装完成后,还需要将你的tesseract的安装目录,添加到系统环境变量中,这一步是方便后续的程序调用它,不然命令行中会找不到tesseract程序。(亲测)

 

好了,这个装好了,总该装tesserocr了吧。

官方给出的安装方式当然是使用pip安装,在cmd中的命令行为:

pip install tesserocr pillow

其意思为将tesserocr和pillow包一起安装。从这里开始,咱们就开始了各种崩溃之旅。

经过各种测试,咱们主要的问题就是出现在tesserocr的包的安装上,所以你可以先使用pip install pillow这个命令来先安装pillow包。

然后再使用pip install tesserocr安装。

我的python版本目前使用的是3.8.1,是目前看来比较新的版本(当然大家以后再看这篇文章的时候可能这个问题就解决搞定了),所以有些支持不太够。

接下来,下载tesserocr的包2.5.0倒是没什么,但是自动运行setup.py的时候就报错了。

我去网上找点别人的报错代码过来(别人装的时候可能是2.4.0版):

E:\Python>pip install tesserocr pillow
Collecting tesserocr
  Using cached https://files.pythonhosted.org/packages/92/2d/05a7f8387e93c192919b508e4f4936f232bd3d2ca388b9130ae538a9f9ad/tesserocr-2.4.0.tar.gz
 
Collecting pillow
  Using cached https://files.pythonhosted.org/packages/19/05/e7869088bcd791fe63f6d671577d25c4e3d1fecdc21501254621c65cd74b/Pillow-5.4.1-cp36-cp36
m-win32.whl
Installing collected packages: tesserocr, pillow
  Running setup.py install for tesserocr ... error
    Complete output from command e:\python\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\admin\\AppData\\Local\\Temp\\pip-i
nstall-9vats9x_\\tesserocr\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(cod
e, __file__, 'exec'))" install --record C:\Users\admin\AppData\Local\Temp\pip-record-t_hk__pf\install-record.txt --single-version-externally-man
aged --compile:
    Failed to extract tesseract version from executable: [WinError 2] 系统找不到指定的文件。
    Supporting tesseract v3.04.00
    Building with configs: {'libraries': ['tesseract', 'lept'], 'cython_compile_time_env': {'TESSERACT_VERSION': 50593792}}
    running install
    running build
    running build_ext
    building 'tesserocr' extension
    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
 
    ----------------------------------------
Command "e:\python\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\admin\\AppData\\Local\\Temp\\pip-install-9vats9x_\\tessero
cr\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" i
nstall --record C:\Users\admin\AppData\Local\Temp\pip-record-t_hk__pf\install-record.txt --single-version-externally-managed --compile" failed w
ith error code 1 in C:\Users\admin\AppData\Local\Temp\pip-install-9vats9x_\tesserocr\

其中有几个问题需要注意的。

问题一:

Failed to extract tesseract version from executable: [WinError 2] 系统找不到指定的文件。

这个问题是第一个问题,我解决了很久,明明我正确安装了tesseract而且添加到了系统环境变量,为啥找不到tesseract呢?

最终原因:添加变量和安装后未重启,用cmd的普通用户模式找不到。

解决办法:打开cmd时使用管理员模式打开,这个报错就不会报错了。

问题二:

building 'tesserocr' extension

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/

从这里可以分析出,这不是一个python的whl包(whl包是啥?就是后来出的一个新标准,将包生成whl文件之后,即wheel文件,我没记错的话这个单词的意思是轮子。python在安装包的时候直接就可以安装这个包,不用使用源码来编译成包再安装,大概是这么个意思。使用whl安装包就可以摆脱使用setup.py来安装),所以需要先编译,但是系统有缺少Microsoft Visual C++ 14.0编译器。应该是这个意思。

这个报错提醒我们,需要到微软的网站下载安装Microsoft Visual C++ Build Tools来编译。

这时候问题就来了,随着时代的发展,我打开这个页面已经很难找到这个Microsoft Visual C++ Build Tools了,这时候网站拼命让我下载Visual Studio2019,这是一个微软出的IDE工具好像,可以进行各种编程开发,但我只需要编译一下python包呀,这些都不需要呀。呜呜呜。而且这些东西大小都好大,动辄几个G,我为了编译几十k的python包,给我电脑装那么多,真的不想这样。

但是老失败呀,我就兜兜转转从别的网站别人的经验中找到了一个还不错的下载地址,可以看下我这篇文章:visual c++ build tools的安装与使用,装没有whl的python包时的编译工具,提示Microsoft Visual C++ 14.0 is required

下载后,光是初始化这个安装包配置都花了好一会儿,好了之后,果断我选择自定义配置。

这里面有好几个选项。

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

我第一遍是啥多余的SDK都不选直接安装。即使这样,你都看得到所用的空间占用有多吓人。

装完之后,输入pip install tesserocr进行tesserocr的编译(下同),报错,这次好像是报的缺少某些东西。

我想可能是我SDK没安装吧,第二次,补充勾选了win10的SDK那个。还是报错找不到某些东西。

第三次,补充勾选了ATL/MFC SDK和.NET的SDK。这次报错跟上一次不同,但是还是有些东西找不到,至此,这个工具已经给C盘装了六七个G的东西了,还是不能解决问题。

也把我搞到了半夜快两点,决定放弃。


第二天,决定选择更快捷的方式,使用whl包来安装。你说我之前知不知道可以用whl包?知道的。但是官方发布的whl包,暂时还不能支持3.8的python,最高只能支持3.7,所以我一直没选择它。

而我不想系统里装那么多的python版本,版本切换起来比较不方便。但我知道比如Anaconda这种工具是可以使用python的虚拟环境的,不影响系统本身安装的版本。

于是我考虑采用Anaconda+whl的方式来安装。

首先先下载安装Anaconda:

https://www.anaconda.com/distribution/

安装时,是否将anaconda等加入环境变量配置那个界面的两个勾我均没有勾选。

安装后,打开Anaconda Navigater,进入Environments。

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

默认一开始是只有base版本的python的(这个base版本不是你系统安装的python,而是anaconda的默认版本)。我为了弄一个纯净的环境,点击Create,创建了一个专门的版本,版本选择3.7。

创建好之后,可以用navigator进入这个虚拟环境的命令行。

你也可以直接通过cmd进入虚拟环境的命令行。因为我一开始在安装anaconda的时候没有将它放到环境变量,这时候无法直接在cmd中使用,你可以找到anaconda安装目录下的condabin目录,将这个目录所在的路径添加到系统环境变量中,然后用管理员模式打开cmd。

输入命令conda env list即可看到目前的conda有哪些虚拟环境等等。

# conda environments:
#
base                  *  E:\ProgramFiles\Anaconda
python3.7_for_tesserocr     E:\ProgramFiles\Anaconda\envs\python3.7_for_tesserocr

可以看到,目前我们激活的虚拟环境是base环境,你需要切换到你想用的虚拟环境中。

输入命令activate 虚拟环境名即可切换过去,使用的pip也会切换。比如我输入activate python3.7_for_tesserocr即可。

更多conda的命令行帮助请参考这篇文章:Anaconda-用conda创建python虚拟环境(一些anaconda的实用命令)

切换后,先安装pillow,pip install pillow。这步没有问题。

然后去下载wheel文件安装tesserocr。

可以到这里下载:https://github.com/simonflueckiger/tesserocr-windows_build/releases

这里我下载了

这个版本到我电脑上。

然后进行本地安装。

输入命令:pip install "你的whl文件的完整路径"

比如我:pip install "E:\tesserocr-2.4.0-cp37-cp37m-win_amd64.whl"

然后,就安装成功了!!!(终于成功了,太难了我)


接下来还是抑制不住内心的喜悦,来测试了一下代码,结果又遇到一些问题:

首先打开cmd,使用前文所说的命令切换到我们安装好tesserocr库的虚拟环境。

然后进入到我存着验证码的文件夹。

在此文件夹编写相关代码:

import tesserocr
from PIL import Image

imagelist = ["code.jpg", "code2.jpg", "code3.jpg", "code4.jpg"]

for i in imagelist:
	image = Image.open(i)

	image = image.convert('L')
	threshold = 127
	table = []
	for i in range(256):
	    if i < threshold:
	        table.append(0)
	    else:
	        table.append(1)

	image = image.point(table, '1')
	# 用图片查看工具打开查看处理到目前到为止的图片的样子
	# image.show()


	result = tesserocr.image_to_text(image)
	print(result)

如上面的代码所示,我们首先导入tesserocr包,然后导入Image命令用来打开图片。

然后对图片进行循环ocr识别。图片打开后,convert命令传入L可以进行图片灰度处理。而如果传入1可以进行二值化处理。不过我们需要设定二值化的阈值(这个涉及图像处理学的东西了,听听就好),我这里大概设置为127,下面的办法就是,灰度处理之后,设置一个图形点阵,如果小于设定的阈值threshold的话,就设置为0,你可以理解为白色点,大于等于就设置为1,即黑色点。

最后调用point方法,根据点阵table进行二值化处理,即第二个参数传入1。此时,这个图片就被按照我们的二值化点阵处理好了。此时理论上图片中的干扰线就会被除去。

当然这个阈值你可以根据自己的图片进行调整,也可以进行更多的图像处理。

同时附上我的四张下载的图片(你可以保存下载改成对应的文件名):

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

code.jpg

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

code2.jpg

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

code3.jpg

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

code4.jpg

 

 

 

接下来,在虚拟环境的python中运行该python脚本,结果报错了。

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

从报错信息来看,说的是在它所说的E:\ProgramFiles\Anaconda\envs\python3.7_for_tesserocr\/tessdata/这个路径下找不到tessdata文件夹。

我一看,咦这不就是我用的虚拟环境的根目录么。

于是我去找到tesseract的安装目录,将tessdata文件夹复制到虚拟环境的根目录下,再次运行:

python3 安装tesserocr:pip install tesserocr pillow报错,各种踩坑记录,把我搞到半夜两点都没解决的问题到底是啥?【雪山凌狐踩坑记】

可以看到,这一次成功进行了识别。

不过识别的准确度还是比较堪忧的,大家可以对照一下前面的几张code图片,对应的正确答案应该是什么。

我发现,在目前的代码简易处理方式下,当验证码中遇到0、o、O这些难以区分的字符时比较难辨认,当二值化处理后的字符,具有比较好的独特形状或排他性时识别度较好,比如code3.jpg就能完全正确识别。

你还能看一下二值化处理完毕后的图片长什么样,可以将我前面python代码中的image.show()这一行的注释取消,就能看到处理后的图片的样子了。

 

你还可以进行更多的这个库的用法的探索。

总之到这里我就基本从坑里爬起来了,虽然结局也不甚完美,但总归还是用上了不是?哈哈哈。

 

好了,感谢大家阅读完本文,我们下次再见!

发表评论

您必须才能发表评论!