前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用docker在云上部署一个图片解析接口

用docker在云上部署一个图片解析接口

作者头像
赵云龙龙
发布2020-09-18 11:17:21
4680
发布2020-09-18 11:17:21
举报
文章被收录于专栏:python爱好部落python爱好部落

公司的应用为了加强安全性,在登陆时增加了验证码。这对自动化来说,增加了不少难度。 曾经尝试用各种方法来解析验证码,识别率都不高。 后面我找到了一个新出的解析验证码包,叫muggle_ocr, 是基于人工智能的,解析效果还不错。 首先安装模块

代码语言:javascript
复制
pip install muggle_ocr
# 因模块过新,阿里/清华等第三方源可能尚未更新镜像,因此手动指定使用境外源,为了提高依赖的安装速度,可预先自行安装依赖:tensorflow/numpy/opencv-python/pillow/pyyaml

因为考虑到需要给大家都用,所以打算在云服务器上做一个接口。 首先写图片解析的代码

代码语言:javascript
复制
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.

代码语言:javascript
复制
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

代码语言:javascript
复制
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 这个镜像,启动容器就可以了。 如何调用? 写段代码就可以了

代码语言:javascript
复制
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用起来很爽,一直用一直爽。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python粉丝团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档