news 2026/3/1 16:49:33

DeepSeek-OCR-2实战教程:3步完成Python爬虫数据自动识别与提取

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek-OCR-2实战教程:3步完成Python爬虫数据自动识别与提取

DeepSeek-OCR-2实战教程:3步完成Python爬虫数据自动识别与提取

1. 为什么需要这一步:从网页截图到结构化数据的痛点

你有没有遇到过这样的场景:写好了一个Python爬虫,成功抓取了目标网站的数据,结果发现页面内容是用图片展示的?或者目标网站为了反爬,把关键信息渲染成了SVG、Canvas,甚至直接是截图——这时候传统的requests+BeautifulSoup方案就彻底失效了。

更常见的是PDF文档、扫描件、电商商品详情页截图、金融报表截图这类非结构化数据。它们看起来清晰可读,但对程序来说就是一片黑盒。过去我们可能得手动复制粘贴,或者用PaddleOCR这类传统工具,但效果往往不尽如人意:表格错乱、公式丢失、中英文混排识别错误、复杂版式完全崩坏。

DeepSeek-OCR-2的出现,恰恰解决了这个长期困扰开发者的难题。它不是简单地“找文字”,而是真正理解文档的逻辑结构——知道标题在哪、正文怎么分段、表格如何对应行列、公式和图表如何嵌入上下文。这种能力源于它的核心创新:视觉因果流(Visual Causal Flow)机制。简单说,它像人一样阅读,先看整体布局,再按语义逻辑决定下一步看哪里,而不是机械地从左上角扫到右下角。

在实际项目中,我用它处理一批电商后台导出的PDF销售报表,传统OCR识别率不到65%,而DeepSeek-OCR-2直接达到92%的准确率,更重要的是,它能原样保留表格结构,生成的Markdown可以直接转成Pandas DataFrame进行后续分析。这才是真正让爬虫数据“活”起来的关键一步。

2. 环境准备:CUDA11.8 + PyTorch2.6快速搭建

DeepSeek-OCR-2对运行环境有明确要求,官方推荐CUDA 11.8搭配PyTorch 2.6.0。这个组合不是随意指定的,而是经过大量测试验证的稳定配置。如果你的系统已经装了其他版本的CUDA或PyTorch,建议新建一个独立环境,避免冲突。

2.1 创建专属conda环境

打开终端,执行以下命令创建干净的Python环境:

conda create -n deepseek-ocr2 python=3.12.9 -y conda activate deepseek-ocr2

这里选择Python 3.12.9是因为DeepSeek-OCR-2的某些依赖在更新版本中存在兼容性问题,3.12.9是目前最稳妥的选择。

2.2 安装核心依赖包

接下来安装PyTorch和vLLM。注意必须使用官方指定的CUDA版本链接,否则可能出现显存分配失败或推理崩溃的问题:

pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu118 pip install vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl

vLLM是高性能推理引擎,能显著提升批量处理速度。如果你只是单张图片测试,也可以跳过这一步,后面用Hugging Face Transformers方式运行。

2.3 安装模型专用依赖

继续安装剩余依赖项,特别注意flash-attn的版本必须严格匹配:

pip install -r https://raw.githubusercontent.com/deepseek-ai/DeepSeek-OCR-2/main/requirements.txt pip install flash-attn==2.7.3 --no-build-isolation

安装完成后,可以简单验证环境是否正常:

import torch print(f"PyTorch版本: {torch.__version__}") print(f"CUDA可用: {torch.cuda.is_available()}") print(f"CUDA版本: {torch.version.cuda}")

如果输出显示CUDA可用且版本为11.8,说明环境搭建成功。这一步看似繁琐,但比后续调试各种奇怪的CUDA错误要省心得多。

3. 爬虫结果预处理:让图像为OCR做好准备

很多开发者以为OCR模型越强,对输入图像要求就越低。实际上恰恰相反——DeepSeek-OCR-2虽然强大,但它依然需要“看得清”的图像。爬虫抓取的截图或PDF转换的图片,往往存在分辨率不足、背景杂乱、文字模糊等问题,直接喂给模型反而会降低效果。

3.1 分辨率与尺寸的黄金法则

DeepSeek-OCR-2采用动态分辨率策略,默认支持(0-6)×768×768局部视图 + 1×1024×1024全局视图。这意味着:

  • 全局视图负责把握整体版式结构
  • 局部视图聚焦关键区域细节

因此,预处理的第一原则是:确保关键内容在1024×1024范围内清晰可见。如果原始截图是1920×1080,不要简单缩放,而是先裁剪出包含核心表格或文本的区域,再调整到1024×1024。

from PIL import Image import numpy as np def preprocess_screenshot(image_path, output_path, target_size=1024): """预处理爬虫截图,适配DeepSeek-OCR-2最佳输入""" # 打开图像 img = Image.open(image_path) # 如果是RGBA模式,转为RGB if img.mode == 'RGBA': img = img.convert('RGB') # 获取原始尺寸 w, h = img.size # 计算缩放比例,保持长宽比 scale = min(target_size / w, target_size / h) new_w, new_h = int(w * scale), int(h * scale) # 缩放图像 img_resized = img.resize((new_w, new_h), Image.Resampling.LANCZOS) # 创建白色背景画布 canvas = Image.new('RGB', (target_size, target_size), 'white') # 居中粘贴缩放后的图像 x = (target_size - new_w) // 2 y = (target_size - new_h) // 2 canvas.paste(img_resized, (x, y)) # 保存预处理后的图像 canvas.save(output_path) print(f"预处理完成:{output_path} ({new_w}x{new_h} → {target_size}x{target_size})") # 使用示例 preprocess_screenshot("crawler_output.png", "processed_input.jpg")

3.2 去噪与对比度增强

对于PDF转图片或网页截图,常有轻微噪点和低对比度问题。我们用OpenCV做轻量级增强,不增加额外依赖:

import cv2 def enhance_image(image_path, output_path): """增强图像对比度,减少噪点""" # 读取图像 img = cv2.imread(image_path) # 转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自适应直方图均衡化 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) enhanced = clahe.apply(gray) # 二值化处理(可选,对纯文本效果更好) _, binary = cv2.threshold(enhanced, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 保存结果 cv2.imwrite(output_path, binary) print(f"图像增强完成:{output_path}") # 使用示例 enhance_image("processed_input.jpg", "enhanced_input.jpg")

这段代码不会过度锐化导致文字边缘断裂,而是通过自适应均衡化让深色文字更突出,浅色背景更干净。实测表明,在处理电商商品参数表时,开启二值化后识别准确率提升了约7%。

4. 模型调用:三种API方式灵活选择

DeepSeek-OCR-2提供了多种调用方式,没有绝对的“最好”,只有“最适合当前场景”。下面介绍三种主流方式,你可以根据项目需求自由选择。

4.1 Hugging Face Transformers方式(推荐新手)

这是最直观、最容易理解的方式,适合快速验证和小规模处理。它不需要额外安装vLLM,直接用Hugging Face生态即可。

from transformers import AutoModel, AutoTokenizer import torch import os # 设置GPU设备 os.environ["CUDA_VISIBLE_DEVICES"] = '0' # 加载模型和分词器 model_name = 'deepseek-ai/DeepSeek-OCR-2' tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) model = AutoModel.from_pretrained( model_name, _attn_implementation='flash_attention_2', trust_remote_code=True, use_safetensors=True ) # 模型设置 model = model.eval().cuda().to(torch.bfloat16) # 定义提示词(Prompt) # 根据不同需求选择合适的prompt PROMPTS = { "markdown": "<image>\n<|grounding|>Convert the document to markdown.", "free_ocr": "<image>\nFree OCR.", "table_only": "<image>\n<|grounding|>Extract only the tables from this document.", "formula": "<image>\n<|grounding|>Parse all mathematical formulas in this document." } # 选择适合的prompt prompt = PROMPTS["markdown"] image_file = "enhanced_input.jpg" output_path = "./results" # 执行推理 res = model.infer( tokenizer, prompt=prompt, image_file=image_file, output_path=output_path, base_size=1024, image_size=768, crop_mode=True, save_results=True ) print("OCR结果已保存至:", res)

关键参数说明:

  • base_size=1024:全局视图尺寸,必须与预处理尺寸一致
  • image_size=768:局部视图尺寸,控制细节捕捉粒度
  • crop_mode=True:启用多裁剪策略,对复杂版式效果更好

4.2 vLLM高性能推理(适合批量处理)

当需要处理上百张图片时,vLLM的吞吐量优势就体现出来了。它支持并发请求,能充分利用GPU显存。

from vllm import LLM, SamplingParams from transformers import AutoTokenizer import torch # 初始化vLLM模型(需提前安装vLLM) llm = LLM( model="deepseek-ai/DeepSeek-OCR-2", tensor_parallel_size=torch.cuda.device_count(), dtype="bfloat16", max_model_len=8192, gpu_memory_utilization=0.9 ) tokenizer = AutoTokenizer.from_pretrained( "deepseek-ai/DeepSeek-OCR-2", trust_remote_code=True ) # 构建输入 def build_vllm_input(image_path, prompt): # 这里需要将图像编码为base64或路径字符串 # 实际使用时需参考DeepSeek-OCR-2的vLLM适配代码 return f"<image>\n{prompt}" # 批量处理示例 image_paths = ["img1.jpg", "img2.jpg", "img3.jpg"] prompts = [PROMPTS["markdown"]] * len(image_paths) # 注意:vLLM方式需要额外的图像编码逻辑 # 此处仅为示意,完整实现请参考官方vLLM示例

vLLM方式需要更多工程工作,但实测在A100上处理100张图片比Transformers方式快3.2倍。

4.3 API服务化封装(生产环境首选)

在实际项目中,我们通常会把OCR能力封装成HTTP服务,供爬虫后端调用:

from fastapi import FastAPI, UploadFile, File, Form from fastapi.responses import JSONResponse import uvicorn import tempfile import os app = FastAPI(title="DeepSeek-OCR-2 API Service") @app.post("/ocr") async def ocr_endpoint( file: UploadFile = File(...), mode: str = Form("markdown") ): # 保存上传文件 with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp: content = await file.read() tmp.write(content) tmp_path = tmp.name try: # 调用OCR模型 prompt = PROMPTS.get(mode, PROMPTS["markdown"]) res = model.infer( tokenizer, prompt=prompt, image_file=tmp_path, output_path="./api_results", base_size=1024, image_size=768, crop_mode=True, save_results=False ) return JSONResponse({ "status": "success", "result": res, "mode": mode }) finally: # 清理临时文件 if os.path.exists(tmp_path): os.unlink(tmp_path) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0:8000", port=8000)

启动服务后,爬虫只需发送HTTP请求即可:

import requests with open("screenshot.jpg", "rb") as f: response = requests.post( "http://localhost:8000/ocr", files={"file": f}, data={"mode": "markdown"} ) result = response.json() print(result["result"])

这种方式解耦了爬虫和OCR模块,便于独立部署、监控和扩展。

5. 结果后处理:从原始输出到可用数据

DeepSeek-OCR-2输出的通常是Markdown格式文本,但这只是第一步。真正的价值在于如何把它变成结构化数据,供后续分析使用。

5.1 Markdown解析与清洗

OCR结果中常有格式错误、多余空行、特殊字符等。我们用标准库进行清洗:

import re import markdown from bs4 import BeautifulSoup def clean_markdown_output(md_text): """清洗OCR输出的Markdown文本""" # 移除连续空行 md_text = re.sub(r'\n\s*\n', '\n\n', md_text) # 移除行首尾空白 md_text = re.sub(r'^\s+|\s+$', '', md_text, flags=re.MULTILINE) # 修复常见的Markdown错误 md_text = re.sub(r'(\*\*[^*]+\*\*)\s+([A-Za-z])', r'\1 \2', md_text) # 加粗后空格 md_text = re.sub(r'(\d+\.)\s+([A-Za-z])', r'\1 \2', md_text) # 数字序号后空格 return md_text.strip() def markdown_to_dataframe(md_text): """将Markdown表格转换为Pandas DataFrame""" # 提取表格部分 table_pattern = r'(\|[^\n]+\|\n\|[-| ]+\|\n(?:\|[^\n]+\|\n?)*)' tables = re.findall(table_pattern, md_text, re.DOTALL) if not tables: return None # 取第一个表格(通常是最主要的) table_md = tables[0] # 转换为HTML html = markdown.markdown(table_md, extensions=['tables']) # 解析HTML表格 soup = BeautifulSoup(html, 'html.parser') table = soup.find('table') if table: # 使用pandas读取 import pandas as pd df_list = pd.read_html(str(table)) return df_list[0] if df_list else None return None # 使用示例 with open("./results/output.md", "r", encoding="utf-8") as f: raw_output = f.read() cleaned = clean_markdown_output(raw_output) df = markdown_to_dataframe(cleaned) if df is not None: print("成功提取表格:") print(df.head()) # 保存为CSV供后续分析 df.to_csv("extracted_data.csv", index=False, encoding="utf-8-sig")

5.2 复杂文档的结构化解析

对于包含多个章节、图表、公式的文档,我们需要更智能的解析策略:

def parse_complex_document(md_text): """解析复杂文档结构""" sections = {} # 按二级标题分割 section_pattern = r'##\s+(.+?)\n([\s\S]*?)(?=\n##\s+|\Z)' matches = re.findall(section_pattern, md_text, re.DOTALL) for title, content in matches: # 清理内容 content = re.sub(r'\n\s*\n', '\n\n', content).strip() # 提取图表引用 figure_pattern = r'!\[([^\]]+)\]\(([^)]+)\)' figures = re.findall(figure_pattern, content) # 提取公式(LaTeX格式) formula_pattern = r'\$\$([\s\S]*?)\$\$' formulas = re.findall(formula_pattern, content) sections[title.strip()] = { "content": content, "figures": figures, "formulas": formulas } return sections # 使用示例 sections = parse_complex_document(cleaned) for title, data in sections.items(): print(f"章节: {title}") print(f" 图表数量: {len(data['figures'])}") print(f" 公式数量: {len(data['formulas'])}")

这种方法能将一份PDF报告自动拆解为结构化数据,每个章节、图表、公式都可单独访问和处理。

6. 常见错误排查:那些让你抓狂的问题

在实际使用中,总会遇到一些意想不到的问题。以下是我在多个项目中总结的高频问题及解决方案。

6.1 CUDA内存不足(OOM)错误

现象:运行时抛出CUDA out of memory错误,即使显存显示充足。

原因:DeepSeek-OCR-2的动态分辨率策略会根据图像内容自动选择局部视图数量,复杂图像可能触发6个768×768视图,导致显存峰值远超预期。

解决方案

  • 限制最大局部视图数:在infer()调用中添加max_crops=3
  • 降低图像尺寸:将base_size设为768而非1024
  • 使用量化:加载模型时添加load_in_4bit=True
# 修改模型加载方式 model = AutoModel.from_pretrained( model_name, load_in_4bit=True, # 启用4位量化 trust_remote_code=True, use_safetensors=True )

6.2 中文识别乱码或缺失

现象:输出中中文显示为方块、问号,或整段中文消失。

原因:字体嵌入问题或编码设置不当。DeepSeek-OCR-2内部使用UTF-8,但某些PDF转图片过程会破坏字符映射。

解决方案

  • 预处理时强制指定字体:cv2.putText()添加测试文字验证
  • 在prompt中明确指定语言:<image>\n<|grounding|>Convert to markdown in Chinese.

6.3 表格结构错乱

现象:表格被识别成多行文本,行列关系完全丢失。

原因:表格边框线不清晰,或单元格内有换行符干扰。

解决方案

  • 预处理时增强表格边框:使用OpenCV的Canny边缘检测
  • 使用专门的表格prompt:<image>\n<|grounding|>Extract tables with exact cell structure.
def enhance_table_borders(image_path, output_path): """增强表格边框以提高识别率""" img = cv2.imread(image_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray, 50, 150, apertureSize=3) # 膨胀边缘 kernel = np.ones((2,2), np.uint8) dilated = cv2.dilate(edges, kernel, iterations=1) # 合并回原图 result = cv2.addWeighted(gray, 0.7, dilated, 0.3, 0) cv2.imwrite(output_path, result)

6.4 识别结果不保存或路径错误

现象:调用infer()后没有生成结果文件,或保存到错误位置。

原因output_path参数必须是已存在的目录,且具有写入权限。

解决方案

  • 在调用前确保目录存在:os.makedirs(output_path, exist_ok=True)
  • 使用绝对路径避免相对路径问题
import os def safe_infer(model, tokenizer, **kwargs): """安全的infer调用,自动创建输出目录""" output_path = kwargs.get("output_path", "./results") os.makedirs(output_path, exist_ok=True) # 确保路径是绝对路径 kwargs["output_path"] = os.path.abspath(output_path) return model.infer(tokenizer, **kwargs)

7. 实战案例:电商价格监控系统的OCR集成

让我们把前面所有步骤串起来,构建一个完整的电商价格监控系统。这个系统每天自动抓取竞品商品页截图,然后用DeepSeek-OCR-2提取价格、规格、库存等关键信息。

7.1 系统架构概览

[爬虫模块] → [截图保存] → [预处理] → [DeepSeek-OCR-2] → [数据清洗] → [数据库存储] ↓ ↓ ↓ ↓ ↓ ↓ Selenium 本地文件系统 OpenCV/PIL Python API Pandas/Regex PostgreSQL

7.2 完整端到端代码

import time from datetime import datetime import sqlite3 from pathlib import Path class EcommerceOCRProcessor: def __init__(self, model, tokenizer): self.model = model self.tokenizer = tokenizer self.db_path = "price_monitor.db" self._init_database() def _init_database(self): """初始化SQLite数据库""" conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS product_prices ( id INTEGER PRIMARY KEY AUTOINCREMENT, url TEXT NOT NULL, screenshot_path TEXT NOT NULL, price REAL, original_price REAL, stock_status TEXT, specs TEXT, processed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() conn.close() def process_product_page(self, url, screenshot_path): """处理单个商品页面""" print(f"开始处理: {url}") # 1. 预处理截图 processed_path = str(Path(screenshot_path).with_name( f"processed_{Path(screenshot_path).stem}.jpg" )) preprocess_screenshot(screenshot_path, processed_path) # 2. OCR识别 prompt = "<image>\n<|grounding|>Extract product price, original price, stock status and key specifications." res = self.model.infer( self.tokenizer, prompt=prompt, image_file=processed_path, output_path="./ocr_results", base_size=1024, image_size=768, crop_mode=True, save_results=True ) # 3. 解析结果 with open("./ocr_results/output.md", "r", encoding="utf-8") as f: md_content = f.read() # 简单的价格提取(实际项目中应使用更复杂的NLP) price_match = re.search(r'价格[::]\s*¥?(\d+\.?\d*)', md_content) original_match = re.search(r'原价[::]\s*¥?(\d+\.?\d*)', md_content) stock_match = re.search(r'库存[::]\s*(.*)', md_content) # 4. 存储到数据库 conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute(''' INSERT INTO product_prices (url, screenshot_path, price, original_price, stock_status, specs) VALUES (?, ?, ?, ?, ?, ?) ''', ( url, screenshot_path, float(price_match.group(1)) if price_match else None, float(original_match.group(1)) if original_match else None, stock_match.group(1).strip() if stock_match else "未知", md_content[:500] # 存储部分规格信息 )) conn.commit() conn.close() print(f"处理完成: {url} -> 价格: {price_match.group(1) if price_match else '未识别'}") def batch_process(self, urls_and_paths): """批量处理多个商品页面""" for url, path in urls_and_paths: try: self.process_product_page(url, path) time.sleep(2) # 避免过于频繁 except Exception as e: print(f"处理 {url} 时出错: {e}") # 使用示例 if __name__ == "__main__": # 假设你已经有了模型和tokenizer # processor = EcommerceOCRProcessor(model, tokenizer) # urls_paths = [ # ("https://example.com/product1", "screenshots/product1.jpg"), # ("https://example.com/product2", "screenshots/product2.jpg") # ] # processor.batch_process(urls_paths) pass

这个案例展示了如何将DeepSeek-OCR-2无缝集成到真实业务系统中。整个流程从截图到结构化数据入库,完全自动化,每天可监控数百个商品的价格变化。

8. 性能优化与进阶技巧

掌握了基础用法后,我们可以进一步优化效果和性能,让OCR系统更强大、更稳定。

8.1 Prompt工程:让模型更懂你的需求

DeepSeek-OCR-2的prompt设计非常关键。不同prompt会导致截然不同的输出格式和内容侧重:

# 针对不同场景的prompt模板 PROMPT_TEMPLATES = { "电商商品": "<image>\n<|grounding|>Extract product name, price, original price, discount rate, stock status, and key specifications in JSON format.", "财务报表": "<image>\n<|grounding|>Parse this financial statement into structured data: revenue, expenses, net income, and year-over-year growth rates.", "合同条款": "<image>\n<|grounding|>Extract contract parties, effective date, termination conditions, and payment terms in bullet points.", "学术论文": "<image>\n<|grounding|>Extract title, authors, abstract, methodology, key findings, and references in markdown.", "多语言混合": "<image>\n<|grounding|>Recognize text in all languages present, preserving original language and formatting." } # 动态选择prompt def get_optimal_prompt(image_context): """根据图像上下文选择最佳prompt""" if "price" in image_context.lower() or "product" in image_context.lower(): return PROMPT_TEMPLATES["电商商品"] elif "financial" in image_context.lower() or "balance" in image_context.lower(): return PROMPT_TEMPLATES["财务报表"] else: return PROMPT_TEMPLATES["电商商品"] # 默认

8.2 混合OCR策略

对于特别困难的图像,单一模型可能不够。我们可以采用混合策略:

def hybrid_ocr(image_path): """混合OCR策略:DeepSeek-OCR-2为主,PaddleOCR为备选""" try: # 首选DeepSeek-OCR-2 prompt = "<image>\nFree OCR." res = model.infer( tokenizer, prompt=prompt, image_file=image_path, output_path="./hybrid_results", base_size=1024, image_size=768, crop_mode=True, save_results=True ) # 检查结果质量(简单启发式) with open("./hybrid_results/output.md", "r", encoding="utf-8") as f: content = f.read() # 如果识别结果太短或包含太多乱码,切换到PaddleOCR if len(content.strip()) < 50 or content.count("") > 5: raise ValueError("DeepSeek-OCR-2结果质量不佳") return content except Exception as e: print(f"DeepSeek-OCR-2失败,切换到PaddleOCR: {e}") # 这里调用PaddleOCR作为备用方案 return paddle_ocr_fallback(image_path) def paddle_ocr_fallback(image_path): """PaddleOCR备用方案""" from paddleocr import PaddleOCR ocr = PaddleOCR(use_angle_cls=True, lang='ch') result = ocr.ocr(image_path, cls=True) # 提取文本 text = "" for line in result: if line: for word_info in line: text += word_info[1][0] + " " return text.strip()

8.3 持续学习与反馈闭环

最好的OCR系统应该能从错误中学习。我们可以建立简单的反馈机制:

class SelfImprovingOCR: def __init__(self, model, tokenizer): self.model = model self.tokenizer = tokenizer self.feedback_db = "ocr_feedback.db" self._init_feedback_db() def _init_feedback_db(self): """初始化反馈数据库""" conn = sqlite3.connect(self.feedback_db) cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS feedback ( id INTEGER PRIMARY KEY AUTOINCREMENT, image_hash TEXT, original_prompt TEXT, model_output TEXT, corrected_output TEXT, is_correct BOOLEAN, feedback_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() conn.close() def submit_feedback(self, image_path, prompt, output, corrected, is_correct=True): """提交人工反馈""" import hashlib with open(image_path, "rb") as f: image_hash = hashlib.md5(f.read()).hexdigest() conn = sqlite3.connect(self.feedback_db) cursor = conn.cursor() cursor.execute(''' INSERT INTO feedback (image_hash, original_prompt, model_output, corrected_output, is_correct) VALUES (?, ?, ?, ?, ?) ''', (image_hash, prompt, output, corrected, is_correct)) conn.commit() conn.close() print("反馈已提交,将用于后续模型优化") def get_improvement_insights(self): """获取改进建议""" conn = sqlite3.connect(self.feedback_db) cursor = conn.cursor() cursor.execute(''' SELECT original_prompt, COUNT(*) as error_count FROM feedback WHERE is_correct = 0 GROUP BY original_prompt ORDER BY error_count DESC LIMIT 5 ''') insights = cursor.fetchall() conn.close() return insights # 使用示例 # ocr_system = SelfImprovingOCR(model, tokenizer) # ocr_system.submit_feedback("bad_case.jpg", prompt, raw_output, corrected_output, False) # insights = ocr_system.get_improvement_insights() # print("需要优化的prompt:", insights)

这种反馈机制让OCR系统越用越聪明,特别适合长期运行的业务系统。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/21 17:25:26

新手必看:树莓派执行更新指令报错的初步诊断步骤

树莓派更新失败&#xff1f;别急着重刷系统——一个嵌入式Linux老手的现场排障实录刚给树莓派插上电源、连好网线&#xff0c;满怀期待地敲下&#xff1a;sudo apt update && sudo apt upgrade -y结果终端卡在Hit:1 https://archive.raspberrypi.org/debian bullseye I…

作者头像 李华
网站建设 2026/3/1 1:15:21

造相Z-Image模型在社交媒体内容创作中的实战应用

造相Z-Image模型在社交媒体内容创作中的实战应用 1. 自媒体人的新画笔&#xff1a;为什么Z-Image正在改变内容生产方式 做自媒体三年&#xff0c;我每天最头疼的不是写文案&#xff0c;而是配图。上周要发一条关于“城市咖啡馆探店”的小红书笔记&#xff0c;光是找一张符合调…

作者头像 李华
网站建设 2026/2/28 9:32:12

STM32F1 ADC寄存器级深度解析与工程实践

1. STM32F1 系列 ADC 模块深度解析:从寄存器架构到工程实践 ADC(Analog-to-Digital Converter)是嵌入式系统中连接物理世界与数字处理的核心桥梁。在 STM32F1 系列微控制器中,ADC 并非一个简单的“电压读取器”,而是一个高度可配置、具备多级流水线、支持多种触发与数据管…

作者头像 李华
网站建设 2026/2/28 20:20:29

OpenBMC小白指南:如何编译第一个镜像

OpenBMC入门第一课&#xff1a;从零编译一个可启动的BMC镜像——不是教程&#xff0c;是系统级认知重建你刚在服务器机柜里插上一块AST2400开发板&#xff0c;串口线连好&#xff0c;终端打开&#xff0c;却只看到一片沉默——U-Boot SPL卡在“DRAM init”之后&#xff1b;或者…

作者头像 李华
网站建设 2026/2/25 1:20:13

java+vue基于springboot框架的勤工助学系统的设计与实现

目录勤工助学系统的设计与实现摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;勤工助学系统的设计与实现摘要 该系统基于SpringBoot框架和Vue.js前端技术&#xff0c;构建了一个高效、安全的勤工助学管理平台&#xff0c;旨…

作者头像 李华
网站建设 2026/2/26 21:27:24

揭秘大数据领域数据可视化的神奇魅力

揭秘大数据领域数据可视化的神奇魅力 关键词&#xff1a;大数据、数据可视化、可视化技术、数据洞察、应用场景 摘要&#xff1a;本文深入探讨了大数据领域数据可视化的神奇魅力。首先介绍了数据可视化的背景&#xff0c;包括目的、预期读者等。接着阐述了核心概念与联系&#…

作者头像 李华