1. 项目概述
上周接手了一个在国产麒麟V10系统上部署RapidOCR的任务,本以为是个简单的活,结果从环境配置到最终跑通整整折腾了三天。这里把整个部署过程中遇到的坑和解决方案做个完整记录,特别是针对aarch64架构的特殊处理,希望能帮到同样在国产化环境里挣扎的同行们。
RapidOCR作为当前性能第一梯队的开源OCR工具,在x86架构上部署确实简单,但到了麒麟V10这种基于aarch64架构的国产系统,从基础依赖到Python包安装处处是坑。最要命的是这个项目还要求支持中文手写体识别,需要额外处理字体和模型的问题。下面我会按照实际操作的顺序,把关键环节和避坑要点逐一说明。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖处理
2.1 系统基础环境确认
首先通过uname -m确认系统架构确实是aarch64,麒麟V10的SP2版本。这个版本默认的Python是3.7,但RapidOCR推荐3.8+,所以需要先升级Python:
bash复制sudo apt-get install python3.8
这里第一个坑就出现了:麒麟的官方源里没有python3.8。解决方法是用源码编译:
bash复制wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tar.xz
tar -xvf Python-3.8.12.tar.xz
cd Python-3.8.12
./configure --enable-optimizations
make -j$(nproc)
sudo make altinstall
注意:一定要用
altinstall而不是install,避免覆盖系统默认Python导致yum等工具失效。
2.2 依赖库的特殊处理
RapidOCR依赖的OpenCV、onnxruntime等库在aarch64上需要特殊处理:
- OpenCV安装:直接
pip install opencv-python会报错,需要从源码编译:
bash复制sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
git clone https://github.com/opencv/opencv.git
cd opencv
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)
sudo make install
- onnxruntime选择:必须使用aarch64专用版本:
bash复制pip install onnxruntime-aarch64
3. RapidOCR核心部署流程
3.1 源码获取与修改
从官方仓库克隆代码后,需要修改几处aarch64适配问题:
- 模型加载逻辑:在
rapidocr_onnxruntime/inference.py中,修改模型加载方式:
python复制# 原代码
self.session = ort.InferenceSession(model_path)
# 修改为
self.session = ort.InferenceSession(model_path, providers=['CPUExecutionProvider'])
- 线程数限制:在
rapidocr_onnxruntime/utils.py中增加:
python复制import os
os.environ["OMP_NUM_THREADS"] = "4" # 根据CPU核心数调整
3.2 中文支持配置
麒麟系统默认缺少中文字体,需要手动添加:
- 下载思源字体:
bash复制wget https://mirrors.tuna.tsinghua.edu.cn/adobe-fonts/source-han-sans/OTF/SourceHanSansSC.zip
unzip SourceHanSansSC.zip
sudo mkdir -p /usr/share/fonts/chinese
sudo cp *.otf /usr/share/fonts/chinese/
sudo fc-cache -fv
- 修改RapidOCR配置:
在config.yaml中添加:
yaml复制font_path: /usr/share/fonts/chinese/SourceHanSansSC-Regular.otf
4. 性能优化技巧
4.1 NEON指令集加速
aarch64的NEON指令集可以显著提升OCR处理速度,需要重新编译关键组件:
bash复制export CFLAGS="-march=armv8-a+simd -mtune=cortex-a72 -O3"
pip install --no-binary :all: numpy
4.2 内存管理优化
在/etc/sysctl.conf末尾添加:
conf复制vm.swappiness = 10
vm.dirty_ratio = 30
vm.dirty_background_ratio = 10
执行sudo sysctl -p生效
5. 常见问题与解决方案
5.1 模型加载失败
现象:报错Failed to load model...
解决方法:
- 检查模型路径是否包含中文(麒麟系统对中文路径支持不好)
- 确认onnxruntime版本匹配:
bash复制pip show onnxruntime | grep Version
应该显示1.14.0及以上版本
5.2 识别结果乱码
现象:英文识别正常,中文全是乱码
解决方法:
- 确认字体文件权限:
bash复制ls -l /usr/share/fonts/chinese/
- 重建字体缓存:
bash复制sudo fc-cache -fv
5.3 内存泄漏问题
现象:长时间运行后内存占用持续增长
解决方法:
在代码中显式释放资源:
python复制import gc
# 每次识别完成后调用
gc.collect()
6. 部署后验证
编写测试脚本test_ocr.py:
python复制from rapidocr_onnxruntime import RapidOCR
ocr = RapidOCR()
result, _ = ocr("test.jpg")
print(result)
测试时发现一个隐藏坑:麒麟V10的默认图片查看器可能损坏图片文件,建议用file命令先验证图片完整性:
bash复制file test.jpg
7. 实际使用心得
- 批量处理建议:在aarch64上,建议每次处理不超过10张图片,然后休息2秒,避免CPU过热降频:
python复制import time
for i, img_path in enumerate(img_list):
if i % 10 == 0:
time.sleep(2)
# 处理代码
- 日志记录必做:麒麟系统的
/var/log空间很小,建议修改RapidOCR的日志路径:
python复制import logging
logging.basicConfig(filename='/home/user/rapidocr.log', level=logging.INFO)
- 性能监控命令:推荐使用
arm-top(需自行安装)监控CPU和内存:
bash复制sudo apt-get install arm-top
arm-top -d 1
