目录
- 完整流程(联网机器 + 离线机器)
- 在离线机器上:
-
- 下载 Miniconda(Linux 64-bit)
- 安装 Miniconda(默认安装到 ~/miniconda3)
- 激活 conda
- 创建 conda 环境(Python 3.8)
- 安装 PaddlePaddle(GPU 版本,若用 CPU 则替换为 `paddlepaddle`)
- 安装 PaddleOCR
- 安装 OpenCV 等依赖
- 测试1:检查 PaddlePaddle 是否能正确识别 GPU
- 测试2:运行 PaddleOCR 测试(自动下载模型)
- 创建模型存储目录
- 下载检测、识别、分类模型
- 解压模型
- 使用本地模型运行 OCR(不联网)
- 打包 conda 环境
- 打包模型文件
- 打包 pip 下载的 wheel 文件(可选,用于极端离线情况)
- 2. 在离线机器上部署
- 进阶版python文件
完整流程(联网机器 + 离线机器)
目标
在联网机器上:
安装 Miniconda + PaddleOCR。
完整测试 OCR 功能(确保所有模型和依赖正常)。
打包 Conda 环境、pip 依赖、PaddleOCR 模型,生成离线安装包。
在离线机器上:
直接部署 Conda 环境 + 预下载模型,无需联网。
🔧 1. 在联网机器上的完整安装与测试
(1) 安装 Miniconda
bash
下载 Miniconda(Linux 64-bit)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
安装 Miniconda(默认安装到 ~/miniconda3)
bash Miniconda3-latest-Linux-x86_64.sh -b
激活 conda
source ~/miniconda3/bin/activate
(2) 创建 Conda 环境并安装 PaddleOCR
bash
创建 conda 环境(Python 3.8)
conda create -n paddle_env python=3.8 -y
conda activate paddle_env
安装 PaddlePaddle(GPU 版本,若用 CPU 则替换为 paddlepaddle
)
pip install paddlepaddle-gpu==2.5.1 -i https://mirror.baidu.com/pypi/simple
安装 PaddleOCR
pip install paddleocr==2.7.0 -i https://mirror.baidu.com/pypi/simple
安装 OpenCV 等依赖
pip install opencv-python Pillow numpy -i https://mirror.baidu.com/pypi/simple
**(3) 📌 关键步骤:测试 PaddleOCR 是否正常工作
bash
测试1:检查 PaddlePaddle 是否能正确识别 GPU
python -c “import paddle; print(paddle.utils.run_check())”
测试2:运行 PaddleOCR 测试(自动下载模型)
python -c “from paddleocr import PaddleOCR; ocr = PaddleOCR(use_angle_cls=True); print(ocr.ocr(‘https://paddleocr.bj.bcebos.com/ppstructure/docs/table/table.jpg’))”
✅ 预期结果:
PaddlePaddle 应输出 Running verify PaddlePaddle program … PaddlePaddle works well!。
PaddleOCR 应成功识别图片中的文字。
这里需要注意一点,设置全局变量
find /root/miniconda3/envs/paddle_env -name “libssl.so.1.1”
export LD_LIBRARY_PATH=/root/miniconda3/envs/paddle_env/lib:$LD_LIBRARY_PATH
(4) 预下载 PaddleOCR 模型(避免离线机器下载)
bash
创建模型存储目录
mkdir -p paddleocr_models
下载检测、识别、分类模型
wget https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar -O paddleocr_models/ch_PP-OCRv4_det_infer.tar
wget https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_infer.tar -O paddleocr_models/ch_PP-OCRv4_rec_infer.tar
wget https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_cls_infer.tar -O paddleocr_models/ch_PP-OCRv4_cls_infer.tar
解压模型
cd paddleocr_models
tar -xf ch_PP-OCRv4_det_infer.tar
tar -xf ch_PP-OCRv4_rec_infer.tar
tar -xf ch_PP-OCRv4_cls_infer.tar
cd …
**(5) 📌 关键步骤:测试离线模型是否可用
bash
使用本地模型运行 OCR(不联网)
python -c "
from paddleocr import PaddleOCR;
ocr = PaddleOCR(
use_angle_cls=True,
det_model_dir=‘./paddleocr_models/ch_PP-OCRv4_det_infer’,
rec_model_dir=‘./paddleocr_models/ch_PP-OCRv4_rec_infer’,
cls_model_dir=‘./paddleocr_models/ch_PP-OCRv4_cls_infer’
);
print(ocr.ocr(‘https://paddleocr.bj.bcebos.com/ppstructure/docs/table/table.jpg’))
"
✅ 预期结果:PaddleOCR 应能正常识别文字,且不触发模型下载。
(6) 打包 Conda 环境和模型
bash
打包 conda 环境
conda pack -n paddle_env -o paddle_env.tar.gz
当时我上边这个命令无法运行,于是直接打包虚拟环境在离线机器上进行还原 tar -czvf paddle_env.tar.gz /root/miniconda3/envs/paddle_env
打包模型文件
tar -czvf paddleocr_models.tar.gz paddleocr_models
打包 pip 下载的 wheel 文件(可选,用于极端离线情况)
mkdir pip_packages
pip download paddlepaddle-gpu2.5.1 paddleocr2.7.0 opencv-python Pillow numpy -d pip_packages
tar -czvf pip_packages.tar.gz pip_packages
(7) 准备离线安装包
最终得到的文件:
Miniconda3-latest-Linux-x86_64.sh(Miniconda 安装脚本)
paddle_env.tar.gz(Conda 环境 把这个放到miniconda 下的env下边即可 能查到这个虚拟环境)
paddleocr_models.tar.gz(PaddleOCR 模型 解压到文件夹下 一会跑python程序的时候可以直接用)
pip_packages.tar.gz(pip 离线依赖包,可选 一会在离线机器上进行pip install paddlepaddle paddleocr 这两个固定版本的依赖即可)
2. 在离线机器上部署
(1) 安装 Miniconda
bash
复制 Miniconda 安装包到离线机器
bash Miniconda3-latest-Linux-x86_64.sh -b
source ~/miniconda3/bin/activate
(2) 恢复 Conda 环境
bash
解压 conda 环境
mkdir -p ~/miniconda3/envs/
tar -xzf paddle_env.tar.gz -C ~/miniconda3/envs/
激活环境
conda activate paddle_env(所有的命令都要基于这个 不进入这个虚拟环境 很多命令都识别不了)
然后查看虚拟环境 conda info --envs
(3) 加载 PaddleOCR 模型
bash
解压模型文件
tar -xzf paddleocr_models.tar.gz
然后设置全局变量
首先查找libssl的位置: find /-name “libssl.so*” 2>/dev/null
export LD_LIBRARY_PATH=/root/miniconda/envs/paddle_env/lib:$LD_LIBRARY_PATH
(如果不设置这个会报一个找不到lib)
(4) 测试离线 OCR
首先下载依赖 paddlepaddle 和 paddleocr
pip install --no-index --find-link=. paddlepaddle-2.5.1-cp38-cp38-manylinux1_x86_64.whl
pip install --no-index --find-link=. paddleocr-2.7.0.0-py3-none-any.whl
然后执行
python -c "
from paddleocr import PaddleOCR;
ocr = PaddleOCR(
use_angle_cls=True,
det_model_dir=‘./paddleocr_models/ch_PP-OCRv4_det_infer’,# 这三个模型可以换成绝对路径
rec_model_dir=‘./paddleocr_models/ch_PP-OCRv4_rec_infer’,
cls_model_dir=‘./paddleocr_models/ch_PP-OCRv4_cls_infer’
);
print(ocr.ocr(‘your_image.jpg’)) # 替换为本地图片路径
"
✅ 预期结果:OCR 应能正常运行,无需联网。
📝 最终检查清单
步骤 联网机器 离线机器
- 安装 Miniconda ✅ 安装并测试 ✅ 仅安装
- 创建 Conda 环境 ✅ 安装 PaddleOCR ✅ 解压恢复
- 测试 OCR ✅ 在线模型 + 本地模型 ✅ 仅本地模型
- 打包环境 ✅ 生成 paddle_env.tar.gz ❌ 不需要
- 预下载模型 ✅ 生成 paddleocr_models.tar.gz ✅ 解压使用
- 离线 pip 包 ✅ 可选打包 ✅ 可选安装
进阶版python文件
初始版py文件
from pdf2image import convert_from_path
from paddleocr import PaddleOCR
import os
初始化 OCR
ocr = PaddleOCR(
use_angle_cls=False,
det_model_dir='./paddleocr_models/ch_PP-OCRv4_det_infer',
rec_model_dir='./paddleocr_models/ch_PP-OCRv4_rec_infer',
cls_model_dir='./paddleocr_models/ch_ppocr_mobile_v2.0_cls_infer',
use_gpu=False
)
#PDF 路径
pdf_path = 'test.pdf'
#转换 PDF 每页为图像
images = convert_from_path(pdf_path, dpi=300) # DPI 可调高保证清晰度
#处理每一页
for i, image in enumerate(images):
image_path = f'page_{i+1}.png'
image.save(image_path, 'PNG') # 保存为 PNG
result = ocr.ocr(image_path, cls=False)
print(f'--- 第 {i+1} 页 ---')
for line in result[0]:
print(line[1][0])
识别边框等相关信息
import os
import sys
from pathlib import Path
from paddleocr import PaddleOCR
from pdf2image import convert_from_path
from PIL import Image
def run_ocr_on_image(image_path, ocr):
"""对单张图片执行 OCR 并返回结果"""
result = ocr.ocr(image_path, cls=False)
text_lines = [line[1][0] for line in result[0]]
return text_lines
def ocr_file(input_path, ocr):
"""根据输入文件类型选择处理方式"""
input_path = Path(input_path)
if not input_path.exists():
print(f"❌ 文件不存在:{input_path}")
return
if input_path.suffix.lower() == '.pdf':
print(f"📄 正在处理 PDF 文件: {input_path}")
images = convert_from_path(str(input_path), dpi=300)
for idx, img in enumerate(images):
img_path = f"temp_page_{idx+1}.png"
img.save(img_path, 'PNG')
print(f"\n--- 第 {idx+1} 页识别结果 ---")
lines = run_ocr_on_image(img_path, ocr)
for line in lines:
print(line)
os.remove(img_path) # 清理临时图像
elif input_path.suffix.lower() in ['.png', '.jpg', '.jpeg', '.bmp']:
print(f"🖼️ 正在处理图片文件: {input_path}")
lines = run_ocr_on_image(str(input_path), ocr)
print("\n--- 识别结果 ---")
for line in lines:
print(line)
else:
print("❌ 不支持的文件类型,请使用 PNG / JPG / PDF。")
def main():
if len(sys.argv) != 2:
print("用法: python ocr_universal.py <输入文件路径>")
return
input_file = sys.argv[1]
# 初始化 OCR(修改模型路径为你的本地路径)
ocr = PaddleOCR(
use_angle_cls=False,
det_model_dir='./paddleocr_models/ch_PP-OCRv4_det_infer',
rec_model_dir='./paddleocr_models/ch_PP-OCRv4_rec_infer',
cls_model_dir='./paddleocr_models/ch_ppocr_mobile_v2.0_cls_infer',
use_gpu=False
)
ocr_file(input_file, ocr)
if __name__ == '__main__':
main()
imageandJson
import os
import sys
from pathlib import Path
from paddleocr import PaddleOCR
from pdf2image import convert_from_path
from PIL import Image, ImageDraw, ImageFont
def run_ocr_on_image(image_path, ocr):
"""对单张图片执行 OCR,返回识别文字和可视化图像"""
result = ocr.ocr(image_path, cls=False)
image = Image.open(image_path).convert("RGB")
draw = ImageDraw.Draw(image)
# 加载字体,优先使用 simfang.ttf(项目根目录),否则用默认字体
try:
font = ImageFont.truetype("simfang.ttf", 18)
except:
font = ImageFont.load_default()
for line in result[0]:
box = line[0] # 边框坐标
text = line[1][0] # 文本
draw.line(box + [box[0]], fill=(255, 0, 0), width=2)
draw.text(box[0], text, fill=(0, 0, 255), font=font)
return result[0], image
def ocr_file(input_path, ocr):
"""根据输入文件类型选择处理方式"""
input_path = Path(input_path)
if not input_path.exists():
print(f"❌ 文件不存在:{input_path}")
return
if input_path.suffix.lower() == '.pdf':
print(f"📄 正在处理 PDF 文件: {input_path}")
images = convert_from_path(str(input_path), dpi=300)
for idx, img in enumerate(images):
img_path = f"temp_page_{idx+1}.png"
img.save(img_path, 'PNG')
print(f"\n--- 第 {idx+1} 页识别结果 ---")
result, vis_img = run_ocr_on_image(img_path, ocr)
output_img_path = f"{input_path.stem}_page{idx+1}_result.png"
vis_img.save(output_img_path)
print(f"✅ 结果图像已保存:{output_img_path}")
os.remove(img_path)
elif input_path.suffix.lower() in ['.png', '.jpg', '.jpeg', '.bmp']:
print(f"🖼️ 正在处理图片文件: {input_path}")
result, image_with_boxes = run_ocr_on_image(str(input_path), ocr)
output_path = input_path.stem + "_result.png"
image_with_boxes.save(output_path)
print(f"✅ 已保存识别图像到:{output_path}")
else:
print("❌ 不支持的文件类型,请使用 PNG / JPG / PDF。")
def main():
if len(sys.argv) != 2:
print("用法: python ocr_universal.py <输入文件路径>")
return
input_file = sys.argv[1]
# 初始化 OCR 模型
ocr = PaddleOCR(
use_angle_cls=False,
det_model_dir='./paddleocr_models/ch_PP-OCRv4_det_infer',
rec_model_dir='./paddleocr_models/ch_PP-OCRv4_rec_infer',
cls_model_dir='./paddleocr_models/ch_ppocr_mobile_v2.0_cls_infer',
use_gpu=False
)
ocr_file(input_file, ocr)
if __name__ == '__main__':
main()