[TOC]

# Geometry3K 数据集解压

Windows 下需要 bash 环境, 可安装 git bash, 也可以手动解压.

```
. data/unzip_data.sh
```

![](./imgs/unzip.png)

# 代码要求环境

```
Python 建议 3.6+
>>> conda create -n InterGPS python==3.7.0
```

```
主要环境
>>> pip install torch==1.7.1
>>> pip install transformers==4.8.2
```

```
其他库依赖
可以直接一键安装 >>> pip install -r requirement.txt
1. 图像解析器
	pip install pandas
	pip install imagehash
	pip install pycocotools
	pip install scikit-image
	pip install opencv-python
	pip install scikit-learn
	pip install antlr4-python3-runtime
2. 符号求解器
	pip install kanren
	pip install sympy
	pip install func_timeout
	pip install multiprocess
3. 数据收集工具
	pip install flask
4. URL 工具
	pip install urllib3==1.26.6
```

# 运行

## 直接运行 Inter-GPS

### 采用 Final 搜索策略

使用以下命令运行未预处理数据的 final 符号求解器 Inter-GPS:

```
cd symbolic_solver
python test.py --label final --strategy final
```

采用 predict+low-first (final) 搜索策略, 应用于图像解析器和文本解析器的逻辑形式生成, 结果和日志保存在 "./symbolic_solver/pred_results" 和 "./symbolic_solver/logs" 两文件夹.

我的电脑芯片是 AMD Ryzen 5 5600H with Radeon Graphics, 16GB 内存, 4GB 显存, 所以为了解决 601 个测试集问题, 我将线程数和更长搜索时间限制调整了.

```
cd symbolic_solver
python test.py --label final --strategy final --time_limit 200 --num_threads 4
```

![](./imgs/train.png)

从数据集中运行带有注解逻辑形式的符号求解器:

```
cd symbolic_solver
python test.py --label final-gt --strategy final --use_annotated --time_limit 200 --num_threads 4
```

![](./imgs/done.png)

## 采用其他搜索策略

- predict 搜索策略 (predict+random) 在注解逻辑形式:

  ```
  cd symbolic_solver
  python test.py --label predict --strategy predict --use_annotated --time_limit 200 --num_threads 4
  ```

- random 搜索策略在注解逻辑形式:

  ```
  cd symbolic_solver
  python test.py --label random --strategy random --use_annotated --time_limit 200 --num_threads 4
  ```

- low-first 搜索策略在注解逻辑形式:

  ```
  cd symbolic_solver
  python test.py --label low-first --strategy low-first --use_annotated --time_limit 200 --num_threads 4
  ```

所有结果被保存到 "./symbolic_solver/pred_results" 和 "./symbolic_solver/logs" 文件夹中.

### 计算准确率

类比如下方法获得测试集准确率.

```
cd symbolic_solver
python sub_acc.py --result_file "./pred_results/logic_1719134341-final-gt.json"
```

![](./imgs/accuracy.png)

## 从头运行 Inter-GPS

从头训练: 指只保留剪枝后的模型的结构, 而不使用其剪枝后的权重, 并随机初始化权重, 再进行训练 (通常使用和训练大模型时相同的学习率计划).

### 文本解析器

将问题文本解析为字面量逻辑形式.

```
cd text_parser
python text_parser.py
```

### 图像解析器

将问题关系图转化为字面量逻辑形式. 以下显示最核心代码, 完整的细节参考  ["./diagram_parser/README.md"](https://github.com/lupantech/InterGPS/blob/main/diagram_parser/README.md).

解压文本区域和符号的检测结果:

```
cd diagram_parser
cd detection_results
unzip -d box_results box_results.zip
unzip -d ocr_results ocr_results.zip
```

生成图像逻辑形式:

```
cd diagram_parser
cd parser
python diagram_parser.py --data_path ../../data/geometry3k --ocr_path ../detection_results/ocr_results --box_path ../detection_results/box_results --output_path ../diagram_logic_forms.json
```

### 定理预测器

a) 生成基于模板和随机排序的定理序列:

```
cd theorem_predict/tools
python generate_random_seqs.py
```

会生成两个文件:

- `./theorem_predict/results/train/pred_seqs_train_l30_n100_template.json` 100 个基于模板的序列, 每个训练数据的最大长度为 30.
- `./theorem_predict/results/test/pred_seqs_test_l100_random.json` 每个测试数据一个最大长度为 100 的随机顺序序列.

b) (可选) 为每个训练数据生成拟合最优定理序列:

```
cd theorem_predict
cd tools
python check_theorem_seq.py
```

所有训练数据进行 100 次尝试试验大约需要 20 小时. 如果节约时间, 只需要跳过这步, 使用 `./theorem_predict/results/train/splits` 中生成的数据代替.

c) (可选) 合并 100 次拟合最优定理序列到一个文件中.

```
cd theorem_predict
cd tools
python merge_all_correct_json.py
```

d) (可选) 从头开始训练定理预测器.

```
cd theorem_predict
【OpenSSL 报错则使用 >>> pip install urllib3==1.26.6】
python train_transformer.py
```

若还想节约时间, 跳过以上步骤, 直接下载模型权重.

```
cd theorem_predict
mkdir models
cd models
wget https://acl2021-intergps.s3.us-west-1.amazonaws.com/tp_model_best.pt
【建议这么使用】
>>> curl https://acl2021-intergps.s3.us-west-1.amazonaws.com/tp_model_best.pt -o tp_model_best.pt
```

e) 评估定理预测器以生成预测定理序列.

```
cd theorem_predict
python eval_transformer.py
```

f) 给 predict 策略 (predict+random) 生成定理序列.

```
cd theorem_predict
cd tools
python add_random_seq_to_pred_seq.py
```

### 符号求解器

最后, 使用 Final 搜索策略 (predict+low-first) 在生成的逻辑形式上运行符号求解器.

```
cd symbolic_solver
python test.py --label final_new --strategy final --text_logic_form_path ../text_parser/text_logic_forms.json --diagram_logic_form_path ../diagram_parser/diagram_logic_forms.json --predict_path ../theorem_predict/results/test/pred_seqs_test_bart_best.json
```
