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。