LightOnOCR-2-1B集成方案:如何封装成Flask API供内部系统调用

张开发
2026/6/1 5:45:38 15 分钟阅读
LightOnOCR-2-1B集成方案:如何封装成Flask API供内部系统调用
LightOnOCR-2-1B集成方案如何封装成Flask API供内部系统调用1. 为什么需要封装OCR API在企业内部系统中直接调用原始OCR服务接口存在几个明显问题安全性风险暴露内部服务器IP和端口维护困难每次模型升级都需要修改多处调用代码功能单一缺乏预处理、后处理等业务逻辑性能瓶颈无法实现请求队列、缓存等优化机制将LightOnOCR-2-1B封装为Flask API可以解决这些问题。我们来看一个典型场景某财务系统需要自动识别上千张发票但原始OCR接口无法满足以下需求自动校正倾斜的发票图片提取关键字段发票号码、金额、日期限制并发请求防止服务器过载记录识别日志用于审计通过封装层我们可以实现这些业务逻辑同时保持核心OCR能力的稳定性。2. 基础封装方案2.1 最小化Flask API实现以下是最基础的封装代码提供/ocr端点from flask import Flask, request, jsonify import base64 import requests app Flask(__name__) OCR_SERVER http://localhost:8000 # 替换为实际地址 app.route(/ocr, methods[POST]) def ocr_api(): # 获取base64编码的图片 data request.get_json() if not data or image not in data: return jsonify({error: Missing image data}), 400 try: # 调用原始OCR服务 response requests.post( f{OCR_SERVER}/v1/chat/completions, json{ model: /root/ai-models/lightonai/LightOnOCR-2-1B, messages: [{ role: user, content: [{ type: image_url, image_url: {url: fdata:image/png;base64,{data[image]}} }] }], max_tokens: 4096 }, timeout30 ) response.raise_for_status() result response.json() return jsonify({text: result[choices][0][message][content]}) except Exception as e: return jsonify({error: str(e)}), 500 if __name__ __main__: app.run(host0.0.0.0, port5000)这个基础版本已经实现了统一的API端点/ocr错误处理机制请求超时设置30秒2.2 调用示例使用curl测试封装后的APIcurl -X POST http://your-flask-server:5000/ocr \ -H Content-Type: application/json \ -d {image: iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5hHgAHggJ/PchI7wAAAABJRU5ErkJggg}3. 进阶功能实现3.1 图片预处理集成在API内部集成OpenCV预处理功能import cv2 import numpy as np from PIL import Image import io def preprocess_image(image_b64): # Base64转OpenCV格式 img_data base64.b64decode(image_b64) nparr np.frombuffer(img_data, np.uint8) img cv2.imdecode(nparr, cv2.IMREAD_COLOR) # 自动旋转校正 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) coords np.column_stack(np.where(gray 255)) angle cv2.minAreaRect(coords)[-1] if angle -45: angle -(90 angle) else: angle -angle (h, w) img.shape[:2] center (w // 2, h // 2) M cv2.getRotationMatrix2D(center, angle, 1.0) img cv2.warpAffine(img, M, (w, h), flagscv2.INTER_CUBIC, borderModecv2.BORDER_REPLICATE) # 返回处理后的base64 _, buffer cv2.imencode(.png, img) return base64.b64encode(buffer).decode(utf-8) # 在API端点中调用 app.route(/ocr, methods[POST]) def ocr_api(): data request.get_json() processed_image preprocess_image(data[image]) # 后续调用OCR逻辑...3.2 结果后处理针对发票识别场景添加字段提取功能import re from datetime import datetime def extract_invoice_info(text): # 提取发票号码 invoice_no re.search(r(发票号码|发票号)[:\s]*([A-Z0-9]{8,20}), text) # 提取金额 amount re.search(r(金额|合计|小写)[:\s]*([¥]?\s*\d\.\d{2}), text) # 提取日期 date re.search(r(\d{4}[年/-]\d{1,2}[月/-]\d{1,2}日?), text) return { invoice_no: invoice_no.group(2) if invoice_no else None, amount: amount.group(2) if amount else None, date: datetime.strptime(date.group(1), %Y-%m-%d).date() if date else None, raw_text: text } # 修改API返回 return jsonify(extract_invoice_info(result[choices][0][message][content]))4. 生产环境优化4.1 并发控制使用Flask-Limiter限制请求频率from flask_limiter import Limiter from flask_limiter.util import get_remote_address limiter Limiter( appapp, key_funcget_remote_address, default_limits[5 per second] ) app.route(/ocr, methods[POST]) limiter.limit(10/minute) # 每个IP每分钟10次 def ocr_api(): # ...4.2 缓存机制对相同图片的重复请求使用Redis缓存import redis from hashlib import md5 r redis.Redis(hostlocalhost, port6379, db0) app.route(/ocr, methods[POST]) def ocr_api(): data request.get_json() image_hash md5(data[image].encode()).hexdigest() # 检查缓存 cached r.get(image_hash) if cached: return jsonify({text: cached.decode(), cached: True}) # 无缓存则处理 result call_ocr_service(data[image]) # 缓存1小时 r.setex(image_hash, 3600, result) return jsonify({text: result, cached: False})4.3 健康检查端点添加/health端点供Kubernetes或负载均衡器使用app.route(/health) def health_check(): try: # 检查OCR服务是否可用 response requests.get(f{OCR_SERVER}/health, timeout3) return jsonify({status: healthy if response.ok else unhealthy}), 200 if response.ok else 503 except: return jsonify({status: unhealthy}), 5035. 容器化部署5.1 Dockerfile配置FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # 安装OpenCV依赖 RUN apt-get update apt-get install -y \ libgl1 \ rm -rf /var/lib/apt/lists/* CMD [gunicorn, --bind, 0.0.0.0:5000, --workers, 4, app:app]5.2 Kubernetes部署示例apiVersion: apps/v1 kind: Deployment metadata: name: ocr-api spec: replicas: 3 selector: matchLabels: app: ocr-api template: metadata: labels: app: ocr-api spec: containers: - name: ocr-api image: your-registry/ocr-api:latest ports: - containerPort: 5000 env: - name: OCR_SERVER value: http://ocr-service:8000 resources: limits: cpu: 1 memory: 1Gi requests: cpu: 0.5 memory: 512Mi --- apiVersion: v1 kind: Service metadata: name: ocr-api-service spec: selector: app: ocr-api ports: - protocol: TCP port: 80 targetPort: 50006. 总结与最佳实践通过Flask封装LightOnOCR-2-1B我们实现了统一接口隐藏内部实现细节提供标准化API业务逻辑集成预处理、后处理等定制功能性能优化通过缓存、限流等机制保障稳定性易于扩展可以方便地添加认证、监控等功能生产环境部署建议使用Nginx作为反向代理处理HTTPS和负载均衡集成Prometheus监控接口调用指标添加JWT认证保护API端点定期备份Redis缓存数据# 示例添加JWT认证 from flask_jwt_extended import JWTManager, jwt_required app.config[JWT_SECRET_KEY] your-secret-key jwt JWTManager(app) app.route(/ocr, methods[POST]) jwt_required() def ocr_api(): # ...获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章