安然小屋 安然之家

安然小屋 安然之家

rapidocr docker安装图片识别服务端 目前最靠谱的 其他的都是各种坑
2026-09-01

1、清理旧容器镜像

docker rm -f rapidocr-api
docker rmi rapidocr-api:local

2、在 /opt/rapidocr 创建 main.py

nano main.py

粘贴完整代码:

from fastapi import FastAPI
from pydantic import BaseModel
import base64
import io
from PIL import Image
from rapidocr_onnxruntime import RapidOCR

app = FastAPI()
ocr = RapidOCR()

class OcrBody(BaseModel):
    image_base64: str

@app.post("/ocr")
def ocr_handle(body: OcrBody):
    img_bytes = base64.b64decode(body.image_base64)
    pil_img = Image.open(io.BytesIO(img_bytes)).convert("RGB")
    result, _ = ocr(pil_img)
    out = []
    if result:
        for box, txt, score in result:
            out.append({
                "text": txt,
                "score": float(score),
                "text_box_position": box
            })
    return {"code":0,"data":out}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("main:app", host="0.0.0.0", port=9000, workers=1)

保存 Ctrl+O,退出 Ctrl+X

3、创建 Dockerfile

nano Dockerfile
FROM python:3.11-slim

WORKDIR /app

RUN apt-get update && apt-get install -y libgomp1 libgl1 libglib2.0-0 && rm -rf /var/lib/apt/lists/*

RUN pip install fastapi uvicorn pillow rapidocr-onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY main.py /app/main.py

EXPOSE 9000

CMD ["uvicorn","main:app","--host","0.0.0.0","--port","9000","--workers","1"]

保存退出。

4、构建镜像

docker build -t rapidocr-api:local .

5、启动容器

docker run -d \
  --name rapidocr-api \
  --restart unless-stopped \
  -p 127.0.0.1:9000:9000 \
  -v rapidocr_models:/app/models \
  rapidocr-api:local

6、看日志,等待自动下载模型

docker logs -f rapidocr-api

首次运行会自动下载 onnx 模型,看到 Uvicorn running on http://0.0.0.0:9000 代表就绪,Ctrl+C退出日志。

7、测试接口

base64 test.jpg | tr -d '\n' | awk '{print "{\"image_base64\":\""$0"\"}"}' | curl -X POST http://127.0.0.1:9000/ocr -H "Content-Type:application/json" -d @-

PHP 调用示例 rapidocr_api.php

<?php
header("Content-Type:application/json");
if(!isset($_FILES['img']) || $_FILES['img']['error']!==UPLOAD_ERR_OK){
    echo json_encode(["code"=>-1,"msg"=>"图片上传失败"]);
    exit;
}
$imgBase64 = base64_encode(file_get_contents($_FILES['img']['tmp_name']));
$postData = json_encode(["image_base64"=>$imgBase64]);

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"http://127.0.0.1:9000/ocr");
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);
curl_setopt($ch,CURLOPT_HTTPHEADER,["Content-Type:application/json"]);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$res = curl_exec($ch);
curl_close($ch);
echo $res;
?>

这套直接调用底层 onnx 推理库,没有 paddlehub、没有 protobuf 冲突,没有包入口找不到的问题,识别效果接近原版 PaddleOCR,中文证件远强于 Tesseract.js。