Table master训练测试流程

2023-11-02

一. 环境配置

参考:https://github.com/JiaquanYe/TableMASTER-mmocr
由于依赖mmdetection,对版本的要求如下:
Python:3.6+
PyTorch:1.3+
CUDA 9.2+
GCC 5+
在服务器上,在没有sudo权限的情况下配置gcc

export PATH=/home/work/guopei/gcc-8.2.0-bin/bin:$PATH
export PATH=/home/work/guopei/gcc-8.2.0-bin/lib64:$PATH
export LD_LIBRARY_PATH=/home/work/guopei/gcc-8.2.0-bin/lib/:$LD_LIBRARY_PATH

1. 安装mmdetection

cd ./mmdetection-2.11.0
pip install -v -e .

2. 安装 mmcv

pip install mmcv-full==1.3.4 -f https://download.openmmlab.com/mmcv/dist/cu102/torch1.6.0/index.html

3. 安装mmocr

pip install mmocr==0.2.0
cd /home/work/guopei/workspace/OCR/table_recog/TableMASTER-mmocr
pip install -v -e .

4. 检验环境是否安装成功

在这里插入图片描述

二. 训练数据准备

1. 解析pubtabnet数据

python ./table_recognition/data_preprocess.py

运行代码之前记得修改"raw_img_root"和"save_root"路径
我的修改如下:
在这里插入图片描述
在这里插入图片描述

2. 生成lmdb数据

python ./table_recognition/lmdb_maker.py

在这里插入图片描述
在这里插入图片描述
该代码会生成lmdb,储存在/home/work/data/guopei/pubtabnet/table_master_data/lmdb/文件夹下,如图:
在这里插入图片描述

三. 训练模型

sh ./table_recognition/expr/table_recognition_dist_train.sh

在这里插入图片描述
在这里插入图片描述
模型训练过程如下:
在这里插入图片描述

四. 测试

测试表格结构模型

CUDA_VISIBLE_DEVICES=7 python table_recognition/table_inference_guopei.py

其中,table_inference_guopei.py的内容如下:

import os

import torch
from mmcv.image import imread

from mmdet.apis import init_detector
from mmocr.apis.inference import model_inference
from mmocr.datasets import build_dataset  # noqa: F401
from mmocr.models import build_detector  # noqa: F401

import sys
import glob
import time
import pickle
import numpy as np
from tqdm import tqdm
from table_recognition.utils import detect_visual, end2end_visual, structure_visual, coord_convert, clip_detect_bbox, rectangle_crop_img, delete_invalid_bbox


def build_model(config_file, checkpoint_file):
    device = 'cpu'
    model = init_detector(config_file, checkpoint=checkpoint_file, device=device)

    if model.cfg.data.test['type'] == 'ConcatDataset':
        model.cfg.data.test.pipeline = model.cfg.data.test['datasets'][
            0].pipeline

    return model


class Inference:
    def __init__(self, config_file, checkpoint_file, device=None):
        self.config_file = config_file
        self.checkpoint_file = checkpoint_file
        self.model = build_model(config_file, checkpoint_file)

        if device is None:
            device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
        else:
            # Specify GPU device
            device = torch.device("cuda:{}".format(device))
        self.model.to(device)

    def result_format(self, pred, file_path):
        raise NotImplementedError

    def predict_single_file(self, file_path):
        pass

    def predict_batch(self, imgs):
        pass


class Structure_Recognition(Inference):
    def __init__(self, config_file, checkpoint_file, samples_per_gpu=1):
        self.config_file = config_file
        self.checkpoint_file = checkpoint_file
        super().__init__(config_file, checkpoint_file)
        self.samples_per_gpu = samples_per_gpu

    def result_format(self, pred, file_path=None):
        pred = pred[0]
        return pred

    def predict_single_file(self, file_path):
        # numpy inference
        img = imread(file_path)
        file_name = os.path.basename(file_path)
        result = model_inference(self.model, [img], batch_mode=True)
        result = self.result_format(result, file_path)
        result_dict = {file_name:result}
        return result, result_dict


class Runner:
    def __init__(self, cfg):
        self.structure_master_config = cfg['structure_master_config']
        self.structure_master_ckpt = cfg['structure_master_ckpt']
        self.structure_master_result_folder = cfg['structure_master_result_folder']

        test_folder = cfg['test_folder']

    def init_structure_master(self):
        self.master_structure_inference = \
            Structure_Recognition(self.structure_master_config, self.structure_master_ckpt)

    def release_structure_master(self):
        torch.cuda.empty_cache()
        del self.master_structure_inference

    def do_structure_predict(self, path, is_save=True, gpu_idx=None):
        if isinstance(path, str):
            if os.path.isfile(path):
                all_results = dict()
                print('Single file in structure master prediction ...')
                _, result_dict = self.master_structure_inference.predict_single_file(path)
                all_results.update(result_dict)

            elif os.path.isdir(path):
                all_results = dict()
                print('Folder files in structure master prediction ...')
                search_path = os.path.join(path, '*.png')
                files = glob.glob(search_path)
                files = files[:20]   # 郭沛添加,用来测试使用
                for file in tqdm(files):
                    _, result_dict = self.master_structure_inference.predict_single_file(file)
                    all_results.update(result_dict)

            else:
                raise ValueError

        elif isinstance(path, list):
            all_results = dict()
            print('Chunks files in structure master prediction ...')
            for i, p in enumerate(path):
                _, result_dict = self.master_structure_inference.predict_single_file(p)
                all_results.update(result_dict)
                if gpu_idx is not None:
                    print("[GPU_{} : {} / {}] {} file structure inference. ".format(gpu_idx, i+1, len(path), p))
                else:
                    print("{} file structure inference. ".format(p))

        else:
            raise ValueError

        # save for matcher.
        if is_save:
            if not os.path.exists(self.structure_master_result_folder):
                os.makedirs(self.structure_master_result_folder)

            if not isinstance(path, list):
                save_file = os.path.join(self.structure_master_result_folder, 'structure_master_results.pkl')
            else:
                save_file = os.path.join(self.structure_master_result_folder, 'structure_master_results_{}.pkl'.format(gpu_idx))

            with open(save_file, 'wb') as f:
                pickle.dump(all_results, f)

    def run(self, path):
        # structure master
        self.init_structure_master()
        self.do_structure_predict(path, is_save=True)
        self.release_structure_master()


if __name__ == '__main__':
    cfg = {
        'structure_master_config': './work_dir/1114_TableMASTER_structure/table_master_lmdb_ResnetExtract_Ranger_0930.py',
        'structure_master_ckpt': './work_dir/1114_TableMASTER_structure/latest.pth',
        'structure_master_result_folder': './structure_val_result',
        'test_folder': '/home/work/data/guopei/pubtabnet/val/',
    }

    # single gpu device inference
    runner = Runner(cfg)
    runner.run(cfg['test_folder'])

识别效果不错,就是速度有点慢,如何提速请关注下期!欢迎技术交流!!!

我们的表格识别解决方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Table master训练测试流程 的相关文章

  • vue vue-router实现路由拦截功能

    vue vue router实现路由拦截功能 1 目录结构 2 设置路由拦截 路由配置如下 在这里自定义了一个对象的参数meta authRequired true 来标记哪些路由是需要登录验证的 导航被触发的时候只要判断是否目标路由中是否
  • 【AI】Diffusion Models

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 两种思路解决线程服务死循环

    背景 系统突然error飚高 不停Full GC 最后发现是因为调用的外部jar包中方法触发bug导致死循环 不断产生新对象 导致内存大量占用无法释放 最终JVM内存回收机制崩溃 解决思路 服务一旦进入死循环 对应线程一直处于running
  • (已解决)STM32L151使用串口发送数据第一字节为FE问题!

    已解决 STM32L151使用串口发送数据第一字节为FE问题 参考文章 1 已解决 STM32L151使用串口发送数据第一字节为FE问题 2 https www cnblogs com Irvingcode p 11603583 html
  • 【机器学习】KS值

    KS检验 风控角度 分类模型评判指标 KS曲线与KS值 从统计角度 我们知道KS是分析两组数据分布是否相同的检验指标 在金融领域中 我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布 好的信用风控模型一般从准确性 稳定性和可解释性来
  • Spring创建Bean的全过程(一)

    Spring测试环境搭建 Spring模块概览 Spring中八大模块 黑色表示该模块的jar包 也就是组件 例如我们想要使用IOC容器 也就是绿色的CoreContainer 我们需要导入Beans Core Context SpEL s

随机推荐

  • Python+微信小程序开发实战课

    本套课程Python结合微信小程序开发实战 由前汽车之家架构师武沛齐老师主讲 共分为18天的课程 文件大小共计9G 课程除了讲解微信小程序开发的基础知识点外 更多的是示例演示 让大家知道如何灵活运用这些知识点 真正学到能够运用到具体开发工作
  • Unity3D Shader之路 写Shader前必须要知道的事情3 ShaderForge的简单使用

    版本 unity 5 4 1 语言 Unity Shader Shader Forge版本 1 32 总起 在具体介绍Shader之前准备再写一篇有关于ShaderForge的 虽然我们可能使用代码来直接编写Shader 但拥有Shader
  • python基础——列表推导式

    python基础 列表推导式 文章目录 python基础 列表推导式 一 实验目的 二 实验原理 三 实验环境 四 实验内容 五 实验步骤 一 实验目的 掌握Python数据结构 列表推导式的用法 二 实验原理 列表推导式 list com
  • 「Python 基础」常用模块

    文章目录 1 内建模块 datetime collections namedtuple deque defaultdict OrderedDict ChainMap Counter base64 struct hashlib 摘要算法 摘要
  • Tomcat的基本认识和使用

    服务器 安装了服务器软件的计算机 通常都是高配置的计算机 服务器软件 接收用户的请求 处理请求 做出响应 web服务器软件 通过浏览器来进行访问的一种服务器软件 在web服务器软件中 可以部署web项目 让用户通过浏览器来访问这些项目 常见
  • 常见泰勒展开公式及复杂泰勒展开求法

    目录 https blog csdn net weixin 45792450 article details 104404432 初等的函数泰勒展开 e x e x ex e
  • 【OpenCv】相机标定介绍及python/c++实现

    针孔相机内外参标定简单介绍 之前有一个项目需要公司标内参 之前对这方面没有接触过 网上找了很多资料 记录下相机标定的基础知识 文章是个人浅显理解 如有错误还请指正 非常感谢 参考链接 坐标系转换 相机参数标定 camera calibrat
  • keil4 编译提示 ERROR L107: ADDRESS SPACE OVERFLOW

    单片机型号STC15F2K60s2 编译环境keil4 系统win7 模式 small 错误 ERROR L107 ADDRESS SPACE OVERFLOW 这个错误意思 提示地址超出 又去看了一遍数据手册 不应该是两k吗 为啥用了13
  • 动态链接(一)

    1 为什么要动态链接 静态链接的缺点 1 内存和磁盘空间 比如有两个程序 目标文件分别为Program1 o Program2 o 并且都用到Lib o这个模块 静态链接生成可执行文件Program1 Program2时 它们都分别存有Li
  • 在虚拟机里通过U盘引导安装Win10教程

    一 前言 打算在VM虚拟机里安装一个Win10系统 按照网上的教程 通过虚拟机的光驱加载 iso镜像文件来引导 发现启动不了 虚拟机一直停留在如下界面 推测可能是该 ios镜像文件里没有合适的引导程序 因此 打算尝试U盘启动 经过验证 发现
  • GNS3 FastEthernet1/10 is up, line protocol is down / SVI 无法连接的问题

    请重启三层路由器 三层路由器在打开的情况之下 连接上的设备貌似无法工作
  • K - Robotopia Kattis - robotopia

    题目链接 题解 题目其实类似于以前的解二元一次方程组 但是如果解出方程组后 会得到一个式子 但是如果仅仅代入式子的话是错误的因为假设是这样 5X 6Y 11 5X 6Y 11 这两个方程联立的话很明显是 X 1 Y 1 所以用这种方法不对
  • C语言密勒码的软件编码,密勒码的编码规则是什么?请画出代码序列11010010的密勒码波形?...

    相关题目与解析 CMI码的编码规则是什么 请画出代码序列11010010的CMI码波形 数字双相码的编码规则是什么 请画出代码序列11010010的双相码波形 简述双相码 曼彻斯特码 的编码规则并画出二进制比特序列1011010011的双相
  • k近邻算法的原理、示例与分析

    k近邻算法的原理 示例与分析 代码参考书籍 Python机器学习基础教程 Andreas C muller Sarah Guido著 张亮 译 北京 人民邮电出版社 2018 1 2019 6重印 实现环境 System Ubuntu se
  • Ubuntu查看CPU|GPU|型号等电脑配置

    电脑配置以及CPU 一个终极命令 可以包括以下命令显示的信息 cat proc cpuinfo alay ws sudo dmidecode grep Product Name Product Name Inspiron 3558 Prod
  • matlab以空间的点画球,3D空间画空洞小球Matlab程序

    3D空间画空洞小球Matlab程序 3D空间画空洞小球Matlab程序 有时候在三维空间中 需要画出很多的空洞小球 可以使用入戏的代码 clear all clc x y z sphere 100 hold on i 1 K 3 for c
  • 【C++入门】const和mutable关键字、常函数介绍

    1 常函数介绍 1 1 什么是常函数 1 常函数的定义 类的成员函数对类中任何成员不作修改而只能作访问的函数 简单来说 就是调用类的成员函数不会对类做任何修改 2 常函数的实现 常函数是依靠const关键字实现的 具体是在类中声明成员函数和
  • glDrawArrays,glDrawElements用法

    glDrawArrays 和 glDrawElements 的作用都是从一个数据数组中提取数据渲染基本图元 render primitives from array data 注 如果要 glDrawArrays 和 glDrawEleme
  • 面试题:【数据库二】mysql:explain解释器type关键字

    mysql的explain解释器的相关资源网上很多 这里我只记录一下我关心的Type列 type type字段的意思 当前sql扫描表的方法 type字段对应的value值 system gt const gt eq ref gt ref
  • Table master训练测试流程

    一 环境配置 参考 https github com JiaquanYe TableMASTER mmocr 由于依赖mmdetection 对版本的要求如下 Python 3 6 PyTorch 1 3 CUDA 9 2 GCC 5 在服