一、UniLM项目介绍
统一语言模型(Unified Language Model,UniLM)
https://github.com/microsoft/unilm
这个 unilm
仓库是微软的一个研究项目,专注于跨任务、语言和模态的大规模自监督预训练,涵盖了多种基础模型架构和模型,在自然语言处理(NLP)、计算机视觉、语音处理和多模态处理等多个领域开展研究。
图1:UniLM的网络结构以及它不同的预训练任务。
1. 基础架构
- TorchScale:一个基础架构库,专注于开发新的基础模型架构,研究建模的通用性、能力、训练稳定性和效率。相关架构有:
- DeepNet:可将 Transformer 扩展到 1000 层及以上,提升模型稳定性。
- Foundation Transformers (Magneto):旨在实现跨任务和模态(包括语言、视觉、语音和多模态)的真正通用建模。
- Length - Extrapolatable Transformer:具有长度外推能力的 Transformer。
- X - MoE:可扩展且可微调的稀疏专家混合(Mixture - of - Experts, MoE)架构。
- 模型架构革新:
- BitNet:用于大语言模型的 1 位 Transformer。
- RetNet:作为 Transformer 的继任者,用于大语言模型。
- LongNet:可将 Transformer 扩展到处理 10 亿个令牌。
2. 基础模型
多模态大语言模型(MLLM)的演进
- Kosmos - 2.5:多模态知识模型。
- Kosmos - 2:将多模态大语言模型与现实世界关联起来。
- Kosmos - 1:多模态大语言模型。
- MetaLM:语言模型作为通用接口。
语言和多语言模型
- UniLM:用于语言理解和生成的统一预训练模型。
- InfoXLM/XLM - E:支持 100 多种语言的多语言/跨语言预训练模型。
- DeltaLM/mT6:用于 100 多种语言的语言生成和翻译的编码器 - 解码器预训练模型。
- MiniLM:用于语言理解和生成的小型快速预训练模型。
- AdaLM:预训练模型的领域、语言和任务自适应模型。
- EdgeLM:适用于边缘/客户端设备的小型预训练模型。
- SimLM:用于相似度匹配的大规模预训练模型。
- E5:文本嵌入模型。
- MiniLLM:大语言模型的知识蒸馏模型。
视觉模型
- BEiT/BEiT - 2:用于视觉的生成式自监督预训练模型,即图像 Transformer 的 BERT 预训练。
- DiT:用于文档图像 Transformer 的自监督预训练模型。
- TextDiffuser/TextDiffuser - 2:将扩散模型作为文本绘画工具。
语音模型
- WavLM:用于全栈语音任务的预训练模型。
- VALL - E:用于文本转语音(TTS)的神经编解码语言模型。
多模态(X + 语言)模型
- LayoutLM/LayoutLMv2/LayoutLMv3:用于文档人工智能的多模态(文本 + 布局/格式 + 图像)文档基础模型。
- LayoutXLM:用于多语言文档人工智能的多模态(文本 + 布局/格式 + 图像)文档基础模型。
- MarkupLM:用于视觉丰富文档理解的标记语言模型预训练。
- XDoc:用于跨格式文档理解的统一预训练模型。
- UniSpeech:用于自动语音识别(ASR)的自监督学习和监督学习的统一预训练模型。
- UniSpeech - SAT:具有说话人感知预训练的通用语音表示学习模型。
- SpeechT5:用于口语处理的编码器 - 解码器预训练模型。
- SpeechLM:利用未配对文本数据增强语音预训练。
- VLMo:统一的视觉 - 语言预训练模型。
- VL - BEiT:生成式视觉 - 语言预训练模型,是 BEiT 向多模态的演进。
- BEiT - 3:通用多模态基础模型,是大规模预训练在任务、语言和模态上融合的重要里程碑。
工具包
- s2s - ft:序列到序列的微调工具包。
- Aggressive Decoding:无损且高效的序列到序列解码算法。
其他资源
- RedStone:为大语言模型整理通用、代码、数学和问答数据。
- LLMOps:支持使用大语言模型(LLMs)和多模态大语言模型(MLLMs)实现人工智能能力的通用技术。
模型发布记录
- 2021 年 10 月:MarkupLM 发布。
- 2021 年 9 月:TrOCR 发布。
- 2021 年 8 月:LayoutReader 和 DeltaLM 发布。
- 2021 年 7 月:BEiT 发布。
代码结构
仓库包含多个子目录,每个子目录对应一个具体的项目或模型,例如 beit
、kosmos - 2
、layoutlm
等。同时,还包含一些工具和脚本,用于数据处理、模型训练和评估等任务。
二、TrOCR
TrOCR和UniLM的关系:
从代码层面看,trocr/trocr_models.py
文件里尝试导入UniLMDecoder
,代码如下:
try:
from .unilm_models import UniLMDecoder
except:
from unilm_models import UniLMDecoder
这表明TrOCR在模型构建时会借鉴UniLM的解码器,可能会复用UniLM在自然语言处理方面的优势,如对文本生成和理解的能力,以增强自身在文字识别后文本处理的效果。
- TrOCR:是一种端到端的文本识别方法,主要用于光学字符识别(OCR)任务,通过预训练的图像Transformer和文本Transformer模型,实现对图像中文字的识别和生成。从
trocr/README.md
可知,它在多个数据集(如IAM、SROIE等)上有出色的表现,能够输出识别的文字结果。 - UniLM:主要聚焦于自然语言理解(NLU)和生成(NLG)的统一预训练。它可以处理多种自然语言处理任务,如抽象文本摘要、问题生成等,在自然语言处理的多个基准测试中取得了新的最优结果(SOTA)。
TrOCR项目结构的大致介绍:
augmentation
:存放数据增强相关代码 。README.md
:项目说明,含概述、使用等。__init__.py
:使trocr
成为Python包。bpe.py
:实现字节对编码算法。convert_to_SROIE_format.py
:数据转SROIE格式。data.py
:负责数据加载与预处理。data_aug.py
:具体数据增强操作。deit.py
:DEIT模型相关代码。generator.py
:生成数据或结果。pic_inference.ipynb
/py
:图像推理。requirements.txt
:记录依赖包。scoring.py
:计算评估指标。task.py
:定义任务逻辑。trocr_models.py
:定义TrOCR模型架构。unilm3-cased.model
:UniLM模型权重。unilm_models.py
:UniLM模型代码。vit_models.py
:ViT模型代码。
IAM数据集上微调代码讲解
Fine-tuning on IAM
export MODEL_NAME=ft_iam
export SAVE_PATH=/path/to/save/${MODEL_NAME}
export LOG_DIR=log_${MODEL_NAME}
export DATA=/path/to/data
mkdir ${LOG_DIR}
export BSZ=8
export valid_BSZ=16
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 \
$(which fairseq-train) \
--data-type STR --user-dir ./ --task text_recognition --input-size 384 \
--arch trocr_large \ # or trocr_base
--seed 1111 --optimizer adam --lr 2e-05 --lr-scheduler inverse_sqrt \
--warmup-init-lr 1e-8 --warmup-updates 500 --weight-decay 0.0001 --log-format tqdm \
--log-interval 10 --batch-size ${BSZ} --batch-size-valid ${valid_BSZ} --save-dir ${SAVE_PATH} \
--tensorboard-logdir ${LOG_DIR} --max-epoch 300 --patience 20 --ddp-backend legacy_ddp \
--num-workers 8 --preprocess DA2 --update-freq 1 \
--bpe gpt2 --decoder-pretrained roberta2 \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --decoder-pretrained unilm ## For small models
--finetune-from-model /path/to/model --fp16 \
${DATA}
这段代码用于在IAM数据集上对TrOCR模型进行微调的脚本,它使用了fairseq
框架,用了fairseq-train
命令,设置了一系列的训练参数,包括学习率、批量大小、训练轮数等。通过分布式训练的方式来加速模型的微调过程。以下是对代码各部分的详细解释:
1. 环境变量设置
export MODEL_NAME=ft_iam
export SAVE_PATH=/path/to/save/${MODEL_NAME}
export LOG_DIR=log_${MODEL_NAME}
export DATA=/path/to/data
mkdir ${LOG_DIR}
export BSZ=8
export valid_BSZ=16
MODEL_NAME
:微调模型的名称,这里设置为ft_iam
,表示在IAM数据集上进行微调。SAVE_PATH
:保存微调后模型的路径,使用了环境变量MODEL_NAME
。LOG_DIR
:保存训练日志的目录,同样使用了环境变量MODEL_NAME
。DATA
:训练数据的路径。mkdir ${LOG_DIR}
:创建日志目录。BSZ
:训练时的批量大小,设置为8。valid_BSZ
:验证时的批量大小,设置为16。
2. 分布式训练启动
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 \
$(which fairseq-train) \
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
:指定使用的GPU设备编号,这里使用了8块GPU。python -m torch.distributed.launch --nproc_per_node=8
:使用torch.distributed.launch
工具启动分布式训练,每个节点使用8个进程。$(which fairseq-train)
:调用fairseq-train
命令进行模型训练。
3. 训练参数设置
--data-type STR --user-dir ./ --task text_recognition --input-size 384 \
--arch trocr_large \ # or trocr_base
--seed 1111 --optimizer adam --lr 2e-05 --lr-scheduler inverse_sqrt \
--warmup-init-lr 1e-8 --warmup-updates 500 --weight-decay 0.0001 --log-format tqdm \
--log-interval 10 --batch-size ${BSZ} --batch-size-valid ${valid_BSZ} --save-dir ${SAVE_PATH} \
--tensorboard-logdir ${LOG_DIR} --max-epoch 300 --patience 20 --ddp-backend legacy_ddp \
--num-workers 8 --preprocess DA2 --update-freq 1 \
--bpe gpt2 --decoder-pretrained roberta2 \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --decoder-pretrained unilm ## For small models
--finetune-from-model /path/to/model --fp16 \
${DATA}
--data-type STR
:指定数据类型为STR
。--user-dir ./
:指定用户自定义代码的目录为当前目录。即trocr/--task text_recognition
:指定训练任务为文本识别。指定任务类型,对应task.py中的实现--input-size 384
:输入图像的大小为384。--arch trocr_large
:使用trocr_large
架构,也可以选择trocr_base
。指定模型架构,对应trocr_models.py中的定义--seed 1111
:设置随机种子为1111,保证结果的可重复性。--optimizer adam
:使用Adam优化器。--lr 2e-05
:学习率设置为2e-05
。--lr-scheduler inverse_sqrt
:使用逆平方根学习率调度器。--warmup-init-lr 1e-8
:热身阶段的初始学习率为1e-8
。--warmup-updates 500
:热身阶段的更新步数为500。--weight-decay 0.0001
:权重衰减系数为0.0001
。--log-format tqdm
:使用tqdm
格式输出训练日志。--log-interval 10
:每10个批次输出一次训练日志。--batch-size ${BSZ}
:训练时的批量大小,使用之前设置的BSZ
。--batch-size-valid ${valid_BSZ}
:验证时的批量大小,使用之前设置的valid_BSZ
。--save-dir ${SAVE_PATH}
:保存模型的目录,使用之前设置的SAVE_PATH
。--tensorboard-logdir ${LOG_DIR}
:保存TensorBoard日志的目录,使用之前设置的LOG_DIR
。--max-epoch 300
:最大训练轮数为300。--patience 20
:早停策略的耐心值为20,如果在20个轮次内验证集性能没有提升,则停止训练。--ddp-backend legacy_ddp
:使用legacy_ddp
作为分布式数据并行后端。--num-workers 8
:数据加载的工作进程数为8。--preprocess DA2
:使用DA2
进行数据预处理。--update-freq 1
:梯度累积步数为1,即每个批次都进行参数更新。--bpe gpt2
:使用GPT-2的字节对编码(BPE)。--decoder-pretrained roberta2
:解码器使用roberta2
进行预训练。--finetune-from-model /path/to/model
:从指定的预训练模型开始微调。--fp16
:使用半精度浮点数(FP16)进行训练,以减少内存使用和加速训练。${DATA}
:指定训练数据的路径。
README
TrOCR
项目地址:https://github.com/microsoft/unilm
简介
TrOCR是一种端到端的文本识别方法,它结合了预训练的图像Transformer和文本Transformer模型,利用Transformer架构同时进行图像理解和字块级别的文本生成。
论文:TrOCR: 基于预训练模型的Transformer光学字符识别
李明浩,吕腾超,崔磊,卢一娟,迪内·弗洛伦西奥,张查,李周军,魏富如,AAAI 2023
。
TrOCR模型也以Huggingface格式提供。[文档][模型]
模型 | 参数数量 | 测试集 | 得分 |
---|---|---|---|
TrOCR-Small | 62M | IAM | 4.22(区分大小写的字符错误率) |
TrOCR-Base | 334M | IAM | 3.42(区分大小写的字符错误率) |
TrOCR-Large | 558M | IAM | 2.89(区分大小写的字符错误率) |
TrOCR-Small | 62M | SROIE | 95.86(F1值) |
TrOCR-Base | 334M | SROIE | 96.34(F1值) |
TrOCR-Large | 558M | SROIE | 96.60(F1值) |
模型 | IIIT5K - 3000 | SVT - 647 | ICDAR2013 - 857 | ICDAR2013 - 1015 | ICDAR2015 - 1811 | ICDAR2015 - 2077 | SVTP - 645 | CT80 - 288 |
---|---|---|---|---|---|---|---|---|
TrOCR-Base(单词准确率) | 93.4 | 95.2 | 98.4 | 97.4 | 86.9 | 81.2 | 92.1 | 90.6 |
TrOCR-Large(单词准确率) | 94.1 | 96.1 | 98.4 | 97.3 | 88.1 | 84.1 | 93.0 | 95.1 |
安装
conda create -n trocr python=3.7
conda activate trocr
git clone https://github.com/microsoft/unilm.git
cd unilm
cd trocr
pip install pybind11
pip install -r requirements.txt
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" 'git+https://github.com/NVIDIA/apex.git'
微调与评估
模型下载
模型 | 下载链接 |
---|---|
TrOCR-Small-IAM | trocr-small-handwritten.pt |
TrOCR-Base-IAM | trocr-base-handwritten.pt |
TrOCR-Large-IAM | trocr-large-handwritten.pt |
TrOCR-Small-SROIE | trocr-small-printed.pt |
TrOCR-Base-SROIE | trocr-base-printed.pt |
TrOCR-Large-SROIE | trocr-large-printed.pt |
TrOCR-Small-Stage1 | trocr-small-stage1.pt |
TrOCR-Base-Stage1 | trocr-base-stage1.pt |
TrOCR-Large-Stage1 | trocr-large-stage1.pt |
TrOCR-Base-STR | trocr-base-str.pt |
TrOCR-Large-STR | trocr-large-str.pt |
测试集下载
测试集 | 下载链接 |
---|---|
IAM | IAM.tar.gz |
SROIE | SROIE_Task2_Original.tar.gz |
STR基准测试集 | STR_BENCHMARKS.zip |
IAM主要用于手写文本识别任务
SROIE主要用于打印文本识别任务,特别是在文档处理和信息提取方面。
STR 基准测试集用于文本识别模型的基准测试,涵盖了多种场景和风格的文本图像,
如果本页面上的任何文件下载失败,请在URL后添加以下字符串作为后缀。
后缀字符串: ?sv=2022-11-02&ss=b&srt=o&sp=r&se=2033-06-08T16:48:15Z&st=2023-06-08T08:48:15Z&spr=https&sig=a9VXrihTzbWyVfaIDlIT1Z0FoR1073VB0RLQUMuudD4%3D
在IAM上进行微调
export MODEL_NAME=ft_iam
export SAVE_PATH=/path/to/save/${MODEL_NAME}
export LOG_DIR=log_${MODEL_NAME}
export DATA=/path/to/data
mkdir ${LOG_DIR}
export BSZ=8
export valid_BSZ=16
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 \
$(which fairseq-train) \
--data-type STR --user-dir ./ --task text_recognition --input-size 384 \
--arch trocr_large \ # 或者 trocr_base
--seed 1111 --optimizer adam --lr 2e-05 --lr-scheduler inverse_sqrt \
--warmup-init-lr 1e-8 --warmup-updates 500 --weight-decay 0.0001 --log-format tqdm \
--log-interval 10 --batch-size ${BSZ} --batch-size-valid ${valid_BSZ} --save-dir ${SAVE_PATH} \
--tensorboard-logdir ${LOG_DIR} --max-epoch 300 --patience 20 --ddp-backend legacy_ddp \
--num-workers 8 --preprocess DA2 --update-freq 1 \
--bpe gpt2 --decoder-pretrained roberta2 \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --decoder-pretrained unilm ## 对于小模型
${DATA}
在SROIE上进行微调
export MODEL_NAME=ft_SROIE
export SAVE_PATH=/path/to/save/${MODEL_NAME}
export LOG_DIR=log_${MODEL_NAME}
export DATA=/path/to/data
mkdir ${LOG_DIR}
export BSZ=16
export valid_BSZ=16
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 \
$(which fairseq-train) \
--data-type SROIE --user-dir ./ --task text_recognition --input-size 384 \
--arch trocr_large \ # 或者 trocr_base
--seed 1111 --optimizer adam --lr 5e-05 --lr-scheduler inverse_sqrt \
--warmup-init-lr 1e-8 --warmup-updates 800 --weight-decay 0.0001 --log-format tqdm \
--log-interval 10 --batch-size ${BSZ} --batch-size-valid ${valid_BSZ} \
--save-dir ${SAVE_PATH} --tensorboard-logdir ${LOG_DIR} --max-epoch 300 \
--patience 10 --ddp-backend legacy_ddp --num-workers 10 --preprocess DA2 \
--bpe gpt2 --decoder-pretrained roberta2 \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --decoder-pretrained unilm ## 对于小模型
${DATA}
在STR基准测试集上进行微调
--preprocess RandAugment --update-freq 1 --ddp-backend legacy_ddp \
--num-workers 8 --finetune-from-model /path/to/model \
--bpe gpt2 --decoder-pretrained roberta2 \
${DATA}
在SROIE上进行评估
export DATA=/path/to/data
export MODEL=/path/to/model
export RESULT_PATH=/path/to/result
export BSZ=16
$(which fairseq-generate) \
--data-type SROIE --user-dir ./ --task text_recognition --input-size 384 \
--beam 10 --nbest 1 --scoring sroie --gen-subset test \
--batch-size ${BSZ} --path ${MODEL} --results-path ${RESULT_PATH} \
--bpe gpt2 --dict-path-or-url https://layoutlm.blob.core.windows.net/trocr/dictionaries/gpt2_with_mask.dict.txt \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --dict-path-or-url https://layoutlm.blob.core.windows.net/trocr/dictionaries/unilm3.dict.txt ## 对于小模型
--preprocess DA2 \
--fp16 \
${DATA}
在STR基准测试集上进行评估
export DATA=/path/to/data
export MODEL=/path/to/model
export RESULT_PATH=/path/to/result
export BSZ=16
$(which fairseq-generate) \
--data-type Receipt53K --user-dir ./ --task text_recognition \
--input-size 384 --beam 10 --nbest 1 --scoring wpa \
--gen-subset test --batch-size ${BSZ} --bpe gpt2 \
--dict-path-or-url https://layoutlm.blob.core.windows.net/trocr/dictionaries/gpt2_with_mask.dict.txt \
--path ${MODEL} --results-path ${RESULT_PATH} \
--preprocess RandAugment \
${DATA}
请使用 “convert_to_sroie_format.py” 将输出文件转换为zip格式,并在网站上提交以获取分数。
推理示例
详情请见 pic_inference.py。
引用
如果您想在研究中引用TrOCR,请引用以下论文:
@misc{li2021trocr,
title={TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models},
author={Minghao Li and Tengchao Lv and Lei Cui and Yijuan Lu and Dinei Florencio and Cha Zhang and Zhoujun Li and Furu Wei},
year={2021},
eprint={2109.10282},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
许可证
本项目遵循此源代码树根目录下的LICENSE
文件中的许可证。部分源代码基于fairseq项目。微软开源行为准则
联系信息
如需使用TrOCR时获得帮助或遇到问题,请提交一个GitHub问题。
如需与TrOCR相关的其他沟通,请联系崔磊 (lecu@microsoft.com
),魏富如 (fuwei@microsoft.com
)。