前言
因为是先调的paddleocr里ppstructure/vqa 部分的layoutxlm,由于paddleocr 还没有支持layoutlmv3,但是v3 相对来说把 visual_backbone 部分的cnn 换成transformer 速度快很多,所以尝试了unilm 的v3版本。
一 、训练
1. dataload 部分修改
因为是从paddleocr vqa 转过去的,训练数据和训练的label_list 已经有了,这里修改了部分数据读取代码xfund.py,读已有的paddle格式的训练数据。
2. 训练部分修改存储best model
根据自己的类别,修改config中的参数,和num_classes
增加以下训练参数,可以在训练过程中保存best_model和last_model
--save_steps 100
--evaluation_strategy steps
--eval_steps 100
--metric_for_best_model eval_f1
--save_strategy steps
--load_best_model_at_end True
--save_total_limit 2
二、推理
推理部分不好改的地方是用的huggingface的transformer库,输入的组织和输出的可视化。输入的组织和可视化参考paddleOCR vqa中的infer_ser,这里只写了注意不同的地方。
1. transformer 库加载模型 和tokenizer,传入模型路径文件夹。
2. infer 函数参考paddleOCR vqa中的infer_ser,送入模型的时候,略有不同。
3. preprocess 和postprocess 修改如下
preprocess 中tokenizer 换成 transformer 里的调用形式
后面input_ids position_ids segment_ids 按照xfund.py 和DataCollatorForKeyValueExtraction的处理方式处理,与paddle 的最大区别是有cls和sep token,还有这里生成position_ids和segment_ids的方式。
postprocess 里注意token序列的index 从1-510
最后可视化参考paddleocr 里的draw_ser_results