首页 > 其他分享 >百度飞浆OCR docker 部署

百度飞浆OCR docker 部署

时间:2024-01-08 15:37:03浏览次数:30  
标签:status RUN inference PaddleOCR import docker OCR com 飞浆

# Version: 2.0.0
FROM paddlepaddle/paddle:2.5.1

# PaddleOCR base on Python3.7
RUN pip3.7 install --no-cache-dir --upgrade pip -i https://mirror.baidu.com/pypi/simple

RUN pip3.7 install --no-cache-dir paddlehub --upgrade -i https://mirror.baidu.com/pypi/simple

RUN pip3 uninstall -y astroid

RUN pip3 install astroid==2.12.2

RUN git clone https://gitee.com/PaddlePaddle/PaddleOCR.git /PaddleOCR

WORKDIR /PaddleOCR

RUN pip3.7 install --no-cache-dir -r requirements.txt -i https://mirror.baidu.com/pypi/simple

RUN mkdir -p /PaddleOCR/inference/

# Download orc detect model(light version). if you want to change normal version, you can change ch_ppocr_mobile_v2.0_det_infer to ch_ppocr_server_v2.0_det_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py)
ADD https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar /PaddleOCR/inference/
ADD https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar /PaddleOCR/inference/
ADD https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar /PaddleOCR/inference/


RUN tar xf /PaddleOCR/inference/ch_PP-OCRv3_det_infer.tar -C /PaddleOCR/inference/
RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v2.0_cls_infer.tar -C /PaddleOCR/inference/
RUN tar xf /PaddleOCR/inference/ch_PP-OCRv3_rec_infer.tar -C /PaddleOCR/inference/


EXPOSE 8866

CMD ["/bin/bash","-c","hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"]

DockerFile 修改如上

最重要的两行就是

RUN pip3 uninstall -y astroid
RUN pip3 install astroid==2.12.2

默认的版本会报错

建好DockerFile之后运行:

docker build -t paddleocr:cpu .

创建image

运行:

docker run -dp 8866:8866 --name paddle_ocr paddleocr:cpu

客户端调用:

package com.modules.controller;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.text.ParseException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import sun.misc.BASE64Encoder;
public class InvoiceOcr {

    //接口地址
    private static String apiURL = "http://XXX:8866/predict/ocr_system";
    //private Log logger = LogFactory.getLog(this.getClass());
    private HttpClient httpClient = null;
    private HttpPost method = null;
    private long startTime = 0L;
    private long endTime = 0L;
    private int status = 0;

    /**
     * 接口地址
     *
     * @param url
     */
    public InvoiceOcr(String url) {

        if (url != null) {
            this.apiURL = url;
        }
        if (apiURL != null) {
            httpClient = new DefaultHttpClient();
            method = new HttpPost(apiURL);

        }
    }

    /**
     * 调用 API
     *
     * @param parameters
     * @return
     */
    public String post(String parameters) {
        String body = null;
        if (method != null & parameters != null && !"".equals(parameters.trim())) {
            try {

                // 建立一个NameValuePair数组,用于存储欲传送的参数
                method.addHeader("Content-type","application/json");
                method.setHeader("Accept", "application/json");
                method.setEntity(new StringEntity(parameters, Charset.forName("UTF-8")));
                startTime = System.currentTimeMillis();

                HttpResponse response = httpClient.execute(method);

                endTime = System.currentTimeMillis();
                int statusCode = response.getStatusLine().getStatusCode();

                //logger.info("statusCode:" + statusCode);
                //logger.info("调用API 花费时间(单位:毫秒):" + (endTime - startTime));
                if (statusCode != HttpStatus.SC_OK) {
                    //logger.error("Method failed:" + response.getStatusLine());
                    status = 1;
                }
                body = EntityUtils.toString(response.getEntity(),"utf-8");
            } catch (IOException e) {
                // 网络错误
                status = 3;
                System.out.println(e);
            } finally {
                //logger.info("调用接口状态:" + status);
            }
        }
        return body;
    }

    public static void main(String[] args) throws ParseException {
        InvoiceOcr ac = new InvoiceOcr(apiURL);
        JSONArray arry = new JSONArray();
        JSONObject j = new JSONObject();
        arry.add(imageToBase64("C:\\Users\\Administrator\\Pictures\\微信图片_20230928141827.jpg"));
        j.put("images",arry);
        String result = ac.post(j.toJSONString());
        System.out.println(result);
    }

    public static String imageToBase64(String path) {
        byte[] data = null;
        // 读取图片字节数组
        try {
            InputStream in = new FileInputStream(path);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);// 返回Base64编码过的字节数组字符串
    }
    /**
     * 0.成功 1.执行方法失败 2.协议错误 3.网络错误
     *
     * @return the status
     */
    public int getStatus() {
        return status;
    }

    /**
     * @param status
     *            the status to set
     */
    public void setStatus(int status) {
        this.status = status;
    }

    /**
     * @return the startTime
     */
    public long getStartTime() {
        return startTime;
    }

    /**
     * @return the endTime
     */
    public long getEndTime() {
        return endTime;
    }
}

参考资料:freesion.com/article/72...


标签:status,RUN,inference,PaddleOCR,import,docker,OCR,com,飞浆
From: https://blog.51cto.com/u_15250463/9145463

相关文章

  • 使用Docker-Compose部署MySQL一主二从同步高可用MHA集群
    (文章目录)......
  • Docker 入门-常用命令
    dockerpull用于从远程镜像仓库(比如DockerHub)拉取镜像的命令。基本语法是dockerpull[选项][镜像名称]:[标签]。例如,dockerpullnginx:latest将会从DockerHub拉取名为nginx的镜像,使用latest标签。如果不指定标签,默认会拉取latest标签的镜像。当然,也可以指定镜像仓......
  • conda install dockerfile
    使用conda安装Dockerfile在软件开发和部署过程中,使用容器化技术可以帮助我们更加高效地构建、运行和管理应用程序。Docker是目前最流行的容器化平台之一,它可以将应用程序及其依赖项打包到一个独立的容器中,并保证在不同的环境中一致地运行。而Dockerfile是用于定义Docker镜像构建过......
  • docker_compose
    dockercompose编排服务DockerCompose是一个用于定义和运行多个Docker容器的工具。通过编写一个YAML文件来描述应用的各个服务,并使用docker-compose命令来启动、停止和管理这些服务。以下是编排Docker服务的常见步骤:创建一个docker-compose.yml文件,该文件用于描述你的......
  • docker_Portainer
    DockerPortainer是一个用于管理Docker容器的图形化界面工具。下面是使用DockerPortainer的一些步骤:安装Docker:首先需要在你的系统上安装Docker。根据不同的操作系统,可以参考Docker官方文档进行安装。下载Portainer镜像:使用以下命令从DockerHub上下载Portainer镜像:dockerpullpo......
  • docker_cig
    Docker上安装通过dockerstats命令可以很方便的查看当前宿主机上所有容器的CPU、内存、网络流量等数据,可以满足一些小型应用。但是dockerstats统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、没有健康指标过线预警等功能。CAdvisor(监控收集)+InfluxDB(存储......
  • 部署Docker
    自己在自己电脑部署Docker首先要有虚拟机,然后在虚拟机上装上系统。我这里用的vmware,系统用的centos7。这些上网也能找到下载与安装教程,如果懒得弄,可以私信我,我这里有vm17与centos7.然后要有一个远程连接工具可以使用FinalShell或者XShell都可以。这里就说一下  如何让fina......
  • docker_命令
    docker常用的命令:二、镜像命令dockerimagesdockersearch去配置的镜像网站库找寻找某个镜像,比如:Dockerdockerpulldockerrmi删除本地有的镜像#删除单个dockerrmi镜像ID#删除镜像,如果此时镜像上面有容器正在运行,会报错无法删除dockerrmi-f镜像ID#强制(forced)删除镜......
  • docker安装常用的软件
    docker安装mysql:docker安装mysqlDocker可以通过以下命令来安装MySQL容器:首先确保已经在计算机上安装了Docker。如果没有安装,请根据操作系统的不同进行相应的安装。打开终端或命令提示符,并运行以下命令拉取最新版本的MySQL镜像:dockerpullmysqldockerpullmysql等待镜像下载完......
  • docker_network命令
    docker命令:一、概述查看网络列表【默认提供三种网络】:dockernetworkls创建一个driver为bridge的网络:(默认创建的就是bridge):dockernetworkcreate自定义network名删除:dockernetworkrm自定义networkID查看网络信息: dockernetworkinspectcentos66-net1.2、docker镜像使用......