用 Docker 自建一个文字识别服务

testerzhang testerzhang 2024-01-01 18:07

用 Docker 自建一个文字识别服务

前言

大家好,我是testerzhang, 平时我们想提取图片的文字,可能用微信自带的提取就很方便了,但是我们是否可以自己自建一个这样的服务呢?今天给大家分享一下。

环境搭建

我们需要在一台已经安装了 Docker 环境的 Linux 服务器进行操作。

最低配置要求:

CPU: 1核内存: 2GSWAP: 2G

# 从 dockerhub pull
docker pull mmmz/trwebocr:latest

# 运行镜像
docker run -itd --rm -p 8089:8089 --name trwebocr mmmz/trwebocr:latest 

这里把容器的8089端口映射到了物理机的8089上,是不是很简单,如果要映射对外的其他端口,可自行调整。

效果图

使用自带的 Web 界面进行识别

访问网址:http://xx.xx.xx.xx:8089/

图片


使用 API

可自行编写一个 Python 脚本调用它的API 接口:


import traceback
import urllib3

import requests
from loguru import logger

logger.add('logs/ocr_tools_{time:YYYY-MM-DD}.log')

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

OCR_API_URL = 'https://10.10.10.10:8089'

def ocr_result(img_file):
    ocr_text = ""

    url = f'{OCR_API_URL}/api/tr-run/'
    upload_img_file = {
        # 'file': open('testocr.png', 'rb')
        # 'file': open('testocr2.jpg', 'rb')
        # 'file': open('testocr3.png', 'rb')
        'file': open(img_file, 'rb')
    }

    compress = 0
    # compress = 1600

    data_dict = {
        'compress': compress
    }

    try:
        resp = requests.post(url=url, 
            data=data_dict, 
            files=upload_img_file,
            verify=False,
        )
        resp_status_code = resp.status_code

        if resp_status_code !=200:
            logger.error(f"识别文字接口失败:状态码{resp_status_code}")
            return  ocr_text

        resp_json = resp.json()
        # logger.debug(f"resp_json:{resp_json}")

        resp_data_dict = resp_json.get("data", {})
        speed_time = resp_data_dict.get("speed_time", "")
        logger.debug(f"speed_time:{speed_time}秒")

        resp_raw_out_list = resp_data_dict.get("raw_out", [])
        # logger.debug(f"resp_raw_out_list:{resp_raw_out_list}")
        
        if len(resp_raw_out_list) == 0:
            # logger.error(f"识别文字接口失败:识别文字异常:{resp_json}")
            logger.error(f"识别文字接口失败:识别文字异常")
            return ocr_text


        for resp_raw_out_record in resp_raw_out_list:
            #  logger.debug(f"resp_raw_out_record:{resp_raw_out_record}")
             temp_text = resp_raw_out_record[1]
            #  logger.debug(f"temp_text:{temp_text}")
             ocr_text = f"{ocr_text}{temp_text}\n"
        
        logger.debug(f"识别文字结果:{ocr_text}")

    except:
        logger.error(f"识别文字接口异常:{traceback.format_exc()}")

    return ocr_text


ocr_result(img_file='testocr3.png')

执行脚本

$ python ocrtool.py

脚本输出效果:

2024-01-01 17:55:09.304 | DEBUG    | __main__:ocr_result:49 - speed_time:0.48秒
2024-01-01 17:55:09.304 | DEBUG    | __main__:ocr_result:66 - 识别文字结果:月下独酌四首·其一
【作者】李白
【朝代】唐
花间一壶酒,
独酌无相亲。
举杯邀明月,对影成三人。
月既不解饮,影徒随我身。
暂伴月将影,行乐须及春。
我歌月徘徊,我舞影零乱。
醒时相交欢,醉后各分散。
永结无情游,相期邈云汉。

开源项目

https://github.com/alisen39/TrWebOCR

这个是用 python 实现的,个人有兴趣,可以查看下源码。

文末

该服务可以不使用 GPU,如果服务器性能越好响应速度也会更快。

自己组建了一个新的交流群,需要进群交流,可以扫描下方加群二维码,也可以在公众号后台回复【加技术群】即可收到相应说明。

图片

喜欢的话可以点击"收藏"进行稍后阅读,可以点击"在看"支持下,也可以分享下此文章给你的其他朋友。

推荐阅读

图片

欢迎关注我的公众号“testerzhang”,原创技术文章第一时间推送。

不错,赏个鸡腿!


教程 · 目录
上一篇自建的推送服务推送到andriod手机
个人观点,仅供参考

微信扫一扫
关注该公众号