【完整过程】Windows下记录PadleOCR训练自己的ocr模型

一、前期准备

1、代码

参考的博主使用的是2.6版本的

博主的paddleocr代码

下面这个是官方的,可能已经更新了(我用的是官网当前最新版)

paddleocr的源代码

注意:最好把上面两个代码都下载下来,后面都会用到

参考博主的:

官网源码的:

2、创建一个conda虚拟环境

  • 打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3 -> Anaconda Prompt启动控制台

  • 创建新的conda环境
# 在命令行输入以下命令,创建名为ocr的环境
# 此处为加速下载,使用清华源
conda create --name ocr python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/  # 这是一行命令

该命令会创建1个名为ocr、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间

  • 激活虚拟环境测试:
conda activate ocr

运行环境配置完成

3、安装包

(1)安装PaddlePaddle
# 先激活ocr虚拟环境
activate ocr

飞浆官网安装文档链接

根据自己的CUDA版本来安装,这里我的CUDA版本是11.6的,因此命令为

python -m pip install paddlepaddle-gpu==2.6.1.post116 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html

如果你没有CUDA打算用CPU版本的,命令为

python -m pip install paddlepaddle==2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
(2)安装PaddleOCR whl包
pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
  • 对于Windows环境用户:直接通过pip安装的shapely库可能出现[winRrror 126] 找不到指定模块的问题。建议从这里下载shapely安装包完成安装。(我这里直接pip是没问题的,视自己情况)
(3)便捷使用

PaddleOCR提供了一系列测试图片,点击这里下载并解压,放到我们的PaddleOCR根目录文件夹下,然后在终端中切换到相应目录

cd D:/cs/PaddleOCR/ppocr_img

如果不使用提供的测试图片,可以将下方--image_dir参数替换为相应的测试图片路径。

3.1  中英文模型
  • 检测+方向分类器+识别全流程:--use_angle_cls true设置使用方向分类器识别180度旋转文字,--use_gpu false设置不使用GPU
activate ocr
cd D:\cs\PaddleOCR\ppocr_img
paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false

结果是一个list,每个item包含了文本框,文字和识别置信度

[[[28.0, 37.0], [302.0, 39.0], [302.0, 72.0], [27.0, 70.0]], ('纯臻营养护发素', 0.9658738374710083)]
......

此外,paddleocr也支持输入pdf文件,并且可以通过指定参数page_num来控制推理前面几页,默认为0,表示推理所有页。

# 这里yolov7.pdf是我自己随便找的一个文件放到该目录下面的
paddleocr --image_dir ./imgs/yolov7.pdf --use_angle_cls true --use_gpu false --page_num 2
  • 单独使用检测:设置--recfalse
paddleocr --image_dir ./imgs/11.jpg --rec false

结果是一个list,每个item只包含文本框

[[27.0, 459.0], [136.0, 459.0], [136.0, 479.0], [27.0, 479.0]]
[[28.0, 429.0], [372.0, 429.0], [372.0, 445.0], [28.0, 445.0]]
......
  • 单独使用识别:设置--detfalse
paddleocr --image_dir ./imgs_words/ch/word_1.jpg --det false

结果是一个list,每个item只包含识别结果和识别置信度

['韩国小馆', 0.994467]

版本说明 paddleocr默认使用PP-OCRv4模型(--ocr_version PP-OCRv4),如需使用其他版本可通过设置参数--ocr_version,具体版本说明如下:

如需新增自己训练的模型,可以在paddleocr中增加模型链接和字段,重新编译即可。

更多whl包使用可参考whl包文档

3.2 多语言模型

PaddleOCR目前支持80个语种,可以通过修改--lang参数进行切换,对于英文模型,指定--lang=en

paddleocr --image_dir ./imgs_en/254.jpg --lang=en

结果是一个list,每个item包含了文本框,文字和识别置信度

[[[67.0, 51.0], [327.0, 46.0], [327.0, 74.0], [68.0, 80.0]], ('PHOCAPITAL', 0.9944712519645691)]
[[[72.0, 92.0], [453.0, 84.0], [454.0, 114.0], [73.0, 122.0]], ('107 State Street', 0.9744491577148438)]
[[[69.0, 135.0], [501.0, 125.0], [501.0, 156.0], [70.0, 165.0]], ('Montpelier Vermont', 0.9357033967971802)]
......

常用的多语言简写包括

全部语种及其对应的缩写列表可查看多语言模型教程

(4) Python脚本使用

4.1 中英文与多语言使用

通过Python脚本使用PaddleOCR whl包,whl包会自动下载ppocr轻量级模型作为默认模型。

  • 检测+方向分类器+识别全流程
from paddleocr import PaddleOCR, draw_ocr# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")  # need to run only once to download and load model into memory
img_path = 'ppocr_img/imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):res = result[idx]for line in res:print(line)# 显示结果
from PIL import Image
result = result[0]
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')

结果是一个list,每个item包含了文本框,文字和识别置信度

[[[28.0, 37.0], [302.0, 39.0], [302.0, 72.0], [27.0, 70.0]], ('纯臻营养护发素', 0.9658738374710083)]
......

结果可视化

如果输入是PDF文件,那么可以参考下面代码进行可视化

from paddleocr import PaddleOCR, draw_ocr# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
PAGE_NUM = 10 # 将识别页码前置作为全局,防止后续打开pdf的参数和前文识别参数不一致 / Set the recognition page number
pdf_path = 'ppocr_img/yolov7.pdf'
ocr = PaddleOCR(use_angle_cls=True, lang="ch", page_num=PAGE_NUM)  # need to run only once to download and load model into memory
# ocr = PaddleOCR(use_angle_cls=True, lang="ch", page_num=PAGE_NUM,use_gpu=0) # 如果需要使用GPU,请取消此行的注释 并注释上一行 / To Use GPU,uncomment this line and comment the above one.
result = ocr.ocr(pdf_path, cls=True)
for idx in range(len(result)):res = result[idx]if res == None: # 识别到空页就跳过,防止程序报错 / Skip when empty result detected to avoid TypeError:NoneTypeprint(f"[DEBUG] Empty page {idx+1} detected, skip it.")continuefor line in res:print(line)
# 显示结果
import fitz
from PIL import Image
import cv2
import numpy as np
imgs = []
with fitz.open(pdf_path) as pdf:for pg in range(0, PAGE_NUM):page = pdf[pg]mat = fitz.Matrix(2, 2)pm = page.get_pixmap(matrix=mat, alpha=False)# if width or height > 2000 pixels, don't enlarge the imageif pm.width > 2000 or pm.height > 2000:pm = page.get_pixmap(matrix=fitz.Matrix(1, 1), alpha=False)img = Image.frombytes("RGB", [pm.width, pm.height], pm.samples)img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)imgs.append(img)
for idx in range(len(result)):res = result[idx]if res == None:continueimage = imgs[idx]boxes = [line[0] for line in res]txts = [line[1][0] for line in res]scores = [line[1][1] for line in res]im_show = draw_ocr(image, boxes, txts, scores, font_path='doc/fonts/simfang.ttf')im_show = Image.fromarray(im_show)im_show.save('result_page_{}.jpg'.format(idx))

结果可视化

4、标注工具

可以参考ocr标注工具(里面有教程)

或直接安装

pip install PPOCRLabel  # 安装# 选择标签模式来启动
PPOCRLabel --lang ch  # 启动【普通模式】,用于打【检测+识别】场景的标签
PPOCRLabel --lang ch --kie True  # 启动 【KIE 模式】,用于打【检测+识别+关键字提取】场景的标签
5、数据准备
5.1 获取源代码

PaddleOCR-release-2.6文件夹(即开头介绍的2.6版本的项目文件)里的PPOCRLabel文件夹、Preliminary_training文件夹复制到PaddleOCR文件夹(就是开头介绍的官方项目文件)的根目录里、并在根目录下创建一个名称为inference_model的文件夹

cd 到  PPOCRLabel 目录下

cd D:\cs\PaddleOCR\PPOCRLabel
5.2 启动标注工具

终端输入命令

# todo 启动【普通模式】,用于打【检测+识别】场景的标签
PPOCRLabel --lang ch
5.3 打开数据集

5.4 标注
(1)自动标注

(2)手动标注

5.5 导出结果

5.6 数据整理

标注完成之后,还是在PPOCRLabel目录下,终端输入命令

python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --datasetRootPath ../数据集相对路径,

#我的是在D:\cs\PaddleOCR\ppocr_img\imgs下建立了一个dataset文件夹下,将上面导出的东西和原始图像放在了这个文件夹下

因此命令是

python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --datasetRootPath D:\cs\PaddleOCR\ppocr_img\imgs\dataset

之后会在根目录下自动创建一个train_data的文件夹

里面就是分好的数据

此时文字检测和文字识别的数据集就都制作好了。

二、训练模型

1、训练模型获取

paddleocr之gitcode

github可能下载不了模型,只能用gitcode的

下载之后在PaddleOCR根目录下建立Preliminary_training文件夹(上面已经从PaddleOCR-release-2.6文件夹中复制过来了,包括权重文件,因此不用再新建了),并将训练模型解压至该文件夹下。如下图所示:

2、det模型训练
2.1 找到det模型对应的yml文件

在项目的configs里面找到需要修改的yml文件

2.2 修改配置文件的参数(我这里以det_mv3_db.yml为例,需要修改的参数都差不多)
2.2.1 第一部分

2.2.2 第二部分

2.2.3 第三部分

2.3 开始训练

激活环境进入到PaddleOCR根目录下。

activate ocr
cd D:\cs\PaddleOCR

输入以下指令开始模型训练

python tools/train.py -c configs/det/"自己选的 det 的yml文件路径"

我的是

python tools/train.py -c configs/det/det_mv3_db.yml

出现以下画面则代表成功

3、rec模型训练
3.1 找到rec模型对应的yml文件

3.2 修改配置文件的参数(我这里以rec_chinese_lite_train_v2.0.yml为例,需要修改的参数都差不多)
3.2.1 第一部分

3.2.2 第二部分

3.2.3 第三部分

3.3 开始训练

激活环境进入到PaddleOCR根目录下。输入以下指令开始模型训练

python tools/train.py -c configs/rec/"自己选的 rec 的yml文件路径"

我的是

python tools/train.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml

出现以下画面则代表成功

 最后训练好可以在./output 下面查看训练后的模型

三、转换成推理模型

需要将生成的转换成为infer文件 命令如下: 

需要修改三个地方,改的时候去掉引号

#  将生成的模型转换成    infer 文件                                                                        最好的模型轮数                                  保存的目录地址
python tools/export_model.py -c configs/"det or rec 对应的yml地址" -o Global.checkpoints=./output/"需要转换的模型地址"/best_accuracy Global.save_inference_dir=./"模型保存地址"/

例如我的是

det 和 rec

python tools/export_model.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./output/label_ocr_11_8/det/latest Global.save_inference_dir=./inference_model/det/
python tools/export_model.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.pretrained_model=./output/label_ocr_11_8/rec/latest Global.save_inference_dir=./inference_model/rec/

转换后的模型会保存在你创建的目录下

四、测试

将det和rec模型替换成自己路径下的模型即可

这个代码是预测文件夹的示例

import os
from PIL import Imagedef batch_ocr(input_dir, output_dir):from paddleocr import PaddleOCR, draw_ocrocr = PaddleOCR(det_model_dir='inference_model/det', rec_model_dir='inference_model/rec', use_angle_cls=True,use_gpu=False)# 遍历输入文件夹下的所有图片文件for filename in os.listdir(input_dir):if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png'):img_path = os.path.join(input_dir, filename)# 进行 OCR 识别result = ocr.ocr(img_path, cls=True)[0]if result is not None:# 获取识别结果的坐标、文本和置信度boxes = [line[0] for line in result]txts = [line[1][0] for line in result]scores = [line[1][1] for line in result]# 读取原始图片image = Image.open(img_path).convert('RGB')# 在原始图片上绘制识别结果im_show = draw_ocr(image, boxes, txts, scores, font_path='doc/fonts/simfang.ttf')im_show = Image.fromarray(im_show)# 保存绘制结果的图片output_path = os.path.join(output_dir, filename)im_show.save(output_path)else:print(f"No result found for image: {img_path}")continue  # 或者其他错误处理逻辑if __name__ == '__main__':# Ocr()input_dir = r'text_img/Eval_img'output_dir = r'text_img/result_img'batch_ocr(input_dir, output_dir)

result_img文件夹存放同名预测结果

五、过程中遇到的问题和解决方法

解决问题:Could not locate zlibwapi.dll. Please make sure it is in your library path!

出现问题如下:

这个错误表示找不到zlibwapi.dll这个动态链接库文件。zlibwapi.dll是zlib库的Windows版本,一些Python包在Windows上需要依赖它。

关于zlibwapi.all这个文件可以到NVIDIA官网下载,链接为:添加链接描述

如下图所示:

下载的时候点击另存为就行,如果实在下载不了的到我网盘里下载包:链接为:添加链接描述

链接:https://pan.baidu.com/s/1v0E0Q3kpHv6ovZ7ZNIy0wg
提取码:irjk

下载好包后解压,并将各个文件添加到指定路径,如下:

zlibwapi.lib文件放到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.5\lib

zlibwapi.dll文件放到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.5\bin

添加好包后再运行代码,就可以解决Could not locate zlibwapi.dll. Please make sure it is in your library path!

参考文献

1.解决问题:Could not locate zlibwapi.dll. Please make sure it is in your library path!

2.PadleOCR训练自己的ocr模型之训练步骤

3.PadleOCR训练自己的ocr模型之数据标注及导出

4.PaddleOCR

5.运行环境准备

6.PPOCRLabelv2

7.PaddleOCR 快速开始

8.PaddlePaddle / PaddleOCR Public训练自己的数据集

9.PaddleOCR训练自己的数据集(已踩坑windows10)

10.PaddleOCR训练自己的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

先有JVM还是先有垃圾回收器?

是先有垃圾回收器再有JVM呢,还是先有JVM再有垃圾回收器呢?或者是先有垃圾回收再有JVM呢?历史上还真是垃圾回收更早面世,垃圾回收最早起源于1960年诞生的LISP语言,Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析…

免费思维13招之十一:利润型思维

免费思维13招之十一:利润型思维 免费思维的另一大战略思维——利润型思维。 什么是利润型思维呢?就是用后期的利润来支付现在的成本。也就是“花未来的钱,办现在的事”。 我们在销售自己的产品时候,最容易犯的一个件事,就是降价,我们先来看一个案例: 前几年,有一个卖…

3dmax材质库导入方法?3dmax云渲染速度体验

3ds Max 材质库包含多种素材,如金属、木材、布料和石材等,但用户在导入材质时常遇到问题。本文将介绍如何在3ds Max中成功导入材质,并探讨使用云渲染服务来加速渲染过程,提高项目效率。 一、3dmax材质库导入教程 自建材质导入方法…

【js】获取媒体流实现拍照功能,摄像头切换

<script setup>import {onMounted,reactive,ref} from vueconst videoConstraints reactive({width: 500,height: 300});let picArr reactive([])let videoNode ref(null)let show ref(true)let stream reactive({})onMounted(async () > {// 获取视频流&#xf…

RuoYi-Vue-Plus (Logback 和 logback-plus.xml 、p6spy)

项目后本地日志 一、logback依赖 打开最外层的 pom.xml,查看 SpringBoot的依赖配置。 <dependencyManagement><dependencies><!-- SpringBoot的依赖配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>s…

position:fixed无法固定到父盒子上面的解决方案

目录 问题如图所示&#xff1a; 下面是错误的代码&#xff1a; 解决方案1&#xff1a; 使用fixed固定定位固定到父元素&#xff1a; 解决方案2&#xff1a; 推荐使用的其他方案&#xff08;粘性定位&#xff09;&#xff1a; 什么是粘性定位&#xff1a; 粘性定位的使用…

Leetcode—287. 寻找重复数【中等】(快慢指针算法)

2024每日刷题&#xff08;136&#xff09; Leetcode—287. 寻找重复数 快慢指针算法思想 low fast 时&#xff0c;快慢指针相遇&#xff0c;low 走过的距离是初始点&#xff08;0&#xff09;到环状开始的点 &#xff08;x&#xff09; 加上 环状开始的点&#xff08;x&…

LeetCode2390从字符串中移除星号

题目描述 给你一个包含若干星号 * 的字符串 s 。在一步操作中&#xff0c;你可以&#xff1a;选中 s 中的一个星号。移除星号 左侧 最近的那个 非星号 字符&#xff0c;并移除该星号自身。返回移除 所有 星号之后的字符串。注意&#xff1a;生成的输入保证总是可以执行题面中描…

详细分析Vue3中的ref(附Demo)

目录 前言1. 基本知识2. Demo 前言 由于新项目涉及Vue3&#xff0c;本着探究问题的本质研究所不会的疑问 1. 基本知识 ref 是 Vue 3 中用于创建响应式数据的函数 接收一个初始值并返回一个包含了该值的响应式引用对象与 Vue 2.x 中的 data 属性不同&#xff0c;ref 返回的是…

【已解决】力扣打不开

表现&#xff1a; 1.访问国内其他网站都没有问题 2.访问github也能成功 3.wifi没有问题 4.连接同网络的其他主机能打开 唯独力扣打不开&#xff0c;可能是DNS解析错误 》自己网络配置问题 解决办法【亲测可行】 找可用的hosts 打开站长之家&#xff0c;进行DNS查询&#xff…

卷积网络项目:实现识别鲜花四分类对比LeNet5、VGG16、ResNet18、ResNet34分类网络

卷积四分类项目 Gitee传送门 分类目标选取 鲜花 杏花 apricot_blossom桃花 peach_blossom梨花 pear_blossom梅花 plum_blossom 模型选择 卷积 LeNet5VGG16ResNet18ResNet34 以图搜图 获取相似度前10的搜图结果 数据清洗 鲜花四分类 删除非图片文件 删除重复图片 整理…

【JavaWeb】前后端分离SpringBoot项目快速排错指南

1 发起业务请求 打开浏览器开发者工具&#xff0c;同时显示网络&#xff08;Internet&#xff09;和控制台&#xff08;console&#xff09; 接着&#xff0c;清空控制台和网络的内容&#xff0c;如下图 然后&#xff0c;点击你的业务按钮&#xff0c;发起请求。 首先看控制台…

【C#进阶】简单数据结构类

简单数据结构类 文章目录 1、Arraylist1、ArrayList的本质2、声明3、增删查改4、装箱拆箱思考 背包售卖 2、Stack1、Stack的本质2、声明3、增取查改4、遍历思考 计算一个数的二进制 3、Queue1、Queue的本质2、声明3、增取查改4、遍历思考 每隔一段时间打印一条消息 4、Hashtab…

如何加密保护U盘?U盘加密方法盘点

U盘是目前最常用的移动存储设备&#xff0c;可以帮助我们存储大量数据。而为了保护数据安全&#xff0c;我们需要加密保护U盘。下面我们就来盘点一下U盘加密的方法。 BitLocker加密 BitLocker是Windows的一种磁盘保护工具&#xff0c;通过加密整个磁盘来保护数据&#xff0c;同…

基于Springboot的校园疫情防控信息管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园疫情防控信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

Vscode编辑器 js 输入log自动补全

最近换了新电脑&#xff0c;新下载了Vscode&#xff0c;记录一下设置项。 Vscode 版本 想要的效果 js文件中输入log&#xff08;点击tab键&#xff09;&#xff0c;自动补全为 console.log() Vscode 文件》首选项》设置 搜索&#xff1a;snippets Emmet: Show Suggestions…

暗区突围TWITCH掉宝领测试资格后,steam激活显示是无效激活码

自《暗区突围》测试启动以来&#xff0c;吸引了大量玩家关注&#xff0c;特别是通过在Twitch平台上观看直播即可获得测试资格的活动&#xff0c;更是掀起了热潮。然而&#xff0c;部分玩家在成功获得激活码后&#xff0c;在Steam平台激活时遭遇了“无效激活码”的问题。本文将提…

nginx 配置域名SSL证书HTTPS服务

下载 上传根目录 /home/wwwroot/xx.com/ssl 从新执行 添加域名命令 选择添加SSL SSL Certificate file: 填写 完整目录 PEM文件地址 SSL Certificate Key file:填写 完整目录 key文件地址

python 对矩阵与矩阵之间对应位置的元素,做softmax操作,代码实战

1.对矩阵中对应位置的元素&#xff0c;做softmax 对于一个向量&#xff0c;softmax函数会对其中每一个元素进行指数运算&#xff0c;然后除以所有元素指数和的结果。当将其应用到多个矩阵的相应位置上时&#xff0c;我们实际上是在对每个位置的一组数&#xff08;从各个矩阵的同…

45.WEB渗透测试-信息收集-域名、指纹收集(7)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;计算机王-CSDN博客 WEB指纹&#xff1a;Web指纹也叫web应用指纹。由于所使用的工具、技术…