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

news2024/10/6 4:13:01

一、前期准备

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:NoneType
        print(f"[DEBUG] Empty page {idx+1} detected, skip it.")
        continue
    for 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 image
        if 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:
        continue
    image = 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 Image


def batch_ocr(input_dir, output_dir):
    from paddleocr import PaddleOCR, draw_ocr

    ocr = 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.coloradmin.cn/o/1677107.html

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

相关文章

HTML静态网页成品作业(HTML+CSS)——自动化专业介绍设计制作(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

从需求到实现:能源软件服务商如何量身定制企业解决方案

能源行业需要数字化转型的原因主要有以下几点:首先,数字化技术可以提高生产效率和安全性,通过实时监控和智能调度降低事故风险,并实现远程控制和自动化生产。其次,数字化转型有助于推动能源行业的创新发展,…

Android ndk获取手机内部存储卡的根目录方法

如下所示: 代码语言:javascript jclass envcls env- FindClass("android/os/Environment"); //获得类引用if (envcls nullptr) return 0;//找到对应的类,该类是静态的返回值是FilejmethodID id env- GetStaticMethodID(envcls,…

Nodejs 第七十章(OSS)

OSS OSS(Object Storage Service)是一种云存储服务,提供了一种高度可扩展的、安全可靠的对象存储解决方案 OSS 对象存储以对象为基本存储单元,每个对象都有唯一的标识符(称为对象键)和数据。这些对象可以…

Java | Leetcode Java题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> t new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> subsetsWithDup(int[] nums) {Arra…

oracle多条重复数据,取最新的

1、原理讲解-可直接看2 筛选出最新的 SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY LOCALAUTHID ORDER BY LASTUPDATETIME DESC) AS rn FROM USER_LOCALAUTH_STATE t ) t WHERE t.rn 1; 解释&#xff1a; 这个序号是基于[LOCALAUTHID]字段进行分…

前端 finalShell 与 docker 创建 服务连接 部署项目

准备 fianlShell 下载地址 官网下载地址 要哪个下那个&#xff0c; 我的是第一个 下载后 安装 打开 选择 SSH 进行配置 配置后点击确定即可 1、yum install -y docker -y 表示不询问&#xff0c;使用默认配置进行安装 检测版本 装最新的 2、 yum list installed | gre…

wangeditor覆盖el-select下拉框解决方法

问题&#xff1a; 发现wangeditor的层级过高&#xff0c;一开始一直想要修改全局css&#xff0c;奈何半天找不到&#xff0c;网上一大堆解决方法都无法生效&#xff0c;自定义的css样式也无法覆盖。 如果有尝试好久的朋友可以参考我的解决方案&#xff1a; 关键语句&#xf…

关于JVM内存模型和堆内存模型的理解

文章目录 前言一、JVM 内存模型的理解1.第一部分&#xff1a;线程共享区&#xff08;堆和方法区&#xff09;2.第二部分&#xff1a;线程独占区&#xff08;程序计数器、虚拟机栈和本地方法栈&#xff09;3.JVM的几个知识点3.1 垃圾回收就指线程共享区&#xff08;堆和方法区&a…

3.3 整型

本节必须掌握的知识点&#xff1a; 整型数据类型的取值范围 示例八 代码分析 汇编解析 获取数据类型的取值范围 3.3.1 整型数据类型取值范围 整型是用来表示限定范围内连续整数的数据类型。表3-1列出了C语言编译器定义的整型数据类型及其大小和取值范围。 类型 存储大小…

【卫星影像三维重建随记】obj模型及其纹理材质文件介绍

obj模型及纹理材质介绍 1.介绍1.1 背景1.2 带有纹理色彩的obj三维模型 2.带有纹理信息obj三维模型文件解析2.1 三维模型数据2.2 obj文件内容2.3mtl文件内容 3 参考 1.介绍 1.1 背景 OBJ格式是一种简单且通用的三维模型文件格式&#xff0c;支持多边形网格和基本的几何体类型&…

IDEA运行main方法,为什么要编译整个工程?

每次在IDEA中导入工程后&#xff0c;想写一个类去测试一些数据&#xff0c;有时候只是写一个main方法进行简单的输出&#xff1b; 但是每次运行一个main方法&#xff0c;整个工程都会重新编译一下&#xff0c;耗时不短 在Eclipse就不会有这个问题&#xff1b; 为什么会编译整…

华为昇腾310B1平台视频解码失败[ERROR] Send frame to vdec failed, errorno:507018

目录 1 [ERROR] Send frame to vdec failed, errorno:507018 2 bug解决尝试1 3 bug解决尝试2 4 最终解决方法 参考文献&#xff1a; 1 [ERROR] Send frame to vdec failed, errorno:507018 某项目中的代码运行报错 [ERROR] Send frame to vdec failed, errorno:507018 Ac…

Spring Boot:异常处理

Spring Boot 前言使用自定义错误页面处理异常使用 ExceptionHandler 注解处理异常使用 ControllerAdvice 注解处理异常使用配置类处理异常使用自定义类处理异常 前言 在 Spring Boot 中&#xff0c;异常处理是一个重要的部分&#xff0c;可以允许开发者优雅地处理应用程序中可…

平地惊雷,GPT-4o 凌晨震撼发布

GPT-4o 今日凌晨&#xff0c;OpenAI 2024 年春季发布会召开&#xff0c;OpenAI 通过短短 28 分钟的发布会&#xff0c;发布了「再次震惊世界」的 GPT-4o&#xff0c;其中 o 是指 omni&#xff08;全能&#xff09;的意思。 一款「全新交互&#xff08;支持 文本/音频/视频 组合…

平安养老险深圳分公司携手福海街道开展5.12防灾减灾活动

在构建和谐社会、倡导人文关怀的当下&#xff0c;平安养老险深圳分公司以高度的社会责任感和深厚的人文情怀&#xff0c;持续关注老年人的健康与安全。在今年“5.12防灾减灾日”来临之际&#xff0c;公司积极响应倡议&#xff0c;于5月10日携手福海街道举办了一场别开生面的消防…

web学习记录--(5.14)

1.Sublime安装与汉化 直接点击windows即可下载&#xff0c;安装即可 Thank You - Sublime Text 汉化 Install Package ChineseLocalzation 2.PHPstorm下载以及激活,汉化 直接下载&#xff0c;然后找激活码激活即可 汉化 plugins&#xff08;插件&#xff09;/chinese&…

【源码】相亲交友系统全新UI/情感测试/婚庆中介/交友系统

【交友】相亲交友系统全新UI/情感测试/婚庆中介/交友系统 带商城&#xff0c;情感测试。 https://www.52codes.cc/codes/qt

YOLOv5改进 | 主干网络 | 在backbone添加Swin-Transformer层

尽管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作为一个anchor base的目标检测的算法&#xff0c;YOLOv5可能比YOLOv8的效果更好。注意力机制是提高模型性能最热门的方法之一&#xff0c;本文给大家带来的教程是添加Swin-Transformer到backbone中。文章在介绍主要的原…

C# OpenCvSharp Demo - 最大内接圆

C# OpenCvSharp Demo - 最大内接圆 目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Windows.Forms; namespace OpenCvSh…