第一次接触ddddocr时,我也被各种依赖项搞得晕头转向。经过几次踩坑后,我总结出一套最稳妥的环境配置方案。ddddocr对Python版本有严格要求,建议使用Python 3.8-3.11版本,其他版本可能会遇到奇怪的兼容性问题。
对于Windows用户,我强烈推荐使用Anaconda创建虚拟环境。这能有效避免不同项目间的依赖冲突。执行以下命令创建名为dd的虚拟环境:
bash复制conda create -n dd python=3.11
conda activate dd
接下来安装核心依赖项。这里有个小技巧:先安装Pillow==9.5.0再安装其他依赖,可以避免图像处理库的版本冲突。requirements.txt应该包含这些关键包:
code复制fire loguru pyyaml tqdm numpy pillow==9.5.0 onnx ddddocr-py311
GPU用户需要特别注意PyTorch版本匹配问题。根据你的CUDA版本选择对应安装命令。我常用的是CUDA 11.7搭配PyTorch 2.0.1:
bash复制conda install pytorch2.0.1 torchvision0.15.2 torchaudio==2.0.2 pytorch-cuda=11.7 -c nvidia
如果只用CPU训练,安装命令更简单:
bash复制conda install pytorch2.0.1 torchvision0.15.2 torchaudio==2.0.2 cpuonly
验证安装是否成功时,可以运行python -c "import ddddocr; print(ddddocr.__version__)"。如果能看到版本号输出,说明基础环境已经就绪。
数据集是训练效果的决定性因素。根据我的经验,数字验证码至少需要3000张样本,混合字符需要5000+,中文验证码则建议8000张以上。图片质量比数量更重要,要确保覆盖各种变形、干扰线等真实场景。
创建训练项目的命令很简单:
bash复制python app.py create charprj
这会在projects目录下生成charprj文件夹,包含三个子目录:
config.yaml是项目的核心配置文件,有几个关键参数需要注意:
yaml复制ImageChannel: 1 # 1表示灰度图,3表示彩色图
ImageHeight: 64 # 高度必须是16的倍数
Word: false # 常规OCR设为false,图像分类才用true
对于中文验证码,建议设置ImageWidth: 128以容纳更多字符。如果是定长验证码,可以固定宽度;不定长则保持-1让系统自动调整。
开始训练前,需要先缓存数据集:
bash复制python app.py cache charprj /path/to/your/images
训练参数中这几个值需要特别关注:
yaml复制Train:
BATCH_SIZE: 32 # 根据显存调整,16/32/64常见
LR: 0.01 # 学习率太大容易震荡,太小收敛慢
TARGET:
Accuracy: 0.97 # 达到此精度停止训练
Cost: 0.05 # 损失值阈值
Epoch: 20 # 最小训练轮数
启动训练的命令很简单:
bash复制python app.py train charprj
训练过程中会遇到几个常见问题:
我常用的技巧是先用小规模数据快速验证流程,再用全量数据训练。比如先用100张图片跑通流程,确认无误后再用全部数据训练。
训练完成后,最佳模型会自动保存在models目录。我们可以用这个onnx模型进行预测:
python复制import ddddocr
ocr = ddddocr.DdddOcr(
det=False,
ocr=False,
import_onnx_path="charprj.onnx",
charsets_path="charsets.json"
)
with open("test.png", 'rb') as f:
print(ocr.classification(f.read()))
部署API服务推荐使用ocr_api_server项目。安装很简单:
bash复制pip install ocr_api_server
启动服务时指定模型路径:
bash复制ocr_api_server --port 9898 --onnx-dir ./models --charsets-dir ./projects/charprj
服务支持两种调用方式:
我建议在生产环境用Nginx做反向代理,添加限流和认证。对于高并发场景,可以启动多个worker进程:
bash复制ocr_api_server --port 9898 --workers 4
记得在config.yaml中配置好字符集路径和模型路径,这样服务重启时能自动加载最新模型。如果遇到内存泄漏问题,可以定期重启服务或者使用容器化部署。