Spaces:
Sleeping
Sleeping
Upload 19 files
Browse files- app.py +53 -0
- models.py +164 -0
- models/best.pt +3 -0
- models/checkpoint/config.json +118 -0
- models/checkpoint/merges.txt +0 -0
- models/checkpoint/preprocessor_config.json +27 -0
- models/checkpoint/pytorch_model.bin +3 -0
- models/checkpoint/rng_state.pth +3 -0
- models/checkpoint/scheduler.pt +3 -0
- models/checkpoint/special_tokens_map.json +51 -0
- models/checkpoint/tokenizer.json +0 -0
- models/checkpoint/tokenizer_config.json +86 -0
- models/checkpoint/trainer_state.json +676 -0
- models/checkpoint/training_args.bin +3 -0
- models/checkpoint/vocab.json +0 -0
- models/vietocr/vgg_seq2seq.pth +3 -0
- models/vietocr/vgg_transformer.pth +3 -0
- requirements.txt +10 -0
- utils.py +140 -0
app.py
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import pandas as pd
|
3 |
+
from models import Reciept_Analyzer
|
4 |
+
from utils import find_product
|
5 |
+
import os
|
6 |
+
model = Reciept_Analyzer()
|
7 |
+
|
8 |
+
sample_images = []
|
9 |
+
for img_file in os.listdir("samples/"):
|
10 |
+
sample_images.append(os.path.join("samples", img_file))
|
11 |
+
|
12 |
+
def predict(image):
|
13 |
+
results = model.forward(image)
|
14 |
+
return results
|
15 |
+
|
16 |
+
def handle_input(image, item_name):
|
17 |
+
df = predict(image) # Phân tích hóa đơn và trả về dataframe
|
18 |
+
print(df)
|
19 |
+
result = find_product(item_name, df)
|
20 |
+
return result
|
21 |
+
|
22 |
+
# Thiết kế giao diện với Gradio
|
23 |
+
def create_interface():
|
24 |
+
with gr.Blocks() as app:
|
25 |
+
gr.Markdown("# Ứng dụng phân tích hóa đơn siêu thị")
|
26 |
+
|
27 |
+
with gr.Row():
|
28 |
+
# Cột bên trái
|
29 |
+
with gr.Column():
|
30 |
+
gr.Markdown("### Tải lên hóa đơn hoặc chọn ảnh mẫu")
|
31 |
+
image_input = gr.Image(label="Ảnh hóa đơn", type="filepath")
|
32 |
+
|
33 |
+
gr.Markdown("### Ảnh mẫu")
|
34 |
+
example = gr.Examples(
|
35 |
+
inputs=image_input,
|
36 |
+
examples=sample_images
|
37 |
+
)
|
38 |
+
|
39 |
+
# Cột bên phải
|
40 |
+
with gr.Column():
|
41 |
+
gr.Markdown("### Tìm kiếm thông tin item")
|
42 |
+
item_input = gr.Textbox(label="Tên item cần tìm")
|
43 |
+
output = gr.Textbox(label="Kết quả")
|
44 |
+
|
45 |
+
search_button = gr.Button("Tìm kiếm")
|
46 |
+
search_button.click(fn=handle_input, inputs=[image_input, item_input], outputs=output)
|
47 |
+
|
48 |
+
return app
|
49 |
+
|
50 |
+
|
51 |
+
# Chạy ứng dụng
|
52 |
+
app = create_interface()
|
53 |
+
app.launch()
|
models.py
ADDED
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import torch
|
3 |
+
import numpy as np
|
4 |
+
from ultralytics import YOLO
|
5 |
+
from transformers import AutoProcessor
|
6 |
+
from transformers import AutoModelForTokenClassification
|
7 |
+
from utils import normalize_box, unnormalize_box, draw_output, create_df
|
8 |
+
from PIL import Image, ImageDraw
|
9 |
+
from vietocr.tool.predictor import Predictor
|
10 |
+
from vietocr.tool.config import Cfg
|
11 |
+
|
12 |
+
class Reciept_Analyzer:
|
13 |
+
def __init__(self,
|
14 |
+
processor_pretrained='microsoft/layoutlmv3-base',
|
15 |
+
layoutlm_pretrained=os.path.join(
|
16 |
+
'models', 'checkpoint'),
|
17 |
+
yolo_pretrained=os.path.join(
|
18 |
+
'models', 'best.pt'),
|
19 |
+
vietocr_pretrained=os.path.join(
|
20 |
+
'models', 'vietocr', 'vgg_seq2seq.pth')
|
21 |
+
):
|
22 |
+
|
23 |
+
print("Initializing processor")
|
24 |
+
self.processor = AutoProcessor.from_pretrained(
|
25 |
+
processor_pretrained, apply_ocr=False)
|
26 |
+
print("Finished initializing processor")
|
27 |
+
|
28 |
+
print("Initializing LayoutLM model")
|
29 |
+
self.lalm_model = AutoModelForTokenClassification.from_pretrained(
|
30 |
+
layoutlm_pretrained)
|
31 |
+
print("Finished initializing LayoutLM model")
|
32 |
+
|
33 |
+
if yolo_pretrained is not None:
|
34 |
+
print("Initializing YOLO model")
|
35 |
+
self.yolo_model = YOLO(yolo_pretrained)
|
36 |
+
print("Finished initializing YOLO model")
|
37 |
+
|
38 |
+
print("Initializing VietOCR model")
|
39 |
+
config = Cfg.load_config_from_name('vgg_seq2seq')
|
40 |
+
config['weights'] = vietocr_pretrained
|
41 |
+
config['cnn']['pretrained']= False
|
42 |
+
config['device'] = 'cuda:0' if torch.cuda.is_available() else 'cpu'
|
43 |
+
self.vietocr = Predictor(config)
|
44 |
+
print("Finished initializing VietOCR model")
|
45 |
+
|
46 |
+
def forward(self, img, output_path="output", is_save_cropped_img=False):
|
47 |
+
input_image = Image.open(img)
|
48 |
+
|
49 |
+
# detection with YOLOv8
|
50 |
+
bboxes = self.yolov8_det(input_image)
|
51 |
+
|
52 |
+
# sort
|
53 |
+
sorted_bboxes = self.sort_bboxes(bboxes)
|
54 |
+
|
55 |
+
# draw bbox
|
56 |
+
image_draw = input_image.copy()
|
57 |
+
self.draw_bbox(image_draw, sorted_bboxes, output_path)
|
58 |
+
|
59 |
+
# crop images
|
60 |
+
cropped_images, normalized_boxes = self.get_cropped_images(input_image, sorted_bboxes, is_save_cropped_img, output_path)
|
61 |
+
|
62 |
+
# recognition with VietOCR
|
63 |
+
texts, mapping_bbox_texts = self.ocr(cropped_images, normalized_boxes)
|
64 |
+
|
65 |
+
# KIE with LayoutLMv3
|
66 |
+
pred_texts, pred_label, boxes = self.kie(input_image, texts, normalized_boxes, mapping_bbox_texts, output_path)
|
67 |
+
|
68 |
+
# create dataframe
|
69 |
+
return create_df(pred_texts, pred_label)
|
70 |
+
|
71 |
+
|
72 |
+
def yolov8_det(self, img):
|
73 |
+
return self.yolo_model.predict(source=img, conf=0.3, iou=0.1)[0].boxes.xyxy.int()
|
74 |
+
|
75 |
+
def sort_bboxes(self, bboxes):
|
76 |
+
bbox_list = []
|
77 |
+
for box in bboxes:
|
78 |
+
tlx, tly, brx, bry = map(int, box)
|
79 |
+
bbox_list.append([tlx, tly, brx, bry])
|
80 |
+
bbox_list.sort(key=lambda x: (x[1], x[2]))
|
81 |
+
return bbox_list
|
82 |
+
|
83 |
+
def draw_bbox(self, image_draw, bboxes, output_path):
|
84 |
+
# draw bbox
|
85 |
+
draw = ImageDraw.Draw(image_draw)
|
86 |
+
for box in bboxes:
|
87 |
+
draw.rectangle(box, outline='red', width=2)
|
88 |
+
image_draw.save(os.path.join(output_path, 'bbox.jpg'))
|
89 |
+
print(f"Exported image with bounding boxes to {os.path.join(output_path, 'bbox.jpg')}")
|
90 |
+
|
91 |
+
def get_cropped_images(self, input_image, bboxes, is_save_cropped=False, output_path="output"):
|
92 |
+
normalized_boxes = []
|
93 |
+
cropped_images = []
|
94 |
+
|
95 |
+
# OCR
|
96 |
+
if is_save_cropped:
|
97 |
+
cropped_folder = os.path.join(output_path, "cropped")
|
98 |
+
if not os.path.exists(cropped_folder):
|
99 |
+
os.makedirs(cropped_folder)
|
100 |
+
i = 0
|
101 |
+
for box in bboxes:
|
102 |
+
tlx, tly, brx, bry = map(int, box)
|
103 |
+
normalized_box = normalize_box(box, input_image.width, input_image.height)
|
104 |
+
normalized_boxes.append(normalized_box)
|
105 |
+
cropped_ = input_image.crop((tlx, tly, brx, bry))
|
106 |
+
if is_save_cropped:
|
107 |
+
cropped_.save(os.path.join(cropped_folder, f'cropped_{i}.jpg'))
|
108 |
+
i += 1
|
109 |
+
cropped_images.append(cropped_)
|
110 |
+
|
111 |
+
return cropped_images, normalized_boxes
|
112 |
+
|
113 |
+
def ocr(self, cropped_images, normalized_boxes):
|
114 |
+
mapping_bbox_texts = {}
|
115 |
+
texts = []
|
116 |
+
for img, normalized_box in zip(cropped_images, normalized_boxes):
|
117 |
+
result = self.vietocr.predict(img)
|
118 |
+
text = result.strip().replace('\n', ' ')
|
119 |
+
texts.append(text)
|
120 |
+
mapping_bbox_texts[','.join(map(str, normalized_box))] = text
|
121 |
+
|
122 |
+
return texts, mapping_bbox_texts
|
123 |
+
|
124 |
+
def kie(self, img, texts, boxes, mapping_bbox_texts, output_path):
|
125 |
+
encoding = self.processor(img, texts,
|
126 |
+
boxes=boxes,
|
127 |
+
return_offsets_mapping=True,
|
128 |
+
return_tensors='pt',
|
129 |
+
max_length=512,
|
130 |
+
padding='max_length')
|
131 |
+
offset_mapping = encoding.pop('offset_mapping')
|
132 |
+
|
133 |
+
with torch.no_grad():
|
134 |
+
outputs = self.lalm_model(**encoding)
|
135 |
+
|
136 |
+
id2label = self.lalm_model.config.id2label
|
137 |
+
logits = outputs.logits
|
138 |
+
token_boxes = encoding.bbox.squeeze().tolist()
|
139 |
+
offset_mapping = offset_mapping.squeeze().tolist()
|
140 |
+
|
141 |
+
predictions = logits.argmax(-1).squeeze().tolist()
|
142 |
+
is_subword = np.array(offset_mapping)[:, 0] != 0
|
143 |
+
|
144 |
+
true_predictions = []
|
145 |
+
true_boxes = []
|
146 |
+
true_texts = []
|
147 |
+
for idx in range(len(predictions)):
|
148 |
+
if not is_subword[idx] and token_boxes[idx] != [0, 0, 0, 0]:
|
149 |
+
true_predictions.append(id2label[predictions[idx]])
|
150 |
+
true_boxes.append(unnormalize_box(
|
151 |
+
token_boxes[idx], img.width, img.height))
|
152 |
+
true_texts.append(mapping_bbox_texts.get(
|
153 |
+
','.join(map(str, token_boxes[idx])), ''))
|
154 |
+
|
155 |
+
if isinstance(output_path, str):
|
156 |
+
os.makedirs(output_path, exist_ok=True)
|
157 |
+
img_output = draw_output(
|
158 |
+
image=img,
|
159 |
+
true_predictions=true_predictions,
|
160 |
+
true_boxes=true_boxes
|
161 |
+
)
|
162 |
+
img_output.save(os.path.join(output_path, 'result.jpg'))
|
163 |
+
print(f"Exported result to {os.path.join(output_path, 'result.jpg')}")
|
164 |
+
return true_texts, true_predictions, true_boxes
|
models/best.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9a76aef7a2e063cfba3fc466a864ed10d80c460d3e87c5667cfeb5b4d67c4df0
|
3 |
+
size 207624591
|
models/checkpoint/config.json
ADDED
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_name_or_path": "microsoft/layoutlmv3-base",
|
3 |
+
"architectures": [
|
4 |
+
"LayoutLMv3ForTokenClassification"
|
5 |
+
],
|
6 |
+
"attention_probs_dropout_prob": 0.1,
|
7 |
+
"bos_token_id": 0,
|
8 |
+
"classifier_dropout": null,
|
9 |
+
"coordinate_size": 128,
|
10 |
+
"eos_token_id": 2,
|
11 |
+
"has_relative_attention_bias": true,
|
12 |
+
"has_spatial_attention_bias": true,
|
13 |
+
"hidden_act": "gelu",
|
14 |
+
"hidden_dropout_prob": 0.1,
|
15 |
+
"hidden_size": 768,
|
16 |
+
"id2label": {
|
17 |
+
"0": "ADDR",
|
18 |
+
"1": "TITLE",
|
19 |
+
"2": "PRODUCT_NAME_PREFIX",
|
20 |
+
"3": "PRODUCT_NAME",
|
21 |
+
"4": "AMOUNT_PREFIX",
|
22 |
+
"5": "AMOUNT",
|
23 |
+
"6": "UNIT_PREFIX",
|
24 |
+
"7": "UNIT",
|
25 |
+
"8": "UPRICE_PREFIX",
|
26 |
+
"9": "UPRICE",
|
27 |
+
"10": "SUB_TPRICE_PREFIX",
|
28 |
+
"11": "SUB_TPRICE",
|
29 |
+
"12": "TAMOUNT_PREFIX",
|
30 |
+
"13": "TAMOUNT",
|
31 |
+
"14": "TPRICE_PREFIX",
|
32 |
+
"15": "TPRICE",
|
33 |
+
"16": "RECEMONEY_PREFIX",
|
34 |
+
"17": "RECEMONEY",
|
35 |
+
"18": "OTHER",
|
36 |
+
"19": "BILLID_PREFIX",
|
37 |
+
"20": "BILLID",
|
38 |
+
"21": "DATETIME_PREFIX",
|
39 |
+
"22": "DATETIME",
|
40 |
+
"23": "CASHIER_PREFIX",
|
41 |
+
"24": "CASHIER",
|
42 |
+
"25": "SHOP_NAME",
|
43 |
+
"26": "PHONE_PREFIX",
|
44 |
+
"27": "FPRICE_PREFIX",
|
45 |
+
"28": "FPRICE",
|
46 |
+
"29": "REMAMONEY_PREFIX",
|
47 |
+
"30": "REMAMONEY",
|
48 |
+
"31": "PHONE",
|
49 |
+
"32": "TDISCOUNT_PREFIX",
|
50 |
+
"33": "TDISCOUNT",
|
51 |
+
"34": "ADDR_PREFIX",
|
52 |
+
"35": "UDISCOUNT_PREFIX",
|
53 |
+
"36": "UDISCOUNT"
|
54 |
+
},
|
55 |
+
"initializer_range": 0.02,
|
56 |
+
"input_size": 224,
|
57 |
+
"intermediate_size": 3072,
|
58 |
+
"label2id": {
|
59 |
+
"ADDR": 0,
|
60 |
+
"ADDR_PREFIX": 34,
|
61 |
+
"AMOUNT": 5,
|
62 |
+
"AMOUNT_PREFIX": 4,
|
63 |
+
"BILLID": 20,
|
64 |
+
"BILLID_PREFIX": 19,
|
65 |
+
"CASHIER": 24,
|
66 |
+
"CASHIER_PREFIX": 23,
|
67 |
+
"DATETIME": 22,
|
68 |
+
"DATETIME_PREFIX": 21,
|
69 |
+
"FPRICE": 28,
|
70 |
+
"FPRICE_PREFIX": 27,
|
71 |
+
"OTHER": 18,
|
72 |
+
"PHONE": 31,
|
73 |
+
"PHONE_PREFIX": 26,
|
74 |
+
"PRODUCT_NAME": 3,
|
75 |
+
"PRODUCT_NAME_PREFIX": 2,
|
76 |
+
"RECEMONEY": 17,
|
77 |
+
"RECEMONEY_PREFIX": 16,
|
78 |
+
"REMAMONEY": 30,
|
79 |
+
"REMAMONEY_PREFIX": 29,
|
80 |
+
"SHOP_NAME": 25,
|
81 |
+
"SUB_TPRICE": 11,
|
82 |
+
"SUB_TPRICE_PREFIX": 10,
|
83 |
+
"TAMOUNT": 13,
|
84 |
+
"TAMOUNT_PREFIX": 12,
|
85 |
+
"TDISCOUNT": 33,
|
86 |
+
"TDISCOUNT_PREFIX": 32,
|
87 |
+
"TITLE": 1,
|
88 |
+
"TPRICE": 15,
|
89 |
+
"TPRICE_PREFIX": 14,
|
90 |
+
"UDISCOUNT": 36,
|
91 |
+
"UDISCOUNT_PREFIX": 35,
|
92 |
+
"UNIT": 7,
|
93 |
+
"UNIT_PREFIX": 6,
|
94 |
+
"UPRICE": 9,
|
95 |
+
"UPRICE_PREFIX": 8
|
96 |
+
},
|
97 |
+
"layer_norm_eps": 1e-05,
|
98 |
+
"max_2d_position_embeddings": 1024,
|
99 |
+
"max_position_embeddings": 514,
|
100 |
+
"max_rel_2d_pos": 256,
|
101 |
+
"max_rel_pos": 128,
|
102 |
+
"model_type": "layoutlmv3",
|
103 |
+
"num_attention_heads": 12,
|
104 |
+
"num_channels": 3,
|
105 |
+
"num_hidden_layers": 12,
|
106 |
+
"pad_token_id": 1,
|
107 |
+
"patch_size": 16,
|
108 |
+
"rel_2d_pos_bins": 64,
|
109 |
+
"rel_pos_bins": 32,
|
110 |
+
"second_input_size": 112,
|
111 |
+
"shape_size": 128,
|
112 |
+
"text_embed": true,
|
113 |
+
"torch_dtype": "float32",
|
114 |
+
"transformers_version": "4.27.2",
|
115 |
+
"type_vocab_size": 1,
|
116 |
+
"visual_embed": true,
|
117 |
+
"vocab_size": 50265
|
118 |
+
}
|
models/checkpoint/merges.txt
ADDED
The diff for this file is too large to render.
See raw diff
|
|
models/checkpoint/preprocessor_config.json
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"apply_ocr": false,
|
3 |
+
"do_normalize": true,
|
4 |
+
"do_rescale": true,
|
5 |
+
"do_resize": true,
|
6 |
+
"feature_extractor_type": "LayoutLMv3FeatureExtractor",
|
7 |
+
"image_mean": [
|
8 |
+
0.5,
|
9 |
+
0.5,
|
10 |
+
0.5
|
11 |
+
],
|
12 |
+
"image_processor_type": "LayoutLMv3ImageProcessor",
|
13 |
+
"image_std": [
|
14 |
+
0.5,
|
15 |
+
0.5,
|
16 |
+
0.5
|
17 |
+
],
|
18 |
+
"ocr_lang": null,
|
19 |
+
"processor_class": "LayoutLMv3Processor",
|
20 |
+
"resample": 2,
|
21 |
+
"rescale_factor": 0.00392156862745098,
|
22 |
+
"size": {
|
23 |
+
"height": 224,
|
24 |
+
"width": 224
|
25 |
+
},
|
26 |
+
"tesseract_config": ""
|
27 |
+
}
|
models/checkpoint/pytorch_model.bin
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:32d465ffd4cbb9b024db495cf54841f73cb717de6dba135fc8258fe9c253296f
|
3 |
+
size 503863089
|
models/checkpoint/rng_state.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:fd747db282a4c24e2cf6e4bc50b907e598e871654c02eb66d5fe56403e68a3d8
|
3 |
+
size 14575
|
models/checkpoint/scheduler.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:7d13d935c351b9a072808b2f35968a51ccc83f30be9b4047e7a9be1cf7fb0a97
|
3 |
+
size 627
|
models/checkpoint/special_tokens_map.json
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"bos_token": {
|
3 |
+
"content": "<s>",
|
4 |
+
"lstrip": false,
|
5 |
+
"normalized": true,
|
6 |
+
"rstrip": false,
|
7 |
+
"single_word": false
|
8 |
+
},
|
9 |
+
"cls_token": {
|
10 |
+
"content": "<s>",
|
11 |
+
"lstrip": false,
|
12 |
+
"normalized": true,
|
13 |
+
"rstrip": false,
|
14 |
+
"single_word": false
|
15 |
+
},
|
16 |
+
"eos_token": {
|
17 |
+
"content": "</s>",
|
18 |
+
"lstrip": false,
|
19 |
+
"normalized": true,
|
20 |
+
"rstrip": false,
|
21 |
+
"single_word": false
|
22 |
+
},
|
23 |
+
"mask_token": {
|
24 |
+
"content": "<mask>",
|
25 |
+
"lstrip": true,
|
26 |
+
"normalized": true,
|
27 |
+
"rstrip": false,
|
28 |
+
"single_word": false
|
29 |
+
},
|
30 |
+
"pad_token": {
|
31 |
+
"content": "<pad>",
|
32 |
+
"lstrip": false,
|
33 |
+
"normalized": true,
|
34 |
+
"rstrip": false,
|
35 |
+
"single_word": false
|
36 |
+
},
|
37 |
+
"sep_token": {
|
38 |
+
"content": "</s>",
|
39 |
+
"lstrip": false,
|
40 |
+
"normalized": true,
|
41 |
+
"rstrip": false,
|
42 |
+
"single_word": false
|
43 |
+
},
|
44 |
+
"unk_token": {
|
45 |
+
"content": "<unk>",
|
46 |
+
"lstrip": false,
|
47 |
+
"normalized": true,
|
48 |
+
"rstrip": false,
|
49 |
+
"single_word": false
|
50 |
+
}
|
51 |
+
}
|
models/checkpoint/tokenizer.json
ADDED
The diff for this file is too large to render.
See raw diff
|
|
models/checkpoint/tokenizer_config.json
ADDED
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"add_prefix_space": true,
|
3 |
+
"apply_ocr": false,
|
4 |
+
"bos_token": {
|
5 |
+
"__type": "AddedToken",
|
6 |
+
"content": "<s>",
|
7 |
+
"lstrip": false,
|
8 |
+
"normalized": true,
|
9 |
+
"rstrip": false,
|
10 |
+
"single_word": false
|
11 |
+
},
|
12 |
+
"cls_token": {
|
13 |
+
"__type": "AddedToken",
|
14 |
+
"content": "<s>",
|
15 |
+
"lstrip": false,
|
16 |
+
"normalized": true,
|
17 |
+
"rstrip": false,
|
18 |
+
"single_word": false
|
19 |
+
},
|
20 |
+
"cls_token_box": [
|
21 |
+
0,
|
22 |
+
0,
|
23 |
+
0,
|
24 |
+
0
|
25 |
+
],
|
26 |
+
"eos_token": {
|
27 |
+
"__type": "AddedToken",
|
28 |
+
"content": "</s>",
|
29 |
+
"lstrip": false,
|
30 |
+
"normalized": true,
|
31 |
+
"rstrip": false,
|
32 |
+
"single_word": false
|
33 |
+
},
|
34 |
+
"errors": "replace",
|
35 |
+
"mask_token": {
|
36 |
+
"__type": "AddedToken",
|
37 |
+
"content": "<mask>",
|
38 |
+
"lstrip": true,
|
39 |
+
"normalized": true,
|
40 |
+
"rstrip": false,
|
41 |
+
"single_word": false
|
42 |
+
},
|
43 |
+
"model_max_length": 512,
|
44 |
+
"only_label_first_subword": true,
|
45 |
+
"pad_token": {
|
46 |
+
"__type": "AddedToken",
|
47 |
+
"content": "<pad>",
|
48 |
+
"lstrip": false,
|
49 |
+
"normalized": true,
|
50 |
+
"rstrip": false,
|
51 |
+
"single_word": false
|
52 |
+
},
|
53 |
+
"pad_token_box": [
|
54 |
+
0,
|
55 |
+
0,
|
56 |
+
0,
|
57 |
+
0
|
58 |
+
],
|
59 |
+
"pad_token_label": -100,
|
60 |
+
"processor_class": "LayoutLMv3Processor",
|
61 |
+
"sep_token": {
|
62 |
+
"__type": "AddedToken",
|
63 |
+
"content": "</s>",
|
64 |
+
"lstrip": false,
|
65 |
+
"normalized": true,
|
66 |
+
"rstrip": false,
|
67 |
+
"single_word": false
|
68 |
+
},
|
69 |
+
"sep_token_box": [
|
70 |
+
0,
|
71 |
+
0,
|
72 |
+
0,
|
73 |
+
0
|
74 |
+
],
|
75 |
+
"special_tokens_map_file": null,
|
76 |
+
"tokenizer_class": "LayoutLMv3Tokenizer",
|
77 |
+
"trim_offsets": true,
|
78 |
+
"unk_token": {
|
79 |
+
"__type": "AddedToken",
|
80 |
+
"content": "<unk>",
|
81 |
+
"lstrip": false,
|
82 |
+
"normalized": true,
|
83 |
+
"rstrip": false,
|
84 |
+
"single_word": false
|
85 |
+
}
|
86 |
+
}
|
models/checkpoint/trainer_state.json
ADDED
@@ -0,0 +1,676 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"best_metric": 0.9322203066872333,
|
3 |
+
"best_model_checkpoint": "/content/drive/MyDrive/checkpoint_layoutlm2/checkpoint-3500",
|
4 |
+
"epoch": 26.31578947368421,
|
5 |
+
"global_step": 5000,
|
6 |
+
"is_hyper_param_search": false,
|
7 |
+
"is_local_process_zero": true,
|
8 |
+
"is_world_process_zero": true,
|
9 |
+
"log_history": [
|
10 |
+
{
|
11 |
+
"epoch": 0.53,
|
12 |
+
"eval_accuracy": 0.5655867006431259,
|
13 |
+
"eval_f1": 0.49600000000000005,
|
14 |
+
"eval_loss": 1.9622313976287842,
|
15 |
+
"eval_precision": 0.6104310803618946,
|
16 |
+
"eval_recall": 0.41769847050254916,
|
17 |
+
"eval_runtime": 31.7963,
|
18 |
+
"eval_samples_per_second": 5.976,
|
19 |
+
"eval_steps_per_second": 1.51,
|
20 |
+
"step": 100
|
21 |
+
},
|
22 |
+
{
|
23 |
+
"epoch": 1.05,
|
24 |
+
"eval_accuracy": 0.7380172309185778,
|
25 |
+
"eval_f1": 0.6739791685869665,
|
26 |
+
"eval_loss": 1.2630114555358887,
|
27 |
+
"eval_precision": 0.682471532574202,
|
28 |
+
"eval_recall": 0.6656955571740714,
|
29 |
+
"eval_runtime": 32.3716,
|
30 |
+
"eval_samples_per_second": 5.869,
|
31 |
+
"eval_steps_per_second": 1.483,
|
32 |
+
"step": 200
|
33 |
+
},
|
34 |
+
{
|
35 |
+
"epoch": 1.58,
|
36 |
+
"eval_accuracy": 0.7893459531610242,
|
37 |
+
"eval_f1": 0.7480542986425339,
|
38 |
+
"eval_loss": 0.9176977872848511,
|
39 |
+
"eval_precision": 0.7436128103634401,
|
40 |
+
"eval_recall": 0.7525491624180627,
|
41 |
+
"eval_runtime": 32.1494,
|
42 |
+
"eval_samples_per_second": 5.91,
|
43 |
+
"eval_steps_per_second": 1.493,
|
44 |
+
"step": 300
|
45 |
+
},
|
46 |
+
{
|
47 |
+
"epoch": 2.11,
|
48 |
+
"eval_accuracy": 0.8295109816769809,
|
49 |
+
"eval_f1": 0.8007957319830002,
|
50 |
+
"eval_loss": 0.7080672979354858,
|
51 |
+
"eval_precision": 0.7954014729656906,
|
52 |
+
"eval_recall": 0.8062636562272396,
|
53 |
+
"eval_runtime": 32.0545,
|
54 |
+
"eval_samples_per_second": 5.927,
|
55 |
+
"eval_steps_per_second": 1.497,
|
56 |
+
"step": 400
|
57 |
+
},
|
58 |
+
{
|
59 |
+
"epoch": 2.63,
|
60 |
+
"learning_rate": 9.666666666666667e-06,
|
61 |
+
"loss": 1.4294,
|
62 |
+
"step": 500
|
63 |
+
},
|
64 |
+
{
|
65 |
+
"epoch": 2.63,
|
66 |
+
"eval_accuracy": 0.8411600533915787,
|
67 |
+
"eval_f1": 0.8213092550790069,
|
68 |
+
"eval_loss": 0.6136476397514343,
|
69 |
+
"eval_precision": 0.814615797958087,
|
70 |
+
"eval_recall": 0.8281136198106337,
|
71 |
+
"eval_runtime": 32.0473,
|
72 |
+
"eval_samples_per_second": 5.929,
|
73 |
+
"eval_steps_per_second": 1.498,
|
74 |
+
"step": 500
|
75 |
+
},
|
76 |
+
{
|
77 |
+
"epoch": 3.16,
|
78 |
+
"eval_accuracy": 0.8741657565829389,
|
79 |
+
"eval_f1": 0.8656448866182666,
|
80 |
+
"eval_loss": 0.5390823483467102,
|
81 |
+
"eval_precision": 0.8524271844660194,
|
82 |
+
"eval_recall": 0.879278951201748,
|
83 |
+
"eval_runtime": 33.0229,
|
84 |
+
"eval_samples_per_second": 5.754,
|
85 |
+
"eval_steps_per_second": 1.454,
|
86 |
+
"step": 600
|
87 |
+
},
|
88 |
+
{
|
89 |
+
"epoch": 3.68,
|
90 |
+
"eval_accuracy": 0.8869069287707803,
|
91 |
+
"eval_f1": 0.878114599262391,
|
92 |
+
"eval_loss": 0.47398096323013306,
|
93 |
+
"eval_precision": 0.8677333333333334,
|
94 |
+
"eval_recall": 0.8887472687545521,
|
95 |
+
"eval_runtime": 32.5116,
|
96 |
+
"eval_samples_per_second": 5.844,
|
97 |
+
"eval_steps_per_second": 1.476,
|
98 |
+
"step": 700
|
99 |
+
},
|
100 |
+
{
|
101 |
+
"epoch": 4.21,
|
102 |
+
"eval_accuracy": 0.8989200339764591,
|
103 |
+
"eval_f1": 0.893278463648834,
|
104 |
+
"eval_loss": 0.4286675751209259,
|
105 |
+
"eval_precision": 0.8972992834833732,
|
106 |
+
"eval_recall": 0.8892935178441369,
|
107 |
+
"eval_runtime": 32.15,
|
108 |
+
"eval_samples_per_second": 5.91,
|
109 |
+
"eval_steps_per_second": 1.493,
|
110 |
+
"step": 800
|
111 |
+
},
|
112 |
+
{
|
113 |
+
"epoch": 4.74,
|
114 |
+
"eval_accuracy": 0.9040165028515956,
|
115 |
+
"eval_f1": 0.8944705457173835,
|
116 |
+
"eval_loss": 0.40272650122642517,
|
117 |
+
"eval_precision": 0.8877331420373027,
|
118 |
+
"eval_recall": 0.9013109978150037,
|
119 |
+
"eval_runtime": 32.2339,
|
120 |
+
"eval_samples_per_second": 5.894,
|
121 |
+
"eval_steps_per_second": 1.489,
|
122 |
+
"step": 900
|
123 |
+
},
|
124 |
+
{
|
125 |
+
"epoch": 5.26,
|
126 |
+
"learning_rate": 9.333333333333334e-06,
|
127 |
+
"loss": 0.455,
|
128 |
+
"step": 1000
|
129 |
+
},
|
130 |
+
{
|
131 |
+
"epoch": 5.26,
|
132 |
+
"eval_accuracy": 0.9131173401286252,
|
133 |
+
"eval_f1": 0.9035698147311342,
|
134 |
+
"eval_loss": 0.369215190410614,
|
135 |
+
"eval_precision": 0.8970034092948143,
|
136 |
+
"eval_recall": 0.9102330662782229,
|
137 |
+
"eval_runtime": 32.0091,
|
138 |
+
"eval_samples_per_second": 5.936,
|
139 |
+
"eval_steps_per_second": 1.5,
|
140 |
+
"step": 1000
|
141 |
+
},
|
142 |
+
{
|
143 |
+
"epoch": 5.79,
|
144 |
+
"eval_accuracy": 0.9172430530275452,
|
145 |
+
"eval_f1": 0.912167606768735,
|
146 |
+
"eval_loss": 0.36320310831069946,
|
147 |
+
"eval_precision": 0.8973049145675532,
|
148 |
+
"eval_recall": 0.9275309541150765,
|
149 |
+
"eval_runtime": 31.8391,
|
150 |
+
"eval_samples_per_second": 5.968,
|
151 |
+
"eval_steps_per_second": 1.508,
|
152 |
+
"step": 1100
|
153 |
+
},
|
154 |
+
{
|
155 |
+
"epoch": 6.32,
|
156 |
+
"eval_accuracy": 0.9166363305424099,
|
157 |
+
"eval_f1": 0.9132502018480307,
|
158 |
+
"eval_loss": 0.34437164664268494,
|
159 |
+
"eval_precision": 0.9000884173297966,
|
160 |
+
"eval_recall": 0.92680262199563,
|
161 |
+
"eval_runtime": 31.688,
|
162 |
+
"eval_samples_per_second": 5.996,
|
163 |
+
"eval_steps_per_second": 1.515,
|
164 |
+
"step": 1200
|
165 |
+
},
|
166 |
+
{
|
167 |
+
"epoch": 6.84,
|
168 |
+
"eval_accuracy": 0.924766411843223,
|
169 |
+
"eval_f1": 0.9212297616881936,
|
170 |
+
"eval_loss": 0.327307790517807,
|
171 |
+
"eval_precision": 0.920392584514722,
|
172 |
+
"eval_recall": 0.922068463219228,
|
173 |
+
"eval_runtime": 31.8134,
|
174 |
+
"eval_samples_per_second": 5.972,
|
175 |
+
"eval_steps_per_second": 1.509,
|
176 |
+
"step": 1300
|
177 |
+
},
|
178 |
+
{
|
179 |
+
"epoch": 7.37,
|
180 |
+
"eval_accuracy": 0.9242810338551146,
|
181 |
+
"eval_f1": 0.9209428830462375,
|
182 |
+
"eval_loss": 0.32373183965682983,
|
183 |
+
"eval_precision": 0.9171180931744312,
|
184 |
+
"eval_recall": 0.9247997086671522,
|
185 |
+
"eval_runtime": 32.69,
|
186 |
+
"eval_samples_per_second": 5.812,
|
187 |
+
"eval_steps_per_second": 1.468,
|
188 |
+
"step": 1400
|
189 |
+
},
|
190 |
+
{
|
191 |
+
"epoch": 7.89,
|
192 |
+
"learning_rate": 9e-06,
|
193 |
+
"loss": 0.2736,
|
194 |
+
"step": 1500
|
195 |
+
},
|
196 |
+
{
|
197 |
+
"epoch": 7.89,
|
198 |
+
"eval_accuracy": 0.9282854022570076,
|
199 |
+
"eval_f1": 0.9256823709575714,
|
200 |
+
"eval_loss": 0.31131741404533386,
|
201 |
+
"eval_precision": 0.916027812444286,
|
202 |
+
"eval_recall": 0.9355426074289876,
|
203 |
+
"eval_runtime": 32.0518,
|
204 |
+
"eval_samples_per_second": 5.928,
|
205 |
+
"eval_steps_per_second": 1.498,
|
206 |
+
"step": 1500
|
207 |
+
},
|
208 |
+
{
|
209 |
+
"epoch": 8.42,
|
210 |
+
"eval_accuracy": 0.9254944788253853,
|
211 |
+
"eval_f1": 0.9237975139614484,
|
212 |
+
"eval_loss": 0.3146894872188568,
|
213 |
+
"eval_precision": 0.9140819964349376,
|
214 |
+
"eval_recall": 0.9337217771303714,
|
215 |
+
"eval_runtime": 32.0386,
|
216 |
+
"eval_samples_per_second": 5.93,
|
217 |
+
"eval_steps_per_second": 1.498,
|
218 |
+
"step": 1600
|
219 |
+
},
|
220 |
+
{
|
221 |
+
"epoch": 8.95,
|
222 |
+
"eval_accuracy": 0.9253731343283582,
|
223 |
+
"eval_f1": 0.9235605856462767,
|
224 |
+
"eval_loss": 0.3176872134208679,
|
225 |
+
"eval_precision": 0.9113632334692431,
|
226 |
+
"eval_recall": 0.9360888565185724,
|
227 |
+
"eval_runtime": 32.1667,
|
228 |
+
"eval_samples_per_second": 5.907,
|
229 |
+
"eval_steps_per_second": 1.492,
|
230 |
+
"step": 1700
|
231 |
+
},
|
232 |
+
{
|
233 |
+
"epoch": 9.47,
|
234 |
+
"eval_accuracy": 0.9262225458075476,
|
235 |
+
"eval_f1": 0.9248316120341267,
|
236 |
+
"eval_loss": 0.3194420337677002,
|
237 |
+
"eval_precision": 0.9124579124579124,
|
238 |
+
"eval_recall": 0.9375455207574654,
|
239 |
+
"eval_runtime": 32.186,
|
240 |
+
"eval_samples_per_second": 5.903,
|
241 |
+
"eval_steps_per_second": 1.491,
|
242 |
+
"step": 1800
|
243 |
+
},
|
244 |
+
{
|
245 |
+
"epoch": 10.0,
|
246 |
+
"eval_accuracy": 0.9293775027302512,
|
247 |
+
"eval_f1": 0.9273722955381991,
|
248 |
+
"eval_loss": 0.30748510360717773,
|
249 |
+
"eval_precision": 0.9146449442181689,
|
250 |
+
"eval_recall": 0.9404588492352512,
|
251 |
+
"eval_runtime": 31.8871,
|
252 |
+
"eval_samples_per_second": 5.959,
|
253 |
+
"eval_steps_per_second": 1.505,
|
254 |
+
"step": 1900
|
255 |
+
},
|
256 |
+
{
|
257 |
+
"epoch": 10.53,
|
258 |
+
"learning_rate": 8.666666666666668e-06,
|
259 |
+
"loss": 0.2045,
|
260 |
+
"step": 2000
|
261 |
+
},
|
262 |
+
{
|
263 |
+
"epoch": 10.53,
|
264 |
+
"eval_accuracy": 0.9305909477005218,
|
265 |
+
"eval_f1": 0.928266981046522,
|
266 |
+
"eval_loss": 0.3004026710987091,
|
267 |
+
"eval_precision": 0.9246612466124661,
|
268 |
+
"eval_recall": 0.9319009468317553,
|
269 |
+
"eval_runtime": 32.044,
|
270 |
+
"eval_samples_per_second": 5.929,
|
271 |
+
"eval_steps_per_second": 1.498,
|
272 |
+
"step": 2000
|
273 |
+
},
|
274 |
+
{
|
275 |
+
"epoch": 11.05,
|
276 |
+
"eval_accuracy": 0.9284067467540347,
|
277 |
+
"eval_f1": 0.9264534623309147,
|
278 |
+
"eval_loss": 0.3036515414714813,
|
279 |
+
"eval_precision": 0.9118321283724211,
|
280 |
+
"eval_recall": 0.9415513474144209,
|
281 |
+
"eval_runtime": 31.8687,
|
282 |
+
"eval_samples_per_second": 5.962,
|
283 |
+
"eval_steps_per_second": 1.506,
|
284 |
+
"step": 2100
|
285 |
+
},
|
286 |
+
{
|
287 |
+
"epoch": 11.58,
|
288 |
+
"eval_accuracy": 0.9307122921975488,
|
289 |
+
"eval_f1": 0.9279507603186097,
|
290 |
+
"eval_loss": 0.30012640357017517,
|
291 |
+
"eval_precision": 0.9226061915046796,
|
292 |
+
"eval_recall": 0.9333576110706482,
|
293 |
+
"eval_runtime": 31.9364,
|
294 |
+
"eval_samples_per_second": 5.949,
|
295 |
+
"eval_steps_per_second": 1.503,
|
296 |
+
"step": 2200
|
297 |
+
},
|
298 |
+
{
|
299 |
+
"epoch": 12.11,
|
300 |
+
"eval_accuracy": 0.9318043926707924,
|
301 |
+
"eval_f1": 0.9303956834532375,
|
302 |
+
"eval_loss": 0.3051491975784302,
|
303 |
+
"eval_precision": 0.9191542288557214,
|
304 |
+
"eval_recall": 0.9419155134741443,
|
305 |
+
"eval_runtime": 31.9279,
|
306 |
+
"eval_samples_per_second": 5.951,
|
307 |
+
"eval_steps_per_second": 1.503,
|
308 |
+
"step": 2300
|
309 |
+
},
|
310 |
+
{
|
311 |
+
"epoch": 12.63,
|
312 |
+
"eval_accuracy": 0.9299842252153865,
|
313 |
+
"eval_f1": 0.9288619723402333,
|
314 |
+
"eval_loss": 0.31714528799057007,
|
315 |
+
"eval_precision": 0.9222760725183988,
|
316 |
+
"eval_recall": 0.9355426074289876,
|
317 |
+
"eval_runtime": 32.3661,
|
318 |
+
"eval_samples_per_second": 5.87,
|
319 |
+
"eval_steps_per_second": 1.483,
|
320 |
+
"step": 2400
|
321 |
+
},
|
322 |
+
{
|
323 |
+
"epoch": 13.16,
|
324 |
+
"learning_rate": 8.333333333333334e-06,
|
325 |
+
"loss": 0.1678,
|
326 |
+
"step": 2500
|
327 |
+
},
|
328 |
+
{
|
329 |
+
"epoch": 13.16,
|
330 |
+
"eval_accuracy": 0.9279213687659265,
|
331 |
+
"eval_f1": 0.9271131805157592,
|
332 |
+
"eval_loss": 0.321869432926178,
|
333 |
+
"eval_precision": 0.9120859760394644,
|
334 |
+
"eval_recall": 0.9426438455935907,
|
335 |
+
"eval_runtime": 32.586,
|
336 |
+
"eval_samples_per_second": 5.831,
|
337 |
+
"eval_steps_per_second": 1.473,
|
338 |
+
"step": 2500
|
339 |
+
},
|
340 |
+
{
|
341 |
+
"epoch": 13.68,
|
342 |
+
"eval_accuracy": 0.9273146462807912,
|
343 |
+
"eval_f1": 0.9248711689720641,
|
344 |
+
"eval_loss": 0.3112223446369171,
|
345 |
+
"eval_precision": 0.9184772849703717,
|
346 |
+
"eval_recall": 0.9313546977421704,
|
347 |
+
"eval_runtime": 32.4269,
|
348 |
+
"eval_samples_per_second": 5.859,
|
349 |
+
"eval_steps_per_second": 1.48,
|
350 |
+
"step": 2600
|
351 |
+
},
|
352 |
+
{
|
353 |
+
"epoch": 14.21,
|
354 |
+
"eval_accuracy": 0.92901346923917,
|
355 |
+
"eval_f1": 0.9273105820584773,
|
356 |
+
"eval_loss": 0.3135831654071808,
|
357 |
+
"eval_precision": 0.922052205220522,
|
358 |
+
"eval_recall": 0.9326292789512017,
|
359 |
+
"eval_runtime": 31.2652,
|
360 |
+
"eval_samples_per_second": 6.077,
|
361 |
+
"eval_steps_per_second": 1.535,
|
362 |
+
"step": 2700
|
363 |
+
},
|
364 |
+
{
|
365 |
+
"epoch": 14.74,
|
366 |
+
"eval_accuracy": 0.9296201917243053,
|
367 |
+
"eval_f1": 0.9286809124515373,
|
368 |
+
"eval_loss": 0.3137897551059723,
|
369 |
+
"eval_precision": 0.9198071084122165,
|
370 |
+
"eval_recall": 0.937727603787327,
|
371 |
+
"eval_runtime": 31.2737,
|
372 |
+
"eval_samples_per_second": 6.075,
|
373 |
+
"eval_steps_per_second": 1.535,
|
374 |
+
"step": 2800
|
375 |
+
},
|
376 |
+
{
|
377 |
+
"epoch": 15.26,
|
378 |
+
"eval_accuracy": 0.93313918213809,
|
379 |
+
"eval_f1": 0.9307971014492753,
|
380 |
+
"eval_loss": 0.3145933747291565,
|
381 |
+
"eval_precision": 0.9260994953136266,
|
382 |
+
"eval_recall": 0.9355426074289876,
|
383 |
+
"eval_runtime": 32.3029,
|
384 |
+
"eval_samples_per_second": 5.882,
|
385 |
+
"eval_steps_per_second": 1.486,
|
386 |
+
"step": 2900
|
387 |
+
},
|
388 |
+
{
|
389 |
+
"epoch": 15.79,
|
390 |
+
"learning_rate": 8.000000000000001e-06,
|
391 |
+
"loss": 0.1404,
|
392 |
+
"step": 3000
|
393 |
+
},
|
394 |
+
{
|
395 |
+
"epoch": 15.79,
|
396 |
+
"eval_accuracy": 0.9296201917243053,
|
397 |
+
"eval_f1": 0.9290786516853932,
|
398 |
+
"eval_loss": 0.31863638758659363,
|
399 |
+
"eval_precision": 0.917450736729984,
|
400 |
+
"eval_recall": 0.9410050983248361,
|
401 |
+
"eval_runtime": 31.4449,
|
402 |
+
"eval_samples_per_second": 6.042,
|
403 |
+
"eval_steps_per_second": 1.526,
|
404 |
+
"step": 3000
|
405 |
+
},
|
406 |
+
{
|
407 |
+
"epoch": 16.32,
|
408 |
+
"eval_accuracy": 0.9314403591797112,
|
409 |
+
"eval_f1": 0.929384143037746,
|
410 |
+
"eval_loss": 0.3153584599494934,
|
411 |
+
"eval_precision": 0.9218917950555356,
|
412 |
+
"eval_recall": 0.9369992716678806,
|
413 |
+
"eval_runtime": 31.167,
|
414 |
+
"eval_samples_per_second": 6.096,
|
415 |
+
"eval_steps_per_second": 1.54,
|
416 |
+
"step": 3100
|
417 |
+
},
|
418 |
+
{
|
419 |
+
"epoch": 16.84,
|
420 |
+
"eval_accuracy": 0.9273146462807912,
|
421 |
+
"eval_f1": 0.926561797752809,
|
422 |
+
"eval_loss": 0.34182220697402954,
|
423 |
+
"eval_precision": 0.9149653825670158,
|
424 |
+
"eval_recall": 0.9384559359067735,
|
425 |
+
"eval_runtime": 31.6096,
|
426 |
+
"eval_samples_per_second": 6.011,
|
427 |
+
"eval_steps_per_second": 1.519,
|
428 |
+
"step": 3200
|
429 |
+
},
|
430 |
+
{
|
431 |
+
"epoch": 17.37,
|
432 |
+
"eval_accuracy": 0.925009100837277,
|
433 |
+
"eval_f1": 0.9233380986418871,
|
434 |
+
"eval_loss": 0.35532286763191223,
|
435 |
+
"eval_precision": 0.9064912280701755,
|
436 |
+
"eval_recall": 0.9408230152949745,
|
437 |
+
"eval_runtime": 32.7011,
|
438 |
+
"eval_samples_per_second": 5.81,
|
439 |
+
"eval_steps_per_second": 1.468,
|
440 |
+
"step": 3300
|
441 |
+
},
|
442 |
+
{
|
443 |
+
"epoch": 17.89,
|
444 |
+
"eval_accuracy": 0.9294988472272783,
|
445 |
+
"eval_f1": 0.9289882395188078,
|
446 |
+
"eval_loss": 0.339712530374527,
|
447 |
+
"eval_precision": 0.9162387108199044,
|
448 |
+
"eval_recall": 0.9420975965040058,
|
449 |
+
"eval_runtime": 31.1932,
|
450 |
+
"eval_samples_per_second": 6.091,
|
451 |
+
"eval_steps_per_second": 1.539,
|
452 |
+
"step": 3400
|
453 |
+
},
|
454 |
+
{
|
455 |
+
"epoch": 18.42,
|
456 |
+
"learning_rate": 7.666666666666667e-06,
|
457 |
+
"loss": 0.1174,
|
458 |
+
"step": 3500
|
459 |
+
},
|
460 |
+
{
|
461 |
+
"epoch": 18.42,
|
462 |
+
"eval_accuracy": 0.9322897706589006,
|
463 |
+
"eval_f1": 0.9322203066872333,
|
464 |
+
"eval_loss": 0.32590094208717346,
|
465 |
+
"eval_precision": 0.929101103273648,
|
466 |
+
"eval_recall": 0.935360524399126,
|
467 |
+
"eval_runtime": 31.3047,
|
468 |
+
"eval_samples_per_second": 6.069,
|
469 |
+
"eval_steps_per_second": 1.533,
|
470 |
+
"step": 3500
|
471 |
+
},
|
472 |
+
{
|
473 |
+
"epoch": 18.95,
|
474 |
+
"eval_accuracy": 0.9299842252153865,
|
475 |
+
"eval_f1": 0.9293038316243929,
|
476 |
+
"eval_loss": 0.330241322517395,
|
477 |
+
"eval_precision": 0.9182367579097049,
|
478 |
+
"eval_recall": 0.9406409322651129,
|
479 |
+
"eval_runtime": 31.3595,
|
480 |
+
"eval_samples_per_second": 6.059,
|
481 |
+
"eval_steps_per_second": 1.531,
|
482 |
+
"step": 3600
|
483 |
+
},
|
484 |
+
{
|
485 |
+
"epoch": 19.47,
|
486 |
+
"eval_accuracy": 0.9303482587064676,
|
487 |
+
"eval_f1": 0.9284752759580005,
|
488 |
+
"eval_loss": 0.33720284700393677,
|
489 |
+
"eval_precision": 0.9154132012033268,
|
490 |
+
"eval_recall": 0.9419155134741443,
|
491 |
+
"eval_runtime": 32.5529,
|
492 |
+
"eval_samples_per_second": 5.837,
|
493 |
+
"eval_steps_per_second": 1.475,
|
494 |
+
"step": 3700
|
495 |
+
},
|
496 |
+
{
|
497 |
+
"epoch": 20.0,
|
498 |
+
"eval_accuracy": 0.9305909477005218,
|
499 |
+
"eval_f1": 0.9294531038832327,
|
500 |
+
"eval_loss": 0.33688944578170776,
|
501 |
+
"eval_precision": 0.9199215266630997,
|
502 |
+
"eval_recall": 0.9391842680262199,
|
503 |
+
"eval_runtime": 31.1686,
|
504 |
+
"eval_samples_per_second": 6.096,
|
505 |
+
"eval_steps_per_second": 1.54,
|
506 |
+
"step": 3800
|
507 |
+
},
|
508 |
+
{
|
509 |
+
"epoch": 20.53,
|
510 |
+
"eval_accuracy": 0.9302269142094406,
|
511 |
+
"eval_f1": 0.9289775291038715,
|
512 |
+
"eval_loss": 0.33882710337638855,
|
513 |
+
"eval_precision": 0.9209160851672928,
|
514 |
+
"eval_recall": 0.9371813546977422,
|
515 |
+
"eval_runtime": 31.4744,
|
516 |
+
"eval_samples_per_second": 6.037,
|
517 |
+
"eval_steps_per_second": 1.525,
|
518 |
+
"step": 3900
|
519 |
+
},
|
520 |
+
{
|
521 |
+
"epoch": 21.05,
|
522 |
+
"learning_rate": 7.333333333333333e-06,
|
523 |
+
"loss": 0.0978,
|
524 |
+
"step": 4000
|
525 |
+
},
|
526 |
+
{
|
527 |
+
"epoch": 21.05,
|
528 |
+
"eval_accuracy": 0.9297415362213324,
|
529 |
+
"eval_f1": 0.9305718144979739,
|
530 |
+
"eval_loss": 0.34309884905815125,
|
531 |
+
"eval_precision": 0.9205415998574737,
|
532 |
+
"eval_recall": 0.9408230152949745,
|
533 |
+
"eval_runtime": 31.0896,
|
534 |
+
"eval_samples_per_second": 6.111,
|
535 |
+
"eval_steps_per_second": 1.544,
|
536 |
+
"step": 4000
|
537 |
+
},
|
538 |
+
{
|
539 |
+
"epoch": 21.58,
|
540 |
+
"eval_accuracy": 0.9313190146826842,
|
541 |
+
"eval_f1": 0.9312798342790237,
|
542 |
+
"eval_loss": 0.3530495762825012,
|
543 |
+
"eval_precision": 0.9214043842452326,
|
544 |
+
"eval_recall": 0.9413692643845594,
|
545 |
+
"eval_runtime": 32.1875,
|
546 |
+
"eval_samples_per_second": 5.903,
|
547 |
+
"eval_steps_per_second": 1.491,
|
548 |
+
"step": 4100
|
549 |
+
},
|
550 |
+
{
|
551 |
+
"epoch": 22.11,
|
552 |
+
"eval_accuracy": 0.9325324596529547,
|
553 |
+
"eval_f1": 0.932169845268082,
|
554 |
+
"eval_loss": 0.34749624133110046,
|
555 |
+
"eval_precision": 0.9212304409672831,
|
556 |
+
"eval_recall": 0.9433721777130372,
|
557 |
+
"eval_runtime": 31.1794,
|
558 |
+
"eval_samples_per_second": 6.094,
|
559 |
+
"eval_steps_per_second": 1.539,
|
560 |
+
"step": 4200
|
561 |
+
},
|
562 |
+
{
|
563 |
+
"epoch": 22.63,
|
564 |
+
"eval_accuracy": 0.9302269142094406,
|
565 |
+
"eval_f1": 0.9302577040908272,
|
566 |
+
"eval_loss": 0.35649344325065613,
|
567 |
+
"eval_precision": 0.9207991437745273,
|
568 |
+
"eval_recall": 0.9399126001456665,
|
569 |
+
"eval_runtime": 32.3866,
|
570 |
+
"eval_samples_per_second": 5.867,
|
571 |
+
"eval_steps_per_second": 1.482,
|
572 |
+
"step": 4300
|
573 |
+
},
|
574 |
+
{
|
575 |
+
"epoch": 23.16,
|
576 |
+
"eval_accuracy": 0.9326538041499818,
|
577 |
+
"eval_f1": 0.9312274368231047,
|
578 |
+
"eval_loss": 0.35333752632141113,
|
579 |
+
"eval_precision": 0.9232283464566929,
|
580 |
+
"eval_recall": 0.9393663510560816,
|
581 |
+
"eval_runtime": 31.2877,
|
582 |
+
"eval_samples_per_second": 6.073,
|
583 |
+
"eval_steps_per_second": 1.534,
|
584 |
+
"step": 4400
|
585 |
+
},
|
586 |
+
{
|
587 |
+
"epoch": 23.68,
|
588 |
+
"learning_rate": 7e-06,
|
589 |
+
"loss": 0.0822,
|
590 |
+
"step": 4500
|
591 |
+
},
|
592 |
+
{
|
593 |
+
"epoch": 23.68,
|
594 |
+
"eval_accuracy": 0.9333818711321441,
|
595 |
+
"eval_f1": 0.932110421724665,
|
596 |
+
"eval_loss": 0.3559868335723877,
|
597 |
+
"eval_precision": 0.9207674542547521,
|
598 |
+
"eval_recall": 0.9437363437727604,
|
599 |
+
"eval_runtime": 31.1716,
|
600 |
+
"eval_samples_per_second": 6.095,
|
601 |
+
"eval_steps_per_second": 1.54,
|
602 |
+
"step": 4500
|
603 |
+
},
|
604 |
+
{
|
605 |
+
"epoch": 24.21,
|
606 |
+
"eval_accuracy": 0.9337459046232254,
|
607 |
+
"eval_f1": 0.932995750067818,
|
608 |
+
"eval_loss": 0.3473477065563202,
|
609 |
+
"eval_precision": 0.9267109753906951,
|
610 |
+
"eval_recall": 0.9393663510560816,
|
611 |
+
"eval_runtime": 31.2203,
|
612 |
+
"eval_samples_per_second": 6.086,
|
613 |
+
"eval_steps_per_second": 1.537,
|
614 |
+
"step": 4600
|
615 |
+
},
|
616 |
+
{
|
617 |
+
"epoch": 24.74,
|
618 |
+
"eval_accuracy": 0.9287707802451158,
|
619 |
+
"eval_f1": 0.9275258194881005,
|
620 |
+
"eval_loss": 0.3723868131637573,
|
621 |
+
"eval_precision": 0.9151160730108099,
|
622 |
+
"eval_recall": 0.9402767662053897,
|
623 |
+
"eval_runtime": 32.4085,
|
624 |
+
"eval_samples_per_second": 5.863,
|
625 |
+
"eval_steps_per_second": 1.481,
|
626 |
+
"step": 4700
|
627 |
+
},
|
628 |
+
{
|
629 |
+
"epoch": 25.26,
|
630 |
+
"eval_accuracy": 0.9327751486470088,
|
631 |
+
"eval_f1": 0.9308232750855701,
|
632 |
+
"eval_loss": 0.3668186068534851,
|
633 |
+
"eval_precision": 0.9210338680926916,
|
634 |
+
"eval_recall": 0.9408230152949745,
|
635 |
+
"eval_runtime": 31.1822,
|
636 |
+
"eval_samples_per_second": 6.093,
|
637 |
+
"eval_steps_per_second": 1.539,
|
638 |
+
"step": 4800
|
639 |
+
},
|
640 |
+
{
|
641 |
+
"epoch": 25.79,
|
642 |
+
"eval_accuracy": 0.9342312826113336,
|
643 |
+
"eval_f1": 0.932900432900433,
|
644 |
+
"eval_loss": 0.35110706090927124,
|
645 |
+
"eval_precision": 0.9242315939957112,
|
646 |
+
"eval_recall": 0.9417334304442826,
|
647 |
+
"eval_runtime": 31.632,
|
648 |
+
"eval_samples_per_second": 6.007,
|
649 |
+
"eval_steps_per_second": 1.517,
|
650 |
+
"step": 4900
|
651 |
+
},
|
652 |
+
{
|
653 |
+
"epoch": 26.32,
|
654 |
+
"learning_rate": 6.666666666666667e-06,
|
655 |
+
"loss": 0.0685,
|
656 |
+
"step": 5000
|
657 |
+
},
|
658 |
+
{
|
659 |
+
"epoch": 26.32,
|
660 |
+
"eval_accuracy": 0.9322897706589006,
|
661 |
+
"eval_f1": 0.9301610276822869,
|
662 |
+
"eval_loss": 0.349013090133667,
|
663 |
+
"eval_precision": 0.9243078029485796,
|
664 |
+
"eval_recall": 0.9360888565185724,
|
665 |
+
"eval_runtime": 31.5377,
|
666 |
+
"eval_samples_per_second": 6.025,
|
667 |
+
"eval_steps_per_second": 1.522,
|
668 |
+
"step": 5000
|
669 |
+
}
|
670 |
+
],
|
671 |
+
"max_steps": 15000,
|
672 |
+
"num_train_epochs": 79,
|
673 |
+
"total_flos": 5296004751249408.0,
|
674 |
+
"trial_name": null,
|
675 |
+
"trial_params": null
|
676 |
+
}
|
models/checkpoint/training_args.bin
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:fbf7fbdb5e11561aca8ea9af246554c6be453feb7f1de7fb0526ab1162afd7e0
|
3 |
+
size 3643
|
models/checkpoint/vocab.json
ADDED
The diff for this file is too large to render.
See raw diff
|
|
models/vietocr/vgg_seq2seq.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:0921503a41375a0584268e23ef3d414ea478a8fe8777865c7745d38f2d0bc5db
|
3 |
+
size 89575371
|
models/vietocr/vgg_transformer.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:870475e8e72564e6732d896b79b3369faefa1440c8fa0ea68d11b2eefadd7721
|
3 |
+
size 26877952
|
requirements.txt
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#paddleocr==2.9.1
|
2 |
+
#paddlepaddle==2.6.2
|
3 |
+
#torch==2.5.1
|
4 |
+
#torchvision==0.20.1
|
5 |
+
vietocr==0.3.13
|
6 |
+
ultralytics==8.3.65
|
7 |
+
huggingface-hub==0.27.1
|
8 |
+
datasets==2.10.0
|
9 |
+
seqeval==1.2.2
|
10 |
+
transformers==4.48.1
|
utils.py
ADDED
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import numpy as np
|
2 |
+
from datasets import load_metric
|
3 |
+
from PIL import ImageDraw, ImageFont
|
4 |
+
import pandas as pd
|
5 |
+
|
6 |
+
|
7 |
+
metric = load_metric("seqeval")
|
8 |
+
|
9 |
+
|
10 |
+
def unnormalize_box(bbox, width, height):
|
11 |
+
return [
|
12 |
+
width * (bbox[0] / 1000),
|
13 |
+
height * (bbox[1] / 1000),
|
14 |
+
width * (bbox[2] / 1000),
|
15 |
+
height * (bbox[3] / 1000)
|
16 |
+
]
|
17 |
+
|
18 |
+
|
19 |
+
def normalize_box(bbox, width, height):
|
20 |
+
return [
|
21 |
+
int((bbox[0] / width) * 1000),
|
22 |
+
int((bbox[1] / height) * 1000),
|
23 |
+
int((bbox[2] / width) * 1000),
|
24 |
+
int((bbox[3] / height) * 1000)
|
25 |
+
]
|
26 |
+
|
27 |
+
|
28 |
+
def draw_output(image, true_predictions, true_boxes):
|
29 |
+
def iob_to_label(label):
|
30 |
+
label = label
|
31 |
+
if not label:
|
32 |
+
return 'other'
|
33 |
+
return label
|
34 |
+
|
35 |
+
# width, height = image.size
|
36 |
+
|
37 |
+
# predictions = logits.argmax(-1).squeeze().tolist()
|
38 |
+
# is_subword = np.array(offset_mapping)[:,0] != 0
|
39 |
+
# true_predictions = [id2label[pred] for idx, pred in enumerate(predictions) if not is_subword[idx]]
|
40 |
+
# true_boxes = [unnormalize_box(box, width, height) for idx, box in enumerate(token_boxes) if not is_subword[idx]]
|
41 |
+
|
42 |
+
# draw
|
43 |
+
draw = ImageDraw.Draw(image)
|
44 |
+
font = ImageFont.load_default()
|
45 |
+
|
46 |
+
for prediction, box in zip(true_predictions, true_boxes):
|
47 |
+
predicted_label = iob_to_label(prediction).lower()
|
48 |
+
draw.rectangle(box, outline='red')
|
49 |
+
draw.text((box[0] + 10, box[1] - 10),
|
50 |
+
text=predicted_label, fill='red', font=font)
|
51 |
+
|
52 |
+
return image
|
53 |
+
|
54 |
+
|
55 |
+
def create_df(true_texts,
|
56 |
+
true_predictions,
|
57 |
+
chosen_labels=['SHOP_NAME', 'ADDR', 'TITLE', 'PHONE',
|
58 |
+
'PRODUCT_NAME', 'AMOUNT', 'UNIT', 'UPRICE', 'SUB_TPRICE', 'UDISCOUNT',
|
59 |
+
'TAMOUNT', 'TPRICE', 'FPRICE', 'TDISCOUNT',
|
60 |
+
'RECEMONEY', 'REMAMONEY',
|
61 |
+
'BILLID', 'DATETIME', 'CASHIER']
|
62 |
+
):
|
63 |
+
|
64 |
+
data = {'text': [], 'class_label': [], 'product_id': []}
|
65 |
+
product_id = -1
|
66 |
+
for text, prediction in zip(true_texts, true_predictions):
|
67 |
+
if prediction not in chosen_labels:
|
68 |
+
continue
|
69 |
+
|
70 |
+
if prediction == 'PRODUCT_NAME':
|
71 |
+
product_id += 1
|
72 |
+
|
73 |
+
|
74 |
+
if prediction in ['AMOUNT', 'UNIT', 'UDISCOUNT', 'UPRICE', 'SUB_TPRICE',
|
75 |
+
'UDISCOUNT', 'TAMOUNT', 'TPRICE', 'FPRICE', 'TDISCOUNT',
|
76 |
+
'RECEMONEY', 'REMAMONEY']:
|
77 |
+
text = reformat(text)
|
78 |
+
|
79 |
+
|
80 |
+
if prediction in ['AMOUNT', 'SUB_TPRICE', 'UPRICE', 'PRODUCT_NAME']:
|
81 |
+
data['product_id'].append(product_id)
|
82 |
+
else:
|
83 |
+
data['product_id'].append('')
|
84 |
+
|
85 |
+
|
86 |
+
data['class_label'].append(prediction)
|
87 |
+
data['text'].append(text)
|
88 |
+
|
89 |
+
|
90 |
+
df = pd.DataFrame(data)
|
91 |
+
|
92 |
+
return df
|
93 |
+
|
94 |
+
|
95 |
+
def reformat(text: str):
|
96 |
+
try:
|
97 |
+
text = text.replace('.', '').replace(',', '').replace(':', '').replace('/', '').replace('|', '').replace(
|
98 |
+
'\\', '').replace(')', '').replace('(', '').replace('-', '').replace(';', '').replace('_', '')
|
99 |
+
return int(text)
|
100 |
+
except:
|
101 |
+
return text
|
102 |
+
|
103 |
+
def find_product(product_name, df):
|
104 |
+
product_name = product_name.lower()
|
105 |
+
product_df = df[df['class_label'] == 'PRODUCT_NAME']
|
106 |
+
mask = product_df['text'].str.lower().str.contains(product_name, case=False, na=False)
|
107 |
+
if mask.any():
|
108 |
+
product_id = product_df.loc[mask, 'product_id'].iloc[0]
|
109 |
+
product_info = df[df['product_id'] == product_id]
|
110 |
+
|
111 |
+
prod_name = product_info.loc[product_info['class_label'] == 'PRODUCT_NAME', 'text'].iloc[0]
|
112 |
+
|
113 |
+
try:
|
114 |
+
amount = product_info.loc[product_info['class_label'] == 'AMOUNT', 'text'].iloc[0]
|
115 |
+
except:
|
116 |
+
print("Error: cannot find amount")
|
117 |
+
amount = ''
|
118 |
+
|
119 |
+
try:
|
120 |
+
uprice = product_info.loc[product_info['class_label'] == 'UPRICE', 'text'].iloc[0]
|
121 |
+
except:
|
122 |
+
print("Error: cannot find unit price")
|
123 |
+
uprice = ''
|
124 |
+
|
125 |
+
try:
|
126 |
+
sub_tprice = product_info.loc[product_info['class_label'] == 'SUB_TPRICE', 'text'].iloc[0]
|
127 |
+
except:
|
128 |
+
print("Error: cannot find sub total price")
|
129 |
+
sub_tprice = ''
|
130 |
+
|
131 |
+
#print("Sản phẩm: ", product_info.loc[product_info['class_label'] == 'PRODUCT_NAME', 'text'].iloc[0])
|
132 |
+
#print("Số lượng: ", product_info.loc[product_info['class_label'] == 'AMOUNT', 'text'].iloc[0])
|
133 |
+
#print("Đơn giá: ", product_info.loc[product_info['class_label'] == 'UPRICE', 'text'].iloc[0])
|
134 |
+
#print("Thành tiền: ", product_info.loc[product_info['class_label'] == 'SUB_TPRICE', 'text'].iloc[0])
|
135 |
+
return f"Sản phẩm: {prod_name}\n Số lượng: {amount}\n Đơn giá: {uprice}\n Thành tiền: {sub_tprice}"
|
136 |
+
else:
|
137 |
+
#print("Không tìm thấy item nào phù hợp.")
|
138 |
+
return "Không tìm thấy item nào phù hợp."
|
139 |
+
#return result = product_df['text'].str.contains(product_name, case=False, na=False).any()
|
140 |
+
#return product_df[product_df['text'].str.contains(product_name, case=False, na=False)]
|