首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Aidlux平台的智能版面分析

基于Aidlux平台的智能版面分析

原创
作者头像
用户10686717
发布于 2024-01-09 11:52:01
发布于 2024-01-09 11:52:01
42800
代码可运行
举报
文章被收录于专栏:Aidlux人工智能Aidlux人工智能
运行总次数:0
代码可运行

版面分析是将文档图像进行文档对象识别并判断各区域所属类别,如配图、表格、公式、分栏等,并对不同类型的区域进行切分、识别。后面的工作是实现包括组卷、以题搜题、文档电子化存储、结构化解析等功能。

版面分析的背景介绍:

目标:

图像版面分析任务拆解:

PDF转Word:

本实战采用CDLA数据集(A Chinese document layout analysis (CDLA) dataset 进行YOLOv8训练,将训练结果生成的best.pth进行onnx转化:

首先,ONNX是一种通用的深度学习模型格式,支持广泛的深度学习框架,包括

PyTorch、TensorFlow、MXNet等。

因此,将PyTorch模型转换为ONNX格式可以方便地在其他框架上部署和运行。

其次,ONNX支持模型优化和压缩,可以将模型大小和计算性能进一步优化,以满足实际应用的需求。

在Aidlux平台上上传代码包后,分别进行相关配置后,进行PDF转图片->版面检测->文本检测和识别等流程,输出Word。

具体的代码如下:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from layout_engine import *
# cap = cvs.VideoCapture()

if __name__ == "__main__":

    print("----------------------------- 相关配置 --------------------------------")
    # 加载检测和识别模型
    OCR_model = OcrEngine()
    layout_model = predictor.load_layout_model()
    print("-->模型加载成功")

    # 输入的PDF路径
    pdf_path = "inputs/paper1.pdf"
    pdf_name = pdf_path.split("/")[-1].split(".pdf")[0]

    print("----------------------------- PDF转图片 --------------------------")
    # 获取当前请求时间
    ti = time.localtime()
    date = f"{ti[0]}_{ti[1]}_{ti[2]}"
    uid = uuid.uuid4().hex[:10]

    # 需要储存图片的目录
    imagePath = f"outputs/pdf/{ti[0]}_{ti[1]}_{ti[2]}_{ti[3]}_{ti[4]}_{ti[5]}_{uid}"
    os.makedirs(imagePath, exist_ok=True)
    pyMuPDF_fitz(pdf_path, imagePath)

    # 创建一个doc文档,用于后续填充内容
    doc = docx.Document()
    default_section = doc.sections[0]
    default_section.page_width = Cm(21)
    default_section.page_height = Cm(30)

    pdf_image_path_list = os.listdir(imagePath)
    # os.listdir的数字从小到大排序
    pdf_image_path_list.sort(key=lambda x: int(x[:-4]))
    img_num = 0
    for pdf_image in tqdm.tqdm(pdf_image_path_list):
        print("----------------------------- 版面检测--------------------------")
        pdf_image_path = os.path.join(imagePath, pdf_image)
        im_cv2 = cv2.imread(pdf_image_path)
        im_b64 = np2base64(im_cv2)
        layout_result,results = predictor.layout_predict(layout_model, im_b64)
        results = results[0].plot()

        # 填充图像、表格、页眉、页脚区域为白色,避免文本OCR的干扰
        im_cv2_plot = im_cv2.copy()
        for item in layout_result:
            points = item.values()
            for point in points:
                im_cv2_plot = cv2.rectangle(im_cv2_plot, (point[0], point[1]), (point[2], point[3]), (255, 255, 255),
                                            -1)

        print("----------------------------- 文本检测和识别--------------------------")
        img_draw, result_list = OCR_model.text_predict(im_cv2_plot, 960)  # 文本检测和识别
        # 将绘制后的图片从BGR格式转换为RGB格式
        img_draw_PIL = Image.fromarray(cv2.cvtColor(results, cv2.COLOR_BGR2RGB))
        ocr_result = []
        for result in result_list:
            ocr_dict = {}
            box, text = result[0].tolist(), result[1]
            box_xy = [box[0][0], box[0][1], box[2][0], box[2][1]]
            ocr_dict[text] = box_xy
            ocr_result.append(ocr_dict)
            img_draw_PIL = cv2ImgAddText(img_draw_PIL, text, box[0][0], box[0][1])
        img_draw_cv = cv2.cvtColor(np.asarray(img_draw_PIL), cv2.COLOR_RGB2BGR)
        # cvs.imshow(img_draw_cv)
        cv2.imwrite(f"outputs/plot/{img_num}.jpg",img_draw_cv)
        img_num = img_num + 1

        print("----------------------------- 写入Word--------------------------")
        # 图片和文本行按照y轴方向进行排序(单栏适用,多栏请先做好分栏操作)
        final_result = ocr_result + layout_result
        final_result_sort = sorted(final_result, key=lambda x: x[list(x.keys())[0]][1])

        for item in final_result_sort:
            keys_list = item.keys()
            for key in keys_list:
                # 对图片和表格进行处理:裁剪-->保存-->写入Word文档
                if key in ["Figure", "Table"]:
                    points = item[key]
                    crop_img = im_cv2[points[1]:points[3], points[0]:points[2]]
                    uid = uuid.uuid4().hex[:10]
                    name = f"{ti[0]}_{ti[1]}_{ti[2]}_{ti[3]}_{ti[4]}_{ti[5]}_{uid}"
                    crop_img_path = f"outputs/crop/{name}.jpg"
                    cv2.imwrite(crop_img_path, crop_img)
                    doc.add_picture(crop_img_path, width=Cm(11))

                # 对页眉和页脚不做写入操作,跳过
                elif key in ["Header", "Footer"]:
                    continue

                # 对其他情况(Text正文部分):保存并设置字体和大小
                else:
                    paragraph = doc.add_paragraph()
                    run = paragraph.add_run(key)
                    font = run.font
                    font.name = 'Times New Roman'
                    font.size = docx.shared.Pt(11)

    # 保存文档
    word_name = f"{pdf_name}_{ti[0]}_{ti[1]}_{ti[2]}_{ti[3]}_{ti[4]}_{ti[5]}_{uid}"
    word_path = f'outputs/words/{word_name}.docx'
    doc.save(word_path)
    print("Done!")

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
EntityFramework经典的left join语法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116076.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
3420
MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]
1、交叉连接:CROSS JOIN 把表A和表B的数据进行一个NM的组合,即笛卡尔积。如本例会产生44=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。
全栈程序员站长
2022/08/10
6.9K0
MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]
hive优化大全-一篇就够了[通俗易懂]
1.概述   在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题。下面开始本篇文章的优化介绍。
全栈程序员站长
2022/08/03
2.2K0
hive优化大全-一篇就够了[通俗易懂]
笔记29-MySQL多表&事务
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/164618.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/18
2760
SQL基础语句大全
你好! 这是本人在大学自学Java时记录的SQL基础语句,希望可以对自学的小白们给与一定帮助,有错误也欢迎大家可以帮助纠正。
全栈程序员站长
2022/08/14
6080
SQL基础语句大全
高级SQL查询-(聚合查询,分组查询,联合查询)[通俗易懂]
当遇到常见的统计总数、计算平局值等操作,可以使⽤聚合函数来实现,常见的聚合函数有:
全栈程序员站长
2022/09/05
5.3K0
嵌套查询效率_sql嵌套查询例子
嵌套查询是 SQL 中表达能力很强的一种机制,既给应用带来了方便也给查询优化带来了很大的挑战。本文总结一下经典的单机系统对嵌套查询的优化。
全栈程序员站长
2022/09/27
2.8K0
SQL 数据查询(4)—— 嵌套查询
常见的比较运算符是>,<,=,>=,<=,!=,<>等。 例3.55中的IN就可以用 = 来实现
全栈程序员站长
2022/09/22
1.5K0
SQL 数据查询(4)—— 嵌套查询
MySQL 全局锁、表锁和行锁「建议收藏」
最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习。
全栈程序员站长
2022/07/18
2.3K0
sql的嵌套查询_sql子查询嵌套优化
最近在做各类小应用,用到了MYSQL,有时候会用到一些比较复杂的嵌套查询,在研究怎么通过SQL实现这些。 假设下面这张表(stu)描述学生的基本信息:
全栈程序员站长
2022/09/22
6.7K0
sql镶嵌查询_标准SQL嵌套查询语句[通俗易懂]
1、简单子查询62616964757a686964616fe78988e69d8331333433626530
全栈程序员站长
2022/09/22
3K0
sql镶嵌查询_SQL数据查询之——嵌套查询「建议收藏」
在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块。将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为 嵌套查询。例如:
全栈程序员站长
2022/09/22
2.4K0
mysql递归查询
注意:只支持单个查询,意思是不可以根据两个或者两个以上的子节点同时查询出所有父节点。我们可以看到,上面参数都是单个值进行递归查询的。 西面提供一个函数支持多个查询
全栈程序员站长
2022/07/02
3.3K0
mysql递归查询
ntp服务器协议,NTP协议介绍及实现方案(服务器端和客户端).doc[通俗易懂]
NTP(Network Time Protocol,网络时间协议)是由RFC1305定义的时间同步协议,用来在分布时间服务器和客户端之间进行时钟同步,同时也是一个因特网标准,它采用应用层同步方法将计算机时钟和UTC时间(格林尼治时间)进行同步,因此时间精度不高,一般在10ms到100ms之间。
全栈程序员站长
2022/11/04
1.7K0
SQL嵌套查询_sql差集嵌套
派生表就是一个由查询结果生成的临时表。他是在外部查询的 FROM 中定义的。派生表的存在范围只是在外部查询中,只要外部查询结束了,派生表也就不存在了。派生表一定要写在 FROM 后面范围内,用()括起来。后面跟着派生表的名称。
全栈程序员站长
2022/09/22
2.6K0
SQL嵌套查询_sql差集嵌套
sql多表联合查询详解_sql多表查询例子
这条语句 其中 select,as, count ,from where,in ,and,group up都是关键字,这条语句的意思是:bi_BillItem根据billid去bill表查满足这些条件的如果查到满足条件billid相等的就查询出bi_BillItem中的menuId,menuName,MenuPrice,(sum(AmountOrder)-sum(AmountCancel))字段 并且按 menuId和menuPrice排序
全栈程序员站长
2022/09/22
2.7K0
SQL嵌套查询_sql嵌套查询返回多个字段
说到嵌套查询,首先得理解嵌套查询是什么意思,简单来说就是,一个查询语句可以嵌套在另外一个查询语句的where子句中。外层的查询称为父查询(主查询),内层的查询称为子查询(从查询)。
全栈程序员站长
2022/09/22
3.5K0
性别在数据库中的数据类型_mysql常用的数据类型有哪些
例如: create table t2(x int(5) unsigned zerofill); insert into t2 values(10); select * from t2;
全栈程序员站长
2022/09/20
1.8K0
性别在数据库中的数据类型_mysql常用的数据类型有哪些
SQL中的连接查询与嵌套查询「建议收藏」
若一个查询同时涉及两个或两个以上的表,则称之为连接查询。连接查询是数据库中最最要的查询,
全栈程序员站长
2022/08/22
5.7K0
SQL中的连接查询与嵌套查询「建议收藏」
mysql中多表嵌套查询例子_mysql子查询嵌套规则
MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual):
全栈程序员站长
2022/11/01
3.9K0
推荐阅读
相关推荐
EntityFramework经典的left join语法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验