背景描述:
本文承接我写的另一篇博客https://blog.csdn.net/Codefengfeng/article/details/158808221?spm=1001.2014.3001.5501,在本地部署好大模型PaddleOCR-VL-1.5后,由于本人很懒,想要实现快捷键调取模型完成OCR功能。最后大致实现的效果是:按下快捷键ctr+1选中目标区域,后台会自动调取大模型执行OCR任务把结果写到剪切板,这时开发者只需快捷键ctr+v即可粘贴识别的内容。上面这段话简单描述为:ctr+1截图,ctr+v粘贴文字~

操作:

阶段一:编写py脚本

在E:\PaddleDeploy 目录下新建一个quicker_ocr.py,该脚本的作用是调取大模型完成OCR任务并标准输出结果供Quicker抓取,代码放在下面。

import requests
import cv2
import base64
import sys

# ====== 核心配置区 ======
LAYOUT_URL = "http://localhost:8001/analyze_layout"
VLM_URL = "http://localhost:8000/v1/chat/completions"
# ========================

def main():
    # 1. 接收 Quicker 传过来的图片路径参数
    if len(sys.argv) < 2:
        print("未接收到图片路径参数")
        return

    image_path = sys.argv[1]
    img = cv2.imread(image_path)
    if img is None:
        print("图片读取失败,请检查路径")
        return

    # 强制绕过系统的科学上网代理
    proxies = {"http": None, "https": None} 
    
    # 2. 请求版面分析 (Port 8001)
    try:
        with open(image_path, "rb") as f:
            res_layout = requests.post(LAYOUT_URL, files={"file": f}, proxies=proxies)
            if res_layout.status_code != 200:
                print(f"版面分析异常: 状态码 {res_layout.status_code}")
                return
            layout_data = res_layout.json()
    except Exception:
        print("无法连接到 8001 端口,请检查 Docker 服务是否启动")
        return

    regions = layout_data.get("regions", [])
    if not regions:
        regions = [{"bbox": [0, 0, img.shape[1], img.shape[0]], "type": "Text"}]

    final_results = []

    # 3. 循环切割区域,调用 0.9B 大模型 (Port 8000)
    for region in regions:
        x1, y1, x2, y2 = region["bbox"]
        region_type = region["type"]
        crop_img = img[int(y1):int(y2), int(x1):int(x2)]
        
        # 【防御机制】:动态压缩长边至 960,防止视觉 Token 溢出导致 vLLM 崩溃
        max_size = 960  
        h, w = crop_img.shape[:2]
        if max(h, w) > max_size:
            scale = max_size / max(h, w)
            crop_img = cv2.resize(crop_img, (int(w * scale), int(h * scale)))
            
        _, buffer = cv2.imencode('.jpg', crop_img, [int(cv2.IMWRITE_JPEG_QUALITY), 85])
        img_base64 = base64.b64encode(buffer).decode('utf-8')

        prompt = "请精准识别这张图中的所有文字。"
        if region_type == "Table":
            prompt = "请识别图中的表格,并以 Markdown 格式严格输出。"

        payload = {
            "model": "/models/PaddleOCR-VL",
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {"type": "text", "text": prompt},
                        {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img_base64}"}}
                    ]
                }
            ],
            "temperature": 0.0
        }

        try:
            # 加入 timeout=120 允许大模型预热
            res_vlm = requests.post(VLM_URL, json=payload, proxies=proxies, timeout=120)
            if res_vlm.status_code == 200:
                text = res_vlm.json()["choices"][0]["message"]["content"]
                final_results.append(text.strip())
            else:
                final_results.append(f"[大模型识别异常: 状态码 {res_vlm.status_code}]")
        except Exception:
            final_results.append("[大模型识别超时或连接断开]")

    # 4. 只打印纯净的识别结果,供 Quicker 抓取
    print("\n\n".join(final_results))

if __name__ == "__main__":
    main()

阶段二:Quicker中搭建动作

  • Step1。创建新动作。
    打开 Quicker 面板,在空白处右键 -> 选择 新建动作 -> 动作类型选择 组合动作,会进入一个动作设置界面。
    在这里插入图片描述
(图1)

在这里插入图片描述

(图2)
  • Step2。添加动作"屏幕截图"。在左侧搜索框中搜索"屏幕截图",双击一下出现图3中所示配置界面,按照我的参数配置即可。
    在这里插入图片描述
(图3)
  • Step3。添加动作"写入图片文件"。在左侧搜索框中搜索后双击,进入图4中所示配置界面,按照我的参数配置即可。(这个文件路径相当于中转站,每次截图都会覆盖这一个文件,不占用硬盘空间)
    在这里插入图片描述
(图4)
  • Step4。添加动作"运行或打开"。在左侧搜索框中搜索后双击,进入图5中所示配置界面,按照我的参数配置即可。这里我要做些参数说明:1.路径这里选择的是安装Anaconda时的资源配置路径,相当于给指令选定解释器(配置过anaconda+pycharm的同学应该熟悉);2.参数这里包含两部分,前半部分是脚本,后半部分是刚刚截图的路径;3.stdout输出,是一个标准输出,负责接受python脚本运行吐出来的文字(print结果)
    在这里插入图片描述
(图5)
  • Step5。添加动作"写入剪切板"。在左侧搜索框中搜索后双击,进入图6中所示配置界面,按照我的参数配置即可。这里选择的变量就是在上一步中创建的Stdout输出变量。
    在这里插入图片描述
(图6)
  • Step6。给动作设置一下外观与描述,然后点击"保存“即可(Step6可不做,只是对美有追求的技术员会做)。找不到好看的图标推荐去阿里的矢量图标库找,网址https://www.iconfont.cn/
    在这里插入图片描述
  • Step7。给这个组合动作设置一个快捷键。右键点击生成好的OCR动作,“信息” -> “设置快捷键”,去里面配置快捷键即可(我设置成了ctr+1)。
    在这里插入图片描述
  • Step7。大模型预热。第一次使用设置好的快捷键调用大模型进行OCR识别时,可能显示模型连接已超时,这不是没做好配置问题,而是启动前需要做个预热。首先确保Docker Desktop中开启了大模型服务,然后去Powershell中用脚本(我的是test_ocr.py)跑一遍OCR识别任务把大模型"热”起来,这时再ctr+1就能正常得到OCR输出了

至此,大功告成!!!!
后面再想使用高精度OCR,此时你打开Docker Desktop启动大模型,然后快乐地:ctr+1截图,ctr+v粘贴文字~

更多推荐