基于 Node.js + Fastify + PP-OCRv5 的高性能轻量级 OCR API 服务。专为验证码识别和通用文字识别设计,成功率 90% 以上。
docker run -d \
--name media-saber-paddle-ocr \
-p 9899:9899 \
xylplm/media-saber-paddle-ocr:latest
创建 docker-compose.yml 文件:
version: "3.8"
services:
media-saber-paddle-ocr:
image: xylplm/media-saber-paddle-ocr:latest
container_name: media-saber-paddle-ocr
ports:
- "9899:9899"
environment:
- TZ=Asia/Shanghai
- LOG_LEVEL=info
restart: unless-stopped
deploy:
resources:
limits:
memory: 1G
cpus: '1.0'
reservations:
memory: 256M
cpus: '0.5'
启动服务:
docker-compose up -d
# 健康检查
curl http://localhost:9899/health
# 测试 OCR 识别
curl -X POST http://localhost:9899/captcha/base64 \
-H "Content-Type: application/json" \
-d '{"base64_img":"your_base64_image_here"}'
适用场景: 验证码识别,自动过滤非字母数字字符
curl -X POST http://localhost:9899/captcha/base64 \
-H "Content-Type: application/json" \
-d '{
"base64_img": "图片的base64编码",
"preprocess": true
}'
响应示例:
{
"result": "ABC123",
"confidence": 0.95,
"processing_time": 0.12
}
适用场景: 通用文字识别,返回完整的文本和位置信息
curl -X POST http://localhost:9899/general/base64 \
-H "Content-Type: application/json" \
-d '{
"base64_img": "图片的base64编码",
"preprocess": false
}'
响应示例 (Paddle 标准格式):
{
"results": [
{
"rec_texts": ["识别的文本"],
"rec_scores": [0.9976],
"det_polygons": [[x1,y1], [x2,y2], [x3,y3], [x4,y4]]
}
],
"processing_time": 0.56
}
适用场景: 直接上传图片文件进行识别
curl -X POST "http://localhost:9899/general/file?preprocess=true" \
-F "file=@/path/to/image.png"
支持的图片格式:JPEG, PNG, GIF, BMP, WebP
所有接口都支持 preprocess 参数:
preprocess: true (默认)
preprocess: false
| 变量 | 说明 | 默认值 |
|---|---|---|
PORT | 服务端口 | 9899 |
HOST | 绑定地址 | 0.0.0.0 |
LOG_LEVEL | 日志级别 | info |
TZ | 时区设置 | UTC |
日志级别选项: debug, info, warn, error
| 指标 | 数值 |
|---|---|
| 镜像大小 | ~150MB |
| 内存占用 | ~150MB |
| 启动时间 | 2-3 秒 |
| 识别速度 | 100-200ms |
| 并发能力 | 优秀 |
服务提供多个健康检查端点:
# 轻量级健康检查
curl http://localhost:9899/health
# OCR 服务状态检查
curl http://localhost:9899/captcha/health
# 服务信息
curl http://localhost:9899/
import requests
import base64
# 读取图片并转换为 base64
with open('image.png', 'rb') as f:
base64_img = base64.b64encode(f.read()).decode('utf-8')
# 调用验证码识别接口
response = requests.post(
'http://localhost:9899/captcha/base64',
json={'base64_img': base64_img}
)
print(response.json())
# 调用通用 OCR 接口
response = requests.post(
'http://localhost:9899/general/base64',
json={'base64_img': base64_img, 'preprocess': False}
)
print(response.json())
const fs = require('fs');
const axios = require('axios');
// 读取图片并转换为 base64
const imageBuffer = fs.readFileSync('image.png');
const base64Img = imageBuffer.toString('base64');
// 调用验证码识别接口
axios.post('http://localhost:9899/captcha/base64', {
base64_img: base64Img
}).then(response => {
console.log(response.data);
});
// 调用通用 OCR 接口
axios.post('http://localhost:9899/general/base64', {
base64_img: base64Img,
preprocess: false
}).then(response => {
console.log(response.data);
});
# 上传图片文件进行识别
curl -X POST "http://localhost:9899/general/file?preprocess=true" \
-F "[email protected]"
# 查看容器日志
docker logs media-saber-paddle-ocr
# 查看实时日志
docker logs -f media-saber-paddle-ocr
如果 9899 端口被占用,可以修改映射端口:
docker run -d \
--name media-saber-paddle-ocr \
-p 8899:9899 \
xylplm/media-saber-paddle-ocr:latest
建议为容器分配至少 512MB 内存:
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
docker run -d \
--name media-saber-paddle-ocr \
-p 9899:9899 \
-e LOG_LEVEL=debug \
xylplm/media-saber-paddle-ocr:latest
docker run -d \
--name media-saber-paddle-ocr \
-p 9899:9899 \
-v /path/to/logs:/app/logs \
xylplm/media-saber-paddle-ocr:latest
docker run -d \
--name media-saber-paddle-ocr \
-p 9899:9899 \
--memory="1g" \
--cpus="1.0" \
xylplm/media-saber-paddle-ocr:latest
latest: 最新稳定版本v1.x.x: 特定版本号dev: 开发版本(不推荐生产使用)本项目基于 [Apache License 2.0] 协议。
欢迎提交 Issue 和 Pull Request!
技术栈: Node.js 24 | Fastify 5 | PP-OCRv5 | ONNX Runtime | eSearch-OCR
Content type
Image
Digest
sha256:0b67d5c49…
Size
474.6 MB
Last updated
8 months ago
docker pull xylplm/media-saber-paddle-ocr