paddle v4 hubserving 部署

环境准备:https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.7/deploy/hubserving#24-%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1
在这里插入图片描述

服务器启动命令

hub serving start -c deploy/hubserving/ocr_system/config.json

客户端请求
python tools/test_hubserving.py --server_url=server_url --image_dir=image_path

import base64
import sys
import time
import requests
import json
import asyncio
import aiohttp

import pandas as pd
from sqlalchemy import create_engine, text
import time


from PIL import Image
from io import BytesIO
import cv2
import numpy as np
import io

time1 = time.time()



def read_data():
    conn = create_engine('mysql+pymysql://xxx:xxx@xxx.xxx.xx.xx:3306/x?charset=uxxxtf8')
    connection = conn.connect()
    page = 0
    sql_select = f"SELECT * from xj_zsjh_png LIMIT {page * 10}, 100"  # 1000条100s  
    results = pd.read_sql(sql=text(sql_select), con=connection)
    out = json.loads(results.to_json(orient='records'))
    img_strs_list = [x['bas64_str'] for x in out]
    return img_strs_list


def cv2_to_base64(image):
    return base64.b64encode(image).decode('utf8')

def save_data(results, file_name):
    df = pd.DataFrame([[i['text'] for i in x] for x in results])

    df.to_csv(file_name, index=False)

def process_image_(img_str):
    binary = base64.b64decode(img_str)
    image = Image.open(BytesIO(binary))

    # 创建一个新的RGB图像,将Alpha通道设置为0
    rgb_image = Image.new('RGB', image.size, (255, 255, 255))
    # 将RGBA图像的颜色信息复制到RGB图像
    rgb_image.paste(image, (0, 0), mask=image)
    # 裁剪图片
    left = 535
    top = 0
    right = left + 240
    bottom = image.size[1]
    cropped_image = rgb_image.crop((left, top, right, bottom))

    # 创建一个BytesIO对象
    image_bytes = io.BytesIO()
    # 将图像保存到BytesIO对象中
    cropped_image.save(image_bytes, format='JPEG')
    return image_bytes






def main2():
    results = []
    img_strs_list = read_data()
    for i, img_str in enumerate(img_strs_list):
        image_bytes = process_image_(img_str)
        data = {'images': [cv2_to_base64(image_bytes.getvalue())]}
        headers = {
            'Content-Type': 'application/json'
        }
        response = requests.post("http://192.168.0.189:8868/predict/ocr_system", data=json.dumps(data), headers=headers)


        if response.status_code == 200:
            res = response.json()["results"][0]
            results.append(res)
        else:
            print('Error:', response.status_code)
    save_data(results, 'normal.csv')

async def process_image(img_str):
    image_bytes = process_image_(img_str)
    headers = {
        'Content-Type': 'application/json'
    }
    # 发送 OCR 请求
    data = {'images': [cv2_to_base64(image_bytes.getvalue())]}
    async with aiohttp.ClientSession() as session:
        async with session.post("http://192.168.0.189:8868/predict/ocr_system", data=json.dumps(data),
                                headers=headers) as response:
            if response.status == 200:
                res = (await response.json())["results"][0]
                return res
            else:
                print(f'Error: {response.status}')
                return None


async def process_images(img_strs_list):
    tasks = []
    sem = asyncio.Semaphore(1)  # 限制并发数为5 当创建过多session时就会报错
    async with sem:
        for img_str in img_strs_list:
            task = asyncio.create_task(process_image(img_str))
            tasks.append(task)
        results = await asyncio.gather(*tasks)

    return results


# 在主函数中调用异步任务
async def main():
    img_strs_list = read_data()
    results = await process_images(img_strs_list)
    save_data(results, 'async.csv')


# asyncio.run(main()) #100条 8.666
main2() #100条 9.667 # 96.832
print(f'当前页 共花费--> ', round(time.time() - time1, 3), '\n') # 1.813

(异步与非异步结果差不多)
结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/288586.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马程序员SSM框架-Maven进阶

视频链接:Maven-01-分模块开发的意义_哔哩哔哩_bilibili 分模块开发与设计 分模块开发意义 分模块开发 依赖管理 依赖传递 依赖传递冲突问题 可以点击红框按钮查看依赖情况。 可选依赖和排除依赖 继承和聚合 聚合 聚合工程开发 继承 聚合和继承的区别 属性 属性…

[Vulnhub靶机] DriftingBlues: 2

[Vulnhub靶机] DriftingBlues: 2靶机渗透思路及方法(个人分享) 靶机下载地址: https://download.vulnhub.com/driftingblues/driftingblues2.ova 靶机地址:192.168.67.21 攻击机地址:192.168.67.3 一、信息收集 1.…

用PHP搭建一个绘画API

【腾讯云AI绘画】用PHP搭建一个绘画API 大家好!今天我要给大家推荐的是如何用PHP搭建一个绘画API,让你的网站或应用瞬间拥有强大的绘画能力!无论你是想要让用户在网页上绘制自己的创意,还是想要实现自动绘画生成特效,这…

SpringBoot 集成支付宝支付

网页操作步骤 1.进入支付宝开发平台—沙箱环境 使用开发者账号登录开放平台控制平台 2.点击沙箱进入沙箱环境 说明:沙箱环境支持的产品,可以在沙箱控制台 沙箱应用 > 产品列表 中查看。 3.进入沙箱,配置接口加签方式 在沙箱进行调试前…

Alibaba Cloud Linux镜像操作系统详解(全方位解析)

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版,针对阿里云服务器ECS做了大量深度优化,Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS,Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…

RocketMQ5.0顺序消息设计实现

前言 顺序消息是 RocketMQ 提供的一种高级消息类型,支持消费者按照发送消息的先后顺序获取消息,从而实现业务场景中的顺序处理。 顺序消息的顺序关系通过消息组(MessageGroup)判定和识别,发送顺序消息时需要为每条消息…

【响应式编程-01】Lambda表达式初体验

一、简要描述 Lambda初体验Lambda表达式的语法格式Lambda表达式应用举例Lambda表达式底层实现 二、什么是Lambda表达式 Java8新特性,来源于数学中的λ[l:mdə]演算 是一套关于函数(f(x))定义、输入量、输出量的计算方案 Lambda表达式 -> 函数 使代码变得简洁…

【AI】DETR模型可视化操作

Detr作为目标检测的算法,不同于之前算法的就是注意力机制,注意力机制能够直观看出来模型对图像关注的点,这个直观到底怎么直观呢,我们只听别人说肯定是不行的,上手测试才是最好的方式,像论文中插图那样的使…

jQuery框架

1.1、jQuery简介 jQuery 是一个高效、精简并且功能丰富的 JavaScript 工具库。它提供的 API 易于使用且兼容众多浏览器,这让诸如 HTML 文档遍历和操作、事件处理、动画和 Ajax 操作更加简单。目前超过90%的网站都使用了jQuery库,jQuery的宗旨&#xff1…

CMake入门教程【核心篇】添加应用程序(add_executable)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1. 概述2. 使用方法2…

Linux 的引导与服务控制

一 开机启动过程 bios加电自检-->mbr-->grub-->加载内核文件-->启动进程 1 bios家电自检 检测硬件是否正常,然后根据bios中的启动项设置,去找内核文件 2 mbr 因为grup太大,第一个扇区存不下所有的grub程序,所以分为2部分指…

视频剪辑高手实战:批量置入随机封面,高效制作

随着数字媒体时代的到来,视频内容已成为日常生活中不可或缺的一部分。无论是社交媒体、新闻、教育还是娱乐,视频都以其独特的魅力吸引着眼球。高质量的视频内容要经过精细的剪辑和包装。现在来讲解云炫AI智剪如何通过批量置入随机封面,高效制…

鸿蒙HarmonyOs:为什么不支持热更新?

学习了一段时间的鸿蒙开发,发现鸿蒙开发还是比较简单的,今天突然心血来潮,研究了一下鸿蒙热更新,最终得出的结论是鸿蒙暂时不支持热更新。 鸿蒙app开发主要是利用的ArkTs语言,ArkTs又是基于TypeScript语言的&#xff0…

Linux network — 网络层收发包流程及 Netfilter 框架浅析

Linux network — 网络层收发包流程及 Netfilter 框架浅析 1. 前言2. 基础网络知识2.1 网络分层模型2.2 数据包协议分层2.3 sk_buff 结构2.4 收发包整体框架 3. 网络层(IPv4)收发包流程4. Netfilter 框架4.1 IPv4 网络层的 Netfilter Hook 点4.2 iptable…

Java基础-----集合类(二)

文章目录 1. 泛型简介2. 使用泛型的好处3.使用泛型3.1 泛型类3.2 泛型接口3.3 泛型方法 4 泛型的通配符4.1 <?>&#xff1a;无边界的通配符4.2 <? extends E>&#xff1a;固定上边界的通配符4.3 <? super E>&#xff1a;固定下边界的通配符 5.总结 今天主…

Invalid bound statement (not found)异常解决方案归纳

一、包名映射不对&#xff08;新建多级mapper文件夹引起的&#xff0c;解决方案在下面链接有详细解释&#xff09; Invalid bound statement (not found)异常解决_invalid bound statement (not found): com.ruoyi.map-CSDN博客 二、mapper.xml中的namespace和实际的mapper文…

软考证书学下来,对找工作有哪些帮助?

“软考&#xff1f;真的别考”。 “考了半天&#xff0c;到过期了还能没用上&#xff0c;hr根本不看”。 我在豆瓣上看着网友们的评论&#xff0c;心中五味杂陈。 每年有超过100万人参加的考试&#xff0c;却被人吐槽说一无是处&#xff1f; 这种国家级认证的考试&#xff0…

小白也能看得懂的Jmeter性能测试中服务端资源监控技术

操作步骤&#xff1a; 1、安装插件管理器 插件管理器的作用&#xff1a;可以提供扩展插件的在线安装升级和卸载。因为我们需要在线安装监控插件&#xff0c;首先我们就要先安装插件管理器。 插件管理器的下载地址&#xff1a;https://jmeter-plugins.org/install/Install/ 如…

【论文笔记】An Extractive-and-Abstractive Framework for Source Code Summarization

An Extractive-and-Abstractive Framework for Source Code Summarization 1. Introduction2. Model2.1 Overview2.2 Training of EACS2.2.1 Part i : Training of Extractor2.2.2 Part ii : Training of Abstracter 3. Evaluation 1. Introduction 代码摘要可以细分为抽取式代…

LeetCode2.AddTwoNumbers两数相加(Java可运行,带测试用例)

一、题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都…