PaddleOCR的简单使用
paddleocr文档
paddlepaddle飞浆官网
paddlepaddle飞浆AI低代码
一、环境配置
- win10
- Anaconda
- 创建Anaconda python环境
# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.10 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
# 激活paddle_env环境
conda activate paddle_env
# 查看当前python的位置
where python
- 安装PaddlePaddle
# 机器安装的是CUDA 11,请运行以下命令安装
pip install paddlepaddle-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple
# 您的机器是CPU,请运行以下命令安装,建议安装2.5.0版本的,可以使用很多独特的功能,比如表格内容SRE,RE预测推理模型
pip install paddlepaddle==2.5.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
- 安装PaddleOCR whl包
pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple
- 安装PaddleLabel标注工具
pip install PPOCRLabel -i https://pypi.tuna.tsinghua.edu.cn/simple
- 下载paddleocr 源代码
方便安装依赖包及运行训练
指定位置下D:\PythonWorkSpace_Study\PaddleOCR_test
git clone https://gitee.com/PaddlePaddle/PaddleOCR
## 1.6 安装requirements
cd D:\PythonWorkSpace_Study\PaddleOCR_test\PaddleOCR
# 此时conda无反应,需要再输入
D:
# 切换到指定目录
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
二、PaddleLabel标注工具的使用方法
- conda 启动python环境
- 找到环境下的site-package对应的PaddleLabel文件夹
- 启动PaddleLabel工具
python PPOCRLabel.py --lang ch # 启动【普通模式】,用于打【检测+识别】场景的标签
- 例如我的PaddleLabel就在D:\DevelopmentTools\Anaconda\envs\paddle_env\Lib\site-packages\PPOCRLabel目录下
- 自定义模型:如果用户想将内置模型更换为自己的推理模型,可根据自定义模型代码使用,通过修改PPOCRLabel.py中针对PaddleOCR类的实例化 或者PPStructure实现,例如指定检测模型:self.ocr = PaddleOCR(det=True, cls=True, use_gpu=gpu, lang=lang) ,在 det_model_dir 中传入自己的模型即可。
- 导出结果:用户可以通过菜单中“文件-导出标记结果”手动导出,同时也可以点击“文件 - 自动导出标记结果”开启自动导出。手动确认过的标记将会被存放在所打开图片文件夹下的Label.txt中。在菜单栏点击 “文件” - "导出识别结果"后,会将此类图片的识别训练数据保存在crop_img文件夹下,识别标签保存在rec_gt.txt中[4]
- 数据集划分
cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下
python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --datasetRootPath ../train_data
# --datasetRootPath 后面的../train_data就是数据标注文件所在位置
# 生成的数据集在D:\DevelopmentTools\Anaconda\envs\paddle_env\Lib\site-packages\train_data目录下
三、数据集的使用方法
3.1 飞浆AI Studio模型产线
- 建议使用该模型产线进行训练
- 选择创建产线
- 首先选文本检测产线
- 自定义数据集需要满足目录条件
- 改变每一个txt文件里面的图片目录,改成当前文件的相对目录,需要注意linux和windows路径符号
- 将数据集文件统一打包成zip文件并放置在模型产线进行训练,所有训练配置都选择默认即可
3.2 自己电脑训练,建议使用GPU
四、结果文件的使用方法
4.1 可直接离线部署
4.2 可以选择结果文件
- 获取上面截图中的文件
- 转换成推理模型
# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.save_inference_dir参数设置转换的模型将保存的地址。
python3 tools/export_model.py -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_det_train/best_accuracy Global.save_inference_dir=./inference/det_db/
4.3 测试训练模型
- 测试单张图像的检测效果:
python tools/infer_det.py -c D:\PythonWorkSpace_Study\PaddleOCR\inference_model\djzs_det1\config.yaml -o Global.infer_img="D:\WorkDocument\OCRTest\Carfi\sre_ocr\00037.jpg" Global.pretrained_model="D:\PythonWorkSpace_Study\PaddleOCR\inference_model\djzs_det1\best_accuracy"
-
其中需要注意config.yaml的配置信息。没有的要补充上
-
转换检测训练模型到推理模型
python tools/export_model.py -c D:\PythonWorkSpace_Study\PaddleOCR\inference_model\djzs_det1\config.yaml -o Global.pretrained_model="D:\PythonWorkSpace_Study\PaddleOCR\inference_model\djzs_det1\best_accuracy" Global.save_inference_dir="D:\PythonWorkSpace_Study\PaddleOCR\model\djzs_det1"
- 使用检测推理模型预测检测
python tools/infer/predict_det.py --det_algorithm="DB" --det_model_dir="D:\PythonWorkSpace_Study\PaddleOCR\model\djzs_det1" --image_dir="D:\WorkDocument\OCRTest\Carfi\sre_ocr\00037.jpg"
- 转换识别训练模型到推理模型
python tools/export_model.py -c D:\PythonWorkSpace_Study\PaddleOCR\inference_model\djzs_rec1\config.yaml -o Global.pretrained_model=D:\PythonWorkSpace_Study\PaddleOCR\inference_model\djzs_rec1\best_accuracy Global.save_inference_dir=D:\PythonWorkSpace_Study\PaddleOCR\model\djzs_rec1
- 可能遇见的错误
UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xcb’ in position 0: illegal multibyte sequence
- 解决方法
- 找到export_model.py,更改 with open(path, “w”, encoding=“utf-8”) as f:
- 找到export_model.py,更改 with open(path, “w”, encoding=“utf-8”) as f:
- 使用检测和识别推理模型识别图片
python tools/infer/predict_system.py --image_dir="D:\WorkDocument\OCRTest\Carfi\sre_ocr\00037.jpg" --det_model_dir="D:\PythonWorkSpace_Study\PaddleOCR\model\djzs_det1" --rec_model_dir="D:\PythonWorkSpace_Study\PaddleOCR\model\djzs_rec1"
五、关于Paddle OCR检测器检测框偏小的解决方法
- 将yaml文件里面字段"unclip_ratio"的值调大。例如:configs/det_mv3_db.yml文件:将默认值1.5改为3.0。
- 在测试评估没有问题,转为推理模型,再做推理测试,发现又变小了,然后追踪推理的代码。发现推理的配置信息在tools/infer/utillity.py文件中。这个文件里面也有一个det_db_unclip_ratio,修改这里的unclip_ratio,检测框正常了
- ppocr如果多次训练导致识别率下降,需要考虑降低学习率,从而保证识别精度
六、Paddlehub Serving部署
6.1 报错ImportError: libGL.so.1: cannot open shared object file: No such file or directory
# 下载mesa-libGL.x86_64
yum install mesa-libGL.x86_64
6.2 报错ImportError: cannot import name ‘RNNCell’ from ‘paddle.fluid.layers’ (/root/anaconda3/envs/paddle_env/lib/python3.8/site-packages/paddle/fluid/layers/init.py)
paddle是2.5.1 gpu,Linux运行时cannot import name 'RNNCell' from 'paddle.fluid.layers',这是因为2.5.0后没有fluid某些算子了,这时不用降版本(因为我将版本后出现了另一个错误,这时只需要把/root/anaconda3/envs/paddle_env/lib/python3.8/site-packages/paddlehub/compat/task/text_generation_task.py这个文件
from 'paddle.fluid.layers import RNNCell ... 换成from paddle.nn import RNNCellBase...对应其他同名的也做替换就可。
小写的rnn需要更换成大小的RNN
6.3 protobuf版本过高,可使用protobuf ==3.20.2
七、关于docker内部部署paddlehub遇见的问题
7.1 paddlehub所在位置
一般所在位置/opt/conda/lib/python3.9/site-packages/paddlehub
其中commands包含install.py serving.py 用于安装模块和启动模块
7.2 安装模块所在位置
一般在/root/.paddlehub/modules/kie_ser
7.3 关于paddlehub 内存爆炸的处理方案
主要是看module运行的是啥,比如我用的是kie_ser模块,最终调用的是
/opt/conda/lib/python3.9/site-packages/paddleocr/ppstructure/kie 目录下
predict_kie_token_ser.py方法,
该方法内部存在
def __call__(self, img):
ori_im = img.copy()
data = {"image": img}
data = transform(data, self.preprocess_op)
if data[0] is None:
return None, 0
starttime = time.time()
for idx in range(len(data)):
if isinstance(data[idx], np.ndarray):
data[idx] = np.expand_dims(data[idx], axis=0)
else:
data[idx] = [data[idx]]
for idx in range(len(self.input_tensor)):
self.input_tensor[idx].copy_from_cpu(data[idx])
self.predictor.run()
outputs = []
for output_tensor in self.output_tensors:
output = output_tensor.copy_to_cpu()
outputs.append(output)
preds = outputs[0]
post_result = self.postprocess_op(
preds, segment_offset_ids=data[6], ocr_infos=data[7]
)
elapse = time.time() - starttime
# 释放内存
self.predictor.clear_intermediate_tensor()
self.predictor.try_shrink_memory()
return post_result, data, elapse
主要关注 self.predictor.run()该方法,
内部使用
# 释放内存
self.predictor.clear_intermediate_tensor()
self.predictor.try_shrink_memory()