donut_pytorch端到端OCR大模型解析

Donut

Donut 🍩,即文档理解转换器,是一种利用无 OCR 端到端转换器模型进行文档理解的新方法。Donut 不需要现成的 OCR 引擎/API,但它在各种可视化文档理解任务(如可视化文档分类或信息提取(又称文档解析))中表现出了最先进的性能。

论文

模型结构

Donut是一种端到端的(即,自包含的)VDU模型,用于通用理解文档图像。Donut的架构非常简单,由基于Transformer的视觉编码器和文本解码器模块组成。请注意,Donut并不依赖于任何与OCR功能相关的模块,而是使用视觉编码器从给定的文档图像中提取特征。接下来的文本解码器将派生的特征映射到一系列子词令牌,以构造所需的结构化格式。每个模型组件都基于Transformer,因此模型可以轻易地以端到端的方式进行训练。

算法原理

编码器。视觉编码器将输入文档图像x∈RH×W×C转换为一组嵌入向量{zi|zi∈Rd,1≤i≤n},其中n是特征图大小或图像块数量,d是编码器的潜在向量的维度。

解码器。给定{z},文本解码器生成一个令牌序列(yi)mi=1,其中yi∈Rv是第i个令牌的独热向量,v是令牌词汇表的大小,m是超参数。

环境配置

Docker(方法一)

光源拉取docker镜像的地址与使用步骤

docker pull image.sourcefind.cn:5000/dcu/admin/base/pytorch:1.13.1-ubuntu20.04-dtk23.10-py38

docker run -it -v /path/your_code_data/:/path/your_code_data/ -v /opt/hyhal/:/opt/hyhal/:ro --shm-size=64G --privileged=true --network=host --device=/dev/kfd --device=/dev/dri/ --group-add video --name donut <your imageID> bash

cd /path/your_code_data/

pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

Dockerfile(方法二)

cd /path/your_code_data/docker

docker build --no-cache -t donut:latest .

docker run --shm-size=64G --name donut -v /opt/hyhal:/opt/hyhal:ro --privileged=true --device=/dev/kfd --network=host --device=/dev/dri/ --group-add video -v /path/your_code_data/:/path/your_code_data/ -it donut bash

Anaconda(方法三)

关于本项目DCU显卡所需的特殊深度学习库可从光合开发者社区下载安装。

DTK驱动:dtk23.10
python:python3.8
torch:1.13.0
torchvision:0.14.0

Tips:以上dtk驱动、python、paddle等DCU相关工具版本需要严格一一对应

conda create -n donut python=3.8

conda activate donut

cd /path/your_code_data/

pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple

数据集

本仓库使用naver-clova-ix/cord-v2数据集, 如需使用可点击下载完整的数据集,训练数据目录结构如下,用于自建微调的数据集请按此目录结构进行制备(具体可参考donut github数据集部分):

> tree dataset_name
dataset_name
├── test
│   ├── metadata.jsonl
│   ├── {image_path0}
│   ├── {image_path1}
│             .
│             .
├── train
│   ├── metadata.jsonl
│   ├── {image_path0}
│   ├── {image_path1}
│             .
│             .
└── validation
    ├── metadata.jsonl
    ├── {image_path0}
    ├── {image_path1}
              .
              .

> cat dataset_name/test/metadata.jsonl
{"file_name": {image_path0}, "ground_truth": "{\"gt_parse\": {ground_truth_parse}, ... {other_metadata_not_used} ... }"}
{"file_name": {image_path1}, "ground_truth": "{\"gt_parse\": {ground_truth_parse}, ... {other_metadata_not_used} ... }"}
     .
     .

训练

单机单卡

bash single_dcu_train.sh

推理

单机单卡

票据OCR

python donut_cord_infernce.py

火车票OCR

python donut_zhtrainticket_inference.py

result

票据OCR结果

火车票OCR结果

精度

测试数据: naver-clova-ix/cord-v2 ,使用的加速卡:V100S/K100。

devicetrain_lossTED_accuracy_scoreF1_accuracy_score
V100s0.05330.871570.796
K1000.0380.870280.8047

应用场景

算法类别

ocr

热点应用行业

金融,教育,政府,科研,制造,能源,交通

预训练权重

预训练权重快速下载中心:SCNet AIModels

项目中的预训练权重可从快速下载通道下载:donut Donut-Base Finetuned-Docvqa donut-base-finetuned-cord-v2

源码仓库及问题反馈

参考资料

### 回答1: 以下是用R语言编写的 `donut_plot` 函数,可以绘制一个甜甜圈图。 ```r donut_plot <- function(x, col){ # 计算各部分所占比例 total <- sum(x) x_prop <- x/total # 绘制图形 pie(x_prop, col = col, init.angle = 90, labels = NA, main = "") pie(x_prop, col = col, init.angle = 90, border = "white", labels = round(x_prop, 2), main = "") legend("topright", legend = paste0(round(x_prop*100, 2), "%"), fill = col) } ``` 其中,`x` 是一个向量,包含各部分的数值,`col` 是一个向量,包含各部分的颜色。 例如,假设我们有以下数据: ```r data <- c(10, 20, 30, 40) colors <- c("red", "orange", "yellow", "green") ``` 我们可以调用 `donut_plot` 函数来绘制甜甜圈图: ```r donut_plot(data, colors) ``` 这将绘制出一个甜甜圈图,其中红色部分占 10%,橙色部分占 20%,黄色部分占 30%,绿色部分占 40%。 ### 回答2: 甜甜圈图(Donut chart)是一种环形图形的表达方式,可以用来展示各个类别在整体中的比例关系。我们可以使用R语言编写一个函数`donut_plot`来绘制甜甜圈图。 ```R donut_plot <- function(x, col) { # 计算每个类别的比例 proportions <- prop.table(table(x)) # 绘制甜甜圈图 pie(proportions, col = col, main = "Donut Chart", radius = 0.8) legend("bottom", labels = names(proportions), fill = col, horiz = TRUE) } ``` 上述函数`donut_plot`接受两个参数:`x`表示类别向量,`col`表示颜色向量。函数首先使用`table`函数计算每个类别的频数,然后使用`prop.table`函数计算每个类别的比例。最后,函数使用`pie`函数绘制甜甜圈图,传入比例和颜色参数,`main`参数用于设置主标题,`radius`参数用于控制甜甜圈的大小。最后,使用`legend`函数在图例位置底部添加标签和颜色。 通过调用`donut_plot`函数,我们可以自定义数据和颜色来绘制甜甜圈图,例如: ```R x <- c("A", "A", "B", "C", "C", "C") col <- c("red", "green", "blue") donut_plot(x, col) ``` 这将绘制一个甜甜圈图,展示了类别"A"、"B"和"C"在整体中的比例关系,并使用红色、绿色和蓝色作为类别的颜色。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术瘾君子1573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值