当前位置: 首页 > news >正文

PPStructure核心源码研究(三)LayoutPredictor类详解

总论中对PPStructure核心类做了概要介绍,本文旨在详解核心类之一:LayoutPredictor类。
回顾下总论中的内容,LayoutPredictor类负责版面分析,用于获取图片中各版面要素的边界框、类别标签、置信度等信息。代码在paddleocr/ppstructure/layout/predict_layout.py文件中。
本文首先详细解释LayoutPredictor类的__init__与__call__方法,接着通过应用场景代码实践,进一步了解该类的实现原理与用法。

构造函数__init__方法

构造函数用于构造LayoutPredictor类的实例,是使用该类的前提。构造函数位于predict_layout.py文件的第39行,定义如下:

def __init__(self, args)

可见,只要传入一个参数对象args即可,系统并没有对参数对象的类进行任何约束,看起来非常简单。但是,如果仔细阅读源码,可以看出构造函数中对args对象的属性有最小集要求。亦即传入的args参数对象,至少应该包含源码中使用到的属性,否则会报错。以下是args必须包含的属性列表:
主要参数包括:

  • args.use_onnx 代表是否使用ONNX模型格式,可以为True或者False。
  • args.layout_dict_path 代表版面分析字典文件所在路径,字符串str类型,默认值为layout_cdla_dict.txt。字典对形成正确的分析结果非常重要,必须保持与推理模型配套。推理模型运行的一般过程是将图像张量输入到模型,执行模型并获取输出张量。然后,将输出张量通过字典中单词序号的简单映射关系,转换为单词的列表。举例来说,假设通过版面分析模型,得到输出张量为[0,0,3,4],假设模型的配套字典为默认值,那么返回的解析结果是[‘text’,‘text’,‘figure_caption’,‘table’]。同样的输出张量,如果模型的配套字典为PubLayNet,那么返回的解析结果是[‘text’,‘text’,‘table’,‘figure’]。差之毫厘谬之千里也。
  • args.layout_score_threshold代表版面分析置信度阈值,浮点float类型。置信度低于此阈值者筛选掉,不输出到解析结果。如果使用paddleocr的parse_args来构造参数对象,那么layout_score_threshold的默认值被设置为0.5。
  • args.layout_nms_threshold代表版面分析nms算法的iou阈值,浮点float类型。开源团队使用了非极大值抑制算法,来处理计算机视觉识别到的候选框序列,高于此阈值者会被视为重叠框从而从结果中排除。 nms的概念理解,可以看看这篇文章。如果使用paddleocr的parse_args来构造参数对象,那么layout_nms_threshold的默认值被设置为0.5。

上述必选参数,数量不多,可以自定义一个类来设置这些属性。为了保持与源码的一致性,推荐使用parse_args函数,该函数的解释参照PPStructure核心源码研究(二)。

魔法函数__call__

上节的构造函数完成了实例基础设置,真正体现功能的地方在魔法函数__call__。函数位于predict_layout.py文件的第70行,定义如下:

def __call__(self, img)

传入参数解释如下:

  • img参数,图像数据三维张量,形状为[h,w,3],分别代表图像高度、图像宽度、通道数(RGB)

魔法函数__call__函数执行过程中,首先对原始图像进行归一化等预处理操作,然后传入推理模型,执行模型,获取输出张量,并通过字典翻译,形成结果列表res_list和耗时elapse两项返回值。

  • res_list
    第一项返回值是一个结果列表,列表中的每一项代表一个版面要素。每个识别到的版面要素是一个字典,包含以下属性:
    • bbox 要素边界框,列表list类型,包含四个数值,分别是左上角x、左上角y、右下角x、右下角y。
    • label 要素类型标签,字符串str类型,值来自于版面分析模型配套字典。
    • score 要素置信度,浮点float类型,置信度越高结果越可信。
  • elapse
    第二项返回结果是耗时,代表整个模型的执行时间,单位为秒。

实验一:获取版面结果

第一个实验的目标,是直接使用LayoutPredictor类,识别官网中示例图片(假设已经存储到本地,名为layout1.jpg):
版面分析目标图片通过程序运行,得到每个版面分析的类别、置信度等信息。主要代码如下:

args = construct_engine_params()
lp = LayoutPredictor(args)
source_img = './img/layout1.jpg'
img = cv2

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 昇思MindSpore AI框架MindFormers实践3:ChatGLM3-6B对一段文字进行提取
  • Qt 边框border - qss样式
  • 如何从github上clone项目
  • 品牌借势华为三折叠手机上市热点文案
  • 基于Java+Mysql实现(web)大型企业管理系统
  • 大数据Flink(一百一十八):SQL水印操作(Watermark)
  • 项目实战 (11)---搜索进度
  • 人工智能辅助汽车造型设计
  • 第307题|快速掌握 反常积分敛散性判定的方法|武忠祥老师每日一题
  • 基于k8s手动部署rabbitmq集群(Manually Deploying RabbitMQ Cluster Based on k8s)
  • Spring Cloud集成Gateaway
  • 【视频教程】基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用
  • Linux shell编程学习笔记80:gzip命令——让文件瘦身
  • redis底层—数据结构
  • 在职研生活学习--20240908
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • canvas绘制圆角头像
  • React16时代,该用什么姿势写 React ?
  • scala基础语法(二)
  • tweak 支持第三方库
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Zsh 开发指南(第十四篇 文件读写)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 深度解析利用ES6进行Promise封装总结
  • const的用法,特别是用在函数前面与后面的区别
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • (13)Hive调优——动态分区导致的小文件问题
  • (26)4.7 字符函数和字符串函数
  • (5)STL算法之复制
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五)activiti-modeler 编辑器初步优化
  • (转)ABI是什么
  • (转)创业的注意事项
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .“空心村”成因分析及解决对策122344
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET处理HTTP请求
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET微信公众号开发-2.0创建自定义菜单
  • /etc/sudoer文件配置简析
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • ??myeclipse+tomcat
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘