在全新ubuntu上用gpu训练paddleocr模型遇到的坑与解决办法

目录

  • 一. 我的ubuntu版本![在这里插入图片描述](https://img-blog.csdnimg.cn/297945917309494ab03b50764e6fb775.png)
  • 二.首先拉取paddleocr源代码
  • 三.下载模型
  • 四.训练前的准备
  • 1.在源代码文件夹里创造一个自己放东西的文件
  • 2.准备数据
    • 2.1数据标注
    • 2.2数据划分
  • 3.改写yml配置文件
  • 4.安装anaconda
  • 五.开始训练
  • 六.报错
    • (1) libGL.so.1
    • (2)Polygon
    • (3) lanms
  • (4)报错UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xbc in position 2: invalid start byt
  • (5)Out of memory error on GPU 0. Cannot allocate xxxxMB memory on GPU 0, xxxxGB memory has been allocated and available memory is only 0.000000B.

一. 我的ubuntu版本在这里插入图片描述

二.首先拉取paddleocr源代码

下载地址:https://gitee.com/paddlepaddle/PaddleOCR

三.下载模型

  • 我要训练一个中文模型,看到该预训练模型泛化性能最优,于是下载这个模型
    https://gitee.com/link?target=https%3A%2F%2Fpaddleocr.bj.bcebos.com%2FPP-OCRv3%2Fchinese%2Fch_PP-OCRv3_rec_train.tar

  • 其他模型地址:https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/models_list.md

四.训练前的准备

1.在源代码文件夹里创造一个自己放东西的文件

在这里插入图片描述

  • config文件夹用来装yml配置文件
    pretrained_model用来装上一步下载的预训练模型
    split_rec_label用来放数据集
    output用来放训练出的模型

  • 创建文件夹非强制,只是这样更方便管理自己文件,yml源文件地址就在
    PaddleOCR-release-2.6/configs/rec/PP-OCRv3这个路径下

2.准备数据

2.1数据标注

参考博客:https://blog.csdn.net/qq_49627063/article/details/119134847

2.2数据划分

在训练之前,所有图片都在一个文件夹中,所有label信息都在同一个txt文件中,因此需要编写脚本,将其按照8:1:1的比例进行分割。

import os
import re
import shutil
import random
import argparsedef split_label(all_label, train_label, val_label, test_label):f = open(all_label, 'r')f_train = open(train_label, 'w')f_val = open(val_label, 'w')f_test = open(test_label, 'w')raw_list = f.readlines()num_train = int(len(raw_list) * 0.8)num_val = int(len(raw_list) * 0.1)num_test = int(len(raw_list) * 0.1)random.shuffle(raw_list)for i in range(num_train):f_train.writelines(raw_list[i])for i in range(num_train, num_train + num_val):f_val.writelines(raw_list[i])for i in range(num_train + num_val, num_train + num_val + num_test):f_test.writelines(raw_list[i])f.close()f_train.close()f_val.close()f_test.close()def split_img(all_imgs, train_label, train_imgs, val_label, val_imgs, test_label, test_imgs):f_train = open(train_label, 'r')f_val = open(val_label, 'r')f_test = open(test_label, 'r')train_list = f_train.readlines()val_list = f_val.readlines()test_list = f_test.readlines()for i in range(len(train_list)):img_path = os.path.join(all_imgs, re.split("[/\t]", train_list[i])[1])shutil.move(img_path, train_imgs)for i in range(len(val_list)):img_path = os.path.join(all_imgs, re.split("[/\t]", val_list[i])[1])shutil.move(img_path, val_imgs)for i in range(len(test_list)):img_path = os.path.join(all_imgs, re.split("[/\t]", test_list[i])[1])shutil.move(img_path, test_imgs)def get_args():parser = argparse.ArgumentParser()parser.add_argument("--all_label", default="../paddleocr/PaddleOCR/train_data/cls/cls_gt_train.txt")parser.add_argument("--all_imgs_dir", default="../paddleocr/PaddleOCR/train_data/cls/images/")parser.add_argument("--train_label", default="../paddleocr/PaddleOCR/train_data/cls/train.txt")parser.add_argument("--train_imgs_dir", default="../paddleocr/PaddleOCR/train_data/cls/train/")parser.add_argument("--val_label", default="../paddleocr/PaddleOCR/train_data/cls/val.txt")parser.add_argument("--val_imgs_dir", default="../paddleocr/PaddleOCR/train_data/cls/val/")parser.add_argument("--test_label", default="../paddleocr/PaddleOCR/train_data/cls/test.txt")parser.add_argument("--test_imgs_dir", default="../paddleocr/PaddleOCR/train_data/cls/test/")return parser.parse_args()def main(args):if not os.path.isdir(args.train_imgs_dir):os.makedirs(args.train_imgs_dir)if not os.path.isdir(args.val_imgs_dir):os.makedirs(args.val_imgs_dir)if not os.path.isdir(args.test_imgs_dir):os.makedirs(args.test_imgs_dir)split_label(args.all_label, args.train_label, args.val_label, args.test_label)split_img(args.all_imgs_dir, args.train_label, args.train_imgs_dir, args.val_label, args.val_imgs_dir, args.test_label, args.test_imgs_dir)if __name__ == "__main__":main(get_args())

3.改写yml配置文件

  • 源地址:https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.6/configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml
Global:debug: falseuse_gpu: trueepoch_num: 800log_smooth_window: 20print_batch_step: 10save_model_dir: wjp/output/rec_ppocr_v3_distillationsave_epoch_step: 3eval_batch_step: [0, 2000]cal_metric_during_train: truepretrained_model:checkpoints:save_inference_dir:use_visualdl: falseinfer_img: doc/imgs_words/ch/word_1.jpgcharacter_dict_path: ppocr/utils/ppocr_keys_v1.txtmax_text_length: &max_text_length 25infer_mode: falseuse_space_char: truedistributed: truesave_res_path: wjp/output/rec/predicts_ppocrv3_distillation.txtOptimizer:name: Adambeta1: 0.9beta2: 0.999lr:name: Piecewisedecay_epochs : [700]values : [0.0005, 0.00005]warmup_epoch: 5regularizer:name: L2factor: 3.0e-05Architecture:model_type: &model_type "rec"name: DistillationModelalgorithm: DistillationModels:Teacher:pretrained:freeze_params: falsereturn_all_feats: truemodel_type: *model_typealgorithm: SVTRTransform:Backbone:name: MobileNetV1Enhancescale: 0.5last_conv_stride: [1, 2]last_pool_type: avgHead:name: MultiHeadhead_list:- CTCHead:Neck:name: svtrdims: 64depth: 2hidden_dims: 120use_guide: TrueHead:fc_decay: 0.00001- SARHead:enc_dim: 512max_text_length: *max_text_lengthStudent:pretrained:freeze_params: falsereturn_all_feats: truemodel_type: *model_typealgorithm: SVTRTransform:Backbone:name: MobileNetV1Enhancescale: 0.5last_conv_stride: [1, 2]last_pool_type: avgHead:name: MultiHeadhead_list:- CTCHead:Neck:name: svtrdims: 64depth: 2hidden_dims: 120use_guide: TrueHead:fc_decay: 0.00001- SARHead:enc_dim: 512max_text_length: *max_text_length
Loss:name: CombinedLossloss_config_list:- DistillationDMLLoss:weight: 1.0act: "softmax"use_log: truemodel_name_pairs:- ["Student", "Teacher"]key: head_outmulti_head: Truedis_head: ctcname: dml_ctc- DistillationDMLLoss:weight: 0.5act: "softmax"use_log: truemodel_name_pairs:- ["Student", "Teacher"]key: head_outmulti_head: Truedis_head: sarname: dml_sar- DistillationDistanceLoss:weight: 1.0mode: "l2"model_name_pairs:- ["Student", "Teacher"]key: backbone_out- DistillationCTCLoss:weight: 1.0model_name_list: ["Student", "Teacher"]key: head_outmulti_head: True- DistillationSARLoss:weight: 1.0model_name_list: ["Student", "Teacher"]key: head_outmulti_head: TruePostProcess:name: DistillationCTCLabelDecodemodel_name: ["Student", "Teacher"]key: head_outmulti_head: TrueMetric:name: DistillationMetricbase_metric_name: RecMetricmain_indicator: acckey: "Student"ignore_space: FalseTrain:dataset:name: SimpleDataSetdata_dir: wjp/split_rec_label/trainext_op_transform_idx: 1label_file_list:- wjp/split_rec_label/train.txttransforms:- DecodeImage:img_mode: BGRchannel_first: false- RecConAug:prob: 0.5ext_data_num: 2image_shape: [48, 320, 3]max_text_length: *max_text_length- RecAug:- MultiLabelEncode:- RecResizeImg:image_shape: [3, 48, 320]- KeepKeys:keep_keys:- image- label_ctc- label_sar- length- valid_ratioloader:shuffle: truebatch_size_per_card: 32drop_last: truenum_workers: 4
Eval:dataset:name: SimpleDataSetdata_dir: wjp/split_rec_label/vallabel_file_list:- wjp/split_rec_label/val.txttransforms:- DecodeImage:img_mode: BGRchannel_first: false- MultiLabelEncode:- RecResizeImg:image_shape: [3, 48, 320]- KeepKeys:keep_keys:- image- label_ctc- label_sar- length- valid_ratioloader:shuffle: falsedrop_last: falsebatch_size_per_card: 128num_workers: 4

4.安装anaconda

参考博客:https://blog.csdn.net/wyf2017/article/details/118676765

  • 创建python虚拟环境
conda create -n ppocr
  • 切换虚拟环境
source activate ppocr

五.开始训练

python tools/train.py -c wjp/ch_PP-OCRv3_rec_distillation.yml -o Global.pretrained_model=wjp/ch_PP-OCRv3_rec_train/best_accuracy
//-c参数放配置文件地址,-o参数放预训练模型地址

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple

六.报错

(1) libGL.so.1

ImportError: libGL.so.1: cannot open shared object file: No such file or directory
  • 解决办法:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python-headless

(2)Polygon

ModuleNotFoundError: No module named 'Polygon'
  • 解决办法:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Polygon3

(3) lanms

ModuleNotFoundError: No module named 'lanms'

源码下载地址:https://github.com/AndranikSargsyan/lanms-nova/tree/master

参考我这个教程编译:http://t.csdnimg.cn/BqOW6

  • 将__init __.py文件替换
import numpy as npdef merge_quadrangle_n9(polys, thres=0.3, precision=10000):if len(polys) == 0:return np.array([], dtype='float32')p = polys.copy()p[:, :8] *= precisionret = np.array(merge_quadrangle_n9(p, thres), dtype='float32')ret[:, :8] /= precisionreturn ret
  • 找到linux种anaconda的包放在什么地方
pip show numpy

在这里插入图片描述
就知道该环境下的包安装地址

  • 将编译好库的整个lanms文件夹移动到该地址去即可调用

(4)报错UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xbc in position 2: invalid start byt

f = open('txt01.txt',encoding='utf-8')

将 encoding=’utf-8’ 改为GB2312、gbk、ISO-8859-1,随便尝试一个均可以

(5)Out of memory error on GPU 0. Cannot allocate xxxxMB memory on GPU 0, xxxxGB memory has been allocated and available memory is only 0.000000B.

将训练的配置yml文件中的batch_size_per_card参数不断改小(除以2),直到不再报这个错即可。
在这里插入图片描述

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

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

相关文章

PostGreSQL:数据表继承

PostGreSQL手册的简史部分介绍到:被称为PostGreSQL的对象关系型数据库管理系统,由美国加州大学伯克利 分校编写的POSTGRES软件包发展而来。经过十几年的发展,PostGreSQL目前是世界上最先进的开源数据库。 The object-relational database man…

Vue 的双向数据绑定是如何实现的?

目录 1. 响应式数据 2. v-model 指令 3. 实现原理 4. 总结 Vue.js 是一款流行的前端 JavaScript 框架,它以其强大的双向数据绑定能力而闻名。双向数据绑定使得数据在视图和模型之间保持同步,并且任一方的变化都会自动反映到另一方。那么,…

2021-arxiv-GPT Understands, Too

2021-arxiv-GPT Understands, Too Paper: https://arxiv.org/abs/2103.10385 Code: https://github.com/THUDM/P-tuning Prompt 简单理解 举例来讲,今天如果有这样两句评论: 1. 什么苹果啊,都没有苹果味&#xff0c…

rust std

目录 一,std基本数据结构 1,std::option 2,std::result 二,std容器 1,vector 三,std算法 1,排序 2,二分 (1)vector二分 (2)…

【C++代码】分割等和子集,目标和,一和零,零钱兑换,动态规划--代码随想录

题目&#xff1a;分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 初步想法排序后双指针&#xff0c;发现不行 class Solution { public:bool canPartition(vector<int>&…

计讯物联外贸公司--佰沃恩应邀出席第三届“嘉庚论坛”—科技创新推动经济高质量发展分论坛

10月22日&#xff0c;以“数智创新能动未来”为主题的第三届“嘉庚论坛”—科技创新推动经济高质量发展分论坛于集美海景皇冠假日酒店正式启幕。此论坛聚焦集美区战略前沿产业&#xff0c;汇聚来自全国各地优秀的企业家、高校及科研院所专家学者&#xff0c;并邀请相关领域的亲…

【案例实战】NodeJS+Vue3+MySQL实现列表查询功能

这篇文章&#xff0c;给大家带来一个列表查询的功能&#xff0c;从前端到后端的一个综合案例实战。 采用vue3作为前端开发&#xff0c;nodejs作为后端开发。 首先我们先来看一下完成的页面效果。点击分页&#xff0c;可以切换到上一页、下一页。搜索框可以进行模糊查询。 后端…

CSRF 篇

一、CSRF 漏洞&#xff1a; 1、漏洞概述&#xff1a; &#xff08;1&#xff09;一般情景&#xff1a; 利用已认证用户的身份执行未经用户授权的操作。攻击者试图欺骗用户在其不知情的情况下执行某些操作&#xff0c;通常是在受害者已经登录到特定网站的情况下。 &#xff0…

长沙某公司面经总结 - 失败版

1.Java语言的特征 Java的三大特性&#xff1a;封装、继承、多态 面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征&#xff1a; 继承&#xff1a;继承是从已有类得到继承信息创建新类的过程 封装&#xff1a;封装是把数据和操作数据的方法绑定起来&#xff0c;对…

IP地址与代理ip在网络安全中的关键作用

目录 前言 一、IP地址在网络安全中的作用 1、网络流量监视和分析 2、网络安全事件响应 3、网络安全检测和防御 二、代理IP在网络安全中的作用 1、流量过滤和清洗 2、匿名访问和保护隐私 3、实现全球化业务 三、IP地址和代理IP在网络安全中的应用案例 1、DDoS攻击 2…

QT实现在线流媒体播放平台

文章目录 QT实现在线流媒体播放平台简介开发视频ffmpeg下载SimpleVideoPlayer.hSimpleVideoPlayer.cpp 开发音频添加功能打开文件夹播放暂停播放上下一首选择倍速 效果展示项目下载 QT实现在线流媒体播放平台 简介 Qt是一种流行的C开发框架&#xff0c;它提供了用于构建图形用…

AT32固件库外设使用,ArduinoAPI接口移植,模块化

目录 一、ArduinoAPI移植一、通用定时器使用1.计时1.2.ETR外部时钟计数4.ArduinoAPI - timer 三、ADC1.ADC初始化&#xff08;非DMA&#xff09;2.ADC_DMA 规则通道扫描 六、USB HID IAP1.准备好Bootloader和app2.配置好时钟&#xff0c;一定要打开USB3.将生成的时钟配置复制到…

Mybatis执行流程简析

一、前言 日常工作中&#xff0c;我们用到mybatis的时候&#xff0c;都是写一个Mapper接口xml文件/注解形式&#xff0c;然后就可以在业务层去调用我们在Mapper接口中定义的CRUD方法&#xff0c;很方便&#xff0c;但一直都没有去研究过执行逻辑&#xff0c;下面附一篇我自己研…

使用simple_3dviz进行三维模型投影

【版权声明】 本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 更多算法总结请关注我的博客&#xff1a;https://blog.csdn.net/suiyingy&#xff0c;或”乐乐感知学堂“公众号。 本文章来自于专栏《Python三维模型处理基础》的系列文…

飞鹅打印机使用注意事项:打印小票(云播报打印机)FP-V58-W(c)

文章目录 引言I 基础操作1.1 设置Wi-Fi1.2 在机器内预先内置logo 引言 应用场景&#xff1a; 云播报打印机&#xff1a;支持第三方软件开发商&#xff0c;接单后实现智能语音播报&#xff0c;可播报订单信息、打印订单小票。 http://www.feieyun.com/open/index.html 飞鹅对…

Android OpenGL ES 2.0入门实践

本文既然是入门实践&#xff0c;就先从简单的2D图形开始&#xff0c;首先&#xff0c;参考两篇官方文档搭建个框架&#xff0c;便于写OpenGL ES相关的代码&#xff1a;构建 OpenGL ES 环境、OpenGL ES 2.0 及更高版本中的投影和相机视图。 先上代码&#xff0c;代码效果如下图…

WPF自定义控件库之Window窗口

在WPF开发中&#xff0c;默认控件的样式常常无法满足实际的应用需求&#xff0c;我们通常都会采用引入第三方控件库的方式来美化UI&#xff0c;使得应用软件的设计风格更加统一。常用的WPF的UI控件库主要有以下几种&#xff0c;如&#xff1a;Modern UI for WPF&#xff0c;Mat…

Elasticsearch:使用 Elasticsearch 进行词汇和语义搜索

作者&#xff1a;PRISCILLA PARODI 在这篇博文中&#xff0c;你将探索使用 Elasticsearch 检索信息的各种方法&#xff0c;特别关注文本&#xff1a;词汇 (lexical) 和语义搜索 (semantic search)。 使用 Elasticsearch 进行词汇和语义搜索 搜索是根据你的搜索查询或组合查询…

0基础学习PyFlink——使用DataStream进行字数统计

大纲 sourceMapSplittingMapping ReduceKeyingReducing 完整代码结构参考资料 在《0基础学习PyFlink——模拟Hadoop流程》一文中&#xff0c;我们看到Hadoop在处理大数据时的MapReduce过程。 本节介绍的DataStream API&#xff0c;则使用了类似的结构。 source 为了方便&…