Loading

LayoutLM微调funsd参考笔记

研一上课,研二上写综述,现在到了寒假了,对于怎么运行和实现模型还行不熟悉,所以得认真琢磨一个模型以便入门。
我的方向是视觉文档的信息抽取,一个小众的方向,最近流行基于模型预训练的方法,以微软亚研院的LayoutLM系列工作为代表。尽管22年发布了LayoutLMv3,但是我还是先以20年的初版LayoutLM入门。
系列工作的代码都开源和公布微软官网、GitHub上,模型可以在HuggingFace上获取。

UNILM项目

跨任务(辨别式和生成式)、多语言、多模态的一系列大规模自监督预训练方法。

UNILM项目下有一系列预训练工作,通过readme文件中我们可以看到一系列微软的工作,在更新记录中可以看到最新的工作进展。
虽然我只研究LayoutLM,但也可以直接将整个父项目Git下载到服务器中。

Layoutmft项目

在配置Layoutlm、Layoutlmv2和Layoutlmv3的环境时,可以观察到layoutmft频繁出现。
Layoutmft也是一个子项目,打开它的readme文件阅读,可以知道mft的含义。

Multimodal (text + layout/format + image) fine-tuning toolkit for document understanding

它是帮助预训练模型微调的工具集,支持的模型有

Popular Language Models: BERT, UniLM(v2), RoBERTa, InfoXLM
LayoutLM Family: LayoutLM, LayoutLMv2, LayoutXLM

所以准备上述模型的环境时,我们可以使用这个工具。安装命令如下:

conda create -n layoutlmft python=3.7
conda activate layoutlmft
git clone https://github.com/microsoft/unilm.git
cd unilm
cd layoutlmft
pip install -r requirements.txt
pip install -e

通过conda创建layoutmft环境,之后的模型都可以在这个环境运行。
然后下载unilm父项目,进入unilm/layoulmmft文件夹,安装所需配置。
我们可以观察所需的基本配置requirement文件,其中pytorch不必多说,transformers是huggingface的模型库,detectron2是文本模型(我也不了解)seqeval应该是一个工具。

-f https://download.pytorch.org/whl/torch_stable.html
-f https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/torch1.7/index.html

datasets==1.6.2
torch==1.7.1+cu101
torchvision==0.8.2+cu101
transformers==4.5.1
detectron2==0.3
seqeval==1.2.2

LayoutLM 项目

LauoutLM是一个简单、有效的模型,用于多模态的视觉文档理解和信息抽取任务,处理文本、布局和视觉多模态信息。

准备环境

conda create -n layoutlm python=3.6
conda activate layoutlm
conda install pytorch==1.4.0 cudatoolkit=10.1 -c pytorch
git clone https://github.com/NVIDIA/apex && cd apex
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
pip install .
## For development mode
# pip install -e ".[dev]"

不太明白为什么这里不用layoutlmmft准备环境。

序列标注任务

以FUNSD为例,首先需要将json格式的数据转换为text

cd examples/seq_labeling
./preprocess.sh

然后对Funsd数据集进行微调训练。

python run_seq_labeling.py  --data_dir data \
                            --model_type layoutlm \
                            --model_name_or_path path/to/pretrained/model/directory \
                            --do_lower_case \
                            --max_seq_length 512 \
                            --do_train \
                            --num_train_epochs 100.0 \
                            --logging_steps 10 \
                            --save_steps -1 \
                            --output_dir path/to/output/directory \
                            --labels data/labels.txt \
                            --per_gpu_train_batch_size 16 \
                            --per_gpu_eval_batch_size 16 \
                            --fp16

多卡情况下,则使用如下命令。

python -m torch.distributed.launch --nproc_per_node=4 run_seq_labeling.py  --data_dir data \
                            --model_type layoutlm \
                            --model_name_or_path path/to/pretrained/model/directory \
                            --do_lower_case \
                            --max_seq_length 512 \
                            --do_train \
                            --num_train_epochs 100.0 \
                            --logging_steps 10 \
                            --save_steps -1 \
                            --output_dir path/to/output/directory \
                            --labels data/labels.txt \
                            --per_gpu_train_batch_size 16 \
                            --per_gpu_eval_batch_size 16 \
                            --fp16

当需要进行评估预测的时候,则需要将--do_train换成--do_eval或--do_predict 。
当需要更换baseline模型时,可以将 --model_type 改为Bert或者RoBerta,更多参数参考run.py文件。

熟悉微调训练过程

LayoutLM (huggingface.co) 中 resource 有一个介绍如何使用 layoutlm 进行 token 分类的 colab notebook 教程文件,我将借助它来执行程序,并学习源码。

环境准备

notebook 中通过安装 unilm/layoutlm 和 transformer 来部署初始化环境。

! rm -r unilm
! git clone -b remove_torch_save https://github.com/NielsRogge/unilm.git
! cd unilm/layoutlm
! pip install unilm/layoutlm

! rm -r transformers
! git clone https://github.com/huggingface/transformers.git
! cd transformers
! pip install ./transformers

获取数据

下载 Funsd 数据集

! wget https://guillaumejaume.github.io/FUNSD/dataset.zip
! unzip dataset.zip && mv dataset data && rm -rf dataset.zip __MACOSX

其目录结构如图所示,分测试和训练数据,包含文档图像和标注的json文件,以相同文件名对应。
image

其中json文件按如下格式,标注了文档的四种实体信息,给出了实体的文本框和文本、token的文本框和文本、以及实体间的联系。
image

将标注信息在原视觉文档上进行可视化后,如下所示。
image

视觉文档处理

Json 格式的标注数据需要转换为 token 级别的文本、布局、图像信息序列。

! python unilm/layoutlm/examples/seq_labeling/preprocess.py --data_dir data/training_data/annotations \
                                                      --data_split train \
                                                      --output_dir data \
                                                      --model_name_or_path microsoft/layoutlm-base-uncased \
                                                      --max_len 510

! python unilm/layoutlm/examples/seq_labeling/preprocess.py --data_dir data/testing_data/annotations \
                                                      --data_split test \
                                                      --output_dir data \
                                                      --model_name_or_path microsoft/layoutlm-base-uncased \
                                                      --max_len 510

通过上述命令调用 preprocess.py 分别生成三个文件,内容格式如下。

# train.txt 描述了token的BIOES实体标注信息
DATE:	S-QUESTION
SUBJECT:	S-QUESTION

# train_image.txt 描述了token在图像中的区域
DATE:	119 158 175 179
SUBJECT:	116 187 209 207

# train_box.txt 描述了token的文本框信息,将最长边缩放到1000。
DATE:	91 158 134 179	762 1000	0013255595.png
SUBJECT:	89 187 160 207	762 1000	0013255595.png

不同视觉文档样本,以空行隔开。

定义PyTorch dataset

主要定义dataset和dataloader。
开源代码中给出了具体的FunsdDataset类,其中调用了LayoutLMTokenizer。

FunsdDataset所在相关模块代码,将在 todo 中分析。

posted @ 2023-02-06 13:44  丘野  阅读(1082)  评论(1编辑  收藏  举报