在Windows上部署Unlimited-ocr并提供给大模型使用

📅 发布时间:2026/7/20 20:04:07
在Windows上部署Unlimited-ocr并提供给大模型使用 我在尝试把我的图片转换为文字恰好看到百度开源了Unlimited-ocr项目就想把它部署到自己的Windows电脑上并提供给其他大模型使用。Unlimited-ocr https://github.com/baidu/Unlimited-OCR我开源的代码 https://github.com/tinygone/unlimited-ocr-mcp-server问题先让Claude Code分析了这个github repo给了很多输出意思是可以帮我安装。我本能拒绝因为我自己都没看清楚它会怎么使用更不知道它到底给我安装了啥。我担心的几个问题1、都给我安装到C盘了2、模型不知道下载到哪3、官方的仓库里面几乎没有代码readme里面有一点我也不知道怎么调用它。准备本机是Windows11操作系统Nvidia RTX5070TI显卡CUDA版本是13.1安装了Anaconda所以会使用conda管理python环境。unlimited-ocr官网显示推荐使用python 3.12.3 CUDA12.9但是在pytorch官网安装已经找不到CUDA12.9所以我还是决定把我的CUDA升级一下然后安装最新的CUDA。升级前安装后安装过程1 创建项目目录 D:/aiworkspace/uocr-workspace可选并创建虚拟环境uocrconda create -n uocr python3.12.3 conda activate uocr2 安装pytorch访问官网 https://pytorch.org/get-started 获取最新的安装链接pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu1323 安装其他依赖在uocr-workspace下创建一个requirements.txt文件内容来自repo里面的readme.md我把torch和torchvision删除transformers4.57.1 Pillow12.1.1 matplotlib3.10.8 einops0.8.2 addict2.4.0 easydict1.13 pymupdf1.27.2.2 psutil7.2.2执行如下命令安装依赖pip install -r requirements.txt4 初步验证执行下面的命令python -c import torch; print(torch:, torch.__version__); print(cuda:, torch.cuda.is_available()); print(device:, torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU only)输出如下说明正常torch: 2.13.0cu132 cuda: True device: NVIDIA GeForce RTX 5070 Ti Laptop GPU5 设置环境变量通过代理访问HuggingFace设置模型下载的目录不然就会下载到C盘。$env:HF_ENDPOINT https://hf-mirror.comecho$env:HF_ENDPOINT$env:HF_HOME E:\hgcacheecho$env:HF_HOME6 创建run_ocr.py内容如下 Unlimited-OCR 推理脚本 用法: # 单张图片gundam 配置适合大图 python run_ocr.py --mode single -i inputs/test.jpg -o outputs # 多张图片 python run_ocr.py --mode multi -i inputs/page1.png inputs/page2.png -o outputs # PDF自动转图后走多页 python run_ocr.py --mode pdf -i inputs/doc.pdf -o outputs --dpi 300 import argparse import os import time import torch from transformers import AutoModel, AutoTokenizer MODEL_NAME baidu/Unlimited-OCR def load_model(): print([1/3] 加载 tokenizer 和模型 ...) t0 time.time() tokenizer AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_codeTrue) model AutoModel.from_pretrained( MODEL_NAME, trust_remote_codeTrue, use_safetensorsTrue, torch_dtypetorch.bfloat16, ) model model.eval().cuda() print(f 模型加载完成耗时 {time.time() - t0:.1f}s) if torch.cuda.is_available(): print(f GPU: {torch.cuda.get_device_name(0)}) return tokenizer, model def infer_single(tokenizer, model, image_file, output_dir): print(f[2/3] 单图推理: {image_file}) model.infer( tokenizer, promptimagedocument parsing., image_fileimage_file, output_pathoutput_dir, base_size1024, image_size640, crop_modeTrue, # gundam 配置 max_length32768, no_repeat_ngram_size35, ngram_window128, save_resultsTrue, ) def infer_multi(tokenizer, model, image_files, output_dir): print(f[2/3] 多页推理: {len(image_files)} 张图) model.infer_multi( tokenizer, promptimageMulti page parsing., image_filesimage_files, output_pathoutput_dir, image_size1024, max_length32768, no_repeat_ngram_size35, ngram_window1024, save_resultsTrue, ) def pdf_to_images(pdf_path, dpi300): import tempfile import fitz # PyMuPDF print(f PDF 转图: {pdf_path} (dpi{dpi})) doc fitz.open(pdf_path) tmp_dir tempfile.mkdtemp(prefixpdf_ocr_) mat fitz.Matrix(dpi / 72, dpi / 72) paths [] for i, page in enumerate(doc): out os.path.join(tmp_dir, fpage_{i1:04d}.png) page.get_pixmap(matrixmat).save(out) paths.append(out) doc.close() print(f 转出 {len(paths)} 页 - {tmp_dir}) return paths def main(): parser argparse.ArgumentParser(descriptionUnlimited-OCR runner) parser.add_argument(--mode, choices[single, multi, pdf], defaultsingle, help推理模式: single单图, multi多图, pdfPDF) parser.add_argument(-i, --inputs, nargs, requiredTrue, help输入文件路径(single/multi 传图片, pdf 传 .pdf)) parser.add_argument(-o, --output, defaultoutputs, help输出目录) parser.add_argument(--dpi, typeint, default300, helpPDF 转图 DPI (仅 pdf 模式)) args parser.parse_args() os.makedirs(args.output, exist_okTrue) tokenizer, model load_model() if args.mode single: infer_single(tokenizer, model, args.inputs[0], args.output) elif args.mode multi: infer_multi(tokenizer, model, args.inputs, args.output) elif args.mode pdf: images pdf_to_images(args.inputs[0], args.dpi) infer_multi(tokenizer, model, images, args.output) print(f[3/3] 完成. 结果目录: {os.path.abspath(args.output)}) if __name__ __main__: t time.time() main() print(f总耗时: {time.time() - t:.1f}s)7 单次调用测试如下命令首先会下载模型程序会先下载模型然后执行识别任务。python run_ocr.py --mode single -i inputs/1.jpg -o outputs8 为了能让大模型调用unlimited-ocr需要运行serve_ocr.py启动一个http服务既兼容OpenAI 兼容 API 服务可以为dify/claude code提供模型服务也可以作为一个独立的http服务。python serve_ocr.py9 创建mcp核心文件是ocr_mcp_server.py然后可以让claude code把这个mcp加入进去。10 引入skill见.claude/skills/uocr11 在Claude Code中执行效果/uocr 识别 inputs/2.png告诉我内容