大一上课,大二上写综述,现在到了寒假了,对于怎么运行和实现模型还行不熟悉,所以得认真琢磨一个模型以便入门。
我的方向是视觉文档的信息抽取,一个小众的方向,最近流行基于模型预训练的方法,以微软亚研院的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文件,以相同文件名对应。
其中json文件按如下格式,标注了文档的四种实体信息,给出了实体的文本框和文本、token的文本框和文本、以及实体间的联系。
将标注信息在原视觉文档上进行可视化后,如下所示。
视觉文档处理
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
WRITER: S-QUESTION
APPROVALS: S-QUESTION
Other: S-QUESTION
# train_box.txt 描述了token的文本框信息
DATE: 119 158 175 179
SUBJECT: 116 187 209 207
WRITER: 116 240 194 260
APPROVALS: 114 286 233 306
Other: 114 508 187 528
# train_image.txt 描述了token在图像中的区域,将最长边缩放到1000。
DATE: 91 158 134 179 762 1000 0013255595.png
SUBJECT: 89 187 160 207 762 1000 0013255595.png
WRITER: 89 240 148 260 762 1000 0013255595.png
APPROVALS: 87 286 178 306 762 1000 0013255595.png
Other: 87 508 143 528 762 1000 0013255595.png
不同视觉文档样本,以空行隔开。