From c6986469faf7095232c018311f8cc0a2701d0dd4 Mon Sep 17 00:00:00 2001 From: Bourn3z <50265953+Bourn3z@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:53:41 +0800 Subject: [PATCH] Add LayoutLMv3 backbone (#656) --- README.md | 11 +- README_CN.md | 11 +- configs/kie/layoutlmv3/README.md | 250 ++++++ configs/kie/layoutlmv3/README_CN.md | 246 ++++++ configs/kie/layoutlmv3/layoutlmv3_arch.jpg | Bin 0 -> 380147 bytes .../layoutlmv3/ser_layoutlmv3_xfund_zh.yaml | 128 +++ .../re_layoutxlm_xfund_zh.yaml | 0 .../ser_layoutxlm_xfund_zh.yaml | 0 configs/kie/vi_layoutxlm/README.md | 283 +++++++ configs/kie/vi_layoutxlm/README_CN.md | 70 +- .../data/transforms/layoutlm_transforms.py | 2 + mindocr/metrics/kie_metrics.py | 2 +- mindocr/models/backbones/__init__.py | 1 + .../models/backbones/layoutlmv3/__init__.py | 5 + .../backbones/layoutlmv3/configuration.py | 44 ++ .../models/backbones/layoutlmv3/layoutlmv3.py | 524 +++++++++++++ .../models/backbones/layoutlmv3/tokenizer.py | 7 + .../models/backbones/layoutxlm/layoutxlm.py | 726 ++---------------- .../transformer_common/activation.py | 23 + .../backbones/transformer_common/layer.py | 522 +++++++++++++ mindocr/models/base_model.py | 31 +- 21 files changed, 2141 insertions(+), 745 deletions(-) create mode 100644 configs/kie/layoutlmv3/README.md create mode 100644 configs/kie/layoutlmv3/README_CN.md create mode 100644 configs/kie/layoutlmv3/layoutlmv3_arch.jpg create mode 100644 configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml rename configs/kie/{layoutlm_series => layoutxlm}/re_layoutxlm_xfund_zh.yaml (100%) rename configs/kie/{layoutlm_series => layoutxlm}/ser_layoutxlm_xfund_zh.yaml (100%) create mode 100644 configs/kie/vi_layoutxlm/README.md create mode 100644 mindocr/models/backbones/layoutlmv3/__init__.py create mode 100644 mindocr/models/backbones/layoutlmv3/configuration.py create mode 100644 mindocr/models/backbones/layoutlmv3/layoutlmv3.py create mode 100644 mindocr/models/backbones/layoutlmv3/tokenizer.py create mode 100644 mindocr/models/backbones/transformer_common/activation.py create mode 100644 mindocr/models/backbones/transformer_common/layer.py diff --git a/README.md b/README.md index 7352103fa..2d74a4384 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,8 @@ You can do MindSpore Lite inference in MindOCR using **MindOCR models** or **Thi
Key Information Extraction -- [x] [LayoutXLM SER](configs/kie/vi_layoutxlm/README_CN.md) (arXiv'2016) +- [x] [LayoutXLM](configs/kie/vi_layoutxlm/README_CN.md) (arXiv'2021) +- [x] [LayoutLMv3](configs/kie/layoutlmv3/README.md) (arXiv'2022)
@@ -287,6 +288,10 @@ Frequently asked questions about configuring environment and mindocr, please ref
News +- 2023/04/01 +1. Add new trained models + - [LayoutLMv3](configs/kie/layoutlmv3/) for key information extraction + - 2024/03/20 1. Add new trained models - [Vary-toy](configs/llm/vary/vary_toy.yaml) for OCR large model, providing Qwen-1.8B LLM-based object detection and OCR abilities @@ -299,8 +304,8 @@ Frequently asked questions about configuring environment and mindocr, please ref - 2023/12/14 1. Add new trained models - - [LayoutXLM SER](configs/kie/vi_layoutxlm) for key information extraction - - [VI-LayoutXLM SER](configs/kie/layoutlm_series) for key information extraction + - [LayoutXLM](configs/kie/layoutxlm) for key information extraction + - [VI-LayoutXLM](configs/kie/vi_layoutxlm) for key information extraction - [PP-OCRv3 DBNet](configs/det/dbnet/db_mobilenetv3_ppocrv3.yaml) for text detection and [PP-OCRv3 SVTR](configs/rec/svtr/svtr_ppocrv3_ch.yaml) for recognition, supporting online inferece and finetuning 2. Add more benchmark datasets and their results - [XFUND](configs/kie/vi_layoutxlm/README_CN.md) diff --git a/README_CN.md b/README_CN.md index aed14732c..f488ddd9b 100644 --- a/README_CN.md +++ b/README_CN.md @@ -194,7 +194,8 @@ python tools/infer/text/predict_system.py --image_dir {path_to_img or dir_to_img
关键信息抽取 -- [x] [LayoutXLM SER](configs/kie/vi_layoutxlm/README_CN.md) (arXiv'2016) +- [x] [LayoutXLM](configs/kie/vi_layoutxlm/README_CN.md) (arXiv'2021) +- [x] [LayoutLMv3](configs/kie/layoutlmv3/README_CN.md) (arXiv'2022)
@@ -282,6 +283,10 @@ MindOCR提供了[数据格式转换工具](tools/dataset_converters) ,以支
详细 +- 2023/04/01 +1. 增加新模型 + - 关键信息抽取[LayoutLMv3](configs/kie/layoutlmv3/) + - 2024/03/20 1. 增加新模型 - OCR大模型[Vary-toy](configs/llm/vary/vary_toy.yaml),支持基于通义千问1.8B LLM的检测和OCR功能 @@ -294,8 +299,8 @@ MindOCR提供了[数据格式转换工具](tools/dataset_converters) ,以支 - 2023/12/14 1. 增加新模型 - - 关键信息抽取[LayoutXLM SER](configs/kie/vi_layoutxlm) - - 关键信息抽取[VI-LayoutXLM SER](configs/kie/layoutlm_series) + - 关键信息抽取[LayoutXLM](configs/kie/layoutxlm) + - 关键信息抽取[VI-LayoutXLM](configs/kie/vi_layoutxlm) - 文本检测[PP-OCRv3 DBNet](configs/det/dbnet/db_mobilenetv3_ppocrv3.yaml)和文本识别[PP-OCRv3 SVTR](configs/rec/svtr/svtr_ppocrv3_ch.yaml),支持在线推理和微调训练 2. 添加更多基准数据集及其结果 - [XFUND](configs/kie/vi_layoutxlm/README_CN.md) diff --git a/configs/kie/layoutlmv3/README.md b/configs/kie/layoutlmv3/README.md new file mode 100644 index 000000000..cc18fd725 --- /dev/null +++ b/configs/kie/layoutlmv3/README.md @@ -0,0 +1,250 @@ +English | [中文](README_CN.md) + +# LayoutLMv3 + + +> [LayoutLMv3: Pre-training for Document AI with Unified Text and Image Masking](https://arxiv.org/abs/2204.08387) + + +## 1. Introduction +Unlike previous LayoutLM series models, LayoutLMv3 does not rely on complex CNN or Faster R-CNN networks to represent images in its model architecture. Instead, it directly utilizes image blocks of document images, thereby greatly reducing parameters and avoiding complex document preprocessing such as manual annotation of target region boxes and document object detection. Its simple unified architecture and training objectives make LayoutLMv3 a versatile pretraining model suitable for both text-centric and image-centric document AI tasks. + +The experimental results demonstrate that LayoutLMv3 achieves better performance with fewer parameters on the following datasets: + +- Text-centric datasets: Form Understanding FUNSD dataset, Receipt Understanding CORD dataset, and Document Visual Question Answering DocVQA dataset. +- Image-centric datasets: Document Image Classification RVL-CDIP dataset and Document Layout Analysis PubLayNet dataset. + +LayoutLMv3 also employs a text-image multimodal Transformer architecture to learn cross-modal representations. Text vectors are obtained by adding word vectors, one-dimensional positional vectors, and two-dimensional positional vectors of words. Text from document images and their corresponding two-dimensional positional information (layout information) are extracted using optical character recognition (OCR) tools. As adjacent words in text often convey similar semantics, LayoutLMv3 shares the two-dimensional positional vectors of adjacent words, while each word in LayoutLM and LayoutLMv2 has different two-dimensional positional vectors. + +The representation of image vectors typically relies on CNN-extracted feature grid features or Faster R-CNN-extracted region features, which increase computational costs or depend on region annotations. Therefore, the authors obtain image features by linearly mapping image blocks, a representation method initially proposed in ViT, which incurs minimal computational cost and does not rely on region annotations, effectively addressing the aforementioned issues. Specifically, the image is first resized to a uniform size (e.g., 224x224), then divided into fixed-size blocks (e.g., 16x16), and image features are obtained through linear mapping to form an image feature sequence, followed by addition of a learnable one-dimensional positional vector to obtain the image vector.[[1](#references)] + +

+ +

+

+ Figure 1. LayoutLMv3 architecture [1] +

+ +## 2. Results + + +### Accuracy + + +According to our experiments, the performance and accuracy evaluation([Model Evaluation](#33-Model-Evaluation)) results of training ([Model Training](#32-Model-Training)) on the XFUND Chinese dataset are as follows: + +
+ +| **Model** | **Task** | **Context** | **Dateset** | **Model Params** | **Batch size** | **Graph train 1P (s/epoch)** | **Graph train 1P (ms/step)** | **Graph train 1P (FPS)** | **hmean** | **Config** | **Download** | +| :----------: | :------: | :-------------: | :--------: | :--------: | :----------: | :--------------------------: | :--------------------------: | :----------------------: | :-------: | :----------------------------------------------------: | :------------------------------------------------------------------------------------------------: | +| LayoutLMv3 | SER | D910x1-MS2.1-G | XFUND_zh | 265.8 M | 8 | 19.53 | 1094.86 | 7.37 | 91.88% | [yaml](../layoutlmv3/ser_layoutlmv3_xfund_zh.yaml) | ckpt(TODO) | + +
+ + + +## 3. Quick Start +### 3.1 Preparation + +#### 3.1.1 Installation +Please refer to the [installation instruction](https://github.com/mindspore-lab/mindocr#installation) in MindOCR. + +#### 3.1.2 Dataset Download + +[The XFUND dataset](https://github.com/doc-analysis/XFUND) is used as the experimental dataset. The XFUND dataset is a multilingual dataset proposed by Microsoft for the Knowledge-Intensive Extraction (KIE) task. It consists of seven datasets, each containing 149 training samples and 50 validation samples. + +Respectively: ZH (Chinese), JA (Japanese), ES (Spanish), FR (French), IT (Italian), DE (German), PT (Portuguese) + +a preprocessed [Chinese dataset](https://download.mindspore.cn/toolkits/mindocr/vi-layoutxlm/XFUND.tar) that can be directly used is provided for everyone to download. + +```bash +mkdir train_data +cd train_data +wget https://download.mindspore.cn/toolkits/mindocr/vi-layoutxlm/XFUND.tar && tar -xf XFUND.tar +cd .. +``` + +#### 3.1.3 Dataset Usage + +After decompression, the data folder structure is as follows: + +```bash + └─ zh_train/ Training set + ├── image/ Folder for storing images + ├── train.json Annotation information + └─ zh_val/ Validation set + ├── image/ Folder for storing images + ├── val.json Annotation information + +``` + +The annotation format of this dataset is: + +```bash +{ + "height": 3508, # Image height + "width": 2480, # Image width + "ocr_info": [ + { + "text": "邮政地址:", # Single text content + "label": "question", # Category of the text + "bbox": [261, 802, 483, 859], # Single text box + "id": 54, # Text index + "linking": [[54, 60]], # Relationships between the current text and other texts [question, answer] + "words": [] + }, + { + "text": "湖南省怀化市市辖区", + "label": "answer", + "bbox": [487, 810, 862, 859], + "id": 60, + "linking": [[54, 60]], + "words": [] + } + ] +} +``` + +**The data configuration for model training.** + +If you want to reproduce the training of the model, it is recommended to modify the dataset-related fields in the configuration YAML file as follows: + +```yaml +... +train: + ... + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # Root directory of the training dataset + data_dir: XFUND/zh_train/image/ # Directory of the training dataset, concatenated with `dataset_root` to form the complete directory of the training dataset + label_file: XFUND/zh_train/train.json # Path to the label file of the training dataset, concatenated with `dataset_root` to form the complete path of the label file of the training dataset +... +eval: + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # Root directory of the validation dataset + data_dir: XFUND/zh_val/image/ # Directory of the validation dataset, concatenated with `dataset_root` to form the complete directory of the validation dataset + label_file: XFUND/zh_val/val.json # Path to the label file of the validation dataset, concatenated with `dataset_root` to form the complete path of the label file of the validation dataset + ... + +``` + +#### 3.1.4 Check YAML Config Files +Apart from the dataset setting, please also check the following important args: `system.distribute`, `system.val_while_train`, `common.batch_size`, `train.ckpt_save_dir`, `train.dataset.dataset_path`, `eval.ckpt_load_path`, `eval.dataset.dataset_path`, `eval.loader.batch_size`. Explanations of these important args: + +```yaml +system: + mode: + distribute: False # `True` for distributed training, `False` for standalone training + amp_level: 'O0' + seed: 42 + val_while_train: True # Validate while training + drop_overflow_update: False +model: + type: kie + transform: null + backbone: + name: layoutlmv3 + head: + name: TokenClassificationHead + num_classes: 7 + use_visual_backbone: True + use_float16: True + pretrained: +... +train: + ckpt_save_dir: './tmp_kie_ser' # The training result (including checkpoints, per-epoch performance and curves) saving directory + dataset_sink_mode: False + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # Path of training dataset + data_dir: XFUND/zh_train/image/ # Path of training dataset data dir + label_file: XFUND/zh_train/train.json # Path of training dataset label file +... +eval: + ckpt_load_path: './tmp_kie_ser/best.ckpt' # checkpoint file path + dataset_sink_mode: False + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # Path of evaluation dataset + data_dir: XFUND/zh_val/image/ # Path of evaluation dataset data dir + label_file: XFUND/zh_val/val.json # Path of evaluation dataset label file +... + ... +... +``` + +**Notes:** +- As the global batch size (batch_size x num_devices) is important for reproducing the result, please adjust `batch_size` accordingly to keep the global batch size unchanged for a different number of GPUs/NPUs, or adjust the learning rate linearly to a new global batch size. + + +### 3.2 Model Training + +* Distributed Training + +It is easy to reproduce the reported results with the pre-defined training recipe. For distributed training on multiple Ascend 910 devices, please modify the configuration parameter `distribute` as True and run: + +```shell +# distributed training on multiple GPU/Ascend devices +mpirun --allow-run-as-root -n 8 python tools/train.py --config configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml +``` + + +* Standalone Training + +If you want to train or finetune the model on a smaller dataset without distributed training, please modify the configuration parameter`distribute` as False and run: + +```shell +# standalone training on a CPU/GPU/Ascend device +python tools/train.py --config configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml +``` + +The training result (including checkpoints, per-epoch performance and curves) will be saved in the directory parsed by the arg `ckpt_save_dir`. The default directory is `./tmp_kie_ser`. + +### 3.3 Model Evaluation + +To evaluate the accuracy of the trained model, you can use `eval.py`. Please set the checkpoint path to the arg `ckpt_load_path` in the `eval` section of yaml config file, set `distribute` to be False, and then run: + +``` +python tools/eval.py --config configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml +``` + +### 3.4 Model Inference + +To perform inference using a pre-trained model, you can utilize `tools/infer/text/predict_ser.py` for inference and visualize the results. + +``` +python tools/infer/text/predict_ser.py --rec_algorithm CRNN_CH --image_dir {dir of images or path of image} +``` + +As an example of entity recognition in Chinese forms, use the script to recognize entities in the form of `configs/kie/vi_layoutxlm/example.jpg`. The results will be stored in the `./inference_results` folder by default, and you can also customize the result storage path through the `--draw_img_save_dir` command-line parameter. + +

+ +

+

+ example.jpg +

+Recognition results are as shown in the image, and the image is saved as`inference_results/example_ser.jpg`: + +

+ +

+

+ example_ser.jpg +

+ + + +## References + + +[1] Yupan Huang, Tengchao Lv, Lei Cui, Yutong Lu, Furu Wei. LayoutLMv3: Pre-training for Document AI with Unified Text and Image Masking. arXiv preprint arXiv:2204.08387, 2022. diff --git a/configs/kie/layoutlmv3/README_CN.md b/configs/kie/layoutlmv3/README_CN.md new file mode 100644 index 000000000..1f2628ad9 --- /dev/null +++ b/configs/kie/layoutlmv3/README_CN.md @@ -0,0 +1,246 @@ +[English](README.md) | 中文 + +# LayoutLMv3 + + +> [LayoutLMv3: Pre-training for Document AI with Unified Text and Image Masking](https://arxiv.org/abs/2204.08387) + +## 1. 模型描述 + + +不同于以往的LayoutLM系列模型,在模型架构设计上,LayoutLMv3 不依赖复杂的 CNN 或 Faster R-CNN 网络来表征图像,而是直接利用文档图像的图像块,从而大大节省了参数并避免了复杂的文档预处理(如人工标注目标区域框和文档目标检测)。简单的统一架构和训练目标使 LayoutLMv3 成为通用的预训练模型,可适用于以文本为中心和以图像为中心的文档 AI 任务。 + +实验结果表明,LayoutLMv3在以下数据集以更少的参数量达到了更优的性能: +- 以文本为中心的数据集:表单理解FUNSD数据集、票据理解CORD数据集以及文档视觉问答DocVQA数据集。 +- 以图像为中心的数据集:文档图像分类RVL-CDIP数据集以及文档布局分析PubLayNet数据集。 + +LayoutLMv3 还应用了文本——图像多模态 Transformer 架构来学习跨模态表征。文本向量由词向量、词的一维位置向量和二维位置向量相加得到。文档图像的文本和其相应的二维位置信息(布局信息)则利用光学字符识别(OCR)工具抽取。因为文本的邻接词通常表达了相似的语义,LayoutLMv3 共享了邻接词的二维位置向量,而 LayoutLM 和 LayoutLMv2 的每个词则用了不同的二维位置向量。 + +图像向量的表示通常依赖于 CNN 抽取特征图网格特征或 Faster R-CNN 提取区域特征,这些方式增加了计算开销或依赖于区域标注。因此,作者将图像块经过线性映射获得图像特征,这种图像表示方式最早在 ViT 中被提出,计算开销极小且不依赖于区域标注,有效解决了以上问题。具体来说,首先将图像缩放为统一的大小(例如224x224),然后将图像切分成固定大小的块(例如16x16),并通过线性映射获得图像特征序列,再加上可学习的一维位置向量后得到图像向量。[1] + + + +

+ +

+

+ 图1. LayoutLMv3架构图 [1] +

+ +## 2. 评估结果 + + +### 训练端 + +根据我们的实验,在XFUND中文数据集上训练([模型训练](#32-模型训练))性能和精度评估([模型评估](#33-模型评估))结果如下: + +
+ +| **模型** | **任务** | **环境配置** | **训练集** | **参数量** | **单卡批量** | **图模式单卡训练 (s/epoch)** | **图模式单卡训练 (ms/step)** | **图模式单卡训练 (FPS)** | **hmean** | **配置文件** | **模型权重下载** | +| :----------: | :------: | :-------------: | :--------: | :--------: | :----------: | :--------------------------: | :--------------------------: | :----------------------: | :-------: | :----------------------------------------------------: | :------------------------------------------------------------------------------------------------: | +| LayoutLMv3 | SER | D910x1-MS2.1-G | XFUND_zh | 265.8 M | 8 | 19.53 | 1094.86 | 7.37 | 91.88% | [yaml](../layoutlmv3/ser_layoutlmv3_xfund_zh.yaml) | ckpt(TODO) | + +
+ + +## 3. 快速开始 +### 3.1 环境及数据准备 + +#### 3.1.1 安装 +环境安装教程请参考MindOCR的 [installation instruction](https://github.com/mindspore-lab/mindocr#installation). + +#### 3.1.2 数据集下载 +这里使用[XFUND数据集](https://github.com/doc-analysis/XFUND)做为实验数据集。 XFUN数据集是微软提出的一个用于KIE任务的多语言数据集,共包含七个数据集,每个数据集包含149张训练集和50张验证集 + +分别为:ZH(中文)、JA(日语)、ES(西班牙)、FR(法语)、IT(意大利)、DE(德语)、PT(葡萄牙) + +这里提供了已经过预处理,可以直接用于训练的[中文数据集](https://download.mindspore.cn/toolkits/mindocr/vi-layoutxlm/XFUND.tar)下载。 + +```bash +mkdir train_data +cd train_data +wget https://download.mindspore.cn/toolkits/mindocr/vi-layoutxlm/XFUND.tar && tar -xf XFUND.tar +cd .. +``` + +#### 3.1.3 数据集使用 + +解压文件后,数据文件夹结构如下: + +```bash + └─ zh_train/ 训练集 + ├── image/ 图片存放文件夹 + ├── train.json 标注信息 + └─ zh_val/ 验证集 + ├── image/ 图片存放文件夹 + ├── val.json 标注信息 + +``` + +该数据集的标注格式为 + +```bash +{ + "height": 3508, # 图像高度 + "width": 2480, # 图像宽度 + "ocr_info": [ + { + "text": "邮政地址:", # 单个文本内容 + "label": "question", # 文本所属类别 + "bbox": [261, 802, 483, 859], # 单个文本框 + "id": 54, # 文本索引 + "linking": [[54, 60]], # 当前文本和其他文本的关系 [question, answer] + "words": [] + }, + { + "text": "湖南省怀化市市辖区", + "label": "answer", + "bbox": [487, 810, 862, 859], + "id": 60, + "linking": [[54, 60]], + "words": [] + } + ] +} +``` + +**模型训练的数据配置** + +如欲重现模型的训练,建议修改配置yaml的数据集相关字段如下: + +```yaml +... +train: + ... + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # 训练数据集根目录 + data_dir: XFUND/zh_train/image/ # 训练数据集目录,将与`dataset_root`拼接形成完整训练数据集目录 + label_file: XFUND/zh_train/train.json # 训练数据集的标签文件路径,将与`dataset_root`拼接形成完整的训练数据的标签文件路径。 +... +eval: + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # 验证数据集根目录 + data_dir: XFUND/zh_val/image/ # 验证数据集目录,将与`dataset_root`拼接形成完整验证数据集目录 + label_file: XFUND/zh_val/val.json # 验证数据集的标签文件路径,将与`dataset_root`拼接形成完整的验证或评估数据的标签文件路径。 + ... +``` + +#### 3.1.4 检查配置文件 +除了数据集的设置,请同时重点关注以下配置项:`system.distribute`, `system.val_while_train`, `train.loader.batch_size`, `train.ckpt_save_dir`, `train.dataset.dataset_root`, `train.dataset.data_dir`, `train.dataset.label_file`, +`eval.ckpt_load_path`, `eval.dataset.dataset_root`, `eval.dataset.data_dir`, `eval.dataset.label_file`, `eval.loader.batch_size`。说明如下: + +```yaml +system: + mode: + distribute: False # 分布式训练为True,单卡训练为False + amp_level: 'O0' + seed: 42 + val_while_train: True # 边训练边验证 + drop_overflow_update: False +model: + type: kie + transform: null + backbone: + name: layoutlmv3 + pretrained: False + checkpoints: path/to/layoutlmv3.ckpt # 导入ckpt位置 + num_classes: &num_classes 7 + mode: vi +... +train: + ckpt_save_dir: './tmp_kie_ser' # 训练结果(包括checkpoint、每个epoch的性能和曲线图)保存目录 + dataset_sink_mode: False + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # 训练数据集根目录 + data_dir: XFUND/zh_train/image/ # 训练数据集目录,将与`dataset_root`拼接形成完整训练数据集目录 + label_file: XFUND/zh_train/train.json # 训练数据集的标签文件路径,将与`dataset_root`拼接形成完整的训练数据的标签文件路径。 +... +eval: + ckpt_load_path: './tmp_kie_ser/best.ckpt' # checkpoint文件路径 + dataset_sink_mode: False + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # 验证数据集根目录 + data_dir: XFUND/zh_val/image/ # 验证数据集目录,将与`dataset_root`拼接形成完整验证数据集目录 + label_file: XFUND/zh_val/val.json # 验证数据集的标签文件路径,将与`dataset_root`拼接形成完整的验证或评估数据的标签文件路径。 + ... +... +``` + +**注意:** +- 由于全局批大小 (batch_size x num_devices) 是对结果复现很重要,因此当GPU/NPU卡数发生变化时,调整`batch_size`以保持全局批大小不变,或根据新的全局批大小线性调整学习率。 + + +### 3.2 模型训练 + +* 多卡数据并行训练 + +使用预定义的训练配置可以轻松重现报告的结果。对于在多个昇腾910设备上的分布式训练,请将配置参数`distribute`修改为True,并运行: + +```shell +# 在多个 GPU/Ascend 设备上进行分布式训练 +mpirun --allow-run-as-root -n 8 python tools/train.py --config configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml +``` + + +* 单卡训练 + +如果要在没有分布式训练的情况下在较小的数据集上训练或微调模型,请将配置参数`distribute`修改为False 并运行: + +```shell +# CPU/GPU/Ascend 设备上的单卡训练 +python tools/train.py --config configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml +``` + +训练结果(包括checkpoint、每个epoch的性能和曲线图)将被保存在yaml配置文件的`ckpt_save_dir`参数配置的目录下,默认为`./tmp_kie_ser`。 + +### 3.3 模型评估 + +若要评估已训练模型的准确性,可以使用`eval.py`。请在yaml配置文件的`eval`部分将参数`ckpt_load_path`设置为模型checkpoint的文件路径,然后运行: + +``` +python tools/eval.py --config configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml +``` + +### 3.4 模型推理 + +若要使用已训练的模型进行推理,可使用`tools/infer/text/predict_ser.py`进行推理并将结果进行可视化展示。 + +``` +python tools/infer/text/predict_ser.py --rec_algorithm CRNN_CH --image_dir {dir of images or path of image} +``` + +以中文表单的实体识别为例,使用脚本识别`configs/kie/vi_layoutxlm/example.jpg`表单中的实体,结果将默认存放在`./inference_results`文件夹内,也可以通过`--draw_img_save_dir`命令行参数自定义结果存储路径。 + +

+ +

+

+ example.jpg +

+识别结果如图,图片保存为`inference_results/example_ser.jpg`: + +

+ +

+

+ example_ser.jpg +

+ + + +## 参考文献 + + +[1] Yupan Huang, Tengchao Lv, Lei Cui, Yutong Lu, Furu Wei. LayoutLMv3: Pre-training for Document AI with Unified Text and Image Masking. arXiv preprint arXiv:2204.08387, 2022. diff --git a/configs/kie/layoutlmv3/layoutlmv3_arch.jpg b/configs/kie/layoutlmv3/layoutlmv3_arch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f23f3fc9d985e640aa7fe1c71386ad092f6e7e2 GIT binary patch literal 380147 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 literal 0 HcmV?d00001 diff --git a/configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml b/configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml new file mode 100644 index 000000000..b42c84116 --- /dev/null +++ b/configs/kie/layoutlmv3/ser_layoutlmv3_xfund_zh.yaml @@ -0,0 +1,128 @@ +system: + mode: 0 # 0 for graph mode, 1 for pynative mode in MindSpore + distribute: False + amp_level: "O0" + seed: 42 + log_interval: 10 + val_start_epoch: 50 + val_while_train: True + drop_overflow_update: False + +model: + type: kie + transform: null + backbone: + name: layoutlmv3 + head: + name: TokenClassificationHead + num_classes: 7 + use_visual_backbone: True + use_float16: True + pretrained: + +postprocess: + name: VQASerTokenLayoutLMPostProcess + class_path: &class_path + +metric: + name: VQASerTokenMetric + main_indicator: hmean + +loss: + name: VQASerTokenLayoutLMLoss + num_classes: 7 + +scheduler: + scheduler: polynomial_decay + lr: 5.0e-5 + min_lr: 2.0e-7 + num_epochs: 200 + warmup_epochs: 2 + +optimizer: + opt: adam + filter_bias_and_bn: False + weight_decay: 0.0005 + +train: + ckpt_save_dir: "./tmp_kie_ser" + dataset_sink_mode: False + dataset: + type: KieDataset + dataset_root: path/to/train_data/ + data_dir: XFUND/zh_train/image + label_file: XFUND/zh_train/train.json + sample_ratio: 1.0 + transform_pipeline: + - DecodeImage: + img_mode: RGB + to_float32: False + - VQATokenLabelEncode: + contains_re: False + algorithm: &algorithm LayoutLMv3 + class_path: *class_path + - VQATokenPad: + max_seq_len: &max_seq_len 512 + return_attention_mask: True + - VQASerTokenChunk: + max_seq_len: *max_seq_len + - LayoutResize: + size: [224, 224] + - NormalizeImage: + bgr_to_rgb: False + is_hwc: True + mean: imagenet + std: imagenet + - ToCHWImage: + # the order of the dataloader list, matching the network input and the input labels for the loss function, and optional data for debug/visualize + output_columns: [ "input_ids", "bbox", "attention_mask", "token_type_ids", "image", "labels"] + net_input_column_index: [0, 1, 2, 3, 4] # input indices for network forward func in output_columns + label_column_index: [2, 5] # input indices marked as label + + loader: + shuffle: True + batch_size: 8 + drop_remainder: True + num_workers: 8 + +eval: + ckpt_load_path: "./tmp_kie_ser/best.ckpt" + dataset_sink_mode: False + dataset: + type: KieDataset + dataset_root: path/to/train_data/ + data_dir: XFUND/zh_val/image + label_file: XFUND/zh_val/val.json + sample_ratio: 1.0 + shuffle: False + transform_pipeline: + - DecodeImage: + img_mode: RGB + to_float32: False + - VQATokenLabelEncode: + contains_re: False + algorithm: *algorithm + class_path: *class_path + - VQATokenPad: + max_seq_len: *max_seq_len + return_attention_mask: True + - VQASerTokenChunk: + max_seq_len: *max_seq_len + - LayoutResize: + size: [224, 224] + - NormalizeImage: + bgr_to_rgb: False + is_hwc: True + mean: imagenet + std: imagenet + - ToCHWImage: + # the order of the dataloader list, matching the network input and the labels for evaluation + output_columns: ["input_ids", "bbox", "attention_mask", "token_type_ids", "image", "labels"] + net_input_column_index: [0, 1, 2, 3, 4] # input indices for network forward func in output_columns + label_column_index: [2, 5] # input indices marked as label + + loader: + shuffle: False + batch_size: 1 + drop_remainder: False + num_workers: 1 diff --git a/configs/kie/layoutlm_series/re_layoutxlm_xfund_zh.yaml b/configs/kie/layoutxlm/re_layoutxlm_xfund_zh.yaml similarity index 100% rename from configs/kie/layoutlm_series/re_layoutxlm_xfund_zh.yaml rename to configs/kie/layoutxlm/re_layoutxlm_xfund_zh.yaml diff --git a/configs/kie/layoutlm_series/ser_layoutxlm_xfund_zh.yaml b/configs/kie/layoutxlm/ser_layoutxlm_xfund_zh.yaml similarity index 100% rename from configs/kie/layoutlm_series/ser_layoutxlm_xfund_zh.yaml rename to configs/kie/layoutxlm/ser_layoutxlm_xfund_zh.yaml diff --git a/configs/kie/vi_layoutxlm/README.md b/configs/kie/vi_layoutxlm/README.md new file mode 100644 index 000000000..5326f11f5 --- /dev/null +++ b/configs/kie/vi_layoutxlm/README.md @@ -0,0 +1,283 @@ +English| [中文](README_CN.md) + +# LayoutXLM + + +> [LayoutXLM: Multimodal Pre-training for Multilingual Visually-rich Document Understanding](https://arxiv.org/abs/2104.08836) + +## 1. Introduction + +**** +LayoutXLM is the multilingual version of LayoutLMv2[2]. Unlike the original LayoutLM, which integrates image embeddings during the fine-tuning stage, LayoutXLM integrates visual information during the pre-training stage and utilizes a Transformer architecture to learn cross-modal interactions between text and images. Additionally, inspired by 1-D relative positional representation, the paper proposes a spatial-aware self-attention mechanism, which provides 2-D relative positional representation for token pairs. Unlike using absolute 2-D position embeddings to model document layout, relative positional embeddings can provide a larger receptive field for modeling contextual spatial relationships clearly. + +As shown in the architecture diagram [Figure 1](#-Multi-modal-Encoder-with-Spatial-Aware-Self-Attention-Mechanism), LayoutXLM (LayoutLMv2) adopts a multimodal Transformer architecture as its backbone. The backbone takes text, image, and layout information as input, establishing deep cross-modal interactions. At the same time, it introduces the spatial-aware self-attention mechanism, allowing the model to better model document layout. + +### Text Embedding +Tokenizing the OCR text sequence with WordPiece, each token is marked as {[A], [B]}. Then, [CLS] is added to the beginning of the sequence, and [SEP] is added to the end of each text segment. Additional [PAD] tokens are added to the end of the sequence to match the maximum sequence length, denoted as L. The final text embedding is the sum of three embeddings: token embedding representing the token itself, 1-D position embedding representing the token index, and segment embedding used to distinguish different text segments. + +### Visual Embedding +Although all the required information is present in the page image, the model finds it challenging to capture detailed features through a single information-rich representation. Therefore, leveraging a CNN-based visual encoder outputs the page feature map, which also converts the page image into a fixed-length sequence. Using the ResNeXt-FPN architecture as the backbone, its parameters can be trained through backpropagation. + +For a given page image I, it is resized to 224×224 before entering the visual backbone. The output feature map is then average-pooled to a fixed size: width W and height H. Afterwards, it is flattened into a visual embedding sequence of length W×H, and its dimension is aligned with the text embedding through a linear projection layer. Since the CNN-based visual backbone cannot acquire position information, 1-D position embedding is also added, which is shared with the text embedding. For segment embedding, all visual tokens are assigned to [C]. + +### Layout Embedding +The layout embedding layer is used to represent spatial layout information, which originates from the axis-aligned token bounding boxes obtained from OCR recognition, including the length, width, and coordinates of the boxes. Following the approach of LayoutLM, the coordinates are normalized and discretized, rounding them to integers between 0 and 1000. Two embedding layers are used to embed features along the x-axis and y-axis, respectively. + +Given a normalized bounding box with xmin, xmax, ymin, ymax, width, and height, the layout embedding layer concatenates the six bounding box features to construct a 2-D position embedding, which is the layout embedding. Since CNN supports local transformations, image token embeddings can be mapped back to the original image one-to-one, without overlapping or missing tokens. Therefore, when calculating bounding boxes, visual tokens can be assigned to the corresponding grid. For special tokens such as [CLS], [SEP], and [PAD] in the text embedding, zero features for bounding boxes are appended. + +### Multi-modal Encoder with Spatial-Aware Self-Attention Mechanism +The encoder concatenates visual embeddings and text embeddings into a unified sequence and adds them to the layout embeddings to blend spatial information. Following the Transformer architecture, the model constructs a multimodal encoder with a stack of multi-head self-attention layers followed by feed-forward networks. However, the original self-attention mechanism only captures absolute positional relationships between input tokens. To effectively model local invariance in document layout, it is necessary to explicitly insert relative positional information. Therefore, we propose the spatial-aware self-attention mechanism and incorporate it into the self-attention layer. + +After obtaining αij from the original self-attention layer, considering the large range of positions, we model semantic relative positions and spatial relative positions as bias terms to avoid introducing too many parameters. We use three biases to represent learnable 1-D and 2-D (x, y) relative positional biases. These biases are different for each attention head but consistent across layers. Assuming a bounding box (xi, yi), the three biases are added to αij to obtain the self-attention map, and finally, the final attention scores are computed in the manner of Transformer. + [1] [2] + + + +

+ +

+

+ Figure 1. LayoutXLM(LayoutLMv2) architecture [1] +

+ +## 2. Results + + +### Accuracy + +According to our experiments, the performance and accuracy evaluation([Model Evaluation](#33-Model-Evaluation)) results of training ([Model Training](#32-Model-Training)) on the XFUND Chinese dataset are as follows: + +
+ +| **Model** | **Task** | **Context** | **Dateset** | **Model Params** | **Batch size** | **Graph train 1P (s/epoch)** | **Graph train 1P (ms/step)** | **Graph train 1P (FPS)** | **hmean** | **Config** | **Download** | +| :----------: | :------: | :-------------: | :--------: | :--------: | :----------: | :--------------------------: | :--------------------------: | :----------------------: | :-------: | :----------------------------------------------------: | :------------------------------------------------------------------------------------------------: | +| LayoutXLM | SER | D910Ax1-MS2.1-G | XFUND_zh | 352.0 M | 8 | 3.41 | 189.50 | 42.24 | 90.41% | [yaml](../layoutxlm/ser_layoutxlm_xfund_zh.yaml) | [ckpt](https://download.mindspore.cn/toolkits/mindocr/layoutxlm/ser_layoutxlm_base-a4ea148e.ckpt) | +| VI-LayoutXLM | SER | D910Ax1-MS2.1-G | XFUND_zh | 265.7 M | 8 | 3.06 | 169.7 | 47.2 | 93.31% | [yaml](ser_vi_layoutxlm_xfund_zh.yaml) | [ckpt](https://download.mindspore.cn/toolkits/mindocr/vi-layoutxlm/ser_vi_layoutxlm-f3c83585.ckpt) | + +
+ + + +## 3. Quick Start +### 3.1 Preparation + +#### 3.1.1 Installation +Please refer to the [installation instruction](https://github.com/mindspore-lab/mindocr#installation) in MindOCR. + +#### 3.1.2 Dataset Download + +[The XFUND dataset](https://github.com/doc-analysis/XFUND) is used as the experimental dataset. The XFUND dataset is a multilingual dataset proposed by Microsoft for the Knowledge-Intensive Extraction (KIE) task. It consists of seven datasets, each containing 149 training samples and 50 validation samples. + +Respectively: ZH (Chinese), JA (Japanese), ES (Spanish), FR (French), IT (Italian), DE (German), PT (Portuguese) + +a preprocessed [Chinese dataset](https://download.mindspore.cn/toolkits/mindocr/vi-layoutxlm/XFUND.tar) that can be directly used is provided for everyone to download. + +```bash +mkdir train_data +cd train_data +wget https://download.mindspore.cn/toolkits/mindocr/vi-layoutxlm/XFUND.tar && tar -xf XFUND.tar +cd .. +``` + +#### 3.1.3 Dataset Usage + +After decompression, the data folder structure is as follows: + +```bash + └─ zh_train/ Training set + ├── image/ Folder for storing images + ├── train.json Annotation information + └─ zh_val/ Validation set + ├── image/ Folder for storing images + ├── val.json Annotation information + +``` + +The annotation format of this dataset is: + +```bash +{ + "height": 3508, # Image height + "width": 2480, # Image width + "ocr_info": [ + { + "text": "邮政地址:", # Single text content + "label": "question", # Category of the text + "bbox": [261, 802, 483, 859], # Single text box + "id": 54, # Text index + "linking": [[54, 60]], # Relationships between the current text and other texts [question, answer] + "words": [] + }, + { + "text": "湖南省怀化市市辖区", + "label": "answer", + "bbox": [487, 810, 862, 859], + "id": 60, + "linking": [[54, 60]], + "words": [] + } + ] +} +``` + +**The data configuration for model training.** + +If you want to reproduce the training of the model, it is recommended to modify the dataset-related fields in the configuration YAML file as follows: + +```yaml +... +train: + ... + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # Root directory of the training dataset + data_dir: XFUND/zh_train/image/ # Directory of the training dataset, concatenated with `dataset_root` to form the complete directory of the training dataset + label_file: XFUND/zh_train/train.json # Path to the label file of the training dataset, concatenated with `dataset_root` to form the complete path of the label file of the training dataset +... +eval: + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # Root directory of the validation dataset + data_dir: XFUND/zh_val/image/ # Directory of the validation dataset, concatenated with `dataset_root` to form the complete directory of the validation dataset + label_file: XFUND/zh_val/val.json # Path to the label file of the validation dataset, concatenated with `dataset_root` to form the complete path of the label file of the validation dataset + ... + +``` + +#### 3.1.4 Check YAML Config Files +Apart from the dataset setting, please also check the following important args: `system.distribute`, `system.val_while_train`, `common.batch_size`, `train.ckpt_save_dir`, `train.dataset.dataset_path`, `eval.ckpt_load_path`, `eval.dataset.dataset_path`, `eval.loader.batch_size`. Explanations of these important args: + +```yaml +system: + mode: + distribute: False # `True` for distributed training, `False` for standalone training + amp_level: 'O0' + seed: 42 + val_while_train: True # Validate while training + drop_overflow_update: False +model: + type: kie + transform: null + backbone: + name: layoutxlm + pretrained: True + num_classes: &num_classes 7 + use_visual_backbone: False + use_float16: True + head : + name: TokenClassificationHead + num_classes: 7 + use_visual_backbone: False + use_float16: True + pretrained: +... +train: + ckpt_save_dir: './tmp_kie_ser' # The training result (including checkpoints, per-epoch performance and curves) saving directory + dataset_sink_mode: False + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # Path of training dataset + data_dir: XFUND/zh_train/image/ # Path of training dataset data dir + label_file: XFUND/zh_train/train.json # Path of training dataset label file +... +eval: + ckpt_load_path: './tmp_kie_ser/best.ckpt' # checkpoint file path + dataset_sink_mode: False + dataset: + type: KieDataset + dataset_root: path/to/dataset/ # Path of evaluation dataset + data_dir: XFUND/zh_val/image/ # Path of evaluation dataset data dir + label_file: XFUND/zh_val/val.json # Path of evaluation dataset label file +... + ... +... +``` + +**Notes:** +- As the global batch size (batch_size x num_devices) is important for reproducing the result, please adjust `batch_size` accordingly to keep the global batch size unchanged for a different number of GPUs/NPUs, or adjust the learning rate linearly to a new global batch size. + + +### 3.2 Model Training + +* Convert PaddleOCR model + +If you want to import the PaddleOCR LayoutXLM model, you can use the `tools/param_converter.py` script to convert the pdparams file to the ckpt format supported by MindSpore, and then import it for further training. + +```shell +python tools/param_converter.py \ + --input_path path/to/paddleocr.pdparams \ + --json_path mindocr/models/backbones/layoutxlm/ser_vi_layoutxlm_param_map.json \ + --output_path path/to/from_paddle.ckpt +``` + +* Distributed Training + +It is easy to reproduce the reported results with the pre-defined training recipe. For distributed training on multiple Ascend 910 devices, please modify the configuration parameter `distribute` as True and run: + +```shell +# distributed training on multiple GPU/Ascend devices +mpirun --allow-run-as-root -n 8 python tools/train.py --config configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yaml +``` + + +* Standalone Training + +If you want to train or finetune the model on a smaller dataset without distributed training, please modify the configuration parameter`distribute` as False and run: + +```shell +# standalone training on a CPU/GPU/Ascend device +python tools/train.py --config configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yaml +``` + +The training result (including checkpoints, per-epoch performance and curves) will be saved in the directory parsed by the arg `ckpt_save_dir`. The default directory is `./tmp_kie_ser`. + +### 3.3 Model Evaluation + +To evaluate the accuracy of the trained model, you can use `eval.py`. Please set the checkpoint path to the arg `ckpt_load_path` in the `eval` section of yaml config file, set `distribute` to be False, and then run: + +``` +python tools/eval.py --config configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yaml +``` + + +### 3.4 Model Inference + +To perform inference using a pre-trained model, you can utilize `tools/infer/text/predict_ser.py` for inference and visualize the results. + +``` +python tools/infer/text/predict_ser.py --rec_algorithm CRNN_CH --image_dir {dir of images or path of image} +``` + +As an example of entity recognition in Chinese forms, use the script to recognize entities in the form of `configs/kie/vi_layoutxlm/example.jpg`. The results will be stored in the `./inference_results` folder by default, and you can also customize the result storage path through the `--draw_img_save_dir` command-line parameter. + +

+ +

+

+ example.jpg +

+Recognition results are as shown in the image, and the image is saved as`inference_results/example_ser.jpg`: + +

+ +

+

+ example_ser.jpg +

+ + + +## References + + +[1] Yang Xu, Yiheng Xu, Tengchao Lv, Lei Cui, Furu Wei, Guoxin Wang, Yijuan Lu, Dinei Florencio, Cha Zhang, Wanxiang Che, Min Zhang, Lidong Zhou. LayoutLMv2: Multi-modal Pre-training for Visually-Rich Document Understanding. arXiv preprint arXiv:2012.14740, 2020. + +[2] Yiheng Xu, Tengchao Lv, Lei Cui, Guoxin Wang, Yijuan Lu, Dinei Florencio, Cha Zhang, Furu Wei. LayoutXLM: Multimodal Pre-training for Multilingual Visually-rich Document Understanding. arXiv preprint arXiv:2104.08836, 2021. diff --git a/configs/kie/vi_layoutxlm/README_CN.md b/configs/kie/vi_layoutxlm/README_CN.md index a0fbd468f..f6f843807 100644 --- a/configs/kie/vi_layoutxlm/README_CN.md +++ b/configs/kie/vi_layoutxlm/README_CN.md @@ -48,43 +48,17 @@ Table Format: ### 训练端 -根据我们的实验,训练([模型训练](#32-模型训练))性能和精度评估([模型评估](#33-模型评估))结果如下: +根据我们的实验,在XFUND中文数据集上训练([模型训练](#32-模型训练))性能和精度评估([模型评估](#33-模型评估))结果如下:
| **模型** | **任务** | **环境配置** | **训练集** | **参数量** | **单卡批量** | **图模式单卡训练 (s/epoch)** | **图模式单卡训练 (ms/step)** | **图模式单卡训练 (FPS)** | **hmean** | **配置文件** | **模型权重下载** | | :----------: | :------: | :-------------: | :--------: | :--------: | :----------: | :--------------------------: | :--------------------------: | :----------------------: | :-------: | :----------------------------------------------------: | :------------------------------------------------------------------------------------------------: | -| LayoutXLM | SER | D910Ax1-MS2.1-G | XFUND_zh | 352.0 M | 8 | 3.41 | 189.50 | 42.24 | 90.41% | [yaml](../layoutlm_series/ser_layoutxlm_xfund_zh.yaml) | [ckpt](https://download.mindspore.cn/toolkits/mindocr/layoutxlm/ser_layoutxlm_base-a4ea148e.ckpt) | +| LayoutXLM | SER | D910Ax1-MS2.1-G | XFUND_zh | 352.0 M | 8 | 3.41 | 189.50 | 42.24 | 90.41% | [yaml](../layoutxlm/ser_layoutxlm_xfund_zh.yaml) | [ckpt](https://download.mindspore.cn/toolkits/mindocr/layoutxlm/ser_layoutxlm_base-a4ea148e.ckpt) | | VI-LayoutXLM | SER | D910Ax1-MS2.1-G | XFUND_zh | 265.7 M | 8 | 3.06 | 169.7 | 47.2 | 93.31% | [yaml](ser_vi_layoutxlm_xfund_zh.yaml) | [ckpt](https://download.mindspore.cn/toolkits/mindocr/vi-layoutxlm/ser_vi_layoutxlm-f3c83585.ckpt) |
-### 3.4 模型推理 - -若要使用已训练的模型进行推理,可使用`tools/infer/text/predict_ser.py`进行推理并将结果进行可视化展示。 - -``` -python tools/infer/text/predict_ser.py --rec_algorithm CRNN_CH --image_dir {dir of images or path of image} -``` - -以中文表单的实体识别为例,使用脚本识别`configs/kie/vi_layoutxlm/example.jpg`表单中的实体,结果将默认存放在`./inference_results`文件夹内,也可以通过`--draw_img_save_dir`命令行参数自定义结果存储路径。 - -

- -

-

- example.jpg -

-识别结果如图,图片保存为`inference_results/example_ser.jpg`: - -

- -

-

- example_ser.jpg -

- - ### 推理端 TODO @@ -190,11 +164,17 @@ model: type: kie transform: null backbone: - name: layoutxlm_for_ser - pretrained: False - checkpoints: path/to/ser_vi_layoutxlm.ckpt # 导入ckpt位置 + name: layoutxlm + pretrained: True num_classes: &num_classes 7 - mode: vi + use_visual_backbone: False + use_float16: True + head : + name: TokenClassificationHead + num_classes: 7 + use_visual_backbone: False + use_float16: True + pretrained: ... train: ckpt_save_dir: './tmp_kie_ser' # 训练结果(包括checkpoint、每个epoch的性能和曲线图)保存目录 @@ -264,6 +244,32 @@ python tools/eval.py --config configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh ``` +### 3.4 模型推理 + +若要使用已训练的模型进行推理,可使用`tools/infer/text/predict_ser.py`进行推理并将结果进行可视化展示。 + +``` +python tools/infer/text/predict_ser.py --rec_algorithm CRNN_CH --image_dir {dir of images or path of image} +``` + +以中文表单的实体识别为例,使用脚本识别`configs/kie/vi_layoutxlm/example.jpg`表单中的实体,结果将默认存放在`./inference_results`文件夹内,也可以通过`--draw_img_save_dir`命令行参数自定义结果存储路径。 + +

+ +

+

+ example.jpg +

+识别结果如图,图片保存为`inference_results/example_ser.jpg`: + +

+ +

+

+ example_ser.jpg +

+ + ## 4. MindSpore Lite 推理 **TODO** diff --git a/mindocr/data/transforms/layoutlm_transforms.py b/mindocr/data/transforms/layoutlm_transforms.py index 2766e05ad..4b1095a9e 100644 --- a/mindocr/data/transforms/layoutlm_transforms.py +++ b/mindocr/data/transforms/layoutlm_transforms.py @@ -7,6 +7,7 @@ from mindspore import nn +from mindocr.models.backbones.layoutlmv3 import LayoutLMv3Tokenizer from mindocr.models.backbones.layoutxlm import LayoutXLMTokenizer from mindocr.utils.kie_utils import load_vqa_bio_label_maps @@ -65,6 +66,7 @@ def __init__( super(VQATokenLabelEncode, self).__init__() tokenizer_dict = { "LayoutXLM": {"class": LayoutXLMTokenizer, "pretrained_model": "layoutxlm-base-uncased"}, + "LayoutLMv3": {"class": LayoutLMv3Tokenizer, "pretrained_model": "layoutxlm-base-uncased"}, } self.contains_re = contains_re tokenizer_config = tokenizer_dict[algorithm] diff --git a/mindocr/metrics/kie_metrics.py b/mindocr/metrics/kie_metrics.py index 34d07b51c..2f0cdee3e 100644 --- a/mindocr/metrics/kie_metrics.py +++ b/mindocr/metrics/kie_metrics.py @@ -3,7 +3,7 @@ from glob import glob import numpy as np -import seqeval +import seqeval.metrics import sklearn from mindspore import get_context, nn diff --git a/mindocr/models/backbones/__init__.py b/mindocr/models/backbones/__init__.py index b6d423152..8f71299ab 100644 --- a/mindocr/models/backbones/__init__.py +++ b/mindocr/models/backbones/__init__.py @@ -8,6 +8,7 @@ from .cls_mobilenet_v3 import * from .det_mobilenet import * from .det_resnet import * +from .layoutlmv3 import layoutlmv3 from .layoutxlm import layoutxlm from .rec_abinet_backbone import * from .rec_master import * diff --git a/mindocr/models/backbones/layoutlmv3/__init__.py b/mindocr/models/backbones/layoutlmv3/__init__.py new file mode 100644 index 000000000..d86a97b37 --- /dev/null +++ b/mindocr/models/backbones/layoutlmv3/__init__.py @@ -0,0 +1,5 @@ +from .configuration import LayoutLMv3PretrainedConfig +from .layoutlmv3 import LayoutLMv3Model +from .tokenizer import LayoutLMv3Tokenizer + +__all__ = ["LayoutLMv3PretrainedConfig", "LayoutLMv3Model", "LayoutLMv3Tokenizer"] diff --git a/mindocr/models/backbones/layoutlmv3/configuration.py b/mindocr/models/backbones/layoutlmv3/configuration.py new file mode 100644 index 000000000..93243ddb5 --- /dev/null +++ b/mindocr/models/backbones/layoutlmv3/configuration.py @@ -0,0 +1,44 @@ +from dataclasses import dataclass + + +@dataclass +class LayoutLMv3PretrainedConfig: + def __init__(self, use_float16=False): + pretrained_config = { + "use_float16": use_float16, + "fast_qkv": False, + "vocab_size": 250002, + "hidden_size": 768, + "num_hidden_layers": 12, + "num_attention_heads": 12, + "intermediate_size": 3072, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "attention_probs_dropout_prob": 0.1, + "max_position_embeddings": 514, + "type_vocab_size": 1, + "initializer_range": 0.02, + "layer_norm_eps": 1e-5, + "pad_token_id": 1, + "bos_token_id": 0, + "eos_token_id": 2, + "max_2d_position_embeddings": 1024, + "coordinate_size": 128, + "shape_size": 128, + "has_relative_attention_bias": True, + "rel_pos_bins": 32, + "max_rel_pos": 128, + "rel_2d_pos_bins": 64, + "max_rel_2d_pos": 256, + "has_spatial_attention_bias": True, + "text_embed": True, + "visual_embed": True, + "input_size": 224, + "num_channels": 3, + "patch_size": 16, + "classifier_dropout": None, + "num_labels": None, + } + + for key, value in pretrained_config.items(): + setattr(self, key, value) diff --git a/mindocr/models/backbones/layoutlmv3/layoutlmv3.py b/mindocr/models/backbones/layoutlmv3/layoutlmv3.py new file mode 100644 index 000000000..1e1bc1f9b --- /dev/null +++ b/mindocr/models/backbones/layoutlmv3/layoutlmv3.py @@ -0,0 +1,524 @@ +import collections + +import numpy as np + +from mindspore import Parameter, Tensor, nn, ops +from mindspore.common import dtype as mstype + +from mindocr.models.backbones._registry import register_backbone, register_backbone_class + +from ..transformer_common.layer import ( + LayoutXLMAttention, + LayoutXLMEmbeddings, + LayoutXLMEncoder, + LayoutXLMLayer, + LayoutXLMSelfAttention, + finfo, +) +from .configuration import LayoutLMv3PretrainedConfig + + +class LayoutLMv3PatchEmbeddings(nn.Cell): + """ + LayoutLMv3 image (patch) embeddings. This class also automatically interpolates the position embeddings for varying + image sizes. + """ + + def __init__(self, config): + super().__init__() + + image_size = ( + config.input_size + if isinstance(config.input_size, collections.abc.Iterable) + else (config.input_size, config.input_size) + ) + patch_size = ( + config.patch_size + if isinstance(config.patch_size, collections.abc.Iterable) + else (config.patch_size, config.patch_size) + ) + self.patch_shape = (image_size[0] // patch_size[0], image_size[1] // patch_size[1]) + self.proj = nn.Conv2d( + config.num_channels, config.hidden_size, kernel_size=patch_size, stride=patch_size, has_bias=True + ) + + def construct(self, pixel_values: Tensor, position_embedding: Tensor = None): + embeddings = self.proj(pixel_values) + + if position_embedding is not None: + # interpolate the position embedding to the corresponding size + position_embedding = position_embedding.view(1, self.patch_shape[0], self.patch_shape[1], -1) + position_embedding = position_embedding.transpose(0, 3, 1, 2) + patch_height, patch_width = embeddings.shape[2], embeddings.shape[3] + position_embedding = ops.interpolate(position_embedding, size=(patch_height, patch_width), mode="bicubic") + embeddings = embeddings + position_embedding + + embeddings = embeddings.flatten(start_dim=2).transpose(0, 2, 1) + return embeddings + + +class LayoutLMv3TextEmbeddings(LayoutXLMEmbeddings): + """ + LayoutLMv3 text embeddings. Same as `RobertaEmbeddings` but with added spatial (layout) embeddings. + """ + + def __init__(self, config): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.position_embeddings = nn.Embedding( + config.max_position_embeddings, config.hidden_size, padding_idx=self.padding_idx + ) + + def create_position_ids_from_input_ids(self, input_ids: Tensor, padding_idx): + """ + Replace non-padding symbols with their position numbers. Position numbers begin at padding_idx+1. Padding + symbols are ignored. This is modified from fairseq's `utils.make_positions`. + """ + # The series of casts and type-conversions here are carefully balanced to both work with ONNX export and XLA. + mask = input_ids.ne(padding_idx).astype(mstype.int32) + incremental_indices = (ops.cumsum(mask, axis=1)) * mask + return incremental_indices.astype(mstype.int64) + padding_idx + + def create_position_ids_from_inputs_embeds(self, inputs_embeds): + """ + We are provided embeddings directly. We cannot infer which are padded so just generate sequential position ids. + """ + input_shape = inputs_embeds.size()[:-1] + sequence_length = input_shape[1] + + position_ids = Tensor(np.arange(self.padding_idx + 1, sequence_length + self.padding_idx + 1, dtype=np.int64)) + return position_ids.unsqueeze(0).broadcast_to(input_shape) + + def construct( + self, + input_ids=None, + bbox=None, + token_type_ids=None, + position_ids=None, + inputs_embeds=None, + ): + if position_ids is None: + if input_ids is not None: + # Create the position ids from the input token ids. Any padded tokens remain padded. + position_ids = self.create_position_ids_from_input_ids(input_ids, self.padding_idx) + else: + position_ids = self.create_position_ids_from_inputs_embeds(inputs_embeds) + + if input_ids is not None: + input_shape = input_ids.shape + else: + input_shape = inputs_embeds.shape[:-1] + + if token_type_ids is None: + token_type_ids = ops.zeros(input_shape, dtype=mstype.int64) + + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + token_type_embeddings = self.token_type_embeddings(token_type_ids) + + embeddings = inputs_embeds + token_type_embeddings + position_embeddings = self.position_embeddings(position_ids) + embeddings += position_embeddings + + spatial_position_embeddings = self._cal_spatial_position_embeddings(bbox) + + embeddings = embeddings + spatial_position_embeddings + + embeddings = self.LayerNorm(embeddings) + embeddings = self.dropout(embeddings) + return embeddings + + +class LayoutLMv3SelfAttention(LayoutXLMSelfAttention): + def __init__(self, config): + super().__init__(config) + + def cogview_attention(self, attention_scores: Tensor, alpha=32): + """ + https://arxiv.org/abs/2105.13290 Section 2.4 Stabilization of training: Precision Bottleneck Relaxation + (PB-Relax). A replacement of the original nn.Softmax(dim=-1)(attention_scores). Seems the new attention_probs + will result in a slower speed and a little bias. Can use allclose(standard_attention_probs, + cogview_attention_probs, atol=1e-08) for comparison. The smaller atol (e.g., 1e-08), the better. + """ + scaled_attention_scores = attention_scores / alpha + max_value = scaled_attention_scores.max(axis=-1).unsqueeze(-1) + new_attention_scores = (scaled_attention_scores - max_value) * alpha + return nn.Softmax(axis=-1)(new_attention_scores) + + def construct( + self, + hidden_states, + attention_mask=None, + head_mask=None, + encoder_hidden_states=None, + encoder_attention_mask=None, + past_key_value=None, + output_attentions=False, + rel_pos=None, + rel_2d_pos=None, + ): + q, k, v = self.compute_qkv(hidden_states) + + # (B, L, H*D) -> (B, H, L, D) + query_layer = self.transpose_for_scores(q) + key_layer = self.transpose_for_scores(k) + value_layer = self.transpose_for_scores(v) + + # Take the dot product between "query" and "key" to get the raw attention scores. + # The attention scores QT K/√d could be significantly larger than input elements, and result in overflow. + # Changing the computational order into QT(K/√d) alleviates the problem. (https://arxiv.org/pdf/2105.13290.pdf) + attention_scores = ops.matmul(query_layer / self.attention_head_size_sqrt, key_layer.transpose(0, 1, 3, 2)) + if self.has_relative_attention_bias and self.has_spatial_attention_bias: + attention_scores += (rel_pos + rel_2d_pos) / self.attention_head_size_sqrt + elif self.has_relative_attention_bias: + attention_scores += rel_pos / self.attention_head_size_sqrt + + if attention_mask is not None: + # Apply the attention mask is (precomputed for all layers in RobertaModel forward() function) + attention_scores = attention_scores + attention_mask.astype(self.dense_dtype) + + # Normalize the attention scores to probabilities. + # Use the trick of the CogView paper to stablize training + attention_probs = self.cogview_attention(attention_scores) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = self.dropout(attention_probs) + + # Mask heads if we want to + if head_mask is not None: + attention_probs = attention_probs * head_mask + + context_layer = ops.matmul(attention_probs, value_layer) + + context_layer = context_layer.transpose(0, 2, 1, 3) + new_context_layer_shape = context_layer.shape[:-2] + (self.all_head_size,) + context_layer = context_layer.view(*new_context_layer_shape) + + outputs = (context_layer, attention_probs) if output_attentions else (context_layer,) + + return outputs + + +class LayoutLMv3Attention(LayoutXLMAttention): + def __init__(self, config): + super().__init__(config) + self.self_attention = LayoutLMv3SelfAttention(config) + + +class LayoutLMv3Layer(LayoutXLMLayer): + def __init__(self, config): + super().__init__(config) + self.attention = LayoutLMv3Attention(config) + + +class LayoutLMv3Encoder(LayoutXLMEncoder): + def __init__(self, config): + super().__init__(config) + self.layer = nn.CellList([LayoutLMv3Layer(config) for _ in range(config.num_hidden_layers)]) + + +@register_backbone_class +class LayoutLMv3Model(nn.Cell): + def __init__(self, config): + super().__init__(config) + self.config = config + self.num_hidden_layers = config.num_hidden_layers + self.has_relative_attention_bias = config.has_relative_attention_bias + self.has_spatial_attention_bias = config.has_spatial_attention_bias + self.patch_size = config.patch_size + self.use_float16 = config.use_float16 + self.dense_dtype = mstype.float32 + if self.use_float16 is True: + self.dense_dtype = mstype.float16 + self.min = finfo(self.dense_dtype) + self.out_channels = 1 + self.use_visual_backbone = True + + if config.text_embed: + self.embeddings = LayoutLMv3TextEmbeddings(config) + + if config.visual_embed: + # use the default pre-training parameters for fine-tuning (e.g., input_size) + # when the input_size is larger in fine-tuning, we will interpolate the position embeddings in forward + self.patch_embed = LayoutLMv3PatchEmbeddings(config) + + size = int(config.input_size / config.patch_size) + self.cls_token = Parameter(ops.zeros((1, 1, config.hidden_size))) + self.pos_embed = Parameter(ops.zeros((1, size * size + 1, config.hidden_size))) + self.pos_drop = nn.Dropout(p=0.0) + + self.LayerNorm = nn.LayerNorm((config.hidden_size,), epsilon=config.layer_norm_eps) + self.dropout = nn.Dropout(p=config.hidden_dropout_prob) + + if config.has_relative_attention_bias or config.has_spatial_attention_bias: + self.init_visual_bbox(image_size=(size, size)) + + self.norm = nn.LayerNorm((config.hidden_size,), epsilon=1e-6) + + self.encoder = LayoutLMv3Encoder(config) + + def get_input_embeddings(self): + return self.embeddings.word_embeddings + + def set_input_embeddings(self, value): + self.embeddings.word_embeddings = value + + def _prune_heads(self, heads_to_prune): + """ + Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base + class PreTrainedModel + """ + for layer, heads in heads_to_prune.items(): + self.encoder.layer[layer].attention.prune_heads(heads) + + def init_visual_bbox(self, image_size=(14, 14), max_len=1000): + """ + Create the bounding boxes for the visual (patch) tokens. + """ + visual_bbox_x = ops.truncate_div(Tensor(np.arange(0, max_len * (image_size[1] + 1), max_len)), image_size[1]) + visual_bbox_y = ops.truncate_div(Tensor(np.arange(0, max_len * (image_size[0] + 1), max_len)), image_size[0]) + visual_bbox = ops.stack( + [ + visual_bbox_x[:-1].broadcast_to((image_size[0], -1)), + visual_bbox_y[:-1].broadcast_to((image_size[1], -1)).transpose(0, 1), + visual_bbox_x[1:].broadcast_to((image_size[0], -1)), + visual_bbox_y[1:].broadcast_to((image_size[1], -1)).transpose(0, 1), + ], + axis=-1, + ).reshape(-1, 4) + + cls_token_box = Tensor([[0 + 1, 0 + 1, max_len - 1, max_len - 1]]) + self.visual_bbox = ops.cat([cls_token_box, visual_bbox], axis=0) + + def calculate_visual_bbox(self, dtype, batch_size): + final_shape = self.visual_bbox.shape + visual_bbox = self.visual_bbox.broadcast_to((batch_size, final_shape[0], final_shape[1])) + visual_bbox = visual_bbox.astype(dtype) + return visual_bbox + + def visual_embeddings(self, pixel_values): + embeddings = self.patch_embed(pixel_values) + + # add [CLS] token + batch_size, seq_len, _ = embeddings.shape + cls_tokens = self.cls_token.broadcast_to((batch_size, -1, -1)) + embeddings = ops.cat((cls_tokens, embeddings), axis=1) + + # add position embeddings + if self.pos_embed is not None: + embeddings = embeddings + self.pos_embed + + embeddings = self.pos_drop(embeddings) + embeddings = self.norm(embeddings) + + return embeddings + + def get_extended_attention_mask(self, attention_mask: Tensor, input_shape, dtype) -> Tensor: + """ + Makes broadcastable attention and causal masks so that future and masked tokens are ignored. + + Arguments: + attention_mask (`Tensor`): + Mask with ones indicating tokens to attend to, zeros for tokens to ignore. + input_shape (`Tuple[int]`): + The shape of the input to the model. + + Returns: + `Tensor` The extended attention mask, with a the same dtype as `attention_mask.dtype`. + """ + if attention_mask.ndim == 3: + extended_attention_mask = attention_mask[:, None, :, :] + elif attention_mask.ndim == 2: + extended_attention_mask = attention_mask[:, None, None, :] + else: + raise ValueError( + f"Wrong shape for input_ids (shape {input_shape}) or attention_mask (shape {attention_mask.shape})" + ) + + # Since attention_mask is 1.0 for positions we want to attend and 0.0 for + # masked positions, this operation will create a tensor which is 0.0 for + # positions we want to attend and the dtype's smallest value for masked positions. + # Since we are adding it to the raw scores before the softmax, this is + # effectively the same as removing these entirely. # fp16 compatibility + extended_attention_mask = extended_attention_mask.astype(dtype) + extended_attention_mask = (1.0 - extended_attention_mask) * self.min + return extended_attention_mask + + def get_head_mask(self, head_mask, num_hidden_layers: int, is_attention_chunked: bool = False): + """ + Prepare the head mask if needed. + + Args: + head_mask (`Tensor` with shape `[num_heads]` or `[num_hidden_layers x num_heads]`, *optional*): + The mask indicating if we should keep the heads or not (1.0 for keep, 0.0 for discard). + num_hidden_layers (`int`): + The number of hidden layers in the model. + is_attention_chunked (`bool`, *optional*, defaults to `False`): + Whether or not the attentions scores are computed by chunks or not. + + Returns: + `Tensor` with shape `[num_hidden_layers x batch x num_heads x seq_length x seq_length]` or list with + `[None]` for each layer. + """ + if head_mask is not None: + head_mask = self._convert_head_mask_to_5d(head_mask, num_hidden_layers) + if is_attention_chunked is True: + head_mask = head_mask.unsqueeze(-1) + else: + head_mask = [None] * num_hidden_layers + + return head_mask + + def _convert_head_mask_to_5d(self, head_mask: Tensor, num_hidden_layers: int): + """-> [num_hidden_layers x batch x num_heads x seq_length x seq_length]""" + if head_mask.ndim == 1: + head_mask = head_mask.unsqueeze(0).unsqueeze(0).unsqueeze(-1).unsqueeze(-1) + head_mask = head_mask.broadcast_to((self.num_hidden_layers, -1, -1, -1, -1)) + elif head_mask.ndim == 2: + head_mask = head_mask.unsqueeze(1).unsqueeze(-1).unsqueeze(-1) # We can specify head_mask for each layer + if head_mask.ndim != 5: + raise ValueError(f"head_mask.dim != 5, instead {head_mask.ndim}") + head_mask = head_mask.to(dtype=self.dtype) # switch to float if need + fp16 compatibility + return head_mask + + def construct( + self, + input_ids=None, # input_ids + bbox=None, # b_box + attention_mask=None, # attention_mask + token_type_ids=None, # token_type_ids + pixel_values=None, # image + position_ids=None, + head_mask=None, + inputs_embeds=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + ): + """ + Constructs the LayoutLMv3 model according to the input provided. + + Args: + input_ids (Tensor, optional): Tensor containing the token IDs of the input text sequence. + bbox (Tensor, optional): Tensor containing the bounding box information of the input text sequence. + attention_mask (Tensor, optional): Tensor containing the attention mask for the input sequence. + token_type_ids (Tensor, optional): Tensor containing the token type IDs to distinguish different sequences. + pixel_values (Tensor, optional): Tensor containing the pixel values of the input image. + position_ids (Tensor, optional): Tensor containing the position IDs indicating the position of tokens. + head_mask (Tensor, optional): Mask to control which heads of the attention mechanism should be used. + inputs_embeds (Tensor, optional): Pre-computed embeddings for the input tokens. + output_attentions (bool, optional): Whether to return attention weights. + output_hidden_states (bool, optional): Whether to return hidden states. + return_dict (bool, optional): Whether to return a dictionary or a tuple of outputs. + + Returns: + Tensor or Tuple[Tensor]: Depending on the configuration, returns either a tensor or a tuple + containing the output sequence and additional outputs such as hidden states and attention weights. + """ + output_attentions = output_attentions if output_attentions is not None else False + output_hidden_states = output_hidden_states if output_hidden_states is not None else False + return_dict = return_dict if return_dict is not None else False + seq_length = None + input_shape = None + if input_ids is not None: + input_shape = input_ids.shape + batch_size, seq_length = input_shape + elif inputs_embeds is not None: + input_shape = inputs_embeds.shape[:-1] + batch_size, seq_length = input_shape + elif pixel_values is not None: + batch_size = len(pixel_values) + else: + raise ValueError("You have to specify either input_ids or inputs_embeds or pixel_values") + embedding_output = None + + if input_ids is not None or inputs_embeds is not None: + if attention_mask is None: + attention_mask = ops.ones(((batch_size, seq_length))) + if token_type_ids is None: + token_type_ids = ops.zeros(input_shape, dtype=mstype.int64) + if bbox is None: + bbox = ops.zeros(tuple(list(input_shape) + [4]), dtype=mstype.int64) + + # ocr information text embeddings + embedding_output = self.embeddings( + input_ids=input_ids, + bbox=bbox, + position_ids=position_ids, + token_type_ids=token_type_ids, + inputs_embeds=inputs_embeds, + ) + final_bbox = final_position_ids = None + if pixel_values is not None: + visual_embeddings = self.visual_embeddings(pixel_values) + visual_embeddings_shape = visual_embeddings.shape + visual_attention_mask = ops.ones((batch_size, visual_embeddings_shape[1]), dtype=mstype.int64) + if attention_mask is not None: + attention_mask = ops.cat([attention_mask, visual_attention_mask.astype(attention_mask.dtype)], axis=1) + else: + attention_mask = visual_attention_mask + + if self.has_relative_attention_bias or self.has_spatial_attention_bias: + if self.has_spatial_attention_bias: + visual_bbox = self.calculate_visual_bbox(dtype=mstype.int64, batch_size=batch_size) + if bbox is not None: + final_bbox = ops.cat([bbox, visual_bbox], axis=1) + else: + final_bbox = visual_bbox + + visual_embeddings_shape = visual_embeddings.shape + visual_position_ids = ops.arange(0, visual_embeddings_shape[1], dtype=mstype.int64).broadcast_to( + (batch_size, visual_embeddings_shape[1]) + ) + if input_ids is not None or inputs_embeds is not None: + position_ids = ops.arange(0, input_shape[1], dtype=mstype.int64).unsqueeze(0) + position_ids = position_ids.broadcast_to(input_shape) + final_position_ids = ops.cat([position_ids, visual_position_ids], axis=1) + else: + final_position_ids = visual_position_ids + + if input_ids is not None or inputs_embeds is not None: + embedding_output = ops.cat([embedding_output, visual_embeddings], axis=1) + else: + embedding_output = visual_embeddings + + embedding_output = self.LayerNorm(embedding_output) + embedding_output = self.dropout(embedding_output) + elif self.has_relative_attention_bias or self.has_spatial_attention_bias: + if self.has_spatial_attention_bias: + final_bbox = bbox + if self.has_relative_attention_bias: + position_ids = self.embeddings.position_ids[:, : input_shape[1]] + position_ids = position_ids.expand_as(input_ids) + final_position_ids = position_ids + + extended_attention_mask = self.get_extended_attention_mask(attention_mask, None, embedding_output.dtype) + + # Prepare head mask if needed + # 1.0 in head_mask indicate we keep the head + # attention_probs has shape bsz x n_heads x N x N + # input head_mask has shape [num_heads] or [num_hidden_layers x num_heads] + # and head_mask is converted to shape [num_hidden_layers x batch x num_heads x seq_length x seq_length] + head_mask = self.get_head_mask(head_mask, self.num_hidden_layers) + + encoder_outputs = self.encoder( + embedding_output, + attention_mask=extended_attention_mask, + bbox=final_bbox, + position_ids=final_position_ids, + head_mask=head_mask, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + ) + + sequence_output = encoder_outputs[0] + + return (sequence_output,) + encoder_outputs[1:] + + +@register_backbone +def layoutlmv3(use_float16: bool = True, **kwargs): + pretrained_config = LayoutLMv3PretrainedConfig(use_float16) + model = LayoutLMv3Model(pretrained_config) + return model diff --git a/mindocr/models/backbones/layoutlmv3/tokenizer.py b/mindocr/models/backbones/layoutlmv3/tokenizer.py new file mode 100644 index 000000000..eb34972df --- /dev/null +++ b/mindocr/models/backbones/layoutlmv3/tokenizer.py @@ -0,0 +1,7 @@ +from ..layoutxlm.tokenizer import LayoutXLMTokenizer + + +class LayoutLMv3Tokenizer(LayoutXLMTokenizer): + """ + Tokenizer of LayoutLMv3-chinese, same as LayoutXLMTokenizer. + """ diff --git a/mindocr/models/backbones/layoutxlm/layoutxlm.py b/mindocr/models/backbones/layoutxlm/layoutxlm.py index bd075159b..4737c03a4 100644 --- a/mindocr/models/backbones/layoutxlm/layoutxlm.py +++ b/mindocr/models/backbones/layoutxlm/layoutxlm.py @@ -1,13 +1,11 @@ -import math - import numpy as np -import mindspore as ms -from mindspore import Parameter, nn, ops, set_context -from mindspore.common.initializer import Constant, initializer +from mindspore import Parameter, Tensor, nn, ops, set_context +from mindspore.common import dtype as mstype from .._registry import register_backbone, register_backbone_class from ..mindcv_models.utils import load_pretrained +from ..transformer_common.layer import LayoutXLMEmbeddings, LayoutXLMEncoder, LayoutXLMPooler from .configuration import LayoutXLMPretrainedConfig from .visual_backbone import build_resnet_fpn_backbone, read_config @@ -34,23 +32,21 @@ def _cfg(url="", use_visual_backbone=True, **kwargs): class VisualBackbone(nn.Cell): def __init__(self, config): - super(VisualBackbone, self).__init__() + super().__init__() self.cfg = read_config() self.backbone = build_resnet_fpn_backbone(self.cfg) if len(self.cfg.MODEL.PIXEL_MEAN) != len(self.cfg.MODEL.PIXEL_STD): - raise ValueError( - "cfg.model.pixel_mean is not equal with cfg.model.pixel_std." - ) + raise ValueError("cfg.model.pixel_mean is not equal with cfg.model.pixel_std.") num_channels = len(self.cfg.MODEL.PIXEL_MEAN) self.pixel_mean = Parameter( - ms.Tensor(self.cfg.MODEL.PIXEL_MEAN).reshape((num_channels, 1, 1)), + Tensor(self.cfg.MODEL.PIXEL_MEAN).reshape((num_channels, 1, 1)), name="pixel_mean", requires_grad=False, ) self.pixel_std = Parameter( - ms.Tensor(self.cfg.MODEL.PIXEL_STD).reshape((num_channels, 1, 1)), + Tensor(self.cfg.MODEL.PIXEL_STD).reshape((num_channels, 1, 1)), name="pixel_std", requires_grad=False, ) @@ -58,9 +54,7 @@ def __init__(self, config): self.out_feature_key = "p2" self.pool_shape = tuple(config.image_feature_pool_shape[:2]) # (7,7) if len(config.image_feature_pool_shape) == 2: - config.image_feature_pool_shape.append( - self.backbone.output_shape()[self.out_feature_key].channels - ) + config.image_feature_pool_shape.append(self.backbone.output_shape()[self.out_feature_key].channels) input_shape = (224, 224) outsize = config.image_feature_pool_shape[0] # (7,7) @@ -70,12 +64,12 @@ def __init__(self, config): stride = insize // outsize kernel = insize - (outsize - 1) * stride - self.weight = ms.Tensor(np.ones([channels, 1, kernel, kernel]), dtype=ms.float32) / (kernel * kernel) + self.weight = Tensor(np.ones([channels, 1, kernel, kernel]), dtype=mstype.float32) / (kernel * kernel) self.conv2d = ops.Conv2D(channels, kernel, stride=stride, group=channels) def pool(self, features): """ - To enhance performance, customize the AdaptiveAvgPool2d layer + Custom AvgPool2d """ features = self.conv2d(features, self.weight) return features @@ -97,628 +91,34 @@ def construct(self, images): return features.flatten(start_dim=2).transpose(0, 2, 1) -def relative_position_bucket( - relative_position, bidirectional=True, num_buckets=32, max_distance=128 -): - ret = 0 - if bidirectional: - num_buckets //= 2 - ret += (relative_position > 0).astype(ms.int64) * num_buckets - n = ops.abs(relative_position) - else: - n = ops.maximum( - -relative_position, ops.zeros_like(relative_position) - ) # to be confirmed - # Now n is in the range [0, inf) - # half of the buckets are for exact increments in positions - max_exact = num_buckets // 2 - is_small = n < max_exact - - # The other half of the buckets are for logarithmically bigger bins in positions up to max_distance - val_if_large = max_exact + ( - ops.log(n.astype(ms.float32) / max_exact) / math.log(max_distance / max_exact) * (num_buckets - max_exact) - ).astype(ms.int64) - - val_if_large = ops.minimum( - val_if_large, ops.full_like(val_if_large, num_buckets - 1) - ) - - ret += ops.where(is_small, n, val_if_large) - return ret - - -class LayoutXLMEmbeddings(nn.Cell): - """ - Include embeddings from word, position and token_type embeddings - """ - - def __init__(self, config): - super(LayoutXLMEmbeddings, self).__init__() - self.word_embeddings = nn.Embedding( - config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id - ) - self.position_embeddings = nn.Embedding( - config.max_position_embeddings, config.hidden_size - ) - - self.x_position_embeddings = nn.Embedding( - config.max_2d_position_embeddings, config.coordinate_size - ) - self.y_position_embeddings = nn.Embedding( - config.max_2d_position_embeddings, config.coordinate_size - ) - self.h_position_embeddings = nn.Embedding( - config.max_2d_position_embeddings, config.shape_size - ) - self.w_position_embeddings = nn.Embedding( - config.max_2d_position_embeddings, config.shape_size - ) - self.token_type_embeddings = nn.Embedding( - config.type_vocab_size, config.hidden_size - ) - - self.LayerNorm = nn.LayerNorm( - (config.hidden_size,), epsilon=config.layer_norm_eps - ) - self.dropout = nn.Dropout(p=config.hidden_dropout_prob) - self.position_ids = Parameter( - ms.Tensor(np.arange(0, config.max_position_embeddings)).broadcast_to( - (1, -1) - ), - name="position_ids", - requires_grad=False, - ) - - def _cal_spatial_position_embeddings(self, bbox): - bbox_0 = bbox[:, :, 0] - bbox_1 = bbox[:, :, 1] - bbox_2 = bbox[:, :, 2] - bbox_3 = bbox[:, :, 3] - left_position_embeddings = self.x_position_embeddings(bbox_0) - upper_position_embeddings = self.y_position_embeddings(bbox_1) - right_position_embeddings = self.x_position_embeddings(bbox_2) - lower_position_embeddings = self.y_position_embeddings(bbox_3) - - h_position_embeddings = self.h_position_embeddings(bbox_3 - bbox_1) - w_position_embeddings = self.w_position_embeddings(bbox_2 - bbox_0) - - spatial_position_embeddings = ops.concat( - ( - left_position_embeddings, - upper_position_embeddings, - right_position_embeddings, - lower_position_embeddings, - h_position_embeddings, - w_position_embeddings, - ), - axis=-1, - ) - return spatial_position_embeddings - - def construct(self, input_ids, bbox=None, token_type_ids=None, position_ids=None): - if position_ids is None: - ones = ops.ones_like(input_ids, dtype=ms.int64) - seq_length = ops.cumsum(ones, axis=-1) - - position_ids = seq_length - ones - position_ids = ops.stop_gradient( - position_ids - ) # position_ids.stop_gradient = True - if token_type_ids is None: - token_type_ids = ops.zeros_like(input_ids, dtype=ms.int64) - - input_embedings = self.word_embeddings(input_ids) - position_embeddings = self.position_embeddings(position_ids) - - left_position_embeddings = self.x_position_embeddings(bbox[:, :, 0]) - upper_position_embeddings = self.y_position_embeddings(bbox[:, :, 1]) - right_position_embeddings = self.x_position_embeddings(bbox[:, :, 2]) - lower_position_embeddings = self.y_position_embeddings(bbox[:, :, 3]) - h_position_embeddings = self.h_position_embeddings( - bbox[:, :, 3] - bbox[:, :, 1] - ) - w_position_embeddings = self.w_position_embeddings( - bbox[:, :, 2] - bbox[:, :, 0] - ) - - token_type_embeddings = self.token_type_embeddings(token_type_ids) - - embeddings = ( - input_embedings - + position_embeddings - + left_position_embeddings - + upper_position_embeddings - + right_position_embeddings - + lower_position_embeddings - + h_position_embeddings - + w_position_embeddings - + token_type_embeddings - ) - - embeddings = self.layer_norm(embeddings) - embeddings = self.dropout(embeddings) - return embeddings - - -class LayoutXLMSelfAttention(nn.Cell): - def __init__(self, config): - super(LayoutXLMSelfAttention, self).__init__() - if config.hidden_size % config.num_attention_heads != 0 and not hasattr( - config, "embedding_size" - ): - raise ValueError( - "The hidden size {} is not a multiple of the number of attention " - "heads {}".format(config.hidden_size, config.num_attention_heads) - ) - self.fast_qkv = config.fast_qkv - self.num_attention_heads = config.num_attention_heads - self.attention_head_size = int(config.hidden_size / config.num_attention_heads) - self.all_head_size = self.num_attention_heads * self.attention_head_size - self.attention_head_size_sqrt = math.sqrt(self.attention_head_size) - - self.has_relative_attention_bias = config.has_relative_attention_bias - self.has_spatial_attention_bias = config.has_spatial_attention_bias - - self.use_float16 = config.use_float16 - self.dense_dtype = ms.float32 - if self.use_float16 is True: - self.dense_dtype = ms.float16 - - if config.fast_qkv: - self.qkv_linear = nn.Dense( - config.hidden_size, 3 * self.all_head_size, has_bias=False - ).to_float(self.dense_dtype) - self.q_bias = Parameter( - initializer(Constant(0.0), [1, 1, self.all_head_size], ms.float32) - ) - self.v_bias = Parameter( - initializer(Constant(0.0), [1, 1, self.all_head_size], ms.float32) - ) - else: - self.query = nn.Dense(config.hidden_size, self.all_head_size).to_float( - self.dense_dtype - ) - self.key = nn.Dense(config.hidden_size, self.all_head_size).to_float( - self.dense_dtype - ) - self.value = nn.Dense(config.hidden_size, self.all_head_size).to_float( - self.dense_dtype - ) - - self.dropout = nn.Dropout(p=config.attention_probs_dropout_prob) - - def transpose_for_scores(self, x): - new_x_shape = list(x.shape[:-1]) + [ - self.num_attention_heads, - self.attention_head_size, - ] - - x = x.reshape(tuple(new_x_shape)) - return x.transpose((0, 2, 1, 3)) - - def compute_qkv(self, hidden_states): - if self.fast_qkv: - qkv = self.qkv_linear(hidden_states) - q, k, v = ops.chunk(qkv, 3, axis=-1) - if q.ndimension() == self.q_bias.ndimension(): - q = q + self.q_bias - v = v + self.v_bias - else: - _sz = (1,) * (q.ndimension() - 1) + (-1,) - q = q + self.q_bias.reshape(_sz) - v = v + self.v_bias.reshape(_sz) - else: - q = self.query(hidden_states) - k = self.key(hidden_states) - v = self.value(hidden_states) - return q, k, v - - def construct( - self, - hidden_states, - attention_mask=None, - head_mask=None, - encoder_hidden_states=None, - encoder_attention_mask=None, - past_key_value=None, - output_attentions=False, - rel_pos=None, - rel_2d_pos=None, - ): - q, k, v = self.compute_qkv(hidden_states) - - # (B, L, H*D) -> (B, H, L, D) - query_layer = self.transpose_for_scores(q) - key_layer = self.transpose_for_scores(k) - value_layer = self.transpose_for_scores(v) - - query_layer = query_layer / self.attention_head_size_sqrt - # [BSZ, NAT, L, L] - attention_scores = ops.matmul( - query_layer.astype(ms.float16), - key_layer.transpose((0, 1, 3, 2)).astype(ms.float16), - ).astype(ms.float32) - if self.has_relative_attention_bias: - attention_scores += rel_pos - if self.has_spatial_attention_bias: - attention_scores += rel_2d_pos - attention_scores = ops.masked_fill( - attention_scores.astype(ms.float32), ops.stop_gradient(attention_mask.astype(ms.bool_)), float("-1e10") - ) - attention_probs = ops.softmax(attention_scores, axis=-1) - # This is actually dropping out entire tokens to attend to, which might - # seem a bit unusual, but is taken from the original Transformer paper. - # attention_probs = self.dropout(attention_probs) - context_layer = ops.matmul( - attention_probs.astype(ms.float16), value_layer.astype(ms.float16) - ).astype(ms.float32) - - context_layer = context_layer.transpose((0, 2, 1, 3)) - new_context_layer_shape = list(context_layer.shape[:-2]) + [self.all_head_size] - context_layer = context_layer.reshape(new_context_layer_shape) - - if output_attentions: - outputs = [context_layer, attention_probs] - else: - outputs = [context_layer] - return outputs - - -class LayoutXLMSelfOutput(nn.Cell): - def __init__(self, config): - super(LayoutXLMSelfOutput, self).__init__() - self.use_float16 = config.use_float16 - self.dense_dtype = ms.float32 - if self.use_float16 is True: - self.dense_dtype = ms.float16 - self.dense = nn.Dense(config.hidden_size, config.hidden_size).to_float( - self.dense_dtype - ) - self.LayerNorm = nn.LayerNorm( - (config.hidden_size,), epsilon=config.layer_norm_eps - ) - self.dropout = nn.Dropout(p=config.hidden_dropout_prob) - - def construct(self, hidden_states, input_tensor): - hidden_states = self.dense(hidden_states) - hidden_states = self.dropout(hidden_states) - hidden_states = self.LayerNorm(hidden_states + input_tensor) - return hidden_states - - -class LayoutXLMAttention(nn.Cell): - def __init__(self, config): - super(LayoutXLMAttention, self).__init__() - self.self_attention = LayoutXLMSelfAttention(config) - self.output = LayoutXLMSelfOutput(config) - - def construct( - self, - hidden_states, - attention_mask=None, - head_mask=None, - encoder_hidden_states=None, - encoder_attention_mask=None, - past_key_value=None, - output_attentions=False, - rel_pos=None, - rel_2d_pos=None, - ): - self_outputs = self.self_attention( - hidden_states, - attention_mask, - head_mask, - encoder_hidden_states, - encoder_attention_mask, - past_key_value, - output_attentions, - rel_pos=rel_pos, - rel_2d_pos=rel_2d_pos, - ) - attention_output = self.output(self_outputs[0], hidden_states) - # add attentions if we output them - if output_attentions: - outputs = [ - attention_output, - ] + self_outputs[1:] - else: - outputs = [attention_output] - return outputs - - -class LayoutXLMIntermediate(nn.Cell): - def __init__(self, config): - super(LayoutXLMIntermediate, self).__init__() - self.use_float16 = config.use_float16 - self.dense_dtype = ms.float32 - if self.use_float16 is True: - self.dense_dtype = ms.float16 - self.dense = nn.Dense(config.hidden_size, config.intermediate_size).to_float( - self.dense_dtype - ) - if config.hidden_act == "gelu": - self.intermediate_act_fn = nn.GELU() - else: - raise ValueError( - "hidden_act is set as: {}, please check it..".format(config.hidden_act) - ) - - def construct(self, hidden_states): - hidden_states = self.dense(hidden_states) - hidden_states = self.intermediate_act_fn(hidden_states) - return hidden_states - - -class LayoutXLMOutput(nn.Cell): - def __init__(self, config): - super(LayoutXLMOutput, self).__init__() - self.use_float16 = config.use_float16 - self.dense_dtype = ms.float32 - if self.use_float16 is True: - self.dense_dtype = ms.float16 - self.dense = nn.Dense(config.intermediate_size, config.hidden_size).to_float( - self.dense_dtype - ) - self.LayerNorm = nn.LayerNorm( - (config.hidden_size,), epsilon=config.layer_norm_eps - ) - self.dropout = nn.Dropout(p=config.hidden_dropout_prob) - - def construct(self, hidden_states, input_tensor): - hidden_states = self.dense(hidden_states) - hidden_states = self.dropout(hidden_states) - hidden_states = self.LayerNorm(hidden_states + input_tensor) - return hidden_states - - -class LayoutXLMLayer(nn.Cell): - def __init__(self, config): - super(LayoutXLMLayer, self).__init__() - # since chunk_size_feed_forward is 0 as default, no chunk is needed here. - self.seq_len_dim = 1 - self.attention = LayoutXLMAttention(config) - self.add_cross_attention = False # default as false - self.intermediate = LayoutXLMIntermediate(config) - self.output = LayoutXLMOutput(config) - - def feed_forward_chunk(self, attention_output): - intermediate_output = self.intermediate(attention_output) - layer_output = self.output(intermediate_output, attention_output) - return layer_output - - def construct( - self, - hidden_states, - attention_mask=None, - head_mask=None, - encoder_hidden_states=None, - encoder_attention_mask=None, - past_key_value=None, - output_attentions=False, - rel_pos=None, - rel_2d_pos=None, - ): - # decoder uni-directional self-attention cached key/values tuple is at positions 1,2 - self_attn_past_key_value = ( - past_key_value[:2] if past_key_value is not None else None - ) - self_attention_outputs = self.attention( - hidden_states, - attention_mask=attention_mask, - head_mask=head_mask, - encoder_hidden_states=encoder_hidden_states, - encoder_attention_mask=encoder_attention_mask, - past_key_value=self_attn_past_key_value, - output_attentions=output_attentions, - rel_pos=rel_pos, - rel_2d_pos=rel_2d_pos, - ) - attention_output = self_attention_outputs[0] - layer_output = self.feed_forward_chunk(attention_output) - - if output_attentions: - outputs = self_attention_outputs[ - 1: - ] # add self attentions if we output attention weights - outputs = [ - layer_output, - ] + list(outputs) - else: - outputs = [layer_output] - return outputs - - -class LayoutXLMEncoder(nn.Cell): - def __init__(self, config): - super(LayoutXLMEncoder, self).__init__() - self.config = config - self.layer = nn.CellList( - [LayoutXLMLayer(config) for _ in range(config.num_hidden_layers)] - ) - - self.has_relative_attention_bias = config.has_relative_attention_bias - self.has_spatial_attention_bias = config.has_spatial_attention_bias - - self.use_float16 = config.use_float16 - self.dense_dtype = ms.float32 - if self.use_float16 is True: - self.dense_dtype = ms.float16 - - if self.has_relative_attention_bias: - self.rel_pos_bins = config.rel_pos_bins - self.max_rel_pos = config.max_rel_pos - self.rel_pos_onehot_size = config.rel_pos_bins - self.rel_pos_bias = nn.Dense( - self.rel_pos_onehot_size, config.num_attention_heads, has_bias=False - ).to_float(ms.float16) - - if self.has_spatial_attention_bias: - self.max_rel_2d_pos = config.max_rel_2d_pos - self.rel_2d_pos_bins = config.rel_2d_pos_bins - self.rel_2d_pos_onehot_size = config.rel_2d_pos_bins - self.rel_pos_x_bias = nn.Dense( - self.rel_2d_pos_onehot_size, config.num_attention_heads, has_bias=False - ).to_float(self.dense_dtype) - self.rel_pos_y_bias = nn.Dense( - self.rel_2d_pos_onehot_size, config.num_attention_heads, has_bias=False - ).to_float(self.dense_dtype) - - def _cal_1d_pos_emb(self, hidden_states, position_ids): - rel_pos_mat = position_ids.unsqueeze(-2) - position_ids.unsqueeze(-1) - rel_pos = relative_position_bucket( - rel_pos_mat, - num_buckets=self.rel_pos_bins, - max_distance=self.max_rel_pos, - ) - on_value, off_value = ms.Tensor(1.0, ms.float32), ms.Tensor(0.0, ms.float32) - rel_pos = ops.one_hot( - rel_pos, self.rel_pos_onehot_size, on_value, off_value - ).astype(hidden_states.dtype) - rel_pos = self.rel_pos_bias(rel_pos).transpose((0, 3, 1, 2)) - return rel_pos - - def _cal_2d_pos_emb(self, hidden_states, bbox): - position_coord_x = bbox[:, :, 0] - position_coord_y = bbox[:, :, 3] - rel_pos_x_2d_mat = position_coord_x.unsqueeze(-2) - position_coord_x.unsqueeze( - -1 - ) - rel_pos_y_2d_mat = position_coord_y.unsqueeze(-2) - position_coord_y.unsqueeze( - -1 - ) - rel_pos_x = relative_position_bucket( - rel_pos_x_2d_mat, - num_buckets=self.rel_2d_pos_bins, - max_distance=self.max_rel_2d_pos, - ) - rel_pos_y = relative_position_bucket( - rel_pos_y_2d_mat, - num_buckets=self.rel_2d_pos_bins, - max_distance=self.max_rel_2d_pos, - ) - on_value, off_value = ms.Tensor(1.0, ms.float32), ms.Tensor(0.0, ms.float32) - rel_pos_x = ops.one_hot( - rel_pos_x, self.rel_2d_pos_onehot_size, on_value, off_value - ).astype(hidden_states.dtype) - rel_pos_y = ops.one_hot( - rel_pos_y, self.rel_2d_pos_onehot_size, on_value, off_value - ).astype(hidden_states.dtype) - rel_pos_x = self.rel_pos_x_bias(rel_pos_x).transpose((0, 3, 1, 2)) - rel_pos_y = self.rel_pos_y_bias(rel_pos_y).transpose((0, 3, 1, 2)) - rel_2d_pos = rel_pos_x + rel_pos_y - return rel_2d_pos - - def construct( - self, - hidden_states, - attention_mask=None, - head_mask=None, - encoder_hidden_states=None, - encoder_attention_mask=None, - past_key_values=None, - output_attentions=False, - output_hidden_states=False, - bbox=None, - position_ids=None, - ): - all_hidden_states = () if output_hidden_states else None - - rel_pos = ( - self._cal_1d_pos_emb(hidden_states, position_ids) - if self.has_relative_attention_bias - else None - ) - rel_2d_pos = ( - self._cal_2d_pos_emb(hidden_states, bbox) - if self.has_spatial_attention_bias - else None - ) - - hidden_save = dict() - hidden_save["input_hidden_states"] = hidden_states - - for i, layer_module in enumerate(self.layer): - if output_hidden_states: - all_hidden_states = all_hidden_states + (hidden_states,) - - layer_head_mask = None - past_key_value = None - # gradient_checkpointing is set as False here so we remove some codes here - hidden_save["input_attention_mask"] = attention_mask - layer_outputs = layer_module( - hidden_states, - attention_mask, - layer_head_mask, - encoder_hidden_states, - encoder_attention_mask, - past_key_value, - output_attentions, - rel_pos=rel_pos, - rel_2d_pos=rel_2d_pos, - ) - - hidden_states = layer_outputs[0] - - hidden_save["{}_data".format(i)] = hidden_states - - return hidden_states, hidden_save - - -class LayoutXLMPooler(nn.Cell): - def __init__(self, config): - super(LayoutXLMPooler, self).__init__() - self.use_float16 = config.use_float16 - self.dense_dtype = ms.float32 - if self.use_float16 is True: - self.dense_dtype = ms.float16 - self.dense = nn.Dense(config.hidden_size, config.hidden_size).to_float( - self.dense_dtype - ) - self.activation = nn.Tanh() - - def construct(self, hidden_states): - # We "pool" the model by simply taking the hidden state corresponding - # to the first token. - first_token_tensor = hidden_states[:, 0] - pooled_output = self.dense(first_token_tensor) - pooled_output = self.activation(pooled_output) - return pooled_output - - @register_backbone_class class LayoutXLMModel(nn.Cell): def __init__(self, config): - super(LayoutXLMModel, self).__init__() + super().__init__() self.config = config self.has_visual_segment_embedding = config.has_visual_segment_embedding self.embeddings = LayoutXLMEmbeddings(config) self.use_visual_backbone = config.use_visual_backbone self.use_float16 = config.use_float16 - self.dense_dtype = ms.float32 + self.dense_dtype = mstype.float32 if self.use_float16 is True: - self.dense_dtype = ms.float16 + self.dense_dtype = mstype.float16 if self.use_visual_backbone is True: set_context(jit_syntax_level=0) self.visual = VisualBackbone(config) self.visual.freeze() - self.visual_proj = nn.Dense( - config.image_feature_pool_shape[-1], config.hidden_size - ).to_float(self.dense_dtype) - if self.has_visual_segment_embedding: - self.visual_segment_embedding = Parameter( - nn.Embedding(1, config.hidden_size).embedding_table[0] + self.visual_proj = nn.Dense(config.image_feature_pool_shape[-1], config.hidden_size).to_float( + self.dense_dtype ) - self.visual_LayerNorm = nn.LayerNorm( - (config.hidden_size,), epsilon=config.layer_norm_eps - ) + if self.has_visual_segment_embedding: + self.visual_segment_embedding = Parameter(nn.Embedding(1, config.hidden_size).embedding_table[0]) + self.visual_LayerNorm = nn.LayerNorm((config.hidden_size,), epsilon=config.layer_norm_eps) self.visual_dropout = nn.Dropout(p=config.hidden_dropout_prob) self.encoder = LayoutXLMEncoder(config) self.pooler = LayoutXLMPooler(config) - self.image_feature_pool_shape_size = ( - config.image_feature_pool_shape[0] * config.image_feature_pool_shape[1] - ) + self.image_feature_pool_shape_size = config.image_feature_pool_shape[0] * config.image_feature_pool_shape[1] self.image_feature_pool_shape = config.image_feature_pool_shape self.num_hidden_layers = config.num_hidden_layers self.max_position_embeddings = config.max_position_embeddings @@ -734,16 +134,9 @@ def set_input_embeddings(self, value): def _calc_text_embeddings(self, input_ids, bbox, position_ids, token_type_ids): words_embeddings = self.embeddings.word_embeddings(input_ids) position_embeddings = self.embeddings.position_embeddings(position_ids) - spatial_position_embeddings = self.embeddings._cal_spatial_position_embeddings( - bbox - ) + spatial_position_embeddings = self.embeddings._cal_spatial_position_embeddings(bbox) token_type_embeddings = self.embeddings.token_type_embeddings(token_type_ids) - embeddings = ( - words_embeddings - + position_embeddings - + spatial_position_embeddings - + token_type_embeddings - ) + embeddings = words_embeddings + position_embeddings + spatial_position_embeddings + token_type_embeddings embeddings = self.embeddings.LayerNorm(embeddings) embeddings = self.embeddings.dropout(embeddings) return embeddings @@ -751,14 +144,10 @@ def _calc_text_embeddings(self, input_ids, bbox, position_ids, token_type_ids): def _calc_img_embeddings(self, image, bbox, position_ids): use_image_info = self.use_visual_backbone and image is not None position_embeddings = self.embeddings.position_embeddings(position_ids) - spatial_position_embeddings = self.embeddings._cal_spatial_position_embeddings( - bbox - ) + spatial_position_embeddings = self.embeddings._cal_spatial_position_embeddings(bbox) if use_image_info: - visual_embeddings = self.visual_proj(self.visual(image.astype(ms.float32))) - embeddings = ( - visual_embeddings + position_embeddings + spatial_position_embeddings - ) + visual_embeddings = self.visual_proj(self.visual(image.astype(mstype.float32))) + embeddings = visual_embeddings + position_embeddings + spatial_position_embeddings else: embeddings = position_embeddings + spatial_position_embeddings if self.has_visual_segment_embedding: @@ -777,9 +166,7 @@ def resize_position_embeddings(self, new_num_position_embeddings): will add newly initialized vectors at the end, whereas reducing the size will remove vectors from the end. """ - num_position_embeds_diff = ( - new_num_position_embeddings - self.max_position_embeddings - ) + num_position_embeds_diff = new_num_position_embeddings - self.max_position_embeddings # no resizing needs to be done if the length stays the same if num_position_embeds_diff == 0: @@ -787,32 +174,24 @@ def resize_position_embeddings(self, new_num_position_embeddings): self.max_position_embeddings = new_num_position_embeddings - old_position_embeddings_weight = ( - self.embeddings.position_embeddings.embedding_table - ) + old_position_embeddings_weight = self.embeddings.position_embeddings.embedding_table - self.embeddings.position_embeddings = nn.Embedding( - self.max_position_embeddings, self.hidden_size - ) + self.embeddings.position_embeddings = nn.Embedding(self.max_position_embeddings, self.hidden_size) if num_position_embeds_diff > 0: self.embeddings.position_embeddings.embedding_table[ :-num_position_embeds_diff ] = old_position_embeddings_weight else: - self.embeddings.position_embeddings.embedding_table = ( - old_position_embeddings_weight[:num_position_embeds_diff] - ) + self.embeddings.position_embeddings.embedding_table = old_position_embeddings_weight[ + :num_position_embeds_diff + ] def _calc_visual_bbox(self, image_feature_pool_shape, bbox, visual_shape): x_size = image_feature_pool_shape[1] y_size = image_feature_pool_shape[0] - visual_bbox_x = ms.Tensor( - np.arange(0, 1000 * (x_size + 1), 1000) // x_size, dtype=ms.int64 - ) - visual_bbox_y = ms.Tensor( - np.arange(0, 1000 * (y_size + 1), 1000) // y_size, dtype=ms.int64 - ) + visual_bbox_x = Tensor(np.arange(0, 1000 * (x_size + 1), 1000) // x_size, dtype=mstype.int64) + visual_bbox_y = Tensor(np.arange(0, 1000 * (y_size + 1), 1000) // y_size, dtype=mstype.int64) expand_shape = image_feature_pool_shape[0:2] expand_shape = tuple(expand_shape) visual_bbox = ops.stack( @@ -824,16 +203,12 @@ def _calc_visual_bbox(self, image_feature_pool_shape, bbox, visual_shape): ], axis=-1, ).reshape((expand_shape[0] * expand_shape[1], ops.shape(bbox)[-1])) - visual_bbox = visual_bbox.broadcast_to( - (visual_shape[0], visual_bbox.shape[0], visual_bbox.shape[1]) - ) + visual_bbox = visual_bbox.broadcast_to((visual_shape[0], visual_bbox.shape[0], visual_bbox.shape[1])) return visual_bbox def _get_input_shape(self, input_ids=None, inputs_embeds=None): if input_ids is not None and inputs_embeds is not None: - raise ValueError( - "You cannot specify both input_ids and inputs_embeds at the same time" - ) + raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time") elif input_ids is not None: return input_ids.shape elif inputs_embeds is not None: @@ -845,9 +220,9 @@ def construct( self, input_ids=None, bbox=None, - image=None, attention_mask=None, token_type_ids=None, + image=None, position_ids=None, head_mask=None, inputs_embeds=None, @@ -857,9 +232,7 @@ def construct( input_shape = self._get_input_shape(input_ids, inputs_embeds) visual_shape = list(input_shape) visual_shape[1] = self.image_feature_pool_shape_size - visual_bbox = self._calc_visual_bbox( - self.image_feature_pool_shape, bbox, visual_shape - ) + visual_bbox = self._calc_visual_bbox(self.image_feature_pool_shape, bbox, visual_shape) final_bbox = ops.concat([bbox, visual_bbox], axis=1) if attention_mask is None: @@ -872,21 +245,17 @@ def construct( attention_mask = attention_mask.astype(visual_attention_mask.dtype) - final_attention_mask = ops.concat( - [attention_mask, visual_attention_mask], axis=1 - ) + final_attention_mask = ops.concat([attention_mask, visual_attention_mask], axis=1) if token_type_ids is None: - token_type_ids = ops.zeros(input_shape, dtype=ms.int64) + token_type_ids = ops.zeros(input_shape, dtype=mstype.int64) if position_ids is None: seq_length = input_shape[1] position_ids = self.embeddings.position_ids[:, :seq_length] position_ids = position_ids.broadcast_to(input_shape) - visual_position_ids = ms.Tensor(np.arange(0, visual_shape[1])).broadcast_to( - (input_shape[0], visual_shape[1]) - ) + visual_position_ids = Tensor(np.arange(0, visual_shape[1])).broadcast_to((input_shape[0], visual_shape[1])) final_position_ids = ops.concat([position_ids, visual_position_ids], axis=1) if bbox is None: @@ -911,12 +280,8 @@ def construct( if head_mask is not None: if head_mask.dim() == 1: - head_mask = ( - head_mask.unsqueeze(0).unsqueeze(0).unsqueeze(-1).unsqueeze(-1) - ) - head_mask = head_mask.broadcast_to( - (self.num_hidden_layers, -1, -1, -1, -1) - ) + head_mask = head_mask.unsqueeze(0).unsqueeze(0).unsqueeze(-1).unsqueeze(-1) + head_mask = head_mask.broadcast_to((self.num_hidden_layers, -1, -1, -1, -1)) elif head_mask.dim() == 2: head_mask = head_mask.unsqueeze(1).unsqueeze(-1).unsqueeze(-1) else: @@ -924,7 +289,7 @@ def construct( encoder_outputs = self.encoder( final_emb, - extended_attention_mask, + attention_mask=extended_attention_mask, bbox=final_bbox, position_ids=final_position_ids, head_mask=head_mask, @@ -937,12 +302,7 @@ def construct( @register_backbone -def layoutxlm( - pretrained: bool = True, - use_visual_backbone: bool = True, - use_float16: bool = False, - **kwargs -): +def layoutxlm(pretrained: bool = True, use_visual_backbone: bool = True, use_float16: bool = False, **kwargs): pretrained_config = LayoutXLMPretrainedConfig(use_visual_backbone, use_float16) model = LayoutXLMModel(pretrained_config) if pretrained: diff --git a/mindocr/models/backbones/transformer_common/activation.py b/mindocr/models/backbones/transformer_common/activation.py new file mode 100644 index 000000000..a75123065 --- /dev/null +++ b/mindocr/models/backbones/transformer_common/activation.py @@ -0,0 +1,23 @@ +from collections import OrderedDict + +from mindspore import nn + + +class ClassInstantier(OrderedDict): + def __getitem__(self, key): + content = super().__getitem__(key) + cls, kwargs = content if isinstance(content, tuple) else (content, {}) + return cls(**kwargs) + + +act_cls = { + "gelu": nn.GELU, + "relu": nn.ReLU, + "relu6": nn.ReLU6, + "sigmoid": nn.Sigmoid, + "silu": nn.SiLU, + "swish": nn.SiLU, + "tanh": nn.Tanh, +} + +act_fn = ClassInstantier(act_cls) diff --git a/mindocr/models/backbones/transformer_common/layer.py b/mindocr/models/backbones/transformer_common/layer.py new file mode 100644 index 000000000..d906a26a8 --- /dev/null +++ b/mindocr/models/backbones/transformer_common/layer.py @@ -0,0 +1,522 @@ +import math + +import numpy as np + +from mindspore import Parameter, Tensor, nn, ops +from mindspore.common import dtype as mstype +from mindspore.common.initializer import Constant, initializer + +from .activation import act_fn + + +def finfo(dtype): + if dtype == mstype.float32: + return np.finfo(np.float32).min + elif dtype == mstype.float16: + return np.finfo(np.float16).min + else: + raise TypeError(f"For 'finfo', the input dtype should be float32 or float16, bug got {dtype}") + + +class LayoutXLMEmbeddings(nn.Cell): + """ + Include embeddings from word, position and token_type embeddings + """ + + def __init__(self, config): + super().__init__() + self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id) + self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size) + + self.x_position_embeddings = nn.Embedding(config.max_2d_position_embeddings, config.coordinate_size) + self.y_position_embeddings = nn.Embedding(config.max_2d_position_embeddings, config.coordinate_size) + self.h_position_embeddings = nn.Embedding(config.max_2d_position_embeddings, config.shape_size) + self.w_position_embeddings = nn.Embedding(config.max_2d_position_embeddings, config.shape_size) + self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size) + + self.LayerNorm = nn.LayerNorm((config.hidden_size,), epsilon=config.layer_norm_eps) + self.dropout = nn.Dropout(p=config.hidden_dropout_prob) + + # position_ids (1, len position emb) is contiguous in memory and exported when serialized + self.position_ids = Parameter( + Tensor(np.arange(0, config.max_position_embeddings)).broadcast_to((1, -1)), + name="position_ids", + requires_grad=False, + ) + + def _cal_spatial_position_embeddings(self, bbox): + bbox_0 = bbox[:, :, 0] + bbox_1 = bbox[:, :, 1] + bbox_2 = bbox[:, :, 2] + bbox_3 = bbox[:, :, 3] + left_position_embeddings = self.x_position_embeddings(bbox_0) + upper_position_embeddings = self.y_position_embeddings(bbox_1) + right_position_embeddings = self.x_position_embeddings(bbox_2) + lower_position_embeddings = self.y_position_embeddings(bbox_3) + + h_position_embeddings = self.h_position_embeddings(bbox_3 - bbox_1) + w_position_embeddings = self.w_position_embeddings(bbox_2 - bbox_0) + + spatial_position_embeddings = ops.concat( + ( + left_position_embeddings, + upper_position_embeddings, + right_position_embeddings, + lower_position_embeddings, + h_position_embeddings, + w_position_embeddings, + ), + axis=-1, + ) + return spatial_position_embeddings + + def construct(self, input_ids, bbox=None, token_type_ids=None, position_ids=None): + raise NotImplementedError( + f"'construct' is not implemented for {self.__class__}. " + f"For implement it, you should overwrite this method." + ) + + +class LayoutXLMSelfAttention(nn.Cell): + def __init__(self, config): + super().__init__() + if config.hidden_size % config.num_attention_heads != 0 and not hasattr(config, "embedding_size"): + raise ValueError( + "The hidden size {} is not a multiple of the number of attention " + "heads {}".format(config.hidden_size, config.num_attention_heads) + ) + self.fast_qkv = config.fast_qkv + self.num_attention_heads = config.num_attention_heads + self.attention_head_size = int(config.hidden_size / config.num_attention_heads) + self.all_head_size = self.num_attention_heads * self.attention_head_size + self.attention_head_size_sqrt = math.sqrt(self.attention_head_size) + + self.has_relative_attention_bias = config.has_relative_attention_bias + self.has_spatial_attention_bias = config.has_spatial_attention_bias + + self.use_float16 = config.use_float16 + self.dense_dtype = mstype.float32 + if self.use_float16 is True: + self.dense_dtype = mstype.float16 + + if config.fast_qkv: + self.qkv_linear = nn.Dense(config.hidden_size, 3 * self.all_head_size, has_bias=False).to_float( + self.dense_dtype + ) + self.q_bias = Parameter(initializer(Constant(0.0), [1, 1, self.all_head_size], self.dense_dtype)) + self.v_bias = Parameter(initializer(Constant(0.0), [1, 1, self.all_head_size], self.dense_dtype)) + else: + self.query = nn.Dense(config.hidden_size, self.all_head_size).to_float(self.dense_dtype) + self.key = nn.Dense(config.hidden_size, self.all_head_size).to_float(self.dense_dtype) + self.value = nn.Dense(config.hidden_size, self.all_head_size).to_float(self.dense_dtype) + + self.dropout = nn.Dropout(p=config.attention_probs_dropout_prob) + self.min = finfo(self.dense_dtype) + + def transpose_for_scores(self, x): + new_x_shape = list(x.shape[:-1]) + [ + self.num_attention_heads, + self.attention_head_size, + ] + + x = x.reshape(tuple(new_x_shape)) + return x.transpose((0, 2, 1, 3)) + + def compute_qkv(self, hidden_states): + if self.fast_qkv: + qkv = self.qkv_linear(hidden_states) + q, k, v = ops.chunk(qkv, 3, axis=-1) + if q.ndimension() == self.q_bias.ndimension(): + q = q + self.q_bias + v = v + self.v_bias + else: + _sz = (1,) * (q.ndimension() - 1) + (-1,) + q = q + self.q_bias.reshape(_sz) + v = v + self.v_bias.reshape(_sz) + else: + q = self.query(hidden_states) + k = self.key(hidden_states) + v = self.value(hidden_states) + return q, k, v + + def construct( + self, + hidden_states, + attention_mask=None, + head_mask=None, + encoder_hidden_states=None, + encoder_attention_mask=None, + past_key_value=None, + output_attentions=False, + rel_pos=None, + rel_2d_pos=None, + ): + q, k, v = self.compute_qkv(hidden_states) + + # (B, L, H*D) -> (B, H, L, D) + query_layer = self.transpose_for_scores(q) + key_layer = self.transpose_for_scores(k) + value_layer = self.transpose_for_scores(v) + + query_layer = query_layer / self.attention_head_size_sqrt + # [BSZ, NAT, L, L] + attention_scores = ops.matmul( + query_layer, + key_layer.transpose((0, 1, 3, 2)), + ) + if self.has_relative_attention_bias: + attention_scores += rel_pos + if self.has_spatial_attention_bias: + attention_scores += rel_2d_pos + attention_scores = ops.masked_fill( + attention_scores, + ops.stop_gradient(attention_mask.astype(mstype.bool_)), + self.min, + ) + attention_probs = ops.softmax(attention_scores, axis=-1) + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = self.dropout(attention_probs) + context_layer = ops.matmul(attention_probs, value_layer) + + context_layer = context_layer.transpose((0, 2, 1, 3)) + new_context_layer_shape = list(context_layer.shape[:-2]) + [self.all_head_size] + context_layer = context_layer.reshape(new_context_layer_shape) + + if output_attentions: + outputs = [context_layer, attention_probs] + else: + outputs = [context_layer] + return outputs + + +class LayoutXLMSelfOutput(nn.Cell): + def __init__(self, config): + super().__init__() + self.use_float16 = config.use_float16 + self.dense_dtype = mstype.float32 + if self.use_float16 is True: + self.dense_dtype = mstype.float16 + self.dense = nn.Dense(config.hidden_size, config.hidden_size).to_float(self.dense_dtype) + self.LayerNorm = nn.LayerNorm((config.hidden_size,), epsilon=config.layer_norm_eps) + self.dropout = nn.Dropout(p=config.hidden_dropout_prob) + + def construct(self, hidden_states, input_tensor): + hidden_states = self.dense(hidden_states) + hidden_states = self.dropout(hidden_states) + hidden_states = self.LayerNorm(hidden_states + input_tensor) + return hidden_states + + +class LayoutXLMAttention(nn.Cell): + def __init__(self, config): + super().__init__() + self.self_attention = LayoutXLMSelfAttention(config) + self.output = LayoutXLMSelfOutput(config) + + def construct( + self, + hidden_states, + attention_mask=None, + head_mask=None, + encoder_hidden_states=None, + encoder_attention_mask=None, + past_key_value=None, + output_attentions=False, + rel_pos=None, + rel_2d_pos=None, + ): + self_outputs = self.self_attention( + hidden_states, + attention_mask, + head_mask, + encoder_hidden_states, + encoder_attention_mask, + past_key_value, + output_attentions, + rel_pos=rel_pos, + rel_2d_pos=rel_2d_pos, + ) + attention_output = self.output(self_outputs[0], hidden_states) + # add attentions if we output them + if output_attentions: + outputs = [ + attention_output, + ] + self_outputs[1:] + else: + outputs = [attention_output] + return outputs + + +class LayoutXLMIntermediate(nn.Cell): + def __init__(self, config): + super().__init__() + self.use_float16 = config.use_float16 + self.dense_dtype = mstype.float32 + if self.use_float16 is True: + self.dense_dtype = mstype.float16 + self.dense = nn.Dense(config.hidden_size, config.intermediate_size).to_float(self.dense_dtype) + if isinstance(config.hidden_act, str): + self.intermediate_act_fn = act_fn[config.hidden_act] + else: + self.intermediate_act_fn = config.hidden_act + + def construct(self, hidden_states): + hidden_states = self.dense(hidden_states) + hidden_states = self.intermediate_act_fn(hidden_states) + return hidden_states + + +class LayoutXLMOutput(nn.Cell): + def __init__(self, config): + super().__init__() + self.use_float16 = config.use_float16 + self.dense_dtype = mstype.float32 + if self.use_float16 is True: + self.dense_dtype = mstype.float16 + self.dense = nn.Dense(config.intermediate_size, config.hidden_size).to_float(self.dense_dtype) + self.LayerNorm = nn.LayerNorm((config.hidden_size,), epsilon=config.layer_norm_eps) + self.dropout = nn.Dropout(p=config.hidden_dropout_prob) + + def construct(self, hidden_states, input_tensor): + hidden_states = self.dense(hidden_states) + hidden_states = self.dropout(hidden_states) + hidden_states = self.LayerNorm(hidden_states + input_tensor) + return hidden_states + + +class LayoutXLMLayer(nn.Cell): + def __init__(self, config): + super().__init__(config) + # since chunk_size_feed_forward is 0 as default, no chunk is needed here. + self.seq_len_dim = 1 + self.attention = LayoutXLMAttention(config) + self.add_cross_attention = False # default as false + self.intermediate = LayoutXLMIntermediate(config) + self.output = LayoutXLMOutput(config) + + def feed_forward_chunk(self, attention_output): + intermediate_output = self.intermediate(attention_output) + layer_output = self.output(intermediate_output, attention_output) + return layer_output + + def construct( + self, + hidden_states, + attention_mask=None, + head_mask=None, + encoder_hidden_states=None, + encoder_attention_mask=None, + past_key_value=None, + output_attentions=False, + rel_pos=None, + rel_2d_pos=None, + ): + # decoder uni-directional self-attention cached key/values tuple is at positions 1,2 + self_attn_past_key_value = past_key_value[:2] if past_key_value is not None else None + self_attention_outputs = self.attention( + hidden_states, + attention_mask=attention_mask, + head_mask=head_mask, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + past_key_value=self_attn_past_key_value, + output_attentions=output_attentions, + rel_pos=rel_pos, + rel_2d_pos=rel_2d_pos, + ) + attention_output = self_attention_outputs[0] + layer_output = self.feed_forward_chunk(attention_output) + + if output_attentions: + outputs = self_attention_outputs[1:] # add self attentions if we output attention weights + outputs = [ + layer_output, + ] + list(outputs) + else: + outputs = [layer_output] + return outputs + + +class LayoutXLMEncoder(nn.Cell): + def __init__(self, config): + super().__init__() + self.config = config + self.layer = nn.CellList([LayoutXLMLayer(config) for _ in range(config.num_hidden_layers)]) + + self.has_relative_attention_bias = config.has_relative_attention_bias + self.has_spatial_attention_bias = config.has_spatial_attention_bias + + self.use_float16 = config.use_float16 + self.dense_dtype = mstype.float32 + if self.use_float16 is True: + self.dense_dtype = mstype.float16 + + if self.has_relative_attention_bias: + self.rel_pos_bins = config.rel_pos_bins + self.max_rel_pos = config.max_rel_pos + self.rel_pos_onehot_size = config.rel_pos_bins + self.rel_pos_bias = nn.Dense(self.rel_pos_onehot_size, config.num_attention_heads, has_bias=False).to_float( + mstype.float16 + ) + + if self.has_spatial_attention_bias: + self.max_rel_2d_pos = config.max_rel_2d_pos + self.rel_2d_pos_bins = config.rel_2d_pos_bins + self.rel_2d_pos_onehot_size = config.rel_2d_pos_bins + self.rel_pos_x_bias = nn.Dense( + self.rel_2d_pos_onehot_size, config.num_attention_heads, has_bias=False + ).to_float(self.dense_dtype) + self.rel_pos_y_bias = nn.Dense( + self.rel_2d_pos_onehot_size, config.num_attention_heads, has_bias=False + ).to_float(self.dense_dtype) + + def relative_position_bucket(self, relative_position, bidirectional=True, num_buckets=32, max_distance=128): + def test(relative_position, bidirectional=True, num_buckets=32, max_distance=128): + ret = 0 + if bidirectional: + num_buckets //= 2 + ret += (relative_position > 0).astype(mstype.int64) * num_buckets + n = ops.abs(relative_position) + else: + n = ops.maximum(-relative_position, ops.zeros_like(relative_position)) # to be confirmed + # Now n is in the range [0, inf) + # half of the buckets are for exact increments in positions + max_exact = num_buckets // 2 + is_small = n < max_exact + + # The other half of the buckets are for logarithmically bigger bins in positions up to max_distance + scaling_val = ops.log(n.astype(mstype.float32) / max_exact) / math.log(max_distance / max_exact) + scaling_val = scaling_val * (num_buckets - max_exact) + val_if_large = max_exact + scaling_val.astype(mstype.int64) + + val_if_large = ops.minimum(val_if_large, ops.full_like(val_if_large, num_buckets - 1)) + + ret += ops.where(is_small, n, val_if_large) + return ret + + # test(relative_position.copy(), num_buckets=num_buckets, max_distance=max_distance) + ret = 0 + if bidirectional: + num_buckets //= 2 + ret += (relative_position > 0).long() * num_buckets + n = ops.abs(relative_position) + else: + n = ops.maximum(-relative_position, ops.zeros_like(relative_position)) + # now n is in the range [0, inf) + + # half of the buckets are for exact increments in positions + max_exact = num_buckets // 2 + is_small = n < max_exact + + # The other half of the buckets are for logarithmically bigger bins in positions up to max_distance + val_if_large = max_exact + ( + ops.log(n.astype(mstype.float32) / max_exact) + / ops.log(Tensor(max_distance / max_exact)) + * (num_buckets - max_exact) + ).astype(mstype.int64) + val_if_large = ops.minimum(val_if_large, ops.full_like(val_if_large, num_buckets - 1)) + + ret += ops.where(is_small, n, val_if_large) + return ret + + def _cal_1d_pos_emb(self, hidden_states, position_ids): + rel_pos_mat = position_ids.unsqueeze(-2) - position_ids.unsqueeze(-1) + rel_pos = self.relative_position_bucket( + rel_pos_mat, + num_buckets=self.rel_pos_bins, + max_distance=self.max_rel_pos, + ) + on_value, off_value = Tensor(1.0, mstype.float32), Tensor(0.0, mstype.float32) + rel_pos = ops.one_hot(rel_pos, self.rel_pos_onehot_size, on_value, off_value).astype(hidden_states.dtype) + rel_pos = self.rel_pos_bias(rel_pos).transpose((0, 3, 1, 2)) + return rel_pos + + def _cal_2d_pos_emb(self, hidden_states, bbox): + position_coord_x = bbox[:, :, 0] + position_coord_y = bbox[:, :, 3] + rel_pos_x_2d_mat = position_coord_x.unsqueeze(-2) - position_coord_x.unsqueeze(-1) + rel_pos_y_2d_mat = position_coord_y.unsqueeze(-2) - position_coord_y.unsqueeze(-1) + rel_pos_x = self.relative_position_bucket( + rel_pos_x_2d_mat, + num_buckets=self.rel_2d_pos_bins, + max_distance=self.max_rel_2d_pos, + ) + rel_pos_y = self.relative_position_bucket( + rel_pos_y_2d_mat, + num_buckets=self.rel_2d_pos_bins, + max_distance=self.max_rel_2d_pos, + ) + on_value, off_value = Tensor(1.0, mstype.float32), Tensor(0.0, mstype.float32) + rel_pos_x = ops.one_hot(rel_pos_x, self.rel_2d_pos_onehot_size, on_value, off_value).astype(hidden_states.dtype) + rel_pos_y = ops.one_hot(rel_pos_y, self.rel_2d_pos_onehot_size, on_value, off_value).astype(hidden_states.dtype) + rel_pos_x = self.rel_pos_x_bias(rel_pos_x).transpose((0, 3, 1, 2)) + rel_pos_y = self.rel_pos_y_bias(rel_pos_y).transpose((0, 3, 1, 2)) + rel_2d_pos = rel_pos_x + rel_pos_y + return rel_2d_pos + + def construct( + self, + hidden_states, + attention_mask=None, + head_mask=None, + encoder_hidden_states=None, + encoder_attention_mask=None, + past_key_values=None, + output_attentions=False, + output_hidden_states=False, + bbox=None, + position_ids=None, + ): + all_hidden_states = () if output_hidden_states else None + + rel_pos = self._cal_1d_pos_emb(hidden_states, position_ids) if self.has_relative_attention_bias else None + rel_2d_pos = self._cal_2d_pos_emb(hidden_states, bbox) if self.has_spatial_attention_bias else None + + hidden_save = dict() + hidden_save["input_hidden_states"] = hidden_states + + for i, layer_module in enumerate(self.layer): + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + layer_head_mask = None + past_key_value = None + # gradient_checkpointing is set as False here so we remove some codes here + hidden_save["input_attention_mask"] = attention_mask + layer_outputs = layer_module( + hidden_states, + attention_mask, + layer_head_mask, + encoder_hidden_states, + encoder_attention_mask, + past_key_value, + output_attentions, + rel_pos=rel_pos, + rel_2d_pos=rel_2d_pos, + ) + + hidden_states = layer_outputs[0] + + hidden_save["{}_data".format(i)] = hidden_states + + return hidden_states, hidden_save + + +class LayoutXLMPooler(nn.Cell): + def __init__(self, config): + super().__init__() + self.use_float16 = config.use_float16 + self.dense_dtype = mstype.float32 + if self.use_float16 is True: + self.dense_dtype = mstype.float16 + self.dense = nn.Dense(config.hidden_size, config.hidden_size).to_float(self.dense_dtype) + self.activation = nn.Tanh() + + def construct(self, hidden_states): + # We "pool" the model by simply taking the hidden state corresponding + # to the first token. + first_token_tensor = hidden_states[:, 0] + pooled_output = self.dense(first_token_tensor) + pooled_output = self.activation(pooled_output) + return pooled_output diff --git a/mindocr/models/base_model.py b/mindocr/models/base_model.py index 7ed0699c1..de3e56691 100644 --- a/mindocr/models/base_model.py +++ b/mindocr/models/base_model.py @@ -62,34 +62,19 @@ def __init__(self, config: dict): self.model_name = f"{backbone_name}_{neck_name}_{self.head_name}" def ser(self, *inputs): - image = inputs[4] - - x = self.backbone( - input_ids=inputs[0], - bbox=inputs[1], - attention_mask=inputs[2], - token_type_ids=inputs[3], - pixel_values=image, - ) - x = self.head(x, inputs[0]) + input_ids, bbox, attention_mask, token_type_ids = inputs[:4] + image = inputs[4] if self.backbone.use_visual_backbone else None + x = self.backbone(input_ids, bbox, attention_mask, token_type_ids, image) + x = self.head(x, input_ids) return x def re(self, *inputs): - if self.backbone.use_visual_backbone is True: - image = inputs[4] - else: - image = None - - x = self.backbone( - input_ids=inputs[0], - bbox=inputs[1], - attention_mask=inputs[2], - token_type_ids=inputs[3], - image=image, - ) - x = self.head(x, inputs[0], inputs[5], inputs[6], inputs[7], inputs[8]) + (input_ids, bbox, attention_mask, token_type_ids, question, question_label, answer, answer_label) = inputs[:8] + image = inputs[8] if self.backbone.use_visual_backbone else None + x = self.backbone(input_ids, bbox, attention_mask, token_type_ids, image) + x = self.head(x, input_ids, question, question_label, answer, answer_label) return x def construct(self, *args):