paddleOCR踩坑记

2023-11-15

训练莫名终止或者评估莫名终止

这是因为在tools/program.py文件里有一句逻辑关系语言出错了,需要进行如下修改。

if idx >= len(train_dataloader):
	break
#把上面这句话修改成下面这个
if idx >= len(train_dataloader)-1:
	break

注意,有两个地方都要这样改,train里面和eval里面。

训练和评估的效果都特别好,预测的效果却特别差

这个是数据预处理的问题,paddleOCR官方给的推理程序里数据预处理的方式和训练程序里数据预处理的方式不完全一样,导致了训练时输入神经网络的张量维度和预测时输入神经网络的张量维度不一样,所以即使权重训练得很好,预测效果也会出现偏差。更改方式如下。
首先,要确保训练的配置文件里image_shape参数和推理的参数设置里rec_image_shape参数的值要是一样的,训练的配置文件在configs/rec里面,推理的参数设置在tools/infer/utility.py文件里面。
然后,更改tools/infer/predict_rec.py的代码,如下。

def resize_norm_img(self, img, max_wh_ratio):
    imgC, imgH, imgW = self.rec_image_shape
    assert imgC == img.shape[2]
    if self.character_type == "ch":
        imgW = int((32 * max_wh_ratio))
    h, w = img.shape[:2]
    ratio = w / float(h)
    if math.ceil(imgH * ratio) > imgW:
         resized_w = imgW 
     else:
         resized_w = int(math.ceil(imgH * ratio)) 
     resized_image = cv2.resize(img, (resized_w, imgH)) 
     resized_image = resized_image.astype('float32')
     resized_image = resized_image.transpose((2, 0, 1)) / 255
     resized_image -= 0.5
     resized_image /= 0.5
     padding_im = np.zeros((imgC, imgH, imgW), dtype=np.float32) 
     padding_im[:, :, 0:resized_w] = resized_image
     return padding_im
 #把上面这个函数改成下面这个
 def resize_norm_img(self, img, max_wh_ratio):
    imgC, imgH, imgW = self.rec_image_shape
    hh=imgW #源码没有这个,导致数据处理不对,会影响推理识别效果
    assert imgC == img.shape[2]
    if self.character_type == "ch":
        imgW = int((32 * max_wh_ratio))
    h, w = img.shape[:2]
    ratio = w / float(h)
    if math.ceil(imgH * ratio) > imgW:
        resized_w = imgW 
    else:
        resized_w = int(math.ceil(imgH * ratio)) 
    resized_image = cv2.resize(img, (resized_w, imgH)) 
    resized_image = resized_image.astype('float32')
    resized_image = resized_image.transpose((2, 0, 1)) / 255
    resized_image -= 0.5
    resized_image /= 0.5
    padding_im = np.zeros((imgC, imgH, hh), dtype=np.float32)  #hh用在这里
    padding_im[:, :, 0:resized_w] = resized_image
    return padding_im

使用gen_label.py报错

如果直接用官网下载下来的程序,安装官网操作走,会出现如下这个错误

UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence

修改方式是在open的参数里面加入encoding=‘utf-8’,但是加入之后,还会出现一个错误,如下。

UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence

这个错误的修改方式得知道程序的具体处理原理才行,修改方式如下:

#把程序中的这一行
b = [int(t) for t in b]
#改成如下
b = [int(b[0].encode('utf-8').decode('utf-8-sig')),int(b[1])]

然后gen_label.py就可以正常运行了!

将paddleOCR转成pytorch框架

如果要将paddleOCR部署在arm架构上,这是非常不方便的一件事,因为针对arm结构的paddlepaddle框架不是很常用,容易出现各种各样的bug,特别是要用Nvidia jetson盒子部署paddle算法,使用tensorrt或deepstream加速推理的时候,几乎无从下手。这个时候我们可以避免这个难坑,先把paddlepaddle版的paddleOCR转换成pytorch框架的paddleOCR(参考https://github.com/frotms/PaddleOCR2Pytorch),然后再在arm架构上部署pytorch框架的算法,这样就会顺利很多了。
但是在这个把paddleOCR转成pytorch框架的项目里,有一个地方有点错误,导致如果检测网络的backbone用的是MobileNetV3small时,会出错。解决方案如下。
找到文件pytorchocr/modeling/backbones/det_mobilenet_v3.py
然后将类MobileNetV3中的

se = se and not self.disable_se
if s == 2 and i > 2:

改成:

se = se and not self.disable_se
start_idx = 2 if model_name == 'large' else 0
if s == 2 and i > start_idx:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

paddleOCR踩坑记 的相关文章

随机推荐

  • Java+seleinum+IDEA环境搭建

    本机Win7 64位 chrome36 IDEA Java 8 selenium3 1 安装Java 本地安装Java8的jdk 配置环境变量 具体方法自己百度 2 安装IDEA 默认安装即可 3 安装selenium及驱动 a 下载sel
  • python append 覆盖数据

    更多文章详见 python append 覆盖数据 自我的进化https www shanxing top p 205 问题 使用append为list添加object的时候 有时候会出现后面的object将前面的几个给覆盖的情况 原因 当
  • QT里的网络通信简介

    QTcpSocket类简介 QTcpSocket类提供了一个TCP套接字 TCP 传输控制协议 是一种可靠的 面向流的 面向连接的传输协议 它特别适合数据的连续传输 QTcpSocket是QAbstractSocket的一个子类 它允许您建
  • 图像分割评价指标: Dice, MIoU, MPA等

    目录 1 混淆矩阵 2 Dice 3 MIoU 4 MPA 仅为个人结合一些博客的理解 1 混淆矩阵 如果是k 1分类问题 就会生成 k 1 k 1 的混淆矩阵 具体定义可参见百度百科 下面以肺结节分割为例 显然这是一个二分类的问题 肺结节
  • 菜鸟求职记1

    熬过了黑色的六月 我和往届的学长学姐一样 背着书包 拎着行李箱 开始了XV的求职之路 忙里偷闲 今天没有招聘会 一整天都在寝室 想着这几天的忙碌身影 我觉着应该将此点滴记录下来 以激励我以后的人生 9月10日 我们早上5点多开始从延安赶往西
  • Tornado 多进程分析(转载)

    引子 Tornado 是一个网络异步的的web开发框架 并且可以利用多进程进行提高效率 下面是创建一个多进程 tornado 程序的例子 usr bin env python coding utf 8 import os import ti
  • webpack5 基础配置(7) eslint-ts的使用和在webpack中的配置 加载vue文件

    上一节最后讲到了typescript的使用 ts loader本质上也是利用与tsc 所以安装ts loader的同时需要安装typescript 如果你没安装typescript 在你安装ts loader的时候 会根据ts loader
  • Git回退分支到某版本

    1 找到要回退的版本号 TortoiseGit gt Show Log gt 选中要回退的版本 gt Reset xxx to this gt commit旁复制版本号 2 本地回退到某版本 git reset hard 9224ad994
  • Idea 中 Docker 的 log 乱码

    IDEA 本地调试代码中英文显示全部正常 但是用 idea 中的 docker 插件部署到服务器 再查看 容器中 log 的时候 log 里面的中文全是乱码 就开启了一段排查过程 开始一个个排查 程序员的日常 查看容器中语言 字符集 环境
  • 【Android】java.lang.UnsatisfiedLinkError: No implementation found for void xx xx xx -- 问题解决

    Android在开发过程中总会出现各种各样的bug 要想畅通无阻的完成一个app的 开发工作固然有点难度 这不 我的程序跑着跑着又报错了 AndroidRuntime FATAL EXCEPTION Thread 4903 Process
  • 反汇编二进制代码

    最近又做了一些内核hook的工作 繁琐的地方在于二进制指令的可读性上 下面简要记录dump出指令二进制 之后利用binutils来转成可读的汇编代码 hook的主要流程参考之前的linux内核态hook模块 splice 主要就是构建一个t
  • 理解MySQL回表

    回表就是先通过数据库索引扫描出数据所在的行 再通过行主键id取出索引中未提供的数据 即基于非主键索引的查询需要多扫描一棵索引树 因此 可以通过索引先查询出id字段 再通过主键id字段 查询行中的字段数据 即通过再次查询提供MySQL查询速度
  • Java编程——输出1000以内的素数(质数)

    素数的定义是什么 质数 prime number 又称素数 有无限个 一个大于1的自然数 除了1和它本身外 不能被其他自然数 质数 整除 换句话说就是该数除了1和它本身以外不再有其他的因数 否则称为合数 public class demo7
  • STM32库函数TIM_SetCompare()的工作机制测试

    一 TIM SetCompare 函数的定义 其中 TIM SetCompareX 这个函数有四个 它们为 TIM SetCompare1 TIM SetCompare2 TIM SetCompare3 TIM SetCompare4 同时
  • 引脚悬空是什么电平_STM32单片机必须掌握的八种IO口模式和引脚配置方式

    八种IO口模式 STM32有八种IO口模式 分别是 模拟输入 浮空输入 上拉输入 下拉输入 开漏输出 推挽输出 复用开漏输出和复用推挽输出 1 模拟输入 GPIO Mode AIN模拟输入 即关闭施密特触发器 将电压信号传送到片上外设模块
  • 关于STM32F103 TIM2重映射

    关于STM32F103 TIM2重映射 如何使用重映射和如何重映射为哪些管脚 这里不详细讲解 可以百度找到 下面讲的是tim2重映射为PA15 PB3 PB10 PB11 这里的设置网上也有讲解 但是如果功能较为复杂的程序 外设用的比较多的
  • 黑马JVM总结(五)

    1 方法区 它是所有java虚拟机 线程共享的区 存储着跟类的结构相关的信息 类的成员变量 方法数据 成员方法 构造器方法 特殊方法 类的构造器 方法区在虚拟机启动时被创建 方法区逻辑上是堆的组成部分 但是不同的JVM厂商实现是不一样的 O
  • 进程,线程,协程总结

    进程 三种状态 就绪态 运行的条件都已经慢去 正在等在cpu执行 执行态 cpu正在执行其功能 等待态 等待某些 条件满足 例如一个程序sleep了 此时就处于等待态 生命周期 用户编写代码 代码本身是以进程运行的 启动程序 进入进程 就绪
  • Eclipse搭建stm32+jlink开发环境全攻略

    Eclipse搭建stm32 jlink开发环境全攻略 初级篇 前言 为什么需要这样的开发环境 免费 跨平台 自由度高 Eclipse代码提示功能强大 MDK弱爆了 注 本人原创 转载注明作者 by 秋之前 email xia mengli
  • paddleOCR踩坑记

    paddleOCR踩坑记 训练莫名终止或者评估莫名终止 训练和评估的效果都特别好 预测的效果却特别差 使用gen label py报错 将paddleOCR转成pytorch框架 训练莫名终止或者评估莫名终止 这是因为在tools prog