python+tensorflow搭建通用证码识别系统教程(linux篇)
2021-06-20 admin linux python 1443
linux我们选择了使用很普遍的centos7.9 64位系统,虚拟机的安装过程如下,重要的地方标注了:
如上图,终端连接上后,先安装wget:
yum install wget
安装过程中输入y,直到完成。
一、安装python3.7,先安装相应组件环境:
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel kernel-devel libffi-devel
然后下载安装包python,3.x版本目前最新的是3.7.9
wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tar.xz
解压:
tar -Jxvf Python-3.7.9.tar.xz
进入目录,编译安装新版:
cd Python-3.7.9
./configure prefix=/usr/local/python3
报错no acceptable C compiler found in PATH,需要安装C编译器:
yum -y install gcc
安装完后,再执行预安装:
./configure prefix=/usr/local/python3
如果有报错,少什么就安装什么,直到没有错误后,再正式编译安装:
make && make install
完成后,设置软链接:
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
测试看看是否正常:
如上图所示,自带的版本是2.7.5,新版本是3.7.9,正常运行了。
pip也添加上新版本软链接;
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
二、安装图文识别组件
这次,我们尝试手工逐个安装,创建ocr目录,上传muggle-ocr后本地安装:
mkdir ocr
cd ocr
用FTP工具上传压缩包到ocr目录:
在终端解压:
yum install -y unzip zip
unzip Lib.zip
将解压后的目录移动到 /usr/local/python3/lib/python3.7/目录下,并安装升级组件:
mv /root/Python-3.7.9/ocr/* /usr/local/python3/lib/python3.7/
/usr/local/python3/bin/python3.7 -m pip install --upgrade pip
pip3 install pyyaml
将ocr.py文件上传到/root/Python-3.7.9/ocr/目录
import time
import base64
# 1. 导入包
import muggle_ocr
"""
使用预置模型,预置模型包含了[ModelType.OCR, ModelType.Captcha] 两种
其中 ModelType.OCR 用于识别普通印刷文本, ModelType.Captcha 用于识别4-6位简单英数验证码
"""
start = time.perf_counter()
# 打开验证码图片,将文件数据作为字符串返回
base64img = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAeAEADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+mRK6RhZH3sOrYxn8KwvF7yQ6VBPDNNFIt3AoMUrJkNIoIODyMHvWsmoW0moyWCmQ3EahnHlPtAPT5sbfwzWvsn7NTWu/wCFv8yeZXsWWdUxuYDJwMnqabufztuz5Nud+e/piuc+x22keL45BbQrBqCbVOwfu5V549Mj8zTmtRqmrT3VnPDbTxyCHzRGjSbFBDsu4HksQuT2Wso6uxtyLvodAoV5jIshOBsKhvlB+nrUlc5pVxctr+paTLcm7toY45RcBQjq7E5RigAJ4z0FV7m4bwpqMspcS2F3mRlY4McuOvA6Nj061c4ODsxTg4uzOol8zyz5W3f239KfWBo4MDS6hqamG9vGz84+VE/hQN0HHY4Oa1wyReetum+UMGZM4yT7moIMTxqksuhpFBFO8rXMLDyYWlKhXBJwAegGeabor3en6le6POt1KjsZ7e/a3bDbuSrtjG4fqMDjGK6Wormf7NbtLt3bccZx3xXSsRaj7JrTX79P8iHD3uYpaxpj6npfkJKEuY2WSKYjG2Reh/n+dR3yW+n6ZbWsljLd2pPlSBIjIyDa3zlQCTyMcf3s1pPMqTRxEHdJnGOnFLIsjLiNwhzyduTj29/z+lc8bJ3ZqpdHscnollNa+IJX0e2nt9H+z/NDco0KNKWyNikZGBnJxz09xoeI4mvNLMPkhJzJHy7AAqGBOHOB2PHB46Vry7LW0kZnlYfxNuy2Txken4cVLsIh2K53BcBzyc+vvVVJ87uOc+d3CKJIYxHGMKOgzSpGkSBI0VFHRVGAKqx2AgAMErxNjkL9xjxyV6Dp2xVmPzNv70JuBxlScEevt9OfrUEH/9k=="
image = base64.b64decode(base64img)
# 2. 初始化;model_type可选:[ModelType.OCR,ModelType.Captcha],ModelType.Captcha可识别4-6位验证码
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
# 3. 调用预测函数
text = sdk.predict(image_bytes=image)
end = time.perf_counter()
print('识别结果:',text,'耗时 %s 秒'%(end-start))
然后测试脚本,看报错信息:
cd /root/Python-3.7.9/ocr/
python3 ocr.py
缺少什么组件,我们就安装什么:
pip3 install pillow
pip3 install tensorflow
pip3 install opencv-python
yum install mesa-libGLU
再运行测试
已正常识别了。
三、安装Django创建API调用服务
现在可以在命令行执行识别了,不过我们要实现的是,其它程序通过访问127.0.0.1?img=base64这种形式,将base64验证码图片发送过去,识别后再返回结果。
这个我们可以通过Django实现。执行命令安装:
pip3 install Django
在ocr目录下创建一个项目,取名为webocr:
cp /usr/local/python3/lib/python3.7/site-packages/django/bin/django-admin.py /root/Python-3.7.9/ocr/
python3 django-admin.py startproject webocr
这行代码将会在当前目录下创建一个 webocr 目录,我们进入目录,启动一下看看:
cd webocr
python3 manage.py runserver
但是我们的centos系统没有安装浏览器,为方便测试,我们用这个启动
python3 manage.py runserver 0.0.0.0:8000
然后在windows本机上的浏览器输入虚拟机ip测试:
http://192.168.135.129:8000/
如果能看到欢迎界面就正常了。
但我的提示错误,SQLite版本太低:
SQLite 3.9.0 or later is required
看了下升级教程,又要下载编译配置,为了省麻烦,直接去掉数据库:
vi /root/Python-3.7.9/ocr/webocr/webocr/settings.py
将下图的删除
启动成功:
然后坑爹的是,我的本地电脑无法访问虚拟机8000端口,干脆简化测试,安装文本浏览器
yum install lynx
复制一个终端,启动后输入网址:
lynx 127.0.0.1:8000
显示访问正常:
同windows教程一样,将文件urls.py和views.py上传到/root/Python-3.7.9/ocr/webocr/webocr/目录,文件内容分别如下:
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('ocr/', views.ocr),
]
from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt
import time
import base64
# 1. 导入ocr识别包
import muggle_ocr
"""
使用预置模型,预置模型包含了[ModelType.OCR, ModelType.Captcha] 两种
其中 ModelType.OCR 用于识别普通印刷文本, ModelType.Captcha 用于识别4-6位简单英数验证码
"""
@csrf_exempt
def ocr(request):
img = request.POST.get("img")
if img != "":
#图片base64经过post传输后+会变成空格,这里要替换回来
img = img.replace(" ", "+")
image = base64.b64decode(img)
# 2. 初始化;model_type可选:[ModelType.OCR,ModelType.Captcha],ModelType.Captcha可识别4-6位验证码
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
# 3. 调用预测函数
text = sdk.predict(image_bytes=image)
return HttpResponse(text)
else:
return HttpResponse("图片为空")
然后和windows一样测试即可:点击查看。
这里补充一下,刚才无法访问是没关闭防火墙,执行命令关闭即可:
systemctl stop firewalld.service
然后我们可以用80端口启动的,这样就不用输入端口号了:
python3 manage.py runserver 0.0.0.0:80
直接输入http://192.168.135.129/访问即可。测试时发现报错:
You may need to add '192.168.135.129' to ALLOWED_HOSTS.
需要修改创建项目时生成的setting.py文件,将ALLOWED_HOSTS = []改为ALLOWED_HOSTS = ['*']
vi /root/Python-3.7.9/ocr/webocr/webocr/settings.py
windows系统安装的,如果是远程调用也一样要设置。以后按下面命令依次执行即可启动:
systemctl stop firewalld.service
cd /root/Python-3.7.9/ocr/webocr/
python3 manage.py runserver 0.0.0.0:80
测试效果还可以,本教程记录完毕。