月度归档:2025年07月

大模型做OCR不如直接OCR

用Qwen2.5VL 3b和7b做OCR 效果不行,不如直接使用OCR的包,如CnOcr

安装:

pip install cnocr[ort-cpu]

pip install cnocr[ort-cpu] -i https://pypi.tuna.tsinghua.edu.cn/simple

首次安装会去hf上下几个模型,CPU也可以运行,效果不错:

from cnocr import CnOcr

img_fp = 'page_10.png'
ocr = CnOcr()  # 所有参数都使用默认值
out = ocr.ocr(img_fp)

print(out)

返回结果为 文本信息 准确率 位置信息

文档:https://cnocr.readthedocs.io/zh-cn/stable/

解决方向:OCR 结果给大模型处理

thinkphp6文件上传 Filesystem Request

创建配置文件在 data/config/filesystem.php

return [
    'default' => 'local',
    'disks'   => [
        'local'  => [
            'type' => 'local',
            'root' => app()->getRuntimePath() . 'storage',
        ],
        'public' => [
            'type' => 'local',
            'root' => app()->getRootPath() . 'public/storage',
            'url'  => '/storage',
        ],
    ],
];

该处 在创建public磁盘:在更目录的public目录下创建storage文件夹用于存储

前端HTML

 <form method="post" action="{:url('portal/gz/post_info_post')}" enctype="multipart/form-data">

控制器中


use think\facade\Request;
use think\facade\Filesystem;

$file = request()->file('path');
        if (!$file) {
            return json(['code' => 0, 'msg' => '未上传文件']);
        }
#判断是否上传
 $savename = Filesystem::disk('public')->putFile('gz', $file);

#其中返回的信息 $savename

#"gz/20250725/c4219efc6dd44ef8e439b85ed03d667c.png"
#即public下的 storage下 

针对名字字符串,两个字的名字中间加两个空格 三个字的不变

function insertSpaces($str) {
		$result = '';
		$length = mb_strlen($str, 'UTF-8');
		$i = 0;
		$k=0;
		while ($i < $length) {
			// 获取当前字符
			$char = mb_substr($str, $i, 1, 'UTF-8');
			if($i+1<$length){
				$char_next = mb_substr($str, $i+1, 1, 'UTF-8');
			}else{
				$char_next =" ";
			}
			if($char!=" "){
				$k++;
			}
			if($char!=" "&&$char_next==" "){
				// var_dump($k);
				if($k==2){
					$result=$result."  ".$char;
				}else{
					$result=$result.$char;
				}
				$k=0;
			}else{
				$result=$result.$char;
			}
			$i++;
		}
	
		return $result;
	}

结合Qwen2.5-VL 自动化扫描文件分析

东芝扫描仪 设置扫描发生文件的SMB位置,每日早上将多页的A4文档PDF扫描到该位置

主进程对该PDF转化为JPG(暂不考虑多页情况)并将每个JPG使用Qwen2.5-vl进行识别,生成JSON对其保持,按照每个文件级对应的JSON文件保存到数据库和文件存储服务器中。

主进程对全部扫描后的JSON文件,使用QWEN3-30b-a3b进行统计分析,生成固定的结果。

使用OLLAMA API实现

需安装OPENAI库 pathlib库

import base64
from pathlib import Path
from openai import OpenAI

client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

def describe_image(image_path: str, question: str = "请用文字描述这张图片") -> str:
    path = Path(image_path)
    if not path.exists():
        raise FileNotFoundError(image_path)

    with path.open("rb") as f:
        b64_img = base64.b64encode(f.read()).decode()

    response = client.chat.completions.create(
        model="qwen2.5vl:3b",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64_img}"}},
                    {"type": "text", "text": question},
                ],
            }
        ],
        max_tokens=1024,
    )
    return response.choices[0].message.content

# 测试
if __name__ == "__main__":
    print(describe_image("./123.jpg","请总结上面图片信息,请找出其中的:申请部门、合同编号、合同金额、合同名称、对方单位、申请公章名称,并将上面信息分别给予下面的键名:sqbm、htbh、htje、htmc、dfdw、sqgzmc,并将其以json的格式输出。"))


describe_image("图片地址","提示词")
//每次调用都是独立的,不会和上次调用重合起来,只要调整提示词的内容,即可完成对不同OCR的识别格式。

返回信息: 需要吧“`json 和 “` 删掉

```json
{
  "yz": 0,
  "ht": 0,
  "type": 0,
  "sqbm": "",
  "htbh": "",
  "htje": "",
  "htmc": "",
  "dfdw": "",
  "sqgzmc": ""
}
```