README.md 9.9 KB
Newer Older
文幕地方's avatar
add re  
文幕地方 已提交
1
# 文档视觉问答(DOC-VQA)
littletomatodonkey's avatar
littletomatodonkey 已提交
2

文幕地方's avatar
文幕地方 已提交
3
VQA指视觉问答,主要针对图像内容进行提问和回答,DOC-VQA是VQA任务中的一种,DOC-VQA主要针对文本图像的文字内容提出问题。
文幕地方's avatar
add re  
文幕地方 已提交
4 5 6 7

PP-Structure 里的 DOC-VQA算法基于PaddleNLP自然语言处理算法库进行开发。

主要特性如下:
littletomatodonkey's avatar
littletomatodonkey 已提交
8 9

- 集成[LayoutXLM](https://arxiv.org/pdf/2104.08836.pdf)模型以及PP-OCR预测引擎。
文幕地方's avatar
文幕地方 已提交
10 11
- 支持基于多模态方法的语义实体识别 (Semantic Entity Recognition, SER) 以及关系抽取 (Relation Extraction, RE) 任务。基于 SER 任务,可以完成对图像中的文本识别与分类;基于 RE 任务,可以完成对图象中的文本内容的关系提取,如判断问题对(pair)。
- 支持SER任务和RE任务的自定义训练。
文幕地方's avatar
add re  
文幕地方 已提交
12 13
- 支持OCR+SER的端到端系统预测与评估。
- 支持OCR+SER+RE的端到端系统预测。
littletomatodonkey's avatar
littletomatodonkey 已提交
14 15 16 17 18


本项目是 [LayoutXLM: Multimodal Pre-training for Multilingual Visually-rich Document Understanding](https://arxiv.org/pdf/2104.08836.pdf) 在 Paddle 2.2上的开源实现,
包含了在 [XFUND数据集](https://github.com/doc-analysis/XFUND) 上的微调代码。

文幕地方's avatar
add re  
文幕地方 已提交
19 20
## 1 性能

文幕地方's avatar
文幕地方 已提交
21
我们在 [XFUN](https://github.com/doc-analysis/XFUND) 的中文数据集上对算法进行了评估,性能如下
文幕地方's avatar
add re  
文幕地方 已提交
22

文幕地方's avatar
文幕地方 已提交
23 24 25 26 27
| 模型 | 任务 | f1 | 模型下载地址 |
|:---:|:---:|:---:| :---:|
| LayoutXLM | RE | 0.7113 | [链接](https://paddleocr.bj.bcebos.com/pplayout/PP-Layout_v1.0_re_pretrained.tar) |
| LayoutXLM | SER | 0.9056 | [链接](https://paddleocr.bj.bcebos.com/pplayout/PP-Layout_v1.0_ser_pretrained.tar) |
| LayoutLM | SER | 0.78 | [链接](https://paddleocr.bj.bcebos.com/pplayout/LayoutLM_ser_pretrained.tar) |
文幕地方's avatar
add re  
文幕地方 已提交
28 29 30 31



## 2. 效果演示
littletomatodonkey's avatar
littletomatodonkey 已提交
32 33 34

**注意:** 测试图片来源于XFUN数据集。

文幕地方's avatar
add re  
文幕地方 已提交
35
### 2.1 SER
littletomatodonkey's avatar
littletomatodonkey 已提交
36

文幕地方's avatar
add re  
文幕地方 已提交
37 38
![](./images/result_ser/zh_val_0_ser.jpg) | ![](./images/result_ser/zh_val_42_ser.jpg)
---|---
littletomatodonkey's avatar
littletomatodonkey 已提交
39

文幕地方's avatar
add re  
文幕地方 已提交
40
图中不同颜色的框表示不同的类别,对于XFUN数据集,有`QUESTION`, `ANSWER`, `HEADER` 3种类别
littletomatodonkey's avatar
littletomatodonkey 已提交
41

文幕地方's avatar
add re  
文幕地方 已提交
42 43 44
* 深紫色:HEADER
* 浅紫色:QUESTION
* 军绿色:ANSWER
littletomatodonkey's avatar
littletomatodonkey 已提交
45

文幕地方's avatar
add re  
文幕地方 已提交
46
在OCR检测框的左上方也标出了对应的类别和OCR识别结果。
littletomatodonkey's avatar
littletomatodonkey 已提交
47 48


文幕地方's avatar
add re  
文幕地方 已提交
49
### 2.2 RE
littletomatodonkey's avatar
littletomatodonkey 已提交
50

文幕地方's avatar
add re  
文幕地方 已提交
51 52
![](./images/result_re/zh_val_21_re.jpg) | ![](./images/result_re/zh_val_40_re.jpg)
---|---
littletomatodonkey's avatar
littletomatodonkey 已提交
53 54


文幕地方's avatar
add re  
文幕地方 已提交
55
图中红色框表示问题,蓝色框表示答案,问题和答案之间使用绿色线连接。在OCR检测框的左上方也标出了对应的类别和OCR识别结果。
littletomatodonkey's avatar
littletomatodonkey 已提交
56

文幕地方's avatar
add re  
文幕地方 已提交
57 58 59 60

## 3. 安装

### 3.1 安装依赖
littletomatodonkey's avatar
littletomatodonkey 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

- **(1) 安装PaddlePaddle**

```bash
pip3 install --upgrade pip

# GPU安装
python3 -m pip install paddlepaddle-gpu==2.2 -i https://mirror.baidu.com/pypi/simple

# CPU安装
python3 -m pip install paddlepaddle==2.2 -i https://mirror.baidu.com/pypi/simple

```
更多需求,请参照[安装文档](https://www.paddlepaddle.org.cn/install/quick)中的说明进行操作。


文幕地方's avatar
add re  
文幕地方 已提交
77
### 3.2 安装PaddleOCR(包含 PP-OCR 和 VQA )
littletomatodonkey's avatar
littletomatodonkey 已提交
78 79 80 81

- **(1)pip快速安装PaddleOCR whl包(仅预测)**

```bash
文幕地方's avatar
add re  
文幕地方 已提交
82
pip install paddleocr
littletomatodonkey's avatar
littletomatodonkey 已提交
83 84
```

littletomatodonkey's avatar
littletomatodonkey 已提交
85
- **(2)下载VQA源码(预测+训练)**
littletomatodonkey's avatar
littletomatodonkey 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98

```bash
【推荐】git clone https://github.com/PaddlePaddle/PaddleOCR

# 如果因为网络问题无法pull成功,也可选择使用码云上的托管:
git clone https://gitee.com/paddlepaddle/PaddleOCR

# 注:码云托管代码可能无法实时同步本github项目更新,存在3~5天延时,请优先使用推荐方式。
```

- **(3)安装PaddleNLP**

```bash
文幕地方's avatar
文幕地方 已提交
99
pip3 install "paddlenlp>=2.2.1"
littletomatodonkey's avatar
littletomatodonkey 已提交
100 101 102
```


littletomatodonkey's avatar
littletomatodonkey 已提交
103
- **(4)安装VQA的`requirements`**
littletomatodonkey's avatar
littletomatodonkey 已提交
104 105

```bash
文幕地方's avatar
add re  
文幕地方 已提交
106
cd ppstructure/vqa
littletomatodonkey's avatar
littletomatodonkey 已提交
107 108 109
pip install -r requirements.txt
```

文幕地方's avatar
add re  
文幕地方 已提交
110
## 4. 使用
littletomatodonkey's avatar
littletomatodonkey 已提交
111 112


文幕地方's avatar
add re  
文幕地方 已提交
113
### 4.1 数据和预训练模型准备
littletomatodonkey's avatar
littletomatodonkey 已提交
114 115 116 117 118 119 120 121 122 123 124 125

处理好的XFUN中文数据集下载地址:[https://paddleocr.bj.bcebos.com/dataset/XFUND.tar](https://paddleocr.bj.bcebos.com/dataset/XFUND.tar)


下载并解压该数据集,解压后将数据集放置在当前目录下。

```shell
wget https://paddleocr.bj.bcebos.com/dataset/XFUND.tar
```

如果希望转换XFUN中其他语言的数据集,可以参考[XFUN数据转换脚本](helper/trans_xfun_data.py)

文幕地方's avatar
add re  
文幕地方 已提交
126
如果希望直接体验预测过程,可以下载我们提供的预训练模型,跳过训练过程,直接预测即可。
littletomatodonkey's avatar
littletomatodonkey 已提交
127 128


文幕地方's avatar
add re  
文幕地方 已提交
129
### 4.2 SER任务
littletomatodonkey's avatar
littletomatodonkey 已提交
130 131 132 133

* 启动训练

```shell
文幕地方's avatar
add re  
文幕地方 已提交
134
python3.7 train_ser.py \
littletomatodonkey's avatar
littletomatodonkey 已提交
135
    --model_name_or_path "layoutxlm-base-uncased" \
文幕地方's avatar
文幕地方 已提交
136
    --ser_model_type "LayoutXLM" \
littletomatodonkey's avatar
littletomatodonkey 已提交
137 138 139 140 141 142 143 144 145 146 147 148 149
    --train_data_dir "XFUND/zh_train/image" \
    --train_label_path "XFUND/zh_train/xfun_normalize_train.json" \
    --eval_data_dir "XFUND/zh_val/image" \
    --eval_label_path "XFUND/zh_val/xfun_normalize_val.json" \
    --num_train_epochs 200 \
    --eval_steps 10 \
    --output_dir "./output/ser/" \
    --learning_rate 5e-5 \
    --warmup_steps 50 \
    --evaluate_during_training \
    --seed 2048
```

文幕地方's avatar
add re  
文幕地方 已提交
150
最终会打印出`precision`, `recall`, `f1`等指标,模型和训练日志会保存在`./output/ser/`文件夹中。
littletomatodonkey's avatar
littletomatodonkey 已提交
151

Z
zhoujun 已提交
152 153 154 155 156
* 恢复训练

```shell
python3.7 train_ser.py \
    --model_name_or_path "model_path" \
文幕地方's avatar
文幕地方 已提交
157
    --ser_model_type "LayoutXLM" \
Z
zhoujun 已提交
158 159 160 161 162 163 164 165 166 167
    --train_data_dir "XFUND/zh_train/image" \
    --train_label_path "XFUND/zh_train/xfun_normalize_train.json" \
    --eval_data_dir "XFUND/zh_val/image" \
    --eval_label_path "XFUND/zh_val/xfun_normalize_val.json" \
    --num_train_epochs 200 \
    --eval_steps 10 \
    --output_dir "./output/ser/" \
    --learning_rate 5e-5 \
    --warmup_steps 50 \
    --evaluate_during_training \
文幕地方's avatar
文幕地方 已提交
168
    --num_workers 8 \
Z
zhoujun 已提交
169 170 171 172 173 174 175 176 177
    --seed 2048 \
    --resume
```

* 评估
```shell
export CUDA_VISIBLE_DEVICES=0
python3 eval_ser.py \
    --model_name_or_path "PP-Layout_v1.0_ser_pretrained/" \
文幕地方's avatar
文幕地方 已提交
178
    --ser_model_type "LayoutXLM" \
Z
zhoujun 已提交
179 180 181
    --eval_data_dir "XFUND/zh_val/image" \
    --eval_label_path "XFUND/zh_val/xfun_normalize_val.json" \
    --per_gpu_eval_batch_size 8 \
文幕地方's avatar
文幕地方 已提交
182
    --num_workers 8 \
Z
zhoujun 已提交
183 184 185 186 187
    --output_dir "output/ser/"  \
    --seed 2048
```
最终会打印出`precision`, `recall`, `f1`等指标

littletomatodonkey's avatar
littletomatodonkey 已提交
188 189 190 191 192
* 使用评估集合中提供的OCR识别结果进行预测

```shell
export CUDA_VISIBLE_DEVICES=0
python3.7 infer_ser.py \
文幕地方's avatar
文幕地方 已提交
193
    --model_name_or_path "PP-Layout_v1.0_ser_pretrained/" \
文幕地方's avatar
文幕地方 已提交
194
    --ser_model_type "LayoutXLM" \
文幕地方's avatar
文幕地方 已提交
195
    --output_dir "output/ser/" \
littletomatodonkey's avatar
littletomatodonkey 已提交
196 197 198 199 200 201 202 203 204 205 206
    --infer_imgs "XFUND/zh_val/image/" \
    --ocr_json_path "XFUND/zh_val/xfun_normalize_val.json"
```

最终会在`output_res`目录下保存预测结果可视化图像以及预测结果文本文件,文件名为`infer_results.txt`

* 使用`OCR引擎 + SER`串联结果

```shell
export CUDA_VISIBLE_DEVICES=0
python3.7 infer_ser_e2e.py \
文幕地方's avatar
文幕地方 已提交
207
    --model_name_or_path "PP-Layout_v1.0_ser_pretrained/" \
文幕地方's avatar
文幕地方 已提交
208
    --ser_model_type "LayoutXLM" \
littletomatodonkey's avatar
littletomatodonkey 已提交
209
    --max_seq_length 512 \
文幕地方's avatar
文幕地方 已提交
210
    --output_dir "output/ser_e2e/" \
文幕地方's avatar
add re  
文幕地方 已提交
211
    --infer_imgs "images/input/zh_val_0.jpg"
littletomatodonkey's avatar
littletomatodonkey 已提交
212 213 214 215 216 217
```

*`OCR引擎 + SER`预测系统进行端到端评估

```shell
export CUDA_VISIBLE_DEVICES=0
文幕地方's avatar
add re  
文幕地方 已提交
218
python3.7 helper/eval_with_label_end2end.py --gt_json_path XFUND/zh_val/xfun_normalize_val.json  --pred_json_path output_res/infer_results.txt
littletomatodonkey's avatar
littletomatodonkey 已提交
219 220 221
```


文幕地方's avatar
add re  
文幕地方 已提交
222
### 3.3 RE任务
littletomatodonkey's avatar
littletomatodonkey 已提交
223

文幕地方's avatar
add re  
文幕地方 已提交
224
* 启动训练
littletomatodonkey's avatar
littletomatodonkey 已提交
225

文幕地方's avatar
add re  
文幕地方 已提交
226
```shell
Z
zhoujun 已提交
227
export CUDA_VISIBLE_DEVICES=0
文幕地方's avatar
add re  
文幕地方 已提交
228 229 230 231 232 233
python3 train_re.py \
    --model_name_or_path "layoutxlm-base-uncased" \
    --train_data_dir "XFUND/zh_train/image" \
    --train_label_path "XFUND/zh_train/xfun_normalize_train.json" \
    --eval_data_dir "XFUND/zh_val/image" \
    --eval_label_path "XFUND/zh_val/xfun_normalize_val.json" \
文幕地方's avatar
文幕地方 已提交
234
    --label_map_path "labels/labels_ser.txt" \
文幕地方's avatar
文幕地方 已提交
235
    --num_train_epochs 200 \
文幕地方's avatar
add re  
文幕地方 已提交
236 237 238 239 240 241
    --eval_steps 10 \
    --output_dir "output/re/"  \
    --learning_rate 5e-5 \
    --warmup_steps 50 \
    --per_gpu_train_batch_size 8 \
    --per_gpu_eval_batch_size 8 \
文幕地方's avatar
文幕地方 已提交
242
    --num_workers 8 \
文幕地方's avatar
add re  
文幕地方 已提交
243 244 245 246 247
    --evaluate_during_training \
    --seed 2048

```

Z
zhoujun 已提交
248 249 250 251 252 253 254 255 256 257
* 恢复训练

```shell
export CUDA_VISIBLE_DEVICES=0
python3 train_re.py \
    --model_name_or_path "model_path" \
    --train_data_dir "XFUND/zh_train/image" \
    --train_label_path "XFUND/zh_train/xfun_normalize_train.json" \
    --eval_data_dir "XFUND/zh_val/image" \
    --eval_label_path "XFUND/zh_val/xfun_normalize_val.json" \
文幕地方's avatar
文幕地方 已提交
258
    --label_map_path "labels/labels_ser.txt" \
Z
zhoujun 已提交
259 260 261 262 263 264 265
    --num_train_epochs 2 \
    --eval_steps 10 \
    --output_dir "output/re/"  \
    --learning_rate 5e-5 \
    --warmup_steps 50 \
    --per_gpu_train_batch_size 8 \
    --per_gpu_eval_batch_size 8 \
文幕地方's avatar
文幕地方 已提交
266
    --num_workers 8 \
Z
zhoujun 已提交
267 268 269 270 271 272
    --evaluate_during_training \
    --seed 2048 \
    --resume

```

文幕地方's avatar
add re  
文幕地方 已提交
273 274
最终会打印出`precision`, `recall`, `f1`等指标,模型和训练日志会保存在`./output/re/`文件夹中。

Z
zhoujun 已提交
275 276 277 278
* 评估
```shell
export CUDA_VISIBLE_DEVICES=0
python3 eval_re.py \
文幕地方's avatar
文幕地方 已提交
279
    --model_name_or_path "PP-Layout_v1.0_re_pretrained/" \
Z
zhoujun 已提交
280 281 282
    --max_seq_length 512 \
    --eval_data_dir "XFUND/zh_val/image" \
    --eval_label_path "XFUND/zh_val/xfun_normalize_val.json" \
文幕地方's avatar
文幕地方 已提交
283
    --label_map_path "labels/labels_ser.txt" \
文幕地方's avatar
文幕地方 已提交
284
    --output_dir "output/re/"  \
Z
zhoujun 已提交
285
    --per_gpu_eval_batch_size 8 \
文幕地方's avatar
文幕地方 已提交
286
    --num_workers 8 \
Z
zhoujun 已提交
287 288 289 290 291
    --seed 2048
```
最终会打印出`precision`, `recall`, `f1`等指标


文幕地方's avatar
add re  
文幕地方 已提交
292 293 294 295 296
* 使用评估集合中提供的OCR识别结果进行预测

```shell
export CUDA_VISIBLE_DEVICES=0
python3 infer_re.py \
文幕地方's avatar
文幕地方 已提交
297
    --model_name_or_path "PP-Layout_v1.0_re_pretrained/" \
文幕地方's avatar
add re  
文幕地方 已提交
298 299 300
    --max_seq_length 512 \
    --eval_data_dir "XFUND/zh_val/image" \
    --eval_label_path "XFUND/zh_val/xfun_normalize_val.json" \
文幕地方's avatar
文幕地方 已提交
301
    --label_map_path "labels/labels_ser.txt" \
文幕地方's avatar
文幕地方 已提交
302
    --output_dir "output/re/"  \
文幕地方's avatar
add re  
文幕地方 已提交
303 304 305 306 307 308 309 310 311 312
    --per_gpu_eval_batch_size 1 \
    --seed 2048
```

最终会在`output_res`目录下保存预测结果可视化图像以及预测结果文本文件,文件名为`infer_results.txt`

* 使用`OCR引擎 + SER + RE`串联结果

```shell
export CUDA_VISIBLE_DEVICES=0
Z
zhoujun 已提交
313
python3.7 infer_ser_re_e2e.py \
文幕地方's avatar
文幕地方 已提交
314 315
    --model_name_or_path "PP-Layout_v1.0_ser_pretrained/" \
    --re_model_name_or_path "PP-Layout_v1.0_re_pretrained/" \
文幕地方's avatar
文幕地方 已提交
316
    --ser_model_type "LayoutXLM" \
文幕地方's avatar
add re  
文幕地方 已提交
317
    --max_seq_length 512 \
文幕地方's avatar
文幕地方 已提交
318
    --output_dir "output/ser_re_e2e/" \
文幕地方's avatar
add re  
文幕地方 已提交
319 320
    --infer_imgs "images/input/zh_val_21.jpg"
```
littletomatodonkey's avatar
littletomatodonkey 已提交
321 322 323 324 325 326

## 参考链接

- LayoutXLM: Multimodal Pre-training for Multilingual Visually-rich Document Understanding, https://arxiv.org/pdf/2104.08836.pdf
- microsoft/unilm/layoutxlm, https://github.com/microsoft/unilm/tree/master/layoutxlm
- XFUND dataset, https://github.com/doc-analysis/XFUND