场景说明
由于最近在搞验证码识别,是用ddddocr项目实现的,因为是py实现的,作为一个js选手,对这些py项目部署感觉十分吃力,所以记录一下。
资料准备
- FastApi基础模板
- Dockerfile文件
- ubuntu环境+docker
- charsets.json
- xxxxx.onnx
模板文件
文件:main.py
,内如如下
import base64
import logging
import ddddocr
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
ocr = ddddocr.DdddOcr(det=False, ocr=False, import_onnx_path="yingshu4_3.onnx", charsets_path="charsets.json")
# ocr = ddddocr.DdddOcr()
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class JsonModel(BaseModel):
base64_text: str
@app.get("/")
async def root():
return {"message": "Hello World"}
@app.post("/cnn/vcode")
async def vcode(post_data: JsonModel):
logger.info("接收到验证码识别请求")
try:
# 打印接收到的base64前50个字符
logger.debug(f"Base64数据: {post_data.base64_text[:50]}...")
# 解码Base64图像
image_bytes = base64.b64decode(post_data.base64_text)
# OCR识别
vcodeText = ocr.classification(image_bytes)
logger.info(f"识别成功: {vcodeText}")
return {"vcode": vcodeText}
except base64.binascii.Error as e:
logger.error(f"Base64解码失败: {str(e)}")
raise HTTPException(status_code=400, detail="Invalid base64 string")
except Exception as e:
logger.error(f"识别过程出错: {str(e)}", exc_info=True)
return {"vcode": "-1"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=48001)
依赖文件:requirements.txt
,内容如下:
ddddocr
uvicorn
fastapi
pydantic
pydantic-settings
构建文件Dockerfile
内容如下:
# 使用Python官方镜像作为基础镜像
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 安装Python依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目文件
COPY . .
# 暴露服务端口(与FastAPI应用端口一致)
EXPOSE 48001
# 启动应用
CMD ["python", "main.py"]
开始构建
确保自己已经准备了charsets.json和xxx.onnx
构建镜像:
docker build -t fastapi-ocr .
启动镜像:
docker run -d -p 48001:48001 --name fastapi-ocr fastapi-ocr