公司的应用为了加强安全性,在登陆时增加了验证码。这对自动化来说,增加了不少难度。 曾经尝试用各种方法来解析验证码,识别率都不高。 后面我找到了一个新出的解析验证码包,叫muggle_ocr, 是基于人工智能的,解析效果还不错。 首先安装模块
pip install muggle_ocr
# 因模块过新,阿里/清华等第三方源可能尚未更新镜像,因此手动指定使用境外源,为了提高依赖的安装速度,可预先自行安装依赖:tensorflow/numpy/opencv-python/pillow/pyyaml
因为考虑到需要给大家都用,所以打算在云服务器上做一个接口。 首先写图片解析的代码
import requests
import time
import muggle_ocr
import os
from PIL import Image
import shutil
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)
root_dir = r"./imgs"
new_dir = r"./imgs2"
def check_folder(folder):
if os.path.exists(folder):
shutil.rmtree(folder)
os.major(folder)
def binaryzation(threshold=145): # 降噪,图片二值化
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
return table
def change_size(source,destination):
directorys = [os.path.join(source, f) for f in os.listdir(source)]
for directory in directorys:
# 不是图片文件就跳过
print(directory)
if directory.endswith(('.jpg','png','jpeg','.bmp')):
img = Image.open(directory)
img = img.convert('L') # 转化为灰度图
img = img.point(binaryzation(), '1') # 二值化
s = "/"
# 获取文件名(含后缀)
oimage_name = directory[directory.rfind(s) + 1:]
(oimage_width, oimage_height) = img.size
new_width = oimage_width * 3
new_height = oimage_height * 3
out = img.resize((new_width, new_height), Image.ANTIALIAS)
out.save(os.path.join(destination,"%s" % oimage_name))
def get_muggule(root_dir):
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()
text = sdk.predict(image_bytes=b)
print(i, text)
return text
为了提高识别率,我将图片进行了处理,进行了降噪,以及放大。 然后需要写一个接口,这里用的是flask.
from flask import request
from flask import Flask, jsonify, abort
from PIL import Image
from testpicture import change_size, get_muggule, root_dir, new_dir, check_folder
import os
app = Flask(__name__)
@app.route("/photo", methods=['POST'])
def get_frame():
# 接收图片
upload_file = request.files['file']
# 获取图片名
file_name = upload_file.filename
if upload_file:
# 计算图片大小
img = Image.open(upload_file)
check_folder(root_dir)
img.save(os.path.join(root_dir, file_name))
check_folder(new_dir)
change_size(root_dir, new_dir)
text = get_muggule(new_dir)
data = {'text': text, 'filename': file_name, 'format': img.format, 'size': img.size}
return jsonify(data)
abort(400) # 若没有图片传递返回400
if __name__ == '__main__':
# app.run(host='127.0.0.1',port=5000)
# 将host设置为0.0.0.0,则外网用户也可以访问到这个服务
app.run(host="0.0.0.0", port=6000, debug=True)
写完以后,本地运行没啥问题,如果需要部署到云服务器上去,得写一个Dockerfile 我得拿到requirement.txt 这里推荐一个工具叫pipreqs,可以通过一条命令直接生成项目所有依赖包清单requirements.txt,方便部署。 生成项目所有依赖清单 方法1: 安装pipreqs pip install pipreqs
装好之后切换到项目根目录下,执行下面命令: pipreqs ./
正常的话应该会在项目根目录下生成一个requirements.txt文件 如果出现unicode问题,通过下面命令解决: pipreqs ./ --encoding=utf-8
当项目里存在requirements .txt文件时,执行命令会提示警告,这时需要在执行命令中增加"--force"参数。执行以下语句: pipreqs ./ --encoding=utf-8 --force
如果生成的requirements.txt文件有个别包漏掉,这时可以检查一下缺失的包名,将包名手工加到文件中。 方法2: 省心方式:导出所有的第三方包 pip freeze >requirements.txt
会生成当前python环境安装的所有安装包,生成的文件名可以任意命名,安装的时候也要用这个名字 pip freeze 会附带上一些不需要的包,以及某些包依赖的包~ 好了,奉献上Dockerfile
FROM python:3.8
ENV PYTHONUNBUFFERED 1
WORKDIR /code/captcha
ADD . /code/captcha
RUN pip3 install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com -r requirements.txt
CMD python3 app.py 0.0.0.0:6000
Build 这个镜像,启动容器就可以了。 如何调用? 写段代码就可以了
if __name__ == '__main__':
# API地址
url = "http://127.0.0.1:6000/photo"
# 图片地址
file_path = r'C:\Users\ming.xiesh\Downloads\kibana.jpg'
# 图片名
file_name = file_path.split('/')[-1]
# 二进制打开图片
file = open(file_path, 'rb')
# 拼接参数
files = {'file': (file_name, file, 'image/jpg')}
# 发送post请求到服务器端
r = requests.post(url, files=files)
print(r.json())
这样,调用起来就很方便。测试了一下,没加灰度和放大图片,七成的识别率,处理了一下,达到了八成,这样就很方便测试了,如果偶尔没识别出来,可以多点一次验证码,多识别一次就可以了。 感觉docker用起来很爽,一直用一直爽。