OCR分享--通义千问-MAX,UMI-OCR和飞浆OCR
评论
收藏

OCR分享--通义千问-MAX,UMI-OCR和飞浆OCR

经验分享
violet’伊芙加登
2025-10-11 10:42·浏览量:521
violet’伊芙加登
影刀中级开发者
发布于 2025-10-11 10:42521浏览

背景:需要识别尺码图片的信息

这里我一共用过三种方法

1、通义千问的max模型:通过base64
import os
import json
import base64
from openai import OpenAI
from config import Config
from PIL import Image
import time
from datetime import datetime
import cv2
client = OpenAI(
    api_key=Config.DASHSCOPE_API_KEY,
    base_url=Config.DASHSCOPE_URL,
    default_headers={
        "Content-Type": "application/json",
        "Authorization": f"Bearer {Config.DASHSCOPE_API_KEY}",
    }
)

system_prompt = """
# 角色
你是一名专业的 OCR 尺码识别助手并将识别结果格式化为标准 Markdown 表格输出。

## 能力

####内容脱敏

  
## 工作流程
1. 接收到图片后,使用 OCR 技术识别其中的尺码表格。
2. 提取并结构化表格信息,保留原有列顺序。

4. 以 Markdown 表格形式输出结果,不添加任何额外说明。

## 输出格式
- 仅输出 Markdown 表格,不包含任何其他文本或解释。
- 表格必须符合标准 Markdown 语法。
- 输出示例:



## 限制

- 不输出除 Markdown 表格以外的任何内容。

"""
#压缩图片尺寸
def compress_image(image_path, max_size=720):

    image = Image.open(image_path)
    image.thumbnail((max_size, max_size))
    tmp_path = image_path.rsplit(".", 1)[0] + "_compressed.png"
    if image.mode != 'L':
        gray_image = image.convert('L')
    else:
        gray_image = image

    gray_image.save(tmp_path, format="PNG")
    return tmp_path

def perform_ocr(image_path,country):
    start_time = time.time()  # ⏱️ 开始计时
    image_path = compress_image(image_path)  # 压缩图片,保证����不超过1024x1024px
    image_format = "jpeg" if image_path.lower().endswith((".jpg", ".jpeg")) else "png"
    with open(image_path, "rb") as f:
        img_b64 = base64.b64encode(f.read()).decode("utf-8")
    image_data = f"data:image/{image_format};base64,{img_b64}"
    # 用户消息:直接字符串
    user_content = f"请识别这张尺码图片,并输出 Markdown 表格,\n图片内容:{image_data}"
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_content}
    ]



    response = client.chat.completions.create(
        model = Config.DASHSCOPE_MODEL,
        messages = messages,
        max_tokens = 4500,
        temperature = Config.DASHSCOPE_temperature,
        top_p = Config.DASHSCOPE_top_p,

        frequency_penalty = Config.DASHSCOPE_frequency_penalty,

    )


    markdown_table = response.choices[0].message.content.strip()

    end_time = time.time()  # ⏱️ 结束计时
    print(f"⏰ OCR 总耗时:{end_time - start_time:.2f} 秒")
    return markdown_table

if __name__ == "__main__":
    image_path = r"C:\Users\Admin\Desktop\图片命名\O1CN01wwhtNr1HbugI8D7Xt_!!2217014300777-0-cib.jpg"
    country = "English"
    markdown_table = perform_ocr(image_path, country)
    print(markdown_table)

那么这个识别加翻译加上标准markdown输出是75s左右,识别了3张图片还是很稳定的就是慢

2、飞浆OCR

import cv2
from paddleocr import PaddleOCR
import time
from datetime import datetime
def ocr_image(image_path, lang='ch'):
    global start_time
    start_time = time.time()  # ⏱️ 开始计时

    """
    使用PaddleOCR识别图片中的文字内容

    参数:
        image_path (str): 图片文件路径
        lang (str): 识别语言
    """
    try:
        ocr_model = PaddleOCR(lang=lang)
        result = ocr_model.predict(image_path)
        return result
    except Exception as e:
        print(f"初始化OCR模型失败: {e}")
        # 回退到默认中文模型
        ocr_model = PaddleOCR(lang='ch')
        result = ocr_model.predict(image_path)
        return result

if __name__ == "__main__":
    image_path = r"C:\Users\Admin\Desktop\ceshi\O1CN01wwhtNr1HbugI8D7Xt_!!2217014300777-0-cib.jpg"

    # 尝试使用中文识别(通常支持中英文混合)
    result = ocr_image(image_path, lang='ch')
    end_time = time.time()  # ⏱️ 结束计时
    print(f"⏰ OCR 总耗时:{end_time - start_time:.2f} 秒")
    # 解析并打印结果
    if result and len(result) > 0:
        for page_result in result:
            if isinstance(page_result, dict) and 'rec_texts' in page_result:
                texts = page_result['rec_texts']
                scores = page_result['rec_scores']
                for t, s in zip(texts, scores):
                    print(f"{t} ({s:.3f})")
            elif isinstance(page_result, list):
                # 处理列表格式的结果
                for item in page_result:
                    if len(item) >= 2:
                        text_info = item[1]
                        if len(text_info) >= 2:
                            text = text_info[0]
                            score = text_info[1]

                            print(f"{text} ({score:.3f})")
同一张图片仅做识别是35秒,置信区间在0.90以上

3、umi-ocr

同一张图0.9s支持http服务,同时 可以部署服务器直接调用给到夯

收藏4
全部评论1
最新
发布评论
评论