文章目录
- 前言
- 一、paddle -> pth -> pt
- 二、pt -> pnnx -> ncnn
- 三、ncnn模型部署
- 参考文档
前言
之前尝试使用paddle -> onnx -> ncnn的方案,遇到了转ncnn过程中,某些层不支持的问题,经过修改ncnn模型参数,可实现部署,但是修改较复杂,很不易用,现在自己都忘了之前怎么修改的了。
参考文档:
PP-OCRv3 文本识别模型转ncnn模型
PPOCRV3文本识别模型精度损失问题解决
ncnn部署PP-OCRv3
现在尝试利用paddle -> pth -> pt -> pnnx -> ncnn 的方式实现ncnn模型部署,且不需要对PPOCRv3的模型进行修改
一、paddle -> pth -> pt
- 开源工程路径:PaddleOCR2Pytorch
- 下载工程后,找到"./pytorchocr/base_ocr_v20.py"文件,对其中save_pytorch_weights函数修改:
def save_pytorch_weights(self, weights_path):"转torchsprit"input_size = torch.randn(1,3,48, 320)mod = torch.jit.trace(self.net, input_size)torch.jit.save(mod, "ch_PP-OCRv3_rec_infer.pt")try:torch.save(self.net.state_dict(), weights_path, _use_new_zipfile_serialization=False)except:torch.save(self.net.state_dict(), weights_path) # _use_new_zipfile_serialization=False for torch>=1.6.0print('model is saved: {}'.format(weights_path))
- 运行代码(注意该工程默认加载的是训练模型best_accuracy)
python converter/ch_ppocr_v3_rec_converter.py --src_model_path "./PaddleOCR-2.7.2/output/01_20240326_ppv3_train/"
- 第三方依赖
train@train:/Projects/ocr/PaddleOCR2Pytorch-main$ pip list | grep -w torch
torch 1.7.1+cu101
- 最终生成文件
train@train:/Projects/ocr/PaddleOCR2Pytorch-main$ ls -l ch_*
-rwxr--r-- 1 nobody nogroup 10944466 4月 7 08:59 ch_PP-OCRv3_rec_infer.pt
-rwxr--r-- 1 nobody nogroup 10660036 4月 7 08:59 ch_ptocr_v3_rec_infer.pth
二、pt -> pnnx -> ncnn
- 利用第三方库pnnx,ncnn,生成ncnn模型文件(这里应用了2个inputshape是为了实现动态输入,H维上的值是任意设置的)
pnnx ch_PP-OCRv3_rec_infer.pt inputshape=[1,3,48,320] inputshape2=[1,3,48,480]
- 第三方依赖
train@train:/Projects/ocr/PaddleOCR2Pytorch-main$ pip list | grep -E "pnnx|ncnn"
ncnn 1.0.20230223
pnnx 20240226
- 最终生成文件(其中ch_PP_OCRv3_rec_infer_ncnn.py为验证脚本,可直接运行验证ncnn模型是否正常)
train@train:/Projects/ocr/PaddleOCR2Pytorch-main/pnnx2ncnn/last_best$ ls -l *ncnn*
-rw-r--r-- 1 train train 5285788 4月 7 09:23 ch_PP_OCRv3_rec_infer.ncnn.bin
-rw-r--r-- 1 train train 10159 4月 7 09:23 ch_PP_OCRv3_rec_infer.ncnn.param
-rw-r--r-- 1 train train 667 4月 7 09:23 ch_PP_OCRv3_rec_infer_ncnn.py
三、ncnn模型部署
生成ncnn模型主要为了在PC端或者移动端部署,当前使用vs2019实现了对文本识别模型的推理测试,主要利用开源ncnn库、opencv库实现对ncnn模型的推理,之后有时间会开源demo工程。
参考文档
- layer 65 not exists or registered
- opencv x86(32位) windows下vs2019编译问题