diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..2e28544b708beea6c0570b12b6597a2239843b04 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,8 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +res0.png filter=lfs diff=lfs merge=lfs -text +table_drawn_bbox_with_extra.png filter=lfs diff=lfs merge=lfs -text +unitable/website/unitable-demo.gif filter=lfs diff=lfs merge=lfs -text +unitable/website/unitable-demo.mp4 filter=lfs diff=lfs merge=lfs -text +unitable/website/wandb_screenshot.png filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..2f1579976b64c9a40e5c851eb391b33c88af7cca --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ + +unitable/experiments/unitable_weights/** + +res/** + +TestingFiles/** +TestingFilesImages/** + +# python generated files +__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# venv +.venv \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..579eff034c61234268a8921cdf93d4033947527d --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,33 @@ +variables: + GIT_STRATEGY: fetch + GIT_SSL_NO_VERIFY: "true" + GIT_LFS_SKIP_SMUDGE: 1 + DOCKER_BUILDKIT: 1 + +stages: + - build + +image_build: + stage: build + image: docker:stable + before_script: + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN http://$CI_REGISTRY + script: | + CI_COMMIT_SHA_7=$(echo $CI_COMMIT_SHA | cut -c1-7) + DATE=$(date +%Y-%m-%d) + docker build --tag $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest \ + --tag $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$CI_COMMIT_SHA_7 \ + --tag $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$DATE \ + -f Dockerfile . + docker push $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest + docker push $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$CI_COMMIT_SHA_7 + docker push $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$DATE + # Run only when Dockerfile has changed + rules: + - if: $CI_PIPELINE_SOURCE == "push" + changes: + - Dockerfile + # Set to `on_success` to automatically rebuild + # Set to `manual` to trigger the build manually using Gitlab UI + when: on_success + allow_failure: true diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..7a73a41bfdf76d6f793007240d80983a52f15f97 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..a00bd474b24ba27f9b6917473909de5660647486 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,55 @@ +ARG BASE_IMAGE="nvidia/cuda:12.2.2-devel-ubuntu22.04" + +FROM ${BASE_IMAGE} +ARG HOMEDIRECTORY="/myhome" +ENV HOMEDIRECTORY=$HOMEDIRECTORY + +USER root +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + curl \ + python3 \ + python3-pip \ + python3-dev \ + poppler-utils \ + gcc \ + git \ + git-lfs \ + htop \ + libgl1 \ + libglib2.0-0 \ + ncdu \ + openssh-client \ + openssh-server \ + psmisc \ + rsync \ + screen \ + sudo \ + tmux \ + unzip \ + vim \ + wget && \ + wget -q https://github.com/justjanne/powerline-go/releases/download/v1.24/powerline-go-linux-"$(dpkg --print-architecture)" -O /usr/local/bin/powerline-shell && \ + chmod a+x /usr/local/bin/powerline-shell + +RUN ln -s /usr/bin/python3 /usr/bin/python +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cu117 + + +# setup ssh +RUN ssh-keygen -A +RUN sed -i 's/#*PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config +EXPOSE 22 + +# Make the root user's home directory /myhome (the default for run.ai), +# and allow to login with password 'root'. +RUN echo 'root:root' | chpasswd +RUN sed -i 's|:root:/root:|:root:/myhome:|' /etc/passwd + +ENTRYPOINT sudo service ssh start && /bin/bash + + + + + diff --git a/README.md b/README.md index dd9befb09f074acbf513f0b8d6d16fcc9acc5bfe..fc2d8ae150dcef5769325cdc6aa0751ba8a89901 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,118 @@ --- -title: Alps -emoji: 👀 -colorFrom: purple -colorTo: green +title: alps +app_file: app.py sdk: gradio sdk_version: 4.44.0 -app_file: app.py -pinned: false --- +# Alps + +Pipeline for OCRing PDFs and tables + +This repository contains different OCR methods using various libraries/models. + +## Running gradio: +`python app.py` in terminal + + +## Installation : +Build the docker image and run the contianer + +Clone this repository and Install the required dependencies: +``` +pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cu117 + +apt install weasyprint + +``` +Note: You need a GPU to run this code. + +## Example Usage + +Run python main.py inside the directory. Provide the path to the test file (the file must be placed inside the repository,and the file path should be relative to the repository (alps)). Next, provide the path to save intermediate outputs from the run (draw cell bounding boxes on the table, show table detection results in pdf), and specify which component to run. + +outputs are printed in terminal + +``` +usage: main.py [-h] [--test_file TEST_FILE] [--debug_folder DEBUG_FOLDER] [--englishFlag ENGLISHFLAG] [--denoise DENOISE] ocr + +``` +Description of the component: + +### ocr1 + +ocr1 +Input: Path to a PDF file +Output: Dictionary of each page and list of line_annotations. List of LineAnnotations contains bboxes for each line and List of its children wordAnnotation. Each wordAnnotation contains bboxes and text inside. +What it does: Runs Ragflow textline detector + OCR with DocTR + +Example: +``` +python main.py ocr1 --test_file TestingFiles/OCRTest1German.pdf --debug_folder ./res/ocrdebug1/ +python main.py ocr1 --test_file TestingFiles/OCRTest3English.pdf --debug_folder ./res/ocrdebug1/ --englishFlag True +``` + +### table1 +Input : file path to an image of a cropped table +Output: Parsed table in HTML form +What it does: Uses Unitable + DocTR + +``` +python main.py table1 --test_file cropped_table.png --debug_folder ./res/table1/ + +``` + +### table2 +Input: File path to an image of a cropped table +Output: Parsed table in HTML form +What it does: Uses Unitable + +``` +python main.py table2 --test_file cropped_table.png --debug_folder ./res/table2/ + +``` +### pdftable1 +Input: PDF file path +Output: Parsed table in HTML form +What it does: Uses Unitable + DocTR + + +``` +python main.py pdftable1 --test_file TestingFiles/OCRTest5English.pdf --debug_folder ./res/table_debug1/ + +python main.py pdftable3 --test_file TestingFiles/TableOCRTestEnglish.pdf --debug_folder ./res/poor_relief2 +``` + + +### pdftable2 : +Input: PDF file path +Output: Parsed table in HTML form +What it does: Detects table and parses them, Runs Full Unitable Table detection + +``` +python main.py pdftable2 --test_file TestingFiles/OCRTest5English.pdf --debug_folder ./res/table_debug2/ +``` + + +### pdftable3 +Input: PDF file path +Output: Parsed table in HTML form +What it does: Detects table with YOLO, Unitable + DocTR + + + +### pdftable4 +Input: PDF file path +Output: Parsed table in HTML form +What it does: Detects table with YOLO, Runs Full doctr Table detection + +python main.py pdftable4 --test_file TestingFiles/TableOCRTestEasier.pdf --debug_folder ./res/table_debug3/ + + +## bbox +They are ordered as ordered as [xmin,ymin,xmax,ymax] . Cause the coordinates starts from (0,0) of the image which is upper left corner + +xmin ymim - upper left corner +xmax ymax - bottom lower corner + +![alt text](image-2.png) -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference diff --git a/abstractClass.py b/abstractClass.py new file mode 100644 index 0000000000000000000000000000000000000000..47102109a27a37e5704d6c0d89e91bf7e035d16e --- /dev/null +++ b/abstractClass.py @@ -0,0 +1,59 @@ + +from typing import Any, List, Literal, Mapping, Optional, Tuple +from abc import ABC, abstractmethod + +import numpy as np +import cv2 +from PIL import Image +from abc import ABC, abstractmethod + +from utils import cropImage + + +class OCRComponent: + """ + Wrapper class for cropping images and giving it to OCR Predictor + """ + def predict_pdf(self, pdf_name:str="", page:int=None, bbx:List[List[float]]=None)-> List[List[float]]: + #TODO: Preprocessing to crop interest region + pass + + +class TextDetector(ABC): + """ + Abstract base class for text detectors that takes in bounding boxes, pdf name, and page + and returns bounding boxes results on them. + """ + + def __init__(self): + + pass + + """ + This is for predicting given an already cropped image + """ + @abstractmethod + def predict_img(self, img:np.ndarray=None)-> List[List[float]]: + # do something with self.input and return bbx + pass + +class textRecognizer(ABC): + """ + class of textRecognizer that takes in bounding boxes, pdf name and page and returns + OCR results on them + """ + + def __init__(self): + + pass + + + """ + This is for predicting given text line detection result form text line detector + """ + @abstractmethod + def predict_img(self, bxs:List[List[float]], img:Image.Image)-> List[List[float]]: + # do something with self.input and return bbx + pass + + \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..9f0db95a2d29bf05734f7334902e7bbce9c35962 --- /dev/null +++ b/app.py @@ -0,0 +1,406 @@ + +import os +import traceback +import argparse +from typing import List, Tuple, Set, Dict + +import time +from PIL import Image +import numpy as np +from doctr.models import ocr_predictor +import logging +import pandas as pd +from bs4 import BeautifulSoup +import gradio + +from utils import cropImages +from utils import draw_only_box,draw_box_with_text,getlogger,Annotation +from ocr_component1 import OCRComponent1 +from detectionAndOcrTable1 import DetectionAndOcrTable1 +from detectionAndOcrTable2 import DetectionAndOcrTable2 +from detectionAndOcrTable3 import DetectionAndOcrTable3 +from detectionAndOcrTable4 import DetectionAndOcrTable4 +from ocrTable1 import OcrTable1 +from ocrTable2 import OcrTable2 +from pdf2image import convert_from_path + + +def convertHTMLToCSV(html:str,output_path:str)->str: + + # empty list + data = [] + + # for getting the header from + # the HTML file + list_header = [] + soup = BeautifulSoup(html,'html.parser') + header = soup.find_all("table")[0].find("tr") + + for items in header: + try: + list_header.append(items.get_text()) + except: + continue + + # for getting the data + HTML_data = soup.find_all("table")[0].find_all("tr")[1:] + + for element in HTML_data: + sub_data = [] + for sub_element in element: + try: + sub_data.append(sub_element.get_text()) + except: + continue + data.append(sub_data) + + # Storing the data into Pandas + # DataFrame + dataFrame = pd.DataFrame(data = data, columns = list_header) + + # Converting Pandas DataFrame + # into CSV file + dataFrame.to_csv(output_path) + +def saveResults(image_list, results, labels, output_dir='output/', threshold=0.5): + if not os.path.exists(output_dir): + os.makedirs(output_dir) + for idx, im in enumerate(image_list): + im = draw_only_box(im, results[idx], labels, threshold=threshold) + + out_path = os.path.join(output_dir, f"{idx}.jpg") + im.save(out_path, quality=95) + print("save result to: " + out_path) + +def InputToImages(input_path:str,resolution=300)-> List[Image.Image]: + """ + input is file location to image + return : List of Pillow image objects + """ + images=[] + try: + img =Image.open(input_path) + if img.mode == 'RGBA': + img = img.convert('RGB') + images.append(img) + except Exception as e: + traceback.print_exc() + return images + +def drawTextDetRes(bxs :List[List[float]],img:Image.Image,output_path:str): + """ + draw layout analysis results + """ + """bxs_draw is xmin, ymin, xmax, ymax""" + bxs_draw = [[b[0][0], b[0][1], b[1][0], b[-1][1]] for b in bxs if b[0][0] <= b[1][0] and b[0][1] <= b[-1][1]] + + #images_to_recognizer = cropImage(bxs, img) + img_to_save = draw_only_box(img, bxs_draw) + img_to_save.save(output_path, quality=95) + +def test_ocr_component1(test_file="TestingFiles/OCRTest1German.pdf", debug_folder = './res/table1/',englishFlag = False): + #Takes as input image of a single page and returns the detected lines and words + + images = convert_from_path(test_file) + ocr = OCRComponent1(englishFlag) + ocr_results = {} + + all_text_in_pages = {} + for page_number,img in enumerate(images): + text_in_page = "" + + line_annotations= ocr.predict(img = np.array(img)) + ocr_results[page_number] = line_annotations + + """ + boxes_to_draw =[] + for list_of_ann in word_annotations: + for ann in list_of_ann: + logger.info(ann.text) + b = ann.box + boxes_to_draw.append(b) + + img_to_save = draw_only_box(img,boxes_to_draw) + img_to_save.save("res/12June_2_lines.png", quality=95) + """ + + line_boxes_to_draw =[] + #print("Detected lines are ") + #print(len(line_annotations.items())) + for index,ann in line_annotations.items(): + + b = ann.box + line_boxes_to_draw.append(b) + line_words = "" + #print("detected words per line") + #print(len(ann.words)) + for wordann in ann.words: + line_words += wordann.text +" " + print(line_words) + text_in_page += line_words +"\n" + + img_to_save1 = draw_only_box(img,line_boxes_to_draw) + imgname = test_file.split("/")[-1][:-4] + img_to_save1.save(debug_folder+imgname+"_"+str(page_number)+"_bbox_detection.png", quality=95) + + all_text_in_pages[page_number] = text_in_page + + return ocr_results, all_text_in_pages + + +def test_tableOcrOnly1(test_file :Image.Image , debug_folder = './res/table1/',denoise = False,englishFlag = False): + #Hybrid Unitable +DocTR + #Good at these kind of tables - with a lot of texts + table = OcrTable1(englishFlag) + image = test_file.convert("RGB") + """ + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_" + + table_code = table.predict([image],debugfolder_filename_page_name,denoise = denoise) + with open(debugfolder_filename_page_name+'output.txt', 'w') as file: + file.write(table_code) + """ + + table_code = table.predict([image],denoise = denoise) + return table_code + + +def test_tableOcrOnly2(test_file:Image.Image, debug_folder = './res/table2/'): + table = OcrTable2() + #FullUnitable + #Good at these kind of tables - with not much text + + image = test_file.convert("RGB") + table.predict([image],debug_folder) + +def test_table_component1(test_file = 'TestingFiles/TableOCRTestEnglish.pdf', debug_folder ='./res/table_debug2/',denoise = False,englishFlag = True): + table_predictor = DetectionAndOcrTable1(englishFlag) + + images = convert_from_path(test_file) + for page_number,img in enumerate(images): + + #print(img.mode) + print("Looking at page:") + print(page_number) + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_"+ str(page_number)+'_' + table_codes = table_predictor.predict(img,debugfolder_filename_page_name=debugfolder_filename_page_name,denoise = denoise) + for index, table_code in enumerate(table_codes): + with open(debugfolder_filename_page_name+str(index)+'output.xls', 'w') as file: + file.write(table_code) + return table_codes + +def test_table_component2(test_file = 'TestingFiles/TableOCRTestEnglish.pdf', debug_folder ='./res/table_debug2/'): + #This components can take in entire pdf page as input , scan for tables and return the table in html format + #Uses the full unitable model + + table_predictor = DetectionAndOcrTable2() + + images = convert_from_path(test_file) + for page_number,img in enumerate(images): + print("Looking at page:") + print(page_number) + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_"+ str(page_number)+'_' + table_codes = table_predictor.predict(img,debugfolder_filename_page_name=debugfolder_filename_page_name) + for index, table_code in enumerate(table_codes): + with open(debugfolder_filename_page_name+str(index)+'output.xls', 'w') as file: + file.write(table_code) + return table_codes + +def test_table_component3(test_file = 'TestingFiles/TableOCRTestEnglish.pdf',debug_folder ='./res/table_debug3/',denoise = False,englishFlag = True): + table_predictor = DetectionAndOcrTable3(englishFlag) + + images = convert_from_path(test_file) + for page_number,img in enumerate(images): + #print(img.mode) + print("Looking at page:") + print(page_number) + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_"+ str(page_number)+'_' + table_codes = table_predictor.predict(img,debugfolder_filename_page_name=debugfolder_filename_page_name) + for index, table_code in enumerate(table_codes): + with open(debugfolder_filename_page_name+str(index)+'output.xls', 'w') as file: + file.write(table_code) + return table_codes + + + +def test_table_component4(test_file = 'TestingFiles/TableOCRTestEnglish.pdf',debug_folder ='./res/table_debug3/'): + table_predictor = DetectionAndOcrTable4() + + images = convert_from_path(test_file) + for page_number,img in enumerate(images): + #print(img.mode) + print("Looking at page:") + print(page_number) + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_"+ str(page_number)+'_' + table_codes = table_predictor.predict(img,debugfolder_filename_page_name=debugfolder_filename_page_name) + for index, table_code in enumerate(table_codes): + with open(debugfolder_filename_page_name+str(index)+'output.xls', 'w') as file: + file.write(table_code) + return table_codes + + +""" + parser = argparse.ArgumentParser(description='Process some strings.') + parser.add_argument('ocr', type=str, help='type in id of the component to test') + parser.add_argument('--test_file',type=str, help='path to the testing file') + parser.add_argument('--debug_folder',type=str, help='path to the folder you want to save your results in') + parser.add_argument('--englishFlag',type=bool, help='Whether your pdf is in english => could lead to better results ') + parser.add_argument('--denoise',type=bool, help='preprocessing for not clean scans ') + + args = parser.parse_args() + start = time.time() + if args.ocr == "ocr1": + test_ocr_component1(args.test_file,args.debug_folder, args.englishFlag) + elif args.ocr == "table1": + test_tableOcrOnly1(args.test_file,args.debug_folder,args.englishFlag,args.denoise) + elif args.ocr == "table2": + test_tableOcrOnly2(args.test_file,args.debug_folder) + elif args.ocr =="pdftable1": + test_table_component1(args.test_file,args.debug_folder,args.englishFlag,args.denoise) + elif args.ocr =="pdftable2": + test_table_component2(args.test_file,args.debug_folder) + elif args.ocr =="pdftable3": + test_table_component3(args.test_file,args.debug_folder,args.englishFlag,args.denoise) + elif args.ocr =="pdftable4": + test_table_component4(args.test_file,args.debug_folder) + +""" +import gradio as gr +from gradio_pdf import PDF + +with gr.Blocks() as demo: + gr.Markdown("# OCR component") + inputs_for_ocr = [PDF(label="Document"), gr.Textbox(label="internal debug folder",placeholder = "./res/table1/"),gr.Checkbox(label ="English Document?",value =False)] + ocr_btn = gr.Button("Run ocr") + + gr.Examples( + examples=[["TestingFiles/OCRTest1German.pdf",'./res/table1/',False]], + inputs=inputs_for_ocr + ) + + outputs_for_ocr = [gr.Textbox(label="List of annotation objects"), gr.Textbox("Text in page")] + + ocr_btn.click(fn=test_ocr_component1, + inputs = inputs_for_ocr, + outputs = outputs_for_ocr, + api_name="OCR" + ) + + gr.Markdown("# Table OCR components that takes a pdf, extract table and return their html code ") + gr.Markdown("## Component 1 uses table transformer and doctr +Unitable") + inputs_for_pdftable1 = [PDF(label="Document"), gr.Textbox(label="internal debug folder",placeholder = "./res/table1/"),gr.Checkbox(label ="Denoise?",value =False),gr.Checkbox(label ="English Document?",value =False)] + table1_btn = gr.Button("Run pdftable1") + + gr.Examples( + examples=[["TestingFiles/OCRTest5English.pdf",'./res/table1/',False]], + inputs=inputs_for_pdftable1 + ) + outputs_for_pdftable1 = [gr.Textbox(label="Table code")] + + table1_btn.click(fn=test_table_component1, + inputs = inputs_for_pdftable1, + outputs = outputs_for_pdftable1, + api_name="pdfTable1" + ) + + gr.Markdown("## Component 2 uses table transformer and Unitable") + inputs_for_pdftable2 = [PDF(label="Document"), gr.Textbox(label="internal debug folder",placeholder = "./res/table1/")] + table2_btn = gr.Button("Run pdftable2") + + gr.Examples( + examples=[["TestingFiles/OCRTest5English.pdf",'./res/table1/',False]], + inputs=inputs_for_pdftable1 + ) + outputs_for_pdftable2 = [gr.Textbox(label="Table code")] + + table2_btn.click(fn=test_table_component2, + inputs = inputs_for_pdftable2, + outputs = outputs_for_pdftable2, + api_name="pdfTable2" + ) + + gr.Markdown("## Component 3 uses Yolo and Unitable+doctr") + inputs_for_pdftable3 = [PDF(label="Document"), gr.Textbox(label="internal debug folder",placeholder = "./res/table1/"),gr.Checkbox(label ="Denoise?",value =False),gr.Checkbox(label ="English Document?",value =False)] + table3_btn = gr.Button("Run pdftable3") + + + gr.Examples( + examples=[["TestingFiles/TableOCRTestEnglish.pdf",'./res/table1/',False]], + inputs=inputs_for_pdftable1 + ) + outputs_for_pdftable3 = [gr.Textbox(label="Table code")] + + table3_btn.click(fn=test_table_component3, + inputs = inputs_for_pdftable3, + outputs = outputs_for_pdftable3, + api_name="pdfTable3" + ) + + gr.Markdown("## Component 4 uses Yolo and Unitable") + inputs_for_pdftable4 = [PDF(label="Document"), gr.Textbox(label="internal debug folder",placeholder = "./res/table1/")] + table4_btn = gr.Button("Run pdftable4") + + gr.Examples( + examples=[["TestingFiles/TableOCRTestEasier.pdf",'./res/table1/',False]], + inputs=inputs_for_pdftable1 + ) + outputs_for_pdftable4 = [gr.Textbox(label="Table code")] + + + table4_btn.click(fn=test_table_component4, + inputs = inputs_for_pdftable4, + outputs = outputs_for_pdftable4, + api_name="pdfTable4" + ) + + + gr.Markdown("# Table OCR component that takes image of an cropped tavle, extract table and return their html code ") + + inputs_for_table1 = [gr.Image(label="Image of cropped table",type='pil'), gr.Textbox(label="internal debug folder",placeholder = "./res/table1/"),gr.Checkbox(label ="Denoise?",value =False),gr.Checkbox(label ="English Document?",value =False)] + onlytable1_btn = gr.Button("Run table1") + + gr.Examples( + examples=[[Image.open("cropped_table.png"),'./res/table1/',False]], + inputs=inputs_for_table1 + ) + outputs_for_table1 = [gr.HTML(label="Table code")] + + + onlytable1_btn.click(fn=test_tableOcrOnly1, + inputs = inputs_for_table1, + outputs = outputs_for_table1, + api_name="table1" + ) + + gr.Markdown("## Another Table OCR component that takes image of an cropped table, extract table and return their html code ") + + inputs_for_table2 = [gr.Image(label="Image of cropped table",type='pil'), gr.Textbox(label="internal debug folder",placeholder = "./res/table1/")] + onlytable2_btn = gr.Button("Run table2") + + + gr.Examples( + examples=[[Image.open("cropped_table.png"),'./res/table1/',False]], + inputs=inputs_for_table2 + ) + outputs_for_table2 = [gr.HTML(label="Table code")] + + onlytable2_btn.click(fn=test_tableOcrOnly2, + inputs = inputs_for_table2, + outputs = outputs_for_table2, + api_name="table2" + ) + + + + +demo.launch(share=True) \ No newline at end of file diff --git a/cropped_table.png b/cropped_table.png new file mode 100644 index 0000000000000000000000000000000000000000..05708c5e5a87d3c493aa66649e0c8656fb1fc403 Binary files /dev/null and b/cropped_table.png differ diff --git a/cropped_table_0.png b/cropped_table_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f4cd408ba94ebbf9062240165cfa4f22486337d8 Binary files /dev/null and b/cropped_table_0.png differ diff --git a/cropped_table_1.png b/cropped_table_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2e2bb5ec81a55f0dd581e475320d9ac80d7238 Binary files /dev/null and b/cropped_table_1.png differ diff --git a/deepdoc/README.md b/deepdoc/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5c7235566f532e85e697f12d3a549022ac6ea4a9 --- /dev/null +++ b/deepdoc/README.md @@ -0,0 +1,122 @@ +English | [简体中文](./README_zh.md) + +# *Deep*Doc + +- [1. Introduction](#1) +- [2. Vision](#2) +- [3. Parser](#3) + + +## 1. Introduction + +With a bunch of documents from various domains with various formats and along with diverse retrieval requirements, +an accurate analysis becomes a very challenge task. *Deep*Doc is born for that purpose. +There are 2 parts in *Deep*Doc so far: vision and parser. +You can run the flowing test programs if you're interested in our results of OCR, layout recognition and TSR. +```bash +python deepdoc/vision/t_ocr.py -h +usage: t_ocr.py [-h] --inputs INPUTS [--output_dir OUTPUT_DIR] + +options: + -h, --help show this help message and exit + --inputs INPUTS Directory where to store images or PDFs, or a file path to a single image or PDF + --output_dir OUTPUT_DIR + Directory where to store the output images. Default: './ocr_outputs' +``` +```bash +python deepdoc/vision/t_recognizer.py -h +usage: t_recognizer.py [-h] --inputs INPUTS [--output_dir OUTPUT_DIR] [--threshold THRESHOLD] [--mode {layout,tsr}] + +options: + -h, --help show this help message and exit + --inputs INPUTS Directory where to store images or PDFs, or a file path to a single image or PDF + --output_dir OUTPUT_DIR + Directory where to store the output images. Default: './layouts_outputs' + --threshold THRESHOLD + A threshold to filter out detections. Default: 0.5 + --mode {layout,tsr} Task mode: layout recognition or table structure recognition +``` + +Our models are served on HuggingFace. If you have trouble downloading HuggingFace models, this might help!! +```bash +export HF_ENDPOINT=https://hf-mirror.com +``` + + +## 2. Vision + +We use vision information to resolve problems as human being. + - OCR. Since a lot of documents presented as images or at least be able to transform to image, + OCR is a very essential and fundamental or even universal solution for text extraction. + ```bash + python deepdoc/vision/t_ocr.py --inputs=path_to_images_or_pdfs --output_dir=path_to_store_result + ``` + The inputs could be directory to images or PDF, or a image or PDF. + You can look into the folder 'path_to_store_result' where has images which demonstrate the positions of results, + txt files which contain the OCR text. +
+ +
+ + - Layout recognition. Documents from different domain may have various layouts, + like, newspaper, magazine, book and résumé are distinct in terms of layout. + Only when machine have an accurate layout analysis, it can decide if these text parts are successive or not, + or this part needs Table Structure Recognition(TSR) to process, or this part is a figure and described with this caption. + We have 10 basic layout components which covers most cases: + - Text + - Title + - Figure + - Figure caption + - Table + - Table caption + - Header + - Footer + - Reference + - Equation + + Have a try on the following command to see the layout detection results. + ```bash + python deepdoc/vision/t_recognizer.py --inputs=path_to_images_or_pdfs --threshold=0.2 --mode=layout --output_dir=path_to_store_result + ``` + The inputs could be directory to images or PDF, or a image or PDF. + You can look into the folder 'path_to_store_result' where has images which demonstrate the detection results as following: +
+ +
+ + - Table Structure Recognition(TSR). Data table is a frequently used structure to present data including numbers or text. + And the structure of a table might be very complex, like hierarchy headers, spanning cells and projected row headers. + Along with TSR, we also reassemble the content into sentences which could be well comprehended by LLM. + We have five labels for TSR task: + - Column + - Row + - Column header + - Projected row header + - Spanning cell + + Have a try on the following command to see the layout detection results. + ```bash + python deepdoc/vision/t_recognizer.py --inputs=path_to_images_or_pdfs --threshold=0.2 --mode=tsr --output_dir=path_to_store_result + ``` + The inputs could be directory to images or PDF, or a image or PDF. + You can look into the folder 'path_to_store_result' where has both images and html pages which demonstrate the detection results as following: +
+ +
+ + +## 3. Parser + +Four kinds of document formats as PDF, DOCX, EXCEL and PPT have their corresponding parser. +The most complex one is PDF parser since PDF's flexibility. The output of PDF parser includes: + - Text chunks with their own positions in PDF(page number and rectangular positions). + - Tables with cropped image from the PDF, and contents which has already translated into natural language sentences. + - Figures with caption and text in the figures. + +### Résumé + +The résumé is a very complicated kind of document. A résumé which is composed of unstructured text +with various layouts could be resolved into structured data composed of nearly a hundred of fields. +We haven't opened the parser yet, as we open the processing method after parsing procedure. + + \ No newline at end of file diff --git a/deepdoc/__init__.py b/deepdoc/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2b1cff12fe96e0b6bf64f2ec8a211a7e1f38497d --- /dev/null +++ b/deepdoc/__init__.py @@ -0,0 +1,8 @@ + +""" +In deepdoc/__init__.py, import the class from ragFlow.py and make it available for import from the deepdoc package: +""" + +from .vision import RagFlow + +__all__ = ['RagFlow'] \ No newline at end of file diff --git a/deepdoc/models/.gitattributes b/deepdoc/models/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..a6344aac8c09253b3b630fb776ae94478aa0275b --- /dev/null +++ b/deepdoc/models/.gitattributes @@ -0,0 +1,35 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text diff --git a/deepdoc/models/README.md b/deepdoc/models/README.md new file mode 100644 index 0000000000000000000000000000000000000000..154df8298fab5ecf322016157858e08cd1bccbe1 --- /dev/null +++ b/deepdoc/models/README.md @@ -0,0 +1,3 @@ +--- +license: apache-2.0 +--- diff --git a/deepdoc/models/det.onnx b/deepdoc/models/det.onnx new file mode 100644 index 0000000000000000000000000000000000000000..d8e1a035c9a98358b8a7969a757f6e50f49bb3cd --- /dev/null +++ b/deepdoc/models/det.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30a86f5731181461d08021402766601e4302a9b9b9666be8aff402696339cdff +size 4745517 diff --git a/deepdoc/models/layout.laws.onnx b/deepdoc/models/layout.laws.onnx new file mode 100644 index 0000000000000000000000000000000000000000..86ad0bda0883e703e6065f2bf3c91354349d5b30 --- /dev/null +++ b/deepdoc/models/layout.laws.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:485a7ddf6889ef15a150bded7091ec1ea5467871f50a88f5f4297c66c1ecef1e +size 12246134 diff --git a/deepdoc/models/layout.manual.onnx b/deepdoc/models/layout.manual.onnx new file mode 100644 index 0000000000000000000000000000000000000000..86ad0bda0883e703e6065f2bf3c91354349d5b30 --- /dev/null +++ b/deepdoc/models/layout.manual.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:485a7ddf6889ef15a150bded7091ec1ea5467871f50a88f5f4297c66c1ecef1e +size 12246134 diff --git a/deepdoc/models/layout.onnx b/deepdoc/models/layout.onnx new file mode 100644 index 0000000000000000000000000000000000000000..86ad0bda0883e703e6065f2bf3c91354349d5b30 --- /dev/null +++ b/deepdoc/models/layout.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:485a7ddf6889ef15a150bded7091ec1ea5467871f50a88f5f4297c66c1ecef1e +size 12246134 diff --git a/deepdoc/models/layout.paper.onnx b/deepdoc/models/layout.paper.onnx new file mode 100644 index 0000000000000000000000000000000000000000..86ad0bda0883e703e6065f2bf3c91354349d5b30 --- /dev/null +++ b/deepdoc/models/layout.paper.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:485a7ddf6889ef15a150bded7091ec1ea5467871f50a88f5f4297c66c1ecef1e +size 12246134 diff --git a/deepdoc/models/ocr.res b/deepdoc/models/ocr.res new file mode 100644 index 0000000000000000000000000000000000000000..84b885d8352226e49b1d5d791b8f43a663e246aa --- /dev/null +++ b/deepdoc/models/ocr.res @@ -0,0 +1,6623 @@ +' +疗 +绚 +诚 +娇 +溜 +题 +贿 +者 +廖 +更 +纳 +加 +奉 +公 +一 +就 +汴 +计 +与 +路 +房 +原 +妇 +2 +0 +8 +- +7 +其 +> +: +] +, +, +骑 +刈 +全 +消 +昏 +傈 +安 +久 +钟 +嗅 +不 +影 +处 +驽 +蜿 +资 +关 +椤 +地 +瘸 +专 +问 +忖 +票 +嫉 +炎 +韵 +要 +月 +田 +节 +陂 +鄙 +捌 +备 +拳 +伺 +眼 +网 +盎 +大 +傍 +心 +东 +愉 +汇 +蹿 +科 +每 +业 +里 +航 +晏 +字 +平 +录 +先 +1 +3 +彤 +鲶 +产 +稍 +督 +腴 +有 +象 +岳 +注 +绍 +在 +泺 +文 +定 +核 +名 +水 +过 +理 +让 +偷 +率 +等 +这 +发 +” +为 +含 +肥 +酉 +相 +鄱 +七 +编 +猥 +锛 +日 +镀 +蒂 +掰 +倒 +辆 +栾 +栗 +综 +涩 +州 +雌 +滑 +馀 +了 +机 +块 +司 +宰 +甙 +兴 +矽 +抚 +保 +用 +沧 +秩 +如 +收 +息 +滥 +页 +疑 +埠 +! +! +姥 +异 +橹 +钇 +向 +下 +跄 +的 +椴 +沫 +国 +绥 +獠 +报 +开 +民 +蜇 +何 +分 +凇 +长 +讥 +藏 +掏 +施 +羽 +中 +讲 +派 +嘟 +人 +提 +浼 +间 +世 +而 +古 +多 +倪 +唇 +饯 +控 +庚 +首 +赛 +蜓 +味 +断 +制 +觉 +技 +替 +艰 +溢 +潮 +夕 +钺 +外 +摘 +枋 +动 +双 +单 +啮 +户 +枇 +确 +锦 +曜 +杜 +或 +能 +效 +霜 +盒 +然 +侗 +电 +晁 +放 +步 +鹃 +新 +杖 +蜂 +吒 +濂 +瞬 +评 +总 +隍 +对 +独 +合 +也 +是 +府 +青 +天 +诲 +墙 +组 +滴 +级 +邀 +帘 +示 +已 +时 +骸 +仄 +泅 +和 +遨 +店 +雇 +疫 +持 +巍 +踮 +境 +只 +亨 +目 +鉴 +崤 +闲 +体 +泄 +杂 +作 +般 +轰 +化 +解 +迂 +诿 +蛭 +璀 +腾 +告 +版 +服 +省 +师 +小 +规 +程 +线 +海 +办 +引 +二 +桧 +牌 +砺 +洄 +裴 +修 +图 +痫 +胡 +许 +犊 +事 +郛 +基 +柴 +呼 +食 +研 +奶 +律 +蛋 +因 +葆 +察 +戏 +褒 +戒 +再 +李 +骁 +工 +貂 +油 +鹅 +章 +啄 +休 +场 +给 +睡 +纷 +豆 +器 +捎 +说 +敏 +学 +会 +浒 +设 +诊 +格 +廓 +查 +来 +霓 +室 +溆 +¢ +诡 +寥 +焕 +舜 +柒 +狐 +回 +戟 +砾 +厄 +实 +翩 +尿 +五 +入 +径 +惭 +喹 +股 +宇 +篝 +| +; +美 +期 +云 +九 +祺 +扮 +靠 +锝 +槌 +系 +企 +酰 +阊 +暂 +蚕 +忻 +豁 +本 +羹 +执 +条 +钦 +H +獒 +限 +进 +季 +楦 +于 +芘 +玖 +铋 +茯 +未 +答 +粘 +括 +样 +精 +欠 +矢 +甥 +帷 +嵩 +扣 +令 +仔 +风 +皈 +行 +支 +部 +蓉 +刮 +站 +蜡 +救 +钊 +汗 +松 +嫌 +成 +可 +. +鹤 +院 +从 +交 +政 +怕 +活 +调 +球 +局 +验 +髌 +第 +韫 +谗 +串 +到 +圆 +年 +米 +/ +* +友 +忿 +检 +区 +看 +自 +敢 +刃 +个 +兹 +弄 +流 +留 +同 +没 +齿 +星 +聆 +轼 +湖 +什 +三 +建 +蛔 +儿 +椋 +汕 +震 +颧 +鲤 +跟 +力 +情 +璺 +铨 +陪 +务 +指 +族 +训 +滦 +鄣 +濮 +扒 +商 +箱 +十 +召 +慷 +辗 +所 +莞 +管 +护 +臭 +横 +硒 +嗓 +接 +侦 +六 +露 +党 +馋 +驾 +剖 +高 +侬 +妪 +幂 +猗 +绺 +骐 +央 +酐 +孝 +筝 +课 +徇 +缰 +门 +男 +西 +项 +句 +谙 +瞒 +秃 +篇 +教 +碲 +罚 +声 +呐 +景 +前 +富 +嘴 +鳌 +稀 +免 +朋 +啬 +睐 +去 +赈 +鱼 +住 +肩 +愕 +速 +旁 +波 +厅 +健 +茼 +厥 +鲟 +谅 +投 +攸 +炔 +数 +方 +击 +呋 +谈 +绩 +别 +愫 +僚 +躬 +鹧 +胪 +炳 +招 +喇 +膨 +泵 +蹦 +毛 +结 +5 +4 +谱 +识 +陕 +粽 +婚 +拟 +构 +且 +搜 +任 +潘 +比 +郢 +妨 +醪 +陀 +桔 +碘 +扎 +选 +哈 +骷 +楷 +亿 +明 +缆 +脯 +监 +睫 +逻 +婵 +共 +赴 +淝 +凡 +惦 +及 +达 +揖 +谩 +澹 +减 +焰 +蛹 +番 +祁 +柏 +员 +禄 +怡 +峤 +龙 +白 +叽 +生 +闯 +起 +细 +装 +谕 +竟 +聚 +钙 +上 +导 +渊 +按 +艾 +辘 +挡 +耒 +盹 +饪 +臀 +记 +邮 +蕙 +受 +各 +医 +搂 +普 +滇 +朗 +茸 +带 +翻 +酚 +( +光 +堤 +墟 +蔷 +万 +幻 +〓 +瑙 +辈 +昧 +盏 +亘 +蛀 +吉 +铰 +请 +子 +假 +闻 +税 +井 +诩 +哨 +嫂 +好 +面 +琐 +校 +馊 +鬣 +缂 +营 +访 +炖 +占 +农 +缀 +否 +经 +钚 +棵 +趟 +张 +亟 +吏 +茶 +谨 +捻 +论 +迸 +堂 +玉 +信 +吧 +瞠 +乡 +姬 +寺 +咬 +溏 +苄 +皿 +意 +赉 +宝 +尔 +钰 +艺 +特 +唳 +踉 +都 +荣 +倚 +登 +荐 +丧 +奇 +涵 +批 +炭 +近 +符 +傩 +感 +道 +着 +菊 +虹 +仲 +众 +懈 +濯 +颞 +眺 +南 +释 +北 +缝 +标 +既 +茗 +整 +撼 +迤 +贲 +挎 +耱 +拒 +某 +妍 +卫 +哇 +英 +矶 +藩 +治 +他 +元 +领 +膜 +遮 +穗 +蛾 +飞 +荒 +棺 +劫 +么 +市 +火 +温 +拈 +棚 +洼 +转 +果 +奕 +卸 +迪 +伸 +泳 +斗 +邡 +侄 +涨 +屯 +萋 +胭 +氡 +崮 +枞 +惧 +冒 +彩 +斜 +手 +豚 +随 +旭 +淑 +妞 +形 +菌 +吲 +沱 +争 +驯 +歹 +挟 +兆 +柱 +传 +至 +包 +内 +响 +临 +红 +功 +弩 +衡 +寂 +禁 +老 +棍 +耆 +渍 +织 +害 +氵 +渑 +布 +载 +靥 +嗬 +虽 +苹 +咨 +娄 +库 +雉 +榜 +帜 +嘲 +套 +瑚 +亲 +簸 +欧 +边 +6 +腿 +旮 +抛 +吹 +瞳 +得 +镓 +梗 +厨 +继 +漾 +愣 +憨 +士 +策 +窑 +抑 +躯 +襟 +脏 +参 +贸 +言 +干 +绸 +鳄 +穷 +藜 +音 +折 +详 +) +举 +悍 +甸 +癌 +黎 +谴 +死 +罩 +迁 +寒 +驷 +袖 +媒 +蒋 +掘 +模 +纠 +恣 +观 +祖 +蛆 +碍 +位 +稿 +主 +澧 +跌 +筏 +京 +锏 +帝 +贴 +证 +糠 +才 +黄 +鲸 +略 +炯 +饱 +四 +出 +园 +犀 +牧 +容 +汉 +杆 +浈 +汰 +瑷 +造 +虫 +瘩 +怪 +驴 +济 +应 +花 +沣 +谔 +夙 +旅 +价 +矿 +以 +考 +s +u +呦 +晒 +巡 +茅 +准 +肟 +瓴 +詹 +仟 +褂 +译 +桌 +混 +宁 +怦 +郑 +抿 +些 +余 +鄂 +饴 +攒 +珑 +群 +阖 +岔 +琨 +藓 +预 +环 +洮 +岌 +宀 +杲 +瀵 +最 +常 +囡 +周 +踊 +女 +鼓 +袭 +喉 +简 +范 +薯 +遐 +疏 +粱 +黜 +禧 +法 +箔 +斤 +遥 +汝 +奥 +直 +贞 +撑 +置 +绱 +集 +她 +馅 +逗 +钧 +橱 +魉 +[ +恙 +躁 +唤 +9 +旺 +膘 +待 +脾 +惫 +购 +吗 +依 +盲 +度 +瘿 +蠖 +俾 +之 +镗 +拇 +鲵 +厝 +簧 +续 +款 +展 +啃 +表 +剔 +品 +钻 +腭 +损 +清 +锶 +统 +涌 +寸 +滨 +贪 +链 +吠 +冈 +伎 +迥 +咏 +吁 +览 +防 +迅 +失 +汾 +阔 +逵 +绀 +蔑 +列 +川 +凭 +努 +熨 +揪 +利 +俱 +绉 +抢 +鸨 +我 +即 +责 +膦 +易 +毓 +鹊 +刹 +玷 +岿 +空 +嘞 +绊 +排 +术 +估 +锷 +违 +们 +苟 +铜 +播 +肘 +件 +烫 +审 +鲂 +广 +像 +铌 +惰 +铟 +巳 +胍 +鲍 +康 +憧 +色 +恢 +想 +拷 +尤 +疳 +知 +S +Y +F +D +A +峄 +裕 +帮 +握 +搔 +氐 +氘 +难 +墒 +沮 +雨 +叁 +缥 +悴 +藐 +湫 +娟 +苑 +稠 +颛 +簇 +后 +阕 +闭 +蕤 +缚 +怎 +佞 +码 +嘤 +蔡 +痊 +舱 +螯 +帕 +赫 +昵 +升 +烬 +岫 +、 +疵 +蜻 +髁 +蕨 +隶 +烛 +械 +丑 +盂 +梁 +强 +鲛 +由 +拘 +揉 +劭 +龟 +撤 +钩 +呕 +孛 +费 +妻 +漂 +求 +阑 +崖 +秤 +甘 +通 +深 +补 +赃 +坎 +床 +啪 +承 +吼 +量 +暇 +钼 +烨 +阂 +擎 +脱 +逮 +称 +P +神 +属 +矗 +华 +届 +狍 +葑 +汹 +育 +患 +窒 +蛰 +佼 +静 +槎 +运 +鳗 +庆 +逝 +曼 +疱 +克 +代 +官 +此 +麸 +耧 +蚌 +晟 +例 +础 +榛 +副 +测 +唰 +缢 +迹 +灬 +霁 +身 +岁 +赭 +扛 +又 +菡 +乜 +雾 +板 +读 +陷 +徉 +贯 +郁 +虑 +变 +钓 +菜 +圾 +现 +琢 +式 +乐 +维 +渔 +浜 +左 +吾 +脑 +钡 +警 +T +啵 +拴 +偌 +漱 +湿 +硕 +止 +骼 +魄 +积 +燥 +联 +踢 +玛 +则 +窿 +见 +振 +畿 +送 +班 +钽 +您 +赵 +刨 +印 +讨 +踝 +籍 +谡 +舌 +崧 +汽 +蔽 +沪 +酥 +绒 +怖 +财 +帖 +肱 +私 +莎 +勋 +羔 +霸 +励 +哼 +帐 +将 +帅 +渠 +纪 +婴 +娩 +岭 +厘 +滕 +吻 +伤 +坝 +冠 +戊 +隆 +瘁 +介 +涧 +物 +黍 +并 +姗 +奢 +蹑 +掣 +垸 +锴 +命 +箍 +捉 +病 +辖 +琰 +眭 +迩 +艘 +绌 +繁 +寅 +若 +毋 +思 +诉 +类 +诈 +燮 +轲 +酮 +狂 +重 +反 +职 +筱 +县 +委 +磕 +绣 +奖 +晋 +濉 +志 +徽 +肠 +呈 +獐 +坻 +口 +片 +碰 +几 +村 +柿 +劳 +料 +获 +亩 +惕 +晕 +厌 +号 +罢 +池 +正 +鏖 +煨 +家 +棕 +复 +尝 +懋 +蜥 +锅 +岛 +扰 +队 +坠 +瘾 +钬 +@ +卧 +疣 +镇 +譬 +冰 +彷 +频 +黯 +据 +垄 +采 +八 +缪 +瘫 +型 +熹 +砰 +楠 +襁 +箐 +但 +嘶 +绳 +啤 +拍 +盥 +穆 +傲 +洗 +盯 +塘 +怔 +筛 +丿 +台 +恒 +喂 +葛 +永 +¥ +烟 +酒 +桦 +书 +砂 +蚝 +缉 +态 +瀚 +袄 +圳 +轻 +蛛 +超 +榧 +遛 +姒 +奘 +铮 +右 +荽 +望 +偻 +卡 +丶 +氰 +附 +做 +革 +索 +戚 +坨 +桷 +唁 +垅 +榻 +岐 +偎 +坛 +莨 +山 +殊 +微 +骇 +陈 +爨 +推 +嗝 +驹 +澡 +藁 +呤 +卤 +嘻 +糅 +逛 +侵 +郓 +酌 +德 +摇 +※ +鬃 +被 +慨 +殡 +羸 +昌 +泡 +戛 +鞋 +河 +宪 +沿 +玲 +鲨 +翅 +哽 +源 +铅 +语 +照 +邯 +址 +荃 +佬 +顺 +鸳 +町 +霭 +睾 +瓢 +夸 +椁 +晓 +酿 +痈 +咔 +侏 +券 +噎 +湍 +签 +嚷 +离 +午 +尚 +社 +锤 +背 +孟 +使 +浪 +缦 +潍 +鞅 +军 +姹 +驶 +笑 +鳟 +鲁 +》 +孽 +钜 +绿 +洱 +礴 +焯 +椰 +颖 +囔 +乌 +孔 +巴 +互 +性 +椽 +哞 +聘 +昨 +早 +暮 +胶 +炀 +隧 +低 +彗 +昝 +铁 +呓 +氽 +藉 +喔 +癖 +瑗 +姨 +权 +胱 +韦 +堑 +蜜 +酋 +楝 +砝 +毁 +靓 +歙 +锲 +究 +屋 +喳 +骨 +辨 +碑 +武 +鸠 +宫 +辜 +烊 +适 +坡 +殃 +培 +佩 +供 +走 +蜈 +迟 +翼 +况 +姣 +凛 +浔 +吃 +飘 +债 +犟 +金 +促 +苛 +崇 +坂 +莳 +畔 +绂 +兵 +蠕 +斋 +根 +砍 +亢 +欢 +恬 +崔 +剁 +餐 +榫 +快 +扶 +‖ +濒 +缠 +鳜 +当 +彭 +驭 +浦 +篮 +昀 +锆 +秸 +钳 +弋 +娣 +瞑 +夷 +龛 +苫 +拱 +致 +% +嵊 +障 +隐 +弑 +初 +娓 +抉 +汩 +累 +蓖 +" +唬 +助 +苓 +昙 +押 +毙 +破 +城 +郧 +逢 +嚏 +獭 +瞻 +溱 +婿 +赊 +跨 +恼 +璧 +萃 +姻 +貉 +灵 +炉 +密 +氛 +陶 +砸 +谬 +衔 +点 +琛 +沛 +枳 +层 +岱 +诺 +脍 +榈 +埂 +征 +冷 +裁 +打 +蹴 +素 +瘘 +逞 +蛐 +聊 +激 +腱 +萘 +踵 +飒 +蓟 +吆 +取 +咙 +簋 +涓 +矩 +曝 +挺 +揣 +座 +你 +史 +舵 +焱 +尘 +苏 +笈 +脚 +溉 +榨 +诵 +樊 +邓 +焊 +义 +庶 +儋 +蟋 +蒲 +赦 +呷 +杞 +诠 +豪 +还 +试 +颓 +茉 +太 +除 +紫 +逃 +痴 +草 +充 +鳕 +珉 +祗 +墨 +渭 +烩 +蘸 +慕 +璇 +镶 +穴 +嵘 +恶 +骂 +险 +绋 +幕 +碉 +肺 +戳 +刘 +潞 +秣 +纾 +潜 +銮 +洛 +须 +罘 +销 +瘪 +汞 +兮 +屉 +r +林 +厕 +质 +探 +划 +狸 +殚 +善 +煊 +烹 +〒 +锈 +逯 +宸 +辍 +泱 +柚 +袍 +远 +蹋 +嶙 +绝 +峥 +娥 +缍 +雀 +徵 +认 +镱 +谷 += +贩 +勉 +撩 +鄯 +斐 +洋 +非 +祚 +泾 +诒 +饿 +撬 +威 +晷 +搭 +芍 +锥 +笺 +蓦 +候 +琊 +档 +礁 +沼 +卵 +荠 +忑 +朝 +凹 +瑞 +头 +仪 +弧 +孵 +畏 +铆 +突 +衲 +车 +浩 +气 +茂 +悖 +厢 +枕 +酝 +戴 +湾 +邹 +飚 +攘 +锂 +写 +宵 +翁 +岷 +无 +喜 +丈 +挑 +嗟 +绛 +殉 +议 +槽 +具 +醇 +淞 +笃 +郴 +阅 +饼 +底 +壕 +砚 +弈 +询 +缕 +庹 +翟 +零 +筷 +暨 +舟 +闺 +甯 +撞 +麂 +茌 +蔼 +很 +珲 +捕 +棠 +角 +阉 +媛 +娲 +诽 +剿 +尉 +爵 +睬 +韩 +诰 +匣 +危 +糍 +镯 +立 +浏 +阳 +少 +盆 +舔 +擘 +匪 +申 +尬 +铣 +旯 +抖 +赘 +瓯 +居 +ˇ +哮 +游 +锭 +茏 +歌 +坏 +甚 +秒 +舞 +沙 +仗 +劲 +潺 +阿 +燧 +郭 +嗖 +霏 +忠 +材 +奂 +耐 +跺 +砀 +输 +岖 +媳 +氟 +极 +摆 +灿 +今 +扔 +腻 +枝 +奎 +药 +熄 +吨 +话 +q +额 +慑 +嘌 +协 +喀 +壳 +埭 +视 +著 +於 +愧 +陲 +翌 +峁 +颅 +佛 +腹 +聋 +侯 +咎 +叟 +秀 +颇 +存 +较 +罪 +哄 +岗 +扫 +栏 +钾 +羌 +己 +璨 +枭 +霉 +煌 +涸 +衿 +键 +镝 +益 +岢 +奏 +连 +夯 +睿 +冥 +均 +糖 +狞 +蹊 +稻 +爸 +刿 +胥 +煜 +丽 +肿 +璃 +掸 +跚 +灾 +垂 +樾 +濑 +乎 +莲 +窄 +犹 +撮 +战 +馄 +软 +络 +显 +鸢 +胸 +宾 +妲 +恕 +埔 +蝌 +份 +遇 +巧 +瞟 +粒 +恰 +剥 +桡 +博 +讯 +凯 +堇 +阶 +滤 +卖 +斌 +骚 +彬 +兑 +磺 +樱 +舷 +两 +娱 +福 +仃 +差 +找 +桁 +÷ +净 +把 +阴 +污 +戬 +雷 +碓 +蕲 +楚 +罡 +焖 +抽 +妫 +咒 +仑 +闱 +尽 +邑 +菁 +爱 +贷 +沥 +鞑 +牡 +嗉 +崴 +骤 +塌 +嗦 +订 +拮 +滓 +捡 +锻 +次 +坪 +杩 +臃 +箬 +融 +珂 +鹗 +宗 +枚 +降 +鸬 +妯 +阄 +堰 +盐 +毅 +必 +杨 +崃 +俺 +甬 +状 +莘 +货 +耸 +菱 +腼 +铸 +唏 +痤 +孚 +澳 +懒 +溅 +翘 +疙 +杷 +淼 +缙 +骰 +喊 +悉 +砻 +坷 +艇 +赁 +界 +谤 +纣 +宴 +晃 +茹 +归 +饭 +梢 +铡 +街 +抄 +肼 +鬟 +苯 +颂 +撷 +戈 +炒 +咆 +茭 +瘙 +负 +仰 +客 +琉 +铢 +封 +卑 +珥 +椿 +镧 +窨 +鬲 +寿 +御 +袤 +铃 +萎 +砖 +餮 +脒 +裳 +肪 +孕 +嫣 +馗 +嵇 +恳 +氯 +江 +石 +褶 +冢 +祸 +阻 +狈 +羞 +银 +靳 +透 +咳 +叼 +敷 +芷 +啥 +它 +瓤 +兰 +痘 +懊 +逑 +肌 +往 +捺 +坊 +甩 +呻 +〃 +沦 +忘 +膻 +祟 +菅 +剧 +崆 +智 +坯 +臧 +霍 +墅 +攻 +眯 +倘 +拢 +骠 +铐 +庭 +岙 +瓠 +′ +缺 +泥 +迢 +捶 +? +? +郏 +喙 +掷 +沌 +纯 +秘 +种 +听 +绘 +固 +螨 +团 +香 +盗 +妒 +埚 +蓝 +拖 +旱 +荞 +铀 +血 +遏 +汲 +辰 +叩 +拽 +幅 +硬 +惶 +桀 +漠 +措 +泼 +唑 +齐 +肾 +念 +酱 +虚 +屁 +耶 +旗 +砦 +闵 +婉 +馆 +拭 +绅 +韧 +忏 +窝 +醋 +葺 +顾 +辞 +倜 +堆 +辋 +逆 +玟 +贱 +疾 +董 +惘 +倌 +锕 +淘 +嘀 +莽 +俭 +笏 +绑 +鲷 +杈 +择 +蟀 +粥 +嗯 +驰 +逾 +案 +谪 +褓 +胫 +哩 +昕 +颚 +鲢 +绠 +躺 +鹄 +崂 +儒 +俨 +丝 +尕 +泌 +啊 +萸 +彰 +幺 +吟 +骄 +苣 +弦 +脊 +瑰 +〈 +诛 +镁 +析 +闪 +剪 +侧 +哟 +框 +螃 +守 +嬗 +燕 +狭 +铈 +缮 +概 +迳 +痧 +鲲 +俯 +售 +笼 +痣 +扉 +挖 +满 +咋 +援 +邱 +扇 +歪 +便 +玑 +绦 +峡 +蛇 +叨 +〖 +泽 +胃 +斓 +喋 +怂 +坟 +猪 +该 +蚬 +炕 +弥 +赞 +棣 +晔 +娠 +挲 +狡 +创 +疖 +铕 +镭 +稷 +挫 +弭 +啾 +翔 +粉 +履 +苘 +哦 +楼 +秕 +铂 +土 +锣 +瘟 +挣 +栉 +习 +享 +桢 +袅 +磨 +桂 +谦 +延 +坚 +蔚 +噗 +署 +谟 +猬 +钎 +恐 +嬉 +雒 +倦 +衅 +亏 +璩 +睹 +刻 +殿 +王 +算 +雕 +麻 +丘 +柯 +骆 +丸 +塍 +谚 +添 +鲈 +垓 +桎 +蚯 +芥 +予 +飕 +镦 +谌 +窗 +醚 +菀 +亮 +搪 +莺 +蒿 +羁 +足 +J +真 +轶 +悬 +衷 +靛 +翊 +掩 +哒 +炅 +掐 +冼 +妮 +l +谐 +稚 +荆 +擒 +犯 +陵 +虏 +浓 +崽 +刍 +陌 +傻 +孜 +千 +靖 +演 +矜 +钕 +煽 +杰 +酗 +渗 +伞 +栋 +俗 +泫 +戍 +罕 +沾 +疽 +灏 +煦 +芬 +磴 +叱 +阱 +榉 +湃 +蜀 +叉 +醒 +彪 +租 +郡 +篷 +屎 +良 +垢 +隗 +弱 +陨 +峪 +砷 +掴 +颁 +胎 +雯 +绵 +贬 +沐 +撵 +隘 +篙 +暖 +曹 +陡 +栓 +填 +臼 +彦 +瓶 +琪 +潼 +哪 +鸡 +摩 +啦 +俟 +锋 +域 +耻 +蔫 +疯 +纹 +撇 +毒 +绶 +痛 +酯 +忍 +爪 +赳 +歆 +嘹 +辕 +烈 +册 +朴 +钱 +吮 +毯 +癜 +娃 +谀 +邵 +厮 +炽 +璞 +邃 +丐 +追 +词 +瓒 +忆 +轧 +芫 +谯 +喷 +弟 +半 +冕 +裙 +掖 +墉 +绮 +寝 +苔 +势 +顷 +褥 +切 +衮 +君 +佳 +嫒 +蚩 +霞 +佚 +洙 +逊 +镖 +暹 +唛 +& +殒 +顶 +碗 +獗 +轭 +铺 +蛊 +废 +恹 +汨 +崩 +珍 +那 +杵 +曲 +纺 +夏 +薰 +傀 +闳 +淬 +姘 +舀 +拧 +卷 +楂 +恍 +讪 +厩 +寮 +篪 +赓 +乘 +灭 +盅 +鞣 +沟 +慎 +挂 +饺 +鼾 +杳 +树 +缨 +丛 +絮 +娌 +臻 +嗳 +篡 +侩 +述 +衰 +矛 +圈 +蚜 +匕 +筹 +匿 +濞 +晨 +叶 +骋 +郝 +挚 +蚴 +滞 +增 +侍 +描 +瓣 +吖 +嫦 +蟒 +匾 +圣 +赌 +毡 +癞 +恺 +百 +曳 +需 +篓 +肮 +庖 +帏 +卿 +驿 +遗 +蹬 +鬓 +骡 +歉 +芎 +胳 +屐 +禽 +烦 +晌 +寄 +媾 +狄 +翡 +苒 +船 +廉 +终 +痞 +殇 +々 +畦 +饶 +改 +拆 +悻 +萄 +£ +瓿 +乃 +訾 +桅 +匮 +溧 +拥 +纱 +铍 +骗 +蕃 +龋 +缬 +父 +佐 +疚 +栎 +醍 +掳 +蓄 +x +惆 +颜 +鲆 +榆 +〔 +猎 +敌 +暴 +谥 +鲫 +贾 +罗 +玻 +缄 +扦 +芪 +癣 +落 +徒 +臾 +恿 +猩 +托 +邴 +肄 +牵 +春 +陛 +耀 +刊 +拓 +蓓 +邳 +堕 +寇 +枉 +淌 +啡 +湄 +兽 +酷 +萼 +碚 +濠 +萤 +夹 +旬 +戮 +梭 +琥 +椭 +昔 +勺 +蜊 +绐 +晚 +孺 +僵 +宣 +摄 +冽 +旨 +萌 +忙 +蚤 +眉 +噼 +蟑 +付 +契 +瓜 +悼 +颡 +壁 +曾 +窕 +颢 +澎 +仿 +俑 +浑 +嵌 +浣 +乍 +碌 +褪 +乱 +蔟 +隙 +玩 +剐 +葫 +箫 +纲 +围 +伐 +决 +伙 +漩 +瑟 +刑 +肓 +镳 +缓 +蹭 +氨 +皓 +典 +畲 +坍 +铑 +檐 +塑 +洞 +倬 +储 +胴 +淳 +戾 +吐 +灼 +惺 +妙 +毕 +珐 +缈 +虱 +盖 +羰 +鸿 +磅 +谓 +髅 +娴 +苴 +唷 +蚣 +霹 +抨 +贤 +唠 +犬 +誓 +逍 +庠 +逼 +麓 +籼 +釉 +呜 +碧 +秧 +氩 +摔 +霄 +穸 +纨 +辟 +妈 +映 +完 +牛 +缴 +嗷 +炊 +恩 +荔 +茆 +掉 +紊 +慌 +莓 +羟 +阙 +萁 +磐 +另 +蕹 +辱 +鳐 +湮 +吡 +吩 +唐 +睦 +垠 +舒 +圜 +冗 +瞿 +溺 +芾 +囱 +匠 +僳 +汐 +菩 +饬 +漓 +黑 +霰 +浸 +濡 +窥 +毂 +蒡 +兢 +驻 +鹉 +芮 +诙 +迫 +雳 +厂 +忐 +臆 +猴 +鸣 +蚪 +栈 +箕 +羡 +渐 +莆 +捍 +眈 +哓 +趴 +蹼 +埕 +嚣 +骛 +宏 +淄 +斑 +噜 +严 +瑛 +垃 +椎 +诱 +压 +庾 +绞 +焘 +廿 +抡 +迄 +棘 +夫 +纬 +锹 +眨 +瞌 +侠 +脐 +竞 +瀑 +孳 +骧 +遁 +姜 +颦 +荪 +滚 +萦 +伪 +逸 +粳 +爬 +锁 +矣 +役 +趣 +洒 +颔 +诏 +逐 +奸 +甭 +惠 +攀 +蹄 +泛 +尼 +拼 +阮 +鹰 +亚 +颈 +惑 +勒 +〉 +际 +肛 +爷 +刚 +钨 +丰 +养 +冶 +鲽 +辉 +蔻 +画 +覆 +皴 +妊 +麦 +返 +醉 +皂 +擀 +〗 +酶 +凑 +粹 +悟 +诀 +硖 +港 +卜 +z +杀 +涕 +± +舍 +铠 +抵 +弛 +段 +敝 +镐 +奠 +拂 +轴 +跛 +袱 +e +t +沉 +菇 +俎 +薪 +峦 +秭 +蟹 +历 +盟 +菠 +寡 +液 +肢 +喻 +染 +裱 +悱 +抱 +氙 +赤 +捅 +猛 +跑 +氮 +谣 +仁 +尺 +辊 +窍 +烙 +衍 +架 +擦 +倏 +璐 +瑁 +币 +楞 +胖 +夔 +趸 +邛 +惴 +饕 +虔 +蝎 +§ +哉 +贝 +宽 +辫 +炮 +扩 +饲 +籽 +魏 +菟 +锰 +伍 +猝 +末 +琳 +哚 +蛎 +邂 +呀 +姿 +鄞 +却 +歧 +仙 +恸 +椐 +森 +牒 +寤 +袒 +婆 +虢 +雅 +钉 +朵 +贼 +欲 +苞 +寰 +故 +龚 +坭 +嘘 +咫 +礼 +硷 +兀 +睢 +汶 +’ +铲 +烧 +绕 +诃 +浃 +钿 +哺 +柜 +讼 +颊 +璁 +腔 +洽 +咐 +脲 +簌 +筠 +镣 +玮 +鞠 +谁 +兼 +姆 +挥 +梯 +蝴 +谘 +漕 +刷 +躏 +宦 +弼 +b +垌 +劈 +麟 +莉 +揭 +笙 +渎 +仕 +嗤 +仓 +配 +怏 +抬 +错 +泯 +镊 +孰 +猿 +邪 +仍 +秋 +鼬 +壹 +歇 +吵 +炼 +< +尧 +射 +柬 +廷 +胧 +霾 +凳 +隋 +肚 +浮 +梦 +祥 +株 +堵 +退 +L +鹫 +跎 +凶 +毽 +荟 +炫 +栩 +玳 +甜 +沂 +鹿 +顽 +伯 +爹 +赔 +蛴 +徐 +匡 +欣 +狰 +缸 +雹 +蟆 +疤 +默 +沤 +啜 +痂 +衣 +禅 +w +i +h +辽 +葳 +黝 +钗 +停 +沽 +棒 +馨 +颌 +肉 +吴 +硫 +悯 +劾 +娈 +马 +啧 +吊 +悌 +镑 +峭 +帆 +瀣 +涉 +咸 +疸 +滋 +泣 +翦 +拙 +癸 +钥 +蜒 ++ +尾 +庄 +凝 +泉 +婢 +渴 +谊 +乞 +陆 +锉 +糊 +鸦 +淮 +I +B +N +晦 +弗 +乔 +庥 +葡 +尻 +席 +橡 +傣 +渣 +拿 +惩 +麋 +斛 +缃 +矮 +蛏 +岘 +鸽 +姐 +膏 +催 +奔 +镒 +喱 +蠡 +摧 +钯 +胤 +柠 +拐 +璋 +鸥 +卢 +荡 +倾 +^ +_ +珀 +逄 +萧 +塾 +掇 +贮 +笆 +聂 +圃 +冲 +嵬 +M +滔 +笕 +值 +炙 +偶 +蜱 +搐 +梆 +汪 +蔬 +腑 +鸯 +蹇 +敞 +绯 +仨 +祯 +谆 +梧 +糗 +鑫 +啸 +豺 +囹 +猾 +巢 +柄 +瀛 +筑 +踌 +沭 +暗 +苁 +鱿 +蹉 +脂 +蘖 +牢 +热 +木 +吸 +溃 +宠 +序 +泞 +偿 +拜 +檩 +厚 +朐 +毗 +螳 +吞 +媚 +朽 +担 +蝗 +橘 +畴 +祈 +糟 +盱 +隼 +郜 +惜 +珠 +裨 +铵 +焙 +琚 +唯 +咚 +噪 +骊 +丫 +滢 +勤 +棉 +呸 +咣 +淀 +隔 +蕾 +窈 +饨 +挨 +煅 +短 +匙 +粕 +镜 +赣 +撕 +墩 +酬 +馁 +豌 +颐 +抗 +酣 +氓 +佑 +搁 +哭 +递 +耷 +涡 +桃 +贻 +碣 +截 +瘦 +昭 +镌 +蔓 +氚 +甲 +猕 +蕴 +蓬 +散 +拾 +纛 +狼 +猷 +铎 +埋 +旖 +矾 +讳 +囊 +糜 +迈 +粟 +蚂 +紧 +鲳 +瘢 +栽 +稼 +羊 +锄 +斟 +睁 +桥 +瓮 +蹙 +祉 +醺 +鼻 +昱 +剃 +跳 +篱 +跷 +蒜 +翎 +宅 +晖 +嗑 +壑 +峻 +癫 +屏 +狠 +陋 +袜 +途 +憎 +祀 +莹 +滟 +佶 +溥 +臣 +约 +盛 +峰 +磁 +慵 +婪 +拦 +莅 +朕 +鹦 +粲 +裤 +哎 +疡 +嫖 +琵 +窟 +堪 +谛 +嘉 +儡 +鳝 +斩 +郾 +驸 +酊 +妄 +胜 +贺 +徙 +傅 +噌 +钢 +栅 +庇 +恋 +匝 +巯 +邈 +尸 +锚 +粗 +佟 +蛟 +薹 +纵 +蚊 +郅 +绢 +锐 +苗 +俞 +篆 +淆 +膀 +鲜 +煎 +诶 +秽 +寻 +涮 +刺 +怀 +噶 +巨 +褰 +魅 +灶 +灌 +桉 +藕 +谜 +舸 +薄 +搀 +恽 +借 +牯 +痉 +渥 +愿 +亓 +耘 +杠 +柩 +锔 +蚶 +钣 +珈 +喘 +蹒 +幽 +赐 +稗 +晤 +莱 +泔 +扯 +肯 +菪 +裆 +腩 +豉 +疆 +骜 +腐 +倭 +珏 +唔 +粮 +亡 +润 +慰 +伽 +橄 +玄 +誉 +醐 +胆 +龊 +粼 +塬 +陇 +彼 +削 +嗣 +绾 +芽 +妗 +垭 +瘴 +爽 +薏 +寨 +龈 +泠 +弹 +赢 +漪 +猫 +嘧 +涂 +恤 +圭 +茧 +烽 +屑 +痕 +巾 +赖 +荸 +凰 +腮 +畈 +亵 +蹲 +偃 +苇 +澜 +艮 +换 +骺 +烘 +苕 +梓 +颉 +肇 +哗 +悄 +氤 +涠 +葬 +屠 +鹭 +植 +竺 +佯 +诣 +鲇 +瘀 +鲅 +邦 +移 +滁 +冯 +耕 +癔 +戌 +茬 +沁 +巩 +悠 +湘 +洪 +痹 +锟 +循 +谋 +腕 +鳃 +钠 +捞 +焉 +迎 +碱 +伫 +急 +榷 +奈 +邝 +卯 +辄 +皲 +卟 +醛 +畹 +忧 +稳 +雄 +昼 +缩 +阈 +睑 +扌 +耗 +曦 +涅 +捏 +瞧 +邕 +淖 +漉 +铝 +耦 +禹 +湛 +喽 +莼 +琅 +诸 +苎 +纂 +硅 +始 +嗨 +傥 +燃 +臂 +赅 +嘈 +呆 +贵 +屹 +壮 +肋 +亍 +蚀 +卅 +豹 +腆 +邬 +迭 +浊 +} +童 +螂 +捐 +圩 +勐 +触 +寞 +汊 +壤 +荫 +膺 +渌 +芳 +懿 +遴 +螈 +泰 +蓼 +蛤 +茜 +舅 +枫 +朔 +膝 +眙 +避 +梅 +判 +鹜 +璜 +牍 +缅 +垫 +藻 +黔 +侥 +惚 +懂 +踩 +腰 +腈 +札 +丞 +唾 +慈 +顿 +摹 +荻 +琬 +~ +斧 +沈 +滂 +胁 +胀 +幄 +莜 +Z +匀 +鄄 +掌 +绰 +茎 +焚 +赋 +萱 +谑 +汁 +铒 +瞎 +夺 +蜗 +野 +娆 +冀 +弯 +篁 +懵 +灞 +隽 +芡 +脘 +俐 +辩 +芯 +掺 +喏 +膈 +蝈 +觐 +悚 +踹 +蔗 +熠 +鼠 +呵 +抓 +橼 +峨 +畜 +缔 +禾 +崭 +弃 +熊 +摒 +凸 +拗 +穹 +蒙 +抒 +祛 +劝 +闫 +扳 +阵 +醌 +踪 +喵 +侣 +搬 +仅 +荧 +赎 +蝾 +琦 +买 +婧 +瞄 +寓 +皎 +冻 +赝 +箩 +莫 +瞰 +郊 +笫 +姝 +筒 +枪 +遣 +煸 +袋 +舆 +痱 +涛 +母 +〇 +启 +践 +耙 +绲 +盘 +遂 +昊 +搞 +槿 +诬 +纰 +泓 +惨 +檬 +亻 +越 +C +o +憩 +熵 +祷 +钒 +暧 +塔 +阗 +胰 +咄 +娶 +魔 +琶 +钞 +邻 +扬 +杉 +殴 +咽 +弓 +〆 +髻 +】 +吭 +揽 +霆 +拄 +殖 +脆 +彻 +岩 +芝 +勃 +辣 +剌 +钝 +嘎 +甄 +佘 +皖 +伦 +授 +徕 +憔 +挪 +皇 +庞 +稔 +芜 +踏 +溴 +兖 +卒 +擢 +饥 +鳞 +煲 +‰ +账 +颗 +叻 +斯 +捧 +鳍 +琮 +讹 +蛙 +纽 +谭 +酸 +兔 +莒 +睇 +伟 +觑 +羲 +嗜 +宜 +褐 +旎 +辛 +卦 +诘 +筋 +鎏 +溪 +挛 +熔 +阜 +晰 +鳅 +丢 +奚 +灸 +呱 +献 +陉 +黛 +鸪 +甾 +萨 +疮 +拯 +洲 +疹 +辑 +叙 +恻 +谒 +允 +柔 +烂 +氏 +逅 +漆 +拎 +惋 +扈 +湟 +纭 +啕 +掬 +擞 +哥 +忽 +涤 +鸵 +靡 +郗 +瓷 +扁 +廊 +怨 +雏 +钮 +敦 +E +懦 +憋 +汀 +拚 +啉 +腌 +岸 +f +痼 +瞅 +尊 +咀 +眩 +飙 +忌 +仝 +迦 +熬 +毫 +胯 +篑 +茄 +腺 +凄 +舛 +碴 +锵 +诧 +羯 +後 +漏 +汤 +宓 +仞 +蚁 +壶 +谰 +皑 +铄 +棰 +罔 +辅 +晶 +苦 +牟 +闽 +\ +烃 +饮 +聿 +丙 +蛳 +朱 +煤 +涔 +鳖 +犁 +罐 +荼 +砒 +淦 +妤 +黏 +戎 +孑 +婕 +瑾 +戢 +钵 +枣 +捋 +砥 +衩 +狙 +桠 +稣 +阎 +肃 +梏 +诫 +孪 +昶 +婊 +衫 +嗔 +侃 +塞 +蜃 +樵 +峒 +貌 +屿 +欺 +缫 +阐 +栖 +诟 +珞 +荭 +吝 +萍 +嗽 +恂 +啻 +蜴 +磬 +峋 +俸 +豫 +谎 +徊 +镍 +韬 +魇 +晴 +U +囟 +猜 +蛮 +坐 +囿 +伴 +亭 +肝 +佗 +蝠 +妃 +胞 +滩 +榴 +氖 +垩 +苋 +砣 +扪 +馏 +姓 +轩 +厉 +夥 +侈 +禀 +垒 +岑 +赏 +钛 +辐 +痔 +披 +纸 +碳 +“ +坞 +蠓 +挤 +荥 +沅 +悔 +铧 +帼 +蒌 +蝇 +a +p +y +n +g +哀 +浆 +瑶 +凿 +桶 +馈 +皮 +奴 +苜 +佤 +伶 +晗 +铱 +炬 +优 +弊 +氢 +恃 +甫 +攥 +端 +锌 +灰 +稹 +炝 +曙 +邋 +亥 +眶 +碾 +拉 +萝 +绔 +捷 +浍 +腋 +姑 +菖 +凌 +涞 +麽 +锢 +桨 +潢 +绎 +镰 +殆 +锑 +渝 +铬 +困 +绽 +觎 +匈 +糙 +暑 +裹 +鸟 +盔 +肽 +迷 +綦 +『 +亳 +佝 +俘 +钴 +觇 +骥 +仆 +疝 +跪 +婶 +郯 +瀹 +唉 +脖 +踞 +针 +晾 +忒 +扼 +瞩 +叛 +椒 +疟 +嗡 +邗 +肆 +跆 +玫 +忡 +捣 +咧 +唆 +艄 +蘑 +潦 +笛 +阚 +沸 +泻 +掊 +菽 +贫 +斥 +髂 +孢 +镂 +赂 +麝 +鸾 +屡 +衬 +苷 +恪 +叠 +希 +粤 +爻 +喝 +茫 +惬 +郸 +绻 +庸 +撅 +碟 +宄 +妹 +膛 +叮 +饵 +崛 +嗲 +椅 +冤 +搅 +咕 +敛 +尹 +垦 +闷 +蝉 +霎 +勰 +败 +蓑 +泸 +肤 +鹌 +幌 +焦 +浠 +鞍 +刁 +舰 +乙 +竿 +裔 +。 +茵 +函 +伊 +兄 +丨 +娜 +匍 +謇 +莪 +宥 +似 +蝽 +翳 +酪 +翠 +粑 +薇 +祢 +骏 +赠 +叫 +Q +噤 +噻 +竖 +芗 +莠 +潭 +俊 +羿 +耜 +O +郫 +趁 +嗪 +囚 +蹶 +芒 +洁 +笋 +鹑 +敲 +硝 +啶 +堡 +渲 +揩 +』 +携 +宿 +遒 +颍 +扭 +棱 +割 +萜 +蔸 +葵 +琴 +捂 +饰 +衙 +耿 +掠 +募 +岂 +窖 +涟 +蔺 +瘤 +柞 +瞪 +怜 +匹 +距 +楔 +炜 +哆 +秦 +缎 +幼 +茁 +绪 +痨 +恨 +楸 +娅 +瓦 +桩 +雪 +嬴 +伏 +榔 +妥 +铿 +拌 +眠 +雍 +缇 +‘ +卓 +搓 +哌 +觞 +噩 +屈 +哧 +髓 +咦 +巅 +娑 +侑 +淫 +膳 +祝 +勾 +姊 +莴 +胄 +疃 +薛 +蜷 +胛 +巷 +芙 +芋 +熙 +闰 +勿 +窃 +狱 +剩 +钏 +幢 +陟 +铛 +慧 +靴 +耍 +k +浙 +浇 +飨 +惟 +绗 +祜 +澈 +啼 +咪 +磷 +摞 +诅 +郦 +抹 +跃 +壬 +吕 +肖 +琏 +颤 +尴 +剡 +抠 +凋 +赚 +泊 +津 +宕 +殷 +倔 +氲 +漫 +邺 +涎 +怠 +$ +垮 +荬 +遵 +俏 +叹 +噢 +饽 +蜘 +孙 +筵 +疼 +鞭 +羧 +牦 +箭 +潴 +c +眸 +祭 +髯 +啖 +坳 +愁 +芩 +驮 +倡 +巽 +穰 +沃 +胚 +怒 +凤 +槛 +剂 +趵 +嫁 +v +邢 +灯 +鄢 +桐 +睽 +檗 +锯 +槟 +婷 +嵋 +圻 +诗 +蕈 +颠 +遭 +痢 +芸 +怯 +馥 +竭 +锗 +徜 +恭 +遍 +籁 +剑 +嘱 +苡 +龄 +僧 +桑 +潸 +弘 +澶 +楹 +悲 +讫 +愤 +腥 +悸 +谍 +椹 +呢 +桓 +葭 +攫 +阀 +翰 +躲 +敖 +柑 +郎 +笨 +橇 +呃 +魁 +燎 +脓 +葩 +磋 +垛 +玺 +狮 +沓 +砜 +蕊 +锺 +罹 +蕉 +翱 +虐 +闾 +巫 +旦 +茱 +嬷 +枯 +鹏 +贡 +芹 +汛 +矫 +绁 +拣 +禺 +佃 +讣 +舫 +惯 +乳 +趋 +疲 +挽 +岚 +虾 +衾 +蠹 +蹂 +飓 +氦 +铖 +孩 +稞 +瑜 +壅 +掀 +勘 +妓 +畅 +髋 +W +庐 +牲 +蓿 +榕 +练 +垣 +唱 +邸 +菲 +昆 +婺 +穿 +绡 +麒 +蚱 +掂 +愚 +泷 +涪 +漳 +妩 +娉 +榄 +讷 +觅 +旧 +藤 +煮 +呛 +柳 +腓 +叭 +庵 +烷 +阡 +罂 +蜕 +擂 +猖 +咿 +媲 +脉 +【 +沏 +貅 +黠 +熏 +哲 +烁 +坦 +酵 +兜 +× +潇 +撒 +剽 +珩 +圹 +乾 +摸 +樟 +帽 +嗒 +襄 +魂 +轿 +憬 +锡 +〕 +喃 +皆 +咖 +隅 +脸 +残 +泮 +袂 +鹂 +珊 +囤 +捆 +咤 +误 +徨 +闹 +淙 +芊 +淋 +怆 +囗 +拨 +梳 +渤 +R +G +绨 +蚓 +婀 +幡 +狩 +麾 +谢 +唢 +裸 +旌 +伉 +纶 +裂 +驳 +砼 +咛 +澄 +樨 +蹈 +宙 +澍 +倍 +貔 +操 +勇 +蟠 +摈 +砧 +虬 +够 +缁 +悦 +藿 +撸 +艹 +摁 +淹 +豇 +虎 +榭 +ˉ +吱 +d +° +喧 +荀 +踱 +侮 +奋 +偕 +饷 +犍 +惮 +坑 +璎 +徘 +宛 +妆 +袈 +倩 +窦 +昂 +荏 +乖 +K +怅 +撰 +鳙 +牙 +袁 +酞 +X +痿 +琼 +闸 +雁 +趾 +荚 +虻 +涝 +《 +杏 +韭 +偈 +烤 +绫 +鞘 +卉 +症 +遢 +蓥 +诋 +杭 +荨 +匆 +竣 +簪 +辙 +敕 +虞 +丹 +缭 +咩 +黟 +m +淤 +瑕 +咂 +铉 +硼 +茨 +嶂 +痒 +畸 +敬 +涿 +粪 +窘 +熟 +叔 +嫔 +盾 +忱 +裘 +憾 +梵 +赡 +珙 +咯 +娘 +庙 +溯 +胺 +葱 +痪 +摊 +荷 +卞 +乒 +髦 +寐 +铭 +坩 +胗 +枷 +爆 +溟 +嚼 +羚 +砬 +轨 +惊 +挠 +罄 +竽 +菏 +氧 +浅 +楣 +盼 +枢 +炸 +阆 +杯 +谏 +噬 +淇 +渺 +俪 +秆 +墓 +泪 +跻 +砌 +痰 +垡 +渡 +耽 +釜 +讶 +鳎 +煞 +呗 +韶 +舶 +绷 +鹳 +缜 +旷 +铊 +皱 +龌 +檀 +霖 +奄 +槐 +艳 +蝶 +旋 +哝 +赶 +骞 +蚧 +腊 +盈 +丁 +` +蜚 +矸 +蝙 +睨 +嚓 +僻 +鬼 +醴 +夜 +彝 +磊 +笔 +拔 +栀 +糕 +厦 +邰 +纫 +逭 +纤 +眦 +膊 +馍 +躇 +烯 +蘼 +冬 +诤 +暄 +骶 +哑 +瘠 +」 +臊 +丕 +愈 +咱 +螺 +擅 +跋 +搏 +硪 +谄 +笠 +淡 +嘿 +骅 +谧 +鼎 +皋 +姚 +歼 +蠢 +驼 +耳 +胬 +挝 +涯 +狗 +蒽 +孓 +犷 +凉 +芦 +箴 +铤 +孤 +嘛 +坤 +V +茴 +朦 +挞 +尖 +橙 +诞 +搴 +碇 +洵 +浚 +帚 +蜍 +漯 +柘 +嚎 +讽 +芭 +荤 +咻 +祠 +秉 +跖 +埃 +吓 +糯 +眷 +馒 +惹 +娼 +鲑 +嫩 +讴 +轮 +瞥 +靶 +褚 +乏 +缤 +宋 +帧 +删 +驱 +碎 +扑 +俩 +俄 +偏 +涣 +竹 +噱 +皙 +佰 +渚 +唧 +斡 +# +镉 +刀 +崎 +筐 +佣 +夭 +贰 +肴 +峙 +哔 +艿 +匐 +牺 +镛 +缘 +仡 +嫡 +劣 +枸 +堀 +梨 +簿 +鸭 +蒸 +亦 +稽 +浴 +{ +衢 +束 +槲 +j +阁 +揍 +疥 +棋 +潋 +聪 +窜 +乓 +睛 +插 +冉 +阪 +苍 +搽 +「 +蟾 +螟 +幸 +仇 +樽 +撂 +慢 +跤 +幔 +俚 +淅 +覃 +觊 +溶 +妖 +帛 +侨 +曰 +妾 +泗 +· +: +瀘 +風 +Ë +( +) +∶ +紅 +紗 +瑭 +雲 +頭 +鶏 +財 +許 +• +¥ +樂 +焗 +麗 +— +; +滙 +東 +榮 +繪 +興 +… +門 +業 +π +楊 +國 +顧 +é +盤 +寳 +Λ +龍 +鳳 +島 +誌 +緣 +結 +銭 +萬 +勝 +祎 +璟 +優 +歡 +臨 +時 +購 += +★ +藍 +昇 +鐵 +觀 +勅 +農 +聲 +畫 +兿 +術 +發 +劉 +記 +專 +耑 +園 +書 +壴 +種 +Ο +● +褀 +號 +銀 +匯 +敟 +锘 +葉 +橪 +廣 +進 +蒄 +鑽 +阝 +祙 +貢 +鍋 +豊 +夬 +喆 +團 +閣 +開 +燁 +賓 +館 +酡 +沔 +順 ++ +硚 +劵 +饸 +陽 +車 +湓 +復 +萊 +氣 +軒 +華 +堃 +迮 +纟 +戶 +馬 +學 +裡 +電 +嶽 +獨 +マ +シ +サ +ジ +燘 +袪 +環 +❤ +臺 +灣 +専 +賣 +孖 +聖 +攝 +線 +▪ +α +傢 +俬 +夢 +達 +莊 +喬 +貝 +薩 +劍 +羅 +壓 +棛 +饦 +尃 +璈 +囍 +醫 +G +I +A +# +N +鷄 +髙 +嬰 +啓 +約 +隹 +潔 +賴 +藝 +~ +寶 +籣 +麺 +  +嶺 +√ +義 +網 +峩 +長 +∧ +魚 +機 +構 +② +鳯 +偉 +L +B +㙟 +畵 +鴿 +' +詩 +溝 +嚞 +屌 +藔 +佧 +玥 +蘭 +織 +1 +3 +9 +0 +7 +點 +砭 +鴨 +鋪 +銘 +廳 +弍 +‧ +創 +湯 +坶 +℃ +卩 +骝 +& +烜 +荘 +當 +潤 +扞 +係 +懷 +碶 +钅 +蚨 +讠 +☆ +叢 +爲 +埗 +涫 +塗 +→ +楽 +現 +鯨 +愛 +瑪 +鈺 +忄 +悶 +藥 +飾 +樓 +視 +孬 +ㆍ +燚 +苪 +師 +① +丼 +锽 +│ +韓 +標 +è +兒 +閏 +匋 +張 +漢 +Ü +髪 +會 +閑 +檔 +習 +裝 +の +峯 +菘 +輝 +И +雞 +釣 +億 +浐 +K +O +R +8 +H +E +P +T +W +D +S +C +M +F +姌 +饹 +» +晞 +廰 +ä +嵯 +鷹 +負 +飲 +絲 +冚 +楗 +澤 +綫 +區 +❋ +← +質 +靑 +揚 +③ +滬 +統 +産 +協 +﹑ +乸 +畐 +經 +運 +際 +洺 +岽 +為 +粵 +諾 +崋 +豐 +碁 +ɔ +V +2 +6 +齋 +誠 +訂 +´ +勑 +雙 +陳 +無 +í +泩 +媄 +夌 +刂 +i +c +t +o +r +a +嘢 +耄 +燴 +暃 +壽 +媽 +靈 +抻 +體 +唻 +É +冮 +甹 +鎮 +錦 +ʌ +蜛 +蠄 +尓 +駕 +戀 +飬 +逹 +倫 +貴 +極 +Я +Й +寬 +磚 +嶪 +郎 +職 +| +間 +n +d +剎 +伈 +課 +飛 +橋 +瘊 +№ +譜 +骓 +圗 +滘 +縣 +粿 +咅 +養 +濤 +彳 +® +% +Ⅱ +啰 +㴪 +見 +矞 +薬 +糁 +邨 +鲮 +顔 +罱 +З +選 +話 +贏 +氪 +俵 +競 +瑩 +繡 +枱 +β +綉 +á +獅 +爾 +™ +麵 +戋 +淩 +徳 +個 +劇 +場 +務 +簡 +寵 +h +實 +膠 +轱 +圖 +築 +嘣 +樹 +㸃 +營 +耵 +孫 +饃 +鄺 +飯 +麯 +遠 +輸 +坫 +孃 +乚 +閃 +鏢 +㎡ +題 +廠 +關 +↑ +爺 +將 +軍 +連 +篦 +覌 +參 +箸 +- +窠 +棽 +寕 +夀 +爰 +歐 +呙 +閥 +頡 +熱 +雎 +垟 +裟 +凬 +勁 +帑 +馕 +夆 +疌 +枼 +馮 +貨 +蒤 +樸 +彧 +旸 +靜 +龢 +暢 +㐱 +鳥 +珺 +鏡 +灡 +爭 +堷 +廚 +Ó +騰 +診 +┅ +蘇 +褔 +凱 +頂 +豕 +亞 +帥 +嘬 +⊥ +仺 +桖 +複 +饣 +絡 +穂 +顏 +棟 +納 +▏ +濟 +親 +設 +計 +攵 +埌 +烺 +ò +頤 +燦 +蓮 +撻 +節 +講 +濱 +濃 +娽 +洳 +朿 +燈 +鈴 +護 +膚 +铔 +過 +補 +Z +U +5 +4 +坋 +闿 +䖝 +餘 +缐 +铞 +貿 +铪 +桼 +趙 +鍊 +[ +㐂 +垚 +菓 +揸 +捲 +鐘 +滏 +𣇉 +爍 +輪 +燜 +鴻 +鮮 +動 +鹞 +鷗 +丄 +慶 +鉌 +翥 +飮 +腸 +⇋ +漁 +覺 +來 +熘 +昴 +翏 +鲱 +圧 +鄉 +萭 +頔 +爐 +嫚 +г +貭 +類 +聯 +幛 +輕 +訓 +鑒 +夋 +锨 +芃 +珣 +䝉 +扙 +嵐 +銷 +處 +ㄱ +語 +誘 +苝 +歸 +儀 +燒 +楿 +內 +粢 +葒 +奧 +麥 +礻 +滿 +蠔 +穵 +瞭 +態 +鱬 +榞 +硂 +鄭 +黃 +煙 +祐 +奓 +逺 +* +瑄 +獲 +聞 +薦 +讀 +這 +樣 +決 +問 +啟 +們 +執 +説 +轉 +單 +隨 +唘 +帶 +倉 +庫 +還 +贈 +尙 +皺 +■ +餅 +產 +○ +∈ +報 +狀 +楓 +賠 +琯 +嗮 +禮 +` +傳 +> +≤ +嗞 +Φ +≥ +換 +咭 +∣ +↓ +曬 +ε +応 +寫 +″ +終 +様 +純 +費 +療 +聨 +凍 +壐 +郵 +ü +黒 +∫ +製 +塊 +調 +軽 +確 +撃 +級 +馴 +Ⅲ +涇 +繹 +數 +碼 +證 +狒 +処 +劑 +< +晧 +賀 +衆 +] +櫥 +兩 +陰 +絶 +對 +鯉 +憶 +◎ +p +e +Y +蕒 +煖 +頓 +測 +試 +鼽 +僑 +碩 +妝 +帯 +≈ +鐡 +舖 +權 +喫 +倆 +ˋ +該 +悅 +ā +俫 +. +f +s +b +m +k +g +u +j +貼 +淨 +濕 +針 +適 +備 +l +/ +給 +謢 +強 +觸 +衛 +與 +⊙ +$ +緯 +變 +⑴ +⑵ +⑶ +㎏ +殺 +∩ +幚 +─ +價 +▲ +離 +ú +ó +飄 +烏 +関 +閟 +﹝ +﹞ +邏 +輯 +鍵 +驗 +訣 +導 +歷 +屆 +層 +▼ +儱 +錄 +熳 +ē +艦 +吋 +錶 +辧 +飼 +顯 +④ +禦 +販 +気 +対 +枰 +閩 +紀 +幹 +瞓 +貊 +淚 +△ +眞 +墊 +Ω +獻 +褲 +縫 +緑 +亜 +鉅 +餠 +{ +} +◆ +蘆 +薈 +█ +◇ +溫 +彈 +晳 +粧 +犸 +穩 +訊 +崬 +凖 +熥 +П +舊 +條 +紋 +圍 +Ⅳ +筆 +尷 +難 +雜 +錯 +綁 +識 +頰 +鎖 +艶 +□ +殁 +殼 +⑧ +├ +▕ +鵬 +ǐ +ō +ǒ +糝 +綱 +▎ +μ +盜 +饅 +醬 +籤 +蓋 +釀 +鹽 +據 +à +ɡ +辦 +◥ +彐 +┌ +婦 +獸 +鲩 +伱 +ī +蒟 +蒻 +齊 +袆 +腦 +寧 +凈 +妳 +煥 +詢 +偽 +謹 +啫 +鯽 +騷 +鱸 +損 +傷 +鎻 +髮 +買 +冏 +儥 +両 +﹢ +∞ +載 +喰 +z +羙 +悵 +燙 +曉 +員 +組 +徹 +艷 +痠 +鋼 +鼙 +縮 +細 +嚒 +爯 +≠ +維 +" +鱻 +壇 +厍 +帰 +浥 +犇 +薡 +軎 +² +應 +醜 +刪 +緻 +鶴 +賜 +噁 +軌 +尨 +镔 +鷺 +槗 +彌 +葚 +濛 +請 +溇 +緹 +賢 +訪 +獴 +瑅 +資 +縤 +陣 +蕟 +栢 +韻 +祼 +恁 +伢 +謝 +劃 +涑 +總 +衖 +踺 +砋 +凉 +籃 +駿 +苼 +瘋 +昽 +紡 +驊 +腎 +﹗ +響 +杋 +剛 +嚴 +禪 +歓 +槍 +傘 +檸 +檫 +炣 +勢 +鏜 +鎢 +銑 +尐 +減 +奪 +惡 +θ +僮 +婭 +臘 +ū +ì +殻 +鉄 +∑ +蛲 +焼 +緖 +續 +紹 +懮 \ No newline at end of file diff --git a/deepdoc/models/rec.onnx b/deepdoc/models/rec.onnx new file mode 100644 index 0000000000000000000000000000000000000000..44523663b32151961641b417ce564f92cf2041ed --- /dev/null +++ b/deepdoc/models/rec.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c7cf60de2afd728d512f4190cf37455092b45f06175365c6fc58d8cd7e2a68b +size 10826336 diff --git a/deepdoc/models/tsr.onnx b/deepdoc/models/tsr.onnx new file mode 100644 index 0000000000000000000000000000000000000000..f5b9bf39d95da4118b9d24a8e60361c8427c0b82 --- /dev/null +++ b/deepdoc/models/tsr.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04c14c3e41802450a1f437a3865ce1a3186046262ea4d75c8975289687a43223 +size 12243020 diff --git a/deepdoc/vision/__init__.py b/deepdoc/vision/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..80c2b06da7034abbb278383ea2fbd0f7738e493b --- /dev/null +++ b/deepdoc/vision/__init__.py @@ -0,0 +1,3 @@ +from .ragFlow import RagFlow + +__all__ = ['ragFlow'] diff --git a/deepdoc/vision/ocr.res b/deepdoc/vision/ocr.res new file mode 100644 index 0000000000000000000000000000000000000000..b62de66190de02c68df57fb21de1e2da9bd92fea --- /dev/null +++ b/deepdoc/vision/ocr.res @@ -0,0 +1,6623 @@ +' +疗 +绚 +诚 +娇 +溜 +题 +贿 +者 +廖 +更 +纳 +加 +奉 +公 +一 +就 +汴 +计 +与 +路 +房 +原 +妇 +2 +0 +8 +- +7 +其 +> +: +] +, +, +骑 +刈 +全 +消 +昏 +傈 +安 +久 +钟 +嗅 +不 +影 +处 +驽 +蜿 +资 +关 +椤 +地 +瘸 +专 +问 +忖 +票 +嫉 +炎 +韵 +要 +月 +田 +节 +陂 +鄙 +捌 +备 +拳 +伺 +眼 +网 +盎 +大 +傍 +心 +东 +愉 +汇 +蹿 +科 +每 +业 +里 +航 +晏 +字 +平 +录 +先 +1 +3 +彤 +鲶 +产 +稍 +督 +腴 +有 +象 +岳 +注 +绍 +在 +泺 +文 +定 +核 +名 +水 +过 +理 +让 +偷 +率 +等 +这 +发 +” +为 +含 +肥 +酉 +相 +鄱 +七 +编 +猥 +锛 +日 +镀 +蒂 +掰 +倒 +辆 +栾 +栗 +综 +涩 +州 +雌 +滑 +馀 +了 +机 +块 +司 +宰 +甙 +兴 +矽 +抚 +保 +用 +沧 +秩 +如 +收 +息 +滥 +页 +疑 +埠 +! +! +姥 +异 +橹 +钇 +向 +下 +跄 +的 +椴 +沫 +国 +绥 +獠 +报 +开 +民 +蜇 +何 +分 +凇 +长 +讥 +藏 +掏 +施 +羽 +中 +讲 +派 +嘟 +人 +提 +浼 +间 +世 +而 +古 +多 +倪 +唇 +饯 +控 +庚 +首 +赛 +蜓 +味 +断 +制 +觉 +技 +替 +艰 +溢 +潮 +夕 +钺 +外 +摘 +枋 +动 +双 +单 +啮 +户 +枇 +确 +锦 +曜 +杜 +或 +能 +效 +霜 +盒 +然 +侗 +电 +晁 +放 +步 +鹃 +新 +杖 +蜂 +吒 +濂 +瞬 +评 +总 +隍 +对 +独 +合 +也 +是 +府 +青 +天 +诲 +墙 +组 +滴 +级 +邀 +帘 +示 +已 +时 +骸 +仄 +泅 +和 +遨 +店 +雇 +疫 +持 +巍 +踮 +境 +只 +亨 +目 +鉴 +崤 +闲 +体 +泄 +杂 +作 +般 +轰 +化 +解 +迂 +诿 +蛭 +璀 +腾 +告 +版 +服 +省 +师 +小 +规 +程 +线 +海 +办 +引 +二 +桧 +牌 +砺 +洄 +裴 +修 +图 +痫 +胡 +许 +犊 +事 +郛 +基 +柴 +呼 +食 +研 +奶 +律 +蛋 +因 +葆 +察 +戏 +褒 +戒 +再 +李 +骁 +工 +貂 +油 +鹅 +章 +啄 +休 +场 +给 +睡 +纷 +豆 +器 +捎 +说 +敏 +学 +会 +浒 +设 +诊 +格 +廓 +查 +来 +霓 +室 +溆 +¢ +诡 +寥 +焕 +舜 +柒 +狐 +回 +戟 +砾 +厄 +实 +翩 +尿 +五 +入 +径 +惭 +喹 +股 +宇 +篝 +| +; +美 +期 +云 +九 +祺 +扮 +靠 +锝 +槌 +系 +企 +酰 +阊 +暂 +蚕 +忻 +豁 +本 +羹 +执 +条 +钦 +H +獒 +限 +进 +季 +楦 +于 +芘 +玖 +铋 +茯 +未 +答 +粘 +括 +样 +精 +欠 +矢 +甥 +帷 +嵩 +扣 +令 +仔 +风 +皈 +行 +支 +部 +蓉 +刮 +站 +蜡 +救 +钊 +汗 +松 +嫌 +成 +可 +. +鹤 +院 +从 +交 +政 +怕 +活 +调 +球 +局 +验 +髌 +第 +韫 +谗 +串 +到 +圆 +年 +米 +/ +* +友 +忿 +检 +区 +看 +自 +敢 +刃 +个 +兹 +弄 +流 +留 +同 +没 +齿 +星 +聆 +轼 +湖 +什 +三 +建 +蛔 +儿 +椋 +汕 +震 +颧 +鲤 +跟 +力 +情 +璺 +铨 +陪 +务 +指 +族 +训 +滦 +鄣 +濮 +扒 +商 +箱 +十 +召 +慷 +辗 +所 +莞 +管 +护 +臭 +横 +硒 +嗓 +接 +侦 +六 +露 +党 +馋 +驾 +剖 +高 +侬 +妪 +幂 +猗 +绺 +骐 +央 +酐 +孝 +筝 +课 +徇 +缰 +门 +男 +西 +项 +句 +谙 +瞒 +秃 +篇 +教 +碲 +罚 +声 +呐 +景 +前 +富 +嘴 +鳌 +稀 +免 +朋 +啬 +睐 +去 +赈 +鱼 +住 +肩 +愕 +速 +旁 +波 +厅 +健 +茼 +厥 +鲟 +谅 +投 +攸 +炔 +数 +方 +击 +呋 +谈 +绩 +别 +愫 +僚 +躬 +鹧 +胪 +炳 +招 +喇 +膨 +泵 +蹦 +毛 +结 +5 +4 +谱 +识 +陕 +粽 +婚 +拟 +构 +且 +搜 +任 +潘 +比 +郢 +妨 +醪 +陀 +桔 +碘 +扎 +选 +哈 +骷 +楷 +亿 +明 +缆 +脯 +监 +睫 +逻 +婵 +共 +赴 +淝 +凡 +惦 +及 +达 +揖 +谩 +澹 +减 +焰 +蛹 +番 +祁 +柏 +员 +禄 +怡 +峤 +龙 +白 +叽 +生 +闯 +起 +细 +装 +谕 +竟 +聚 +钙 +上 +导 +渊 +按 +艾 +辘 +挡 +耒 +盹 +饪 +臀 +记 +邮 +蕙 +受 +各 +医 +搂 +普 +滇 +朗 +茸 +带 +翻 +酚 +( +光 +堤 +墟 +蔷 +万 +幻 +〓 +瑙 +辈 +昧 +盏 +亘 +蛀 +吉 +铰 +请 +子 +假 +闻 +税 +井 +诩 +哨 +嫂 +好 +面 +琐 +校 +馊 +鬣 +缂 +营 +访 +炖 +占 +农 +缀 +否 +经 +钚 +棵 +趟 +张 +亟 +吏 +茶 +谨 +捻 +论 +迸 +堂 +玉 +信 +吧 +瞠 +乡 +姬 +寺 +咬 +溏 +苄 +皿 +意 +赉 +宝 +尔 +钰 +艺 +特 +唳 +踉 +都 +荣 +倚 +登 +荐 +丧 +奇 +涵 +批 +炭 +近 +符 +傩 +感 +道 +着 +菊 +虹 +仲 +众 +懈 +濯 +颞 +眺 +南 +释 +北 +缝 +标 +既 +茗 +整 +撼 +迤 +贲 +挎 +耱 +拒 +某 +妍 +卫 +哇 +英 +矶 +藩 +治 +他 +元 +领 +膜 +遮 +穗 +蛾 +飞 +荒 +棺 +劫 +么 +市 +火 +温 +拈 +棚 +洼 +转 +果 +奕 +卸 +迪 +伸 +泳 +斗 +邡 +侄 +涨 +屯 +萋 +胭 +氡 +崮 +枞 +惧 +冒 +彩 +斜 +手 +豚 +随 +旭 +淑 +妞 +形 +菌 +吲 +沱 +争 +驯 +歹 +挟 +兆 +柱 +传 +至 +包 +内 +响 +临 +红 +功 +弩 +衡 +寂 +禁 +老 +棍 +耆 +渍 +织 +害 +氵 +渑 +布 +载 +靥 +嗬 +虽 +苹 +咨 +娄 +库 +雉 +榜 +帜 +嘲 +套 +瑚 +亲 +簸 +欧 +边 +6 +腿 +旮 +抛 +吹 +瞳 +得 +镓 +梗 +厨 +继 +漾 +愣 +憨 +士 +策 +窑 +抑 +躯 +襟 +脏 +参 +贸 +言 +干 +绸 +鳄 +穷 +藜 +音 +折 +详 +) +举 +悍 +甸 +癌 +黎 +谴 +死 +罩 +迁 +寒 +驷 +袖 +媒 +蒋 +掘 +模 +纠 +恣 +观 +祖 +蛆 +碍 +位 +稿 +主 +澧 +跌 +筏 +京 +锏 +帝 +贴 +证 +糠 +才 +黄 +鲸 +略 +炯 +饱 +四 +出 +园 +犀 +牧 +容 +汉 +杆 +浈 +汰 +瑷 +造 +虫 +瘩 +怪 +驴 +济 +应 +花 +沣 +谔 +夙 +旅 +价 +矿 +以 +考 +s +u +呦 +晒 +巡 +茅 +准 +肟 +瓴 +詹 +仟 +褂 +译 +桌 +混 +宁 +怦 +郑 +抿 +些 +余 +鄂 +饴 +攒 +珑 +群 +阖 +岔 +琨 +藓 +预 +环 +洮 +岌 +宀 +杲 +瀵 +最 +常 +囡 +周 +踊 +女 +鼓 +袭 +喉 +简 +范 +薯 +遐 +疏 +粱 +黜 +禧 +法 +箔 +斤 +遥 +汝 +奥 +直 +贞 +撑 +置 +绱 +集 +她 +馅 +逗 +钧 +橱 +魉 +[ +恙 +躁 +唤 +9 +旺 +膘 +待 +脾 +惫 +购 +吗 +依 +盲 +度 +瘿 +蠖 +俾 +之 +镗 +拇 +鲵 +厝 +簧 +续 +款 +展 +啃 +表 +剔 +品 +钻 +腭 +损 +清 +锶 +统 +涌 +寸 +滨 +贪 +链 +吠 +冈 +伎 +迥 +咏 +吁 +览 +防 +迅 +失 +汾 +阔 +逵 +绀 +蔑 +列 +川 +凭 +努 +熨 +揪 +利 +俱 +绉 +抢 +鸨 +我 +即 +责 +膦 +易 +毓 +鹊 +刹 +玷 +岿 +空 +嘞 +绊 +排 +术 +估 +锷 +违 +们 +苟 +铜 +播 +肘 +件 +烫 +审 +鲂 +广 +像 +铌 +惰 +铟 +巳 +胍 +鲍 +康 +憧 +色 +恢 +想 +拷 +尤 +疳 +知 +S +Y +F +D +A +峄 +裕 +帮 +握 +搔 +氐 +氘 +难 +墒 +沮 +雨 +叁 +缥 +悴 +藐 +湫 +娟 +苑 +稠 +颛 +簇 +后 +阕 +闭 +蕤 +缚 +怎 +佞 +码 +嘤 +蔡 +痊 +舱 +螯 +帕 +赫 +昵 +升 +烬 +岫 +、 +疵 +蜻 +髁 +蕨 +隶 +烛 +械 +丑 +盂 +梁 +强 +鲛 +由 +拘 +揉 +劭 +龟 +撤 +钩 +呕 +孛 +费 +妻 +漂 +求 +阑 +崖 +秤 +甘 +通 +深 +补 +赃 +坎 +床 +啪 +承 +吼 +量 +暇 +钼 +烨 +阂 +擎 +脱 +逮 +称 +P +神 +属 +矗 +华 +届 +狍 +葑 +汹 +育 +患 +窒 +蛰 +佼 +静 +槎 +运 +鳗 +庆 +逝 +曼 +疱 +克 +代 +官 +此 +麸 +耧 +蚌 +晟 +例 +础 +榛 +副 +测 +唰 +缢 +迹 +灬 +霁 +身 +岁 +赭 +扛 +又 +菡 +乜 +雾 +板 +读 +陷 +徉 +贯 +郁 +虑 +变 +钓 +菜 +圾 +现 +琢 +式 +乐 +维 +渔 +浜 +左 +吾 +脑 +钡 +警 +T +啵 +拴 +偌 +漱 +湿 +硕 +止 +骼 +魄 +积 +燥 +联 +踢 +玛 +则 +窿 +见 +振 +畿 +送 +班 +钽 +您 +赵 +刨 +印 +讨 +踝 +籍 +谡 +舌 +崧 +汽 +蔽 +沪 +酥 +绒 +怖 +财 +帖 +肱 +私 +莎 +勋 +羔 +霸 +励 +哼 +帐 +将 +帅 +渠 +纪 +婴 +娩 +岭 +厘 +滕 +吻 +伤 +坝 +冠 +戊 +隆 +瘁 +介 +涧 +物 +黍 +并 +姗 +奢 +蹑 +掣 +垸 +锴 +命 +箍 +捉 +病 +辖 +琰 +眭 +迩 +艘 +绌 +繁 +寅 +若 +毋 +思 +诉 +类 +诈 +燮 +轲 +酮 +狂 +重 +反 +职 +筱 +县 +委 +磕 +绣 +奖 +晋 +濉 +志 +徽 +肠 +呈 +獐 +坻 +口 +片 +碰 +几 +村 +柿 +劳 +料 +获 +亩 +惕 +晕 +厌 +号 +罢 +池 +正 +鏖 +煨 +家 +棕 +复 +尝 +懋 +蜥 +锅 +岛 +扰 +队 +坠 +瘾 +钬 +@ +卧 +疣 +镇 +譬 +冰 +彷 +频 +黯 +据 +垄 +采 +八 +缪 +瘫 +型 +熹 +砰 +楠 +襁 +箐 +但 +嘶 +绳 +啤 +拍 +盥 +穆 +傲 +洗 +盯 +塘 +怔 +筛 +丿 +台 +恒 +喂 +葛 +永 +¥ +烟 +酒 +桦 +书 +砂 +蚝 +缉 +态 +瀚 +袄 +圳 +轻 +蛛 +超 +榧 +遛 +姒 +奘 +铮 +右 +荽 +望 +偻 +卡 +丶 +氰 +附 +做 +革 +索 +戚 +坨 +桷 +唁 +垅 +榻 +岐 +偎 +坛 +莨 +山 +殊 +微 +骇 +陈 +爨 +推 +嗝 +驹 +澡 +藁 +呤 +卤 +嘻 +糅 +逛 +侵 +郓 +酌 +德 +摇 +※ +鬃 +被 +慨 +殡 +羸 +昌 +泡 +戛 +鞋 +河 +宪 +沿 +玲 +鲨 +翅 +哽 +源 +铅 +语 +照 +邯 +址 +荃 +佬 +顺 +鸳 +町 +霭 +睾 +瓢 +夸 +椁 +晓 +酿 +痈 +咔 +侏 +券 +噎 +湍 +签 +嚷 +离 +午 +尚 +社 +锤 +背 +孟 +使 +浪 +缦 +潍 +鞅 +军 +姹 +驶 +笑 +鳟 +鲁 +》 +孽 +钜 +绿 +洱 +礴 +焯 +椰 +颖 +囔 +乌 +孔 +巴 +互 +性 +椽 +哞 +聘 +昨 +早 +暮 +胶 +炀 +隧 +低 +彗 +昝 +铁 +呓 +氽 +藉 +喔 +癖 +瑗 +姨 +权 +胱 +韦 +堑 +蜜 +酋 +楝 +砝 +毁 +靓 +歙 +锲 +究 +屋 +喳 +骨 +辨 +碑 +武 +鸠 +宫 +辜 +烊 +适 +坡 +殃 +培 +佩 +供 +走 +蜈 +迟 +翼 +况 +姣 +凛 +浔 +吃 +飘 +债 +犟 +金 +促 +苛 +崇 +坂 +莳 +畔 +绂 +兵 +蠕 +斋 +根 +砍 +亢 +欢 +恬 +崔 +剁 +餐 +榫 +快 +扶 +‖ +濒 +缠 +鳜 +当 +彭 +驭 +浦 +篮 +昀 +锆 +秸 +钳 +弋 +娣 +瞑 +夷 +龛 +苫 +拱 +致 +% +嵊 +障 +隐 +弑 +初 +娓 +抉 +汩 +累 +蓖 +" +唬 +助 +苓 +昙 +押 +毙 +破 +城 +郧 +逢 +嚏 +獭 +瞻 +溱 +婿 +赊 +跨 +恼 +璧 +萃 +姻 +貉 +灵 +炉 +密 +氛 +陶 +砸 +谬 +衔 +点 +琛 +沛 +枳 +层 +岱 +诺 +脍 +榈 +埂 +征 +冷 +裁 +打 +蹴 +素 +瘘 +逞 +蛐 +聊 +激 +腱 +萘 +踵 +飒 +蓟 +吆 +取 +咙 +簋 +涓 +矩 +曝 +挺 +揣 +座 +你 +史 +舵 +焱 +尘 +苏 +笈 +脚 +溉 +榨 +诵 +樊 +邓 +焊 +义 +庶 +儋 +蟋 +蒲 +赦 +呷 +杞 +诠 +豪 +还 +试 +颓 +茉 +太 +除 +紫 +逃 +痴 +草 +充 +鳕 +珉 +祗 +墨 +渭 +烩 +蘸 +慕 +璇 +镶 +穴 +嵘 +恶 +骂 +险 +绋 +幕 +碉 +肺 +戳 +刘 +潞 +秣 +纾 +潜 +銮 +洛 +须 +罘 +销 +瘪 +汞 +兮 +屉 +r +林 +厕 +质 +探 +划 +狸 +殚 +善 +煊 +烹 +〒 +锈 +逯 +宸 +辍 +泱 +柚 +袍 +远 +蹋 +嶙 +绝 +峥 +娥 +缍 +雀 +徵 +认 +镱 +谷 += +贩 +勉 +撩 +鄯 +斐 +洋 +非 +祚 +泾 +诒 +饿 +撬 +威 +晷 +搭 +芍 +锥 +笺 +蓦 +候 +琊 +档 +礁 +沼 +卵 +荠 +忑 +朝 +凹 +瑞 +头 +仪 +弧 +孵 +畏 +铆 +突 +衲 +车 +浩 +气 +茂 +悖 +厢 +枕 +酝 +戴 +湾 +邹 +飚 +攘 +锂 +写 +宵 +翁 +岷 +无 +喜 +丈 +挑 +嗟 +绛 +殉 +议 +槽 +具 +醇 +淞 +笃 +郴 +阅 +饼 +底 +壕 +砚 +弈 +询 +缕 +庹 +翟 +零 +筷 +暨 +舟 +闺 +甯 +撞 +麂 +茌 +蔼 +很 +珲 +捕 +棠 +角 +阉 +媛 +娲 +诽 +剿 +尉 +爵 +睬 +韩 +诰 +匣 +危 +糍 +镯 +立 +浏 +阳 +少 +盆 +舔 +擘 +匪 +申 +尬 +铣 +旯 +抖 +赘 +瓯 +居 +ˇ +哮 +游 +锭 +茏 +歌 +坏 +甚 +秒 +舞 +沙 +仗 +劲 +潺 +阿 +燧 +郭 +嗖 +霏 +忠 +材 +奂 +耐 +跺 +砀 +输 +岖 +媳 +氟 +极 +摆 +灿 +今 +扔 +腻 +枝 +奎 +药 +熄 +吨 +话 +q +额 +慑 +嘌 +协 +喀 +壳 +埭 +视 +著 +於 +愧 +陲 +翌 +峁 +颅 +佛 +腹 +聋 +侯 +咎 +叟 +秀 +颇 +存 +较 +罪 +哄 +岗 +扫 +栏 +钾 +羌 +己 +璨 +枭 +霉 +煌 +涸 +衿 +键 +镝 +益 +岢 +奏 +连 +夯 +睿 +冥 +均 +糖 +狞 +蹊 +稻 +爸 +刿 +胥 +煜 +丽 +肿 +璃 +掸 +跚 +灾 +垂 +樾 +濑 +乎 +莲 +窄 +犹 +撮 +战 +馄 +软 +络 +显 +鸢 +胸 +宾 +妲 +恕 +埔 +蝌 +份 +遇 +巧 +瞟 +粒 +恰 +剥 +桡 +博 +讯 +凯 +堇 +阶 +滤 +卖 +斌 +骚 +彬 +兑 +磺 +樱 +舷 +两 +娱 +福 +仃 +差 +找 +桁 +÷ +净 +把 +阴 +污 +戬 +雷 +碓 +蕲 +楚 +罡 +焖 +抽 +妫 +咒 +仑 +闱 +尽 +邑 +菁 +爱 +贷 +沥 +鞑 +牡 +嗉 +崴 +骤 +塌 +嗦 +订 +拮 +滓 +捡 +锻 +次 +坪 +杩 +臃 +箬 +融 +珂 +鹗 +宗 +枚 +降 +鸬 +妯 +阄 +堰 +盐 +毅 +必 +杨 +崃 +俺 +甬 +状 +莘 +货 +耸 +菱 +腼 +铸 +唏 +痤 +孚 +澳 +懒 +溅 +翘 +疙 +杷 +淼 +缙 +骰 +喊 +悉 +砻 +坷 +艇 +赁 +界 +谤 +纣 +宴 +晃 +茹 +归 +饭 +梢 +铡 +街 +抄 +肼 +鬟 +苯 +颂 +撷 +戈 +炒 +咆 +茭 +瘙 +负 +仰 +客 +琉 +铢 +封 +卑 +珥 +椿 +镧 +窨 +鬲 +寿 +御 +袤 +铃 +萎 +砖 +餮 +脒 +裳 +肪 +孕 +嫣 +馗 +嵇 +恳 +氯 +江 +石 +褶 +冢 +祸 +阻 +狈 +羞 +银 +靳 +透 +咳 +叼 +敷 +芷 +啥 +它 +瓤 +兰 +痘 +懊 +逑 +肌 +往 +捺 +坊 +甩 +呻 +〃 +沦 +忘 +膻 +祟 +菅 +剧 +崆 +智 +坯 +臧 +霍 +墅 +攻 +眯 +倘 +拢 +骠 +铐 +庭 +岙 +瓠 +′ +缺 +泥 +迢 +捶 +? +? +郏 +喙 +掷 +沌 +纯 +秘 +种 +听 +绘 +固 +螨 +团 +香 +盗 +妒 +埚 +蓝 +拖 +旱 +荞 +铀 +血 +遏 +汲 +辰 +叩 +拽 +幅 +硬 +惶 +桀 +漠 +措 +泼 +唑 +齐 +肾 +念 +酱 +虚 +屁 +耶 +旗 +砦 +闵 +婉 +馆 +拭 +绅 +韧 +忏 +窝 +醋 +葺 +顾 +辞 +倜 +堆 +辋 +逆 +玟 +贱 +疾 +董 +惘 +倌 +锕 +淘 +嘀 +莽 +俭 +笏 +绑 +鲷 +杈 +择 +蟀 +粥 +嗯 +驰 +逾 +案 +谪 +褓 +胫 +哩 +昕 +颚 +鲢 +绠 +躺 +鹄 +崂 +儒 +俨 +丝 +尕 +泌 +啊 +萸 +彰 +幺 +吟 +骄 +苣 +弦 +脊 +瑰 +〈 +诛 +镁 +析 +闪 +剪 +侧 +哟 +框 +螃 +守 +嬗 +燕 +狭 +铈 +缮 +概 +迳 +痧 +鲲 +俯 +售 +笼 +痣 +扉 +挖 +满 +咋 +援 +邱 +扇 +歪 +便 +玑 +绦 +峡 +蛇 +叨 +〖 +泽 +胃 +斓 +喋 +怂 +坟 +猪 +该 +蚬 +炕 +弥 +赞 +棣 +晔 +娠 +挲 +狡 +创 +疖 +铕 +镭 +稷 +挫 +弭 +啾 +翔 +粉 +履 +苘 +哦 +楼 +秕 +铂 +土 +锣 +瘟 +挣 +栉 +习 +享 +桢 +袅 +磨 +桂 +谦 +延 +坚 +蔚 +噗 +署 +谟 +猬 +钎 +恐 +嬉 +雒 +倦 +衅 +亏 +璩 +睹 +刻 +殿 +王 +算 +雕 +麻 +丘 +柯 +骆 +丸 +塍 +谚 +添 +鲈 +垓 +桎 +蚯 +芥 +予 +飕 +镦 +谌 +窗 +醚 +菀 +亮 +搪 +莺 +蒿 +羁 +足 +J +真 +轶 +悬 +衷 +靛 +翊 +掩 +哒 +炅 +掐 +冼 +妮 +l +谐 +稚 +荆 +擒 +犯 +陵 +虏 +浓 +崽 +刍 +陌 +傻 +孜 +千 +靖 +演 +矜 +钕 +煽 +杰 +酗 +渗 +伞 +栋 +俗 +泫 +戍 +罕 +沾 +疽 +灏 +煦 +芬 +磴 +叱 +阱 +榉 +湃 +蜀 +叉 +醒 +彪 +租 +郡 +篷 +屎 +良 +垢 +隗 +弱 +陨 +峪 +砷 +掴 +颁 +胎 +雯 +绵 +贬 +沐 +撵 +隘 +篙 +暖 +曹 +陡 +栓 +填 +臼 +彦 +瓶 +琪 +潼 +哪 +鸡 +摩 +啦 +俟 +锋 +域 +耻 +蔫 +疯 +纹 +撇 +毒 +绶 +痛 +酯 +忍 +爪 +赳 +歆 +嘹 +辕 +烈 +册 +朴 +钱 +吮 +毯 +癜 +娃 +谀 +邵 +厮 +炽 +璞 +邃 +丐 +追 +词 +瓒 +忆 +轧 +芫 +谯 +喷 +弟 +半 +冕 +裙 +掖 +墉 +绮 +寝 +苔 +势 +顷 +褥 +切 +衮 +君 +佳 +嫒 +蚩 +霞 +佚 +洙 +逊 +镖 +暹 +唛 +& +殒 +顶 +碗 +獗 +轭 +铺 +蛊 +废 +恹 +汨 +崩 +珍 +那 +杵 +曲 +纺 +夏 +薰 +傀 +闳 +淬 +姘 +舀 +拧 +卷 +楂 +恍 +讪 +厩 +寮 +篪 +赓 +乘 +灭 +盅 +鞣 +沟 +慎 +挂 +饺 +鼾 +杳 +树 +缨 +丛 +絮 +娌 +臻 +嗳 +篡 +侩 +述 +衰 +矛 +圈 +蚜 +匕 +筹 +匿 +濞 +晨 +叶 +骋 +郝 +挚 +蚴 +滞 +增 +侍 +描 +瓣 +吖 +嫦 +蟒 +匾 +圣 +赌 +毡 +癞 +恺 +百 +曳 +需 +篓 +肮 +庖 +帏 +卿 +驿 +遗 +蹬 +鬓 +骡 +歉 +芎 +胳 +屐 +禽 +烦 +晌 +寄 +媾 +狄 +翡 +苒 +船 +廉 +终 +痞 +殇 +々 +畦 +饶 +改 +拆 +悻 +萄 +£ +瓿 +乃 +訾 +桅 +匮 +溧 +拥 +纱 +铍 +骗 +蕃 +龋 +缬 +父 +佐 +疚 +栎 +醍 +掳 +蓄 +x +惆 +颜 +鲆 +榆 +〔 +猎 +敌 +暴 +谥 +鲫 +贾 +罗 +玻 +缄 +扦 +芪 +癣 +落 +徒 +臾 +恿 +猩 +托 +邴 +肄 +牵 +春 +陛 +耀 +刊 +拓 +蓓 +邳 +堕 +寇 +枉 +淌 +啡 +湄 +兽 +酷 +萼 +碚 +濠 +萤 +夹 +旬 +戮 +梭 +琥 +椭 +昔 +勺 +蜊 +绐 +晚 +孺 +僵 +宣 +摄 +冽 +旨 +萌 +忙 +蚤 +眉 +噼 +蟑 +付 +契 +瓜 +悼 +颡 +壁 +曾 +窕 +颢 +澎 +仿 +俑 +浑 +嵌 +浣 +乍 +碌 +褪 +乱 +蔟 +隙 +玩 +剐 +葫 +箫 +纲 +围 +伐 +决 +伙 +漩 +瑟 +刑 +肓 +镳 +缓 +蹭 +氨 +皓 +典 +畲 +坍 +铑 +檐 +塑 +洞 +倬 +储 +胴 +淳 +戾 +吐 +灼 +惺 +妙 +毕 +珐 +缈 +虱 +盖 +羰 +鸿 +磅 +谓 +髅 +娴 +苴 +唷 +蚣 +霹 +抨 +贤 +唠 +犬 +誓 +逍 +庠 +逼 +麓 +籼 +釉 +呜 +碧 +秧 +氩 +摔 +霄 +穸 +纨 +辟 +妈 +映 +完 +牛 +缴 +嗷 +炊 +恩 +荔 +茆 +掉 +紊 +慌 +莓 +羟 +阙 +萁 +磐 +另 +蕹 +辱 +鳐 +湮 +吡 +吩 +唐 +睦 +垠 +舒 +圜 +冗 +瞿 +溺 +芾 +囱 +匠 +僳 +汐 +菩 +饬 +漓 +黑 +霰 +浸 +濡 +窥 +毂 +蒡 +兢 +驻 +鹉 +芮 +诙 +迫 +雳 +厂 +忐 +臆 +猴 +鸣 +蚪 +栈 +箕 +羡 +渐 +莆 +捍 +眈 +哓 +趴 +蹼 +埕 +嚣 +骛 +宏 +淄 +斑 +噜 +严 +瑛 +垃 +椎 +诱 +压 +庾 +绞 +焘 +廿 +抡 +迄 +棘 +夫 +纬 +锹 +眨 +瞌 +侠 +脐 +竞 +瀑 +孳 +骧 +遁 +姜 +颦 +荪 +滚 +萦 +伪 +逸 +粳 +爬 +锁 +矣 +役 +趣 +洒 +颔 +诏 +逐 +奸 +甭 +惠 +攀 +蹄 +泛 +尼 +拼 +阮 +鹰 +亚 +颈 +惑 +勒 +〉 +际 +肛 +爷 +刚 +钨 +丰 +养 +冶 +鲽 +辉 +蔻 +画 +覆 +皴 +妊 +麦 +返 +醉 +皂 +擀 +〗 +酶 +凑 +粹 +悟 +诀 +硖 +港 +卜 +z +杀 +涕 +± +舍 +铠 +抵 +弛 +段 +敝 +镐 +奠 +拂 +轴 +跛 +袱 +e +t +沉 +菇 +俎 +薪 +峦 +秭 +蟹 +历 +盟 +菠 +寡 +液 +肢 +喻 +染 +裱 +悱 +抱 +氙 +赤 +捅 +猛 +跑 +氮 +谣 +仁 +尺 +辊 +窍 +烙 +衍 +架 +擦 +倏 +璐 +瑁 +币 +楞 +胖 +夔 +趸 +邛 +惴 +饕 +虔 +蝎 +§ +哉 +贝 +宽 +辫 +炮 +扩 +饲 +籽 +魏 +菟 +锰 +伍 +猝 +末 +琳 +哚 +蛎 +邂 +呀 +姿 +鄞 +却 +歧 +仙 +恸 +椐 +森 +牒 +寤 +袒 +婆 +虢 +雅 +钉 +朵 +贼 +欲 +苞 +寰 +故 +龚 +坭 +嘘 +咫 +礼 +硷 +兀 +睢 +汶 +’ +铲 +烧 +绕 +诃 +浃 +钿 +哺 +柜 +讼 +颊 +璁 +腔 +洽 +咐 +脲 +簌 +筠 +镣 +玮 +鞠 +谁 +兼 +姆 +挥 +梯 +蝴 +谘 +漕 +刷 +躏 +宦 +弼 +b +垌 +劈 +麟 +莉 +揭 +笙 +渎 +仕 +嗤 +仓 +配 +怏 +抬 +错 +泯 +镊 +孰 +猿 +邪 +仍 +秋 +鼬 +壹 +歇 +吵 +炼 +< +尧 +射 +柬 +廷 +胧 +霾 +凳 +隋 +肚 +浮 +梦 +祥 +株 +堵 +退 +L +鹫 +跎 +凶 +毽 +荟 +炫 +栩 +玳 +甜 +沂 +鹿 +顽 +伯 +爹 +赔 +蛴 +徐 +匡 +欣 +狰 +缸 +雹 +蟆 +疤 +默 +沤 +啜 +痂 +衣 +禅 +w +i +h +辽 +葳 +黝 +钗 +停 +沽 +棒 +馨 +颌 +肉 +吴 +硫 +悯 +劾 +娈 +马 +啧 +吊 +悌 +镑 +峭 +帆 +瀣 +涉 +咸 +疸 +滋 +泣 +翦 +拙 +癸 +钥 +蜒 ++ +尾 +庄 +凝 +泉 +婢 +渴 +谊 +乞 +陆 +锉 +糊 +鸦 +淮 +I +B +N +晦 +弗 +乔 +庥 +葡 +尻 +席 +橡 +傣 +渣 +拿 +惩 +麋 +斛 +缃 +矮 +蛏 +岘 +鸽 +姐 +膏 +催 +奔 +镒 +喱 +蠡 +摧 +钯 +胤 +柠 +拐 +璋 +鸥 +卢 +荡 +倾 +^ +_ +珀 +逄 +萧 +塾 +掇 +贮 +笆 +聂 +圃 +冲 +嵬 +M +滔 +笕 +值 +炙 +偶 +蜱 +搐 +梆 +汪 +蔬 +腑 +鸯 +蹇 +敞 +绯 +仨 +祯 +谆 +梧 +糗 +鑫 +啸 +豺 +囹 +猾 +巢 +柄 +瀛 +筑 +踌 +沭 +暗 +苁 +鱿 +蹉 +脂 +蘖 +牢 +热 +木 +吸 +溃 +宠 +序 +泞 +偿 +拜 +檩 +厚 +朐 +毗 +螳 +吞 +媚 +朽 +担 +蝗 +橘 +畴 +祈 +糟 +盱 +隼 +郜 +惜 +珠 +裨 +铵 +焙 +琚 +唯 +咚 +噪 +骊 +丫 +滢 +勤 +棉 +呸 +咣 +淀 +隔 +蕾 +窈 +饨 +挨 +煅 +短 +匙 +粕 +镜 +赣 +撕 +墩 +酬 +馁 +豌 +颐 +抗 +酣 +氓 +佑 +搁 +哭 +递 +耷 +涡 +桃 +贻 +碣 +截 +瘦 +昭 +镌 +蔓 +氚 +甲 +猕 +蕴 +蓬 +散 +拾 +纛 +狼 +猷 +铎 +埋 +旖 +矾 +讳 +囊 +糜 +迈 +粟 +蚂 +紧 +鲳 +瘢 +栽 +稼 +羊 +锄 +斟 +睁 +桥 +瓮 +蹙 +祉 +醺 +鼻 +昱 +剃 +跳 +篱 +跷 +蒜 +翎 +宅 +晖 +嗑 +壑 +峻 +癫 +屏 +狠 +陋 +袜 +途 +憎 +祀 +莹 +滟 +佶 +溥 +臣 +约 +盛 +峰 +磁 +慵 +婪 +拦 +莅 +朕 +鹦 +粲 +裤 +哎 +疡 +嫖 +琵 +窟 +堪 +谛 +嘉 +儡 +鳝 +斩 +郾 +驸 +酊 +妄 +胜 +贺 +徙 +傅 +噌 +钢 +栅 +庇 +恋 +匝 +巯 +邈 +尸 +锚 +粗 +佟 +蛟 +薹 +纵 +蚊 +郅 +绢 +锐 +苗 +俞 +篆 +淆 +膀 +鲜 +煎 +诶 +秽 +寻 +涮 +刺 +怀 +噶 +巨 +褰 +魅 +灶 +灌 +桉 +藕 +谜 +舸 +薄 +搀 +恽 +借 +牯 +痉 +渥 +愿 +亓 +耘 +杠 +柩 +锔 +蚶 +钣 +珈 +喘 +蹒 +幽 +赐 +稗 +晤 +莱 +泔 +扯 +肯 +菪 +裆 +腩 +豉 +疆 +骜 +腐 +倭 +珏 +唔 +粮 +亡 +润 +慰 +伽 +橄 +玄 +誉 +醐 +胆 +龊 +粼 +塬 +陇 +彼 +削 +嗣 +绾 +芽 +妗 +垭 +瘴 +爽 +薏 +寨 +龈 +泠 +弹 +赢 +漪 +猫 +嘧 +涂 +恤 +圭 +茧 +烽 +屑 +痕 +巾 +赖 +荸 +凰 +腮 +畈 +亵 +蹲 +偃 +苇 +澜 +艮 +换 +骺 +烘 +苕 +梓 +颉 +肇 +哗 +悄 +氤 +涠 +葬 +屠 +鹭 +植 +竺 +佯 +诣 +鲇 +瘀 +鲅 +邦 +移 +滁 +冯 +耕 +癔 +戌 +茬 +沁 +巩 +悠 +湘 +洪 +痹 +锟 +循 +谋 +腕 +鳃 +钠 +捞 +焉 +迎 +碱 +伫 +急 +榷 +奈 +邝 +卯 +辄 +皲 +卟 +醛 +畹 +忧 +稳 +雄 +昼 +缩 +阈 +睑 +扌 +耗 +曦 +涅 +捏 +瞧 +邕 +淖 +漉 +铝 +耦 +禹 +湛 +喽 +莼 +琅 +诸 +苎 +纂 +硅 +始 +嗨 +傥 +燃 +臂 +赅 +嘈 +呆 +贵 +屹 +壮 +肋 +亍 +蚀 +卅 +豹 +腆 +邬 +迭 +浊 +} +童 +螂 +捐 +圩 +勐 +触 +寞 +汊 +壤 +荫 +膺 +渌 +芳 +懿 +遴 +螈 +泰 +蓼 +蛤 +茜 +舅 +枫 +朔 +膝 +眙 +避 +梅 +判 +鹜 +璜 +牍 +缅 +垫 +藻 +黔 +侥 +惚 +懂 +踩 +腰 +腈 +札 +丞 +唾 +慈 +顿 +摹 +荻 +琬 +~ +斧 +沈 +滂 +胁 +胀 +幄 +莜 +Z +匀 +鄄 +掌 +绰 +茎 +焚 +赋 +萱 +谑 +汁 +铒 +瞎 +夺 +蜗 +野 +娆 +冀 +弯 +篁 +懵 +灞 +隽 +芡 +脘 +俐 +辩 +芯 +掺 +喏 +膈 +蝈 +觐 +悚 +踹 +蔗 +熠 +鼠 +呵 +抓 +橼 +峨 +畜 +缔 +禾 +崭 +弃 +熊 +摒 +凸 +拗 +穹 +蒙 +抒 +祛 +劝 +闫 +扳 +阵 +醌 +踪 +喵 +侣 +搬 +仅 +荧 +赎 +蝾 +琦 +买 +婧 +瞄 +寓 +皎 +冻 +赝 +箩 +莫 +瞰 +郊 +笫 +姝 +筒 +枪 +遣 +煸 +袋 +舆 +痱 +涛 +母 +〇 +启 +践 +耙 +绲 +盘 +遂 +昊 +搞 +槿 +诬 +纰 +泓 +惨 +檬 +亻 +越 +C +o +憩 +熵 +祷 +钒 +暧 +塔 +阗 +胰 +咄 +娶 +魔 +琶 +钞 +邻 +扬 +杉 +殴 +咽 +弓 +〆 +髻 +】 +吭 +揽 +霆 +拄 +殖 +脆 +彻 +岩 +芝 +勃 +辣 +剌 +钝 +嘎 +甄 +佘 +皖 +伦 +授 +徕 +憔 +挪 +皇 +庞 +稔 +芜 +踏 +溴 +兖 +卒 +擢 +饥 +鳞 +煲 +‰ +账 +颗 +叻 +斯 +捧 +鳍 +琮 +讹 +蛙 +纽 +谭 +酸 +兔 +莒 +睇 +伟 +觑 +羲 +嗜 +宜 +褐 +旎 +辛 +卦 +诘 +筋 +鎏 +溪 +挛 +熔 +阜 +晰 +鳅 +丢 +奚 +灸 +呱 +献 +陉 +黛 +鸪 +甾 +萨 +疮 +拯 +洲 +疹 +辑 +叙 +恻 +谒 +允 +柔 +烂 +氏 +逅 +漆 +拎 +惋 +扈 +湟 +纭 +啕 +掬 +擞 +哥 +忽 +涤 +鸵 +靡 +郗 +瓷 +扁 +廊 +怨 +雏 +钮 +敦 +E +懦 +憋 +汀 +拚 +啉 +腌 +岸 +f +痼 +瞅 +尊 +咀 +眩 +飙 +忌 +仝 +迦 +熬 +毫 +胯 +篑 +茄 +腺 +凄 +舛 +碴 +锵 +诧 +羯 +後 +漏 +汤 +宓 +仞 +蚁 +壶 +谰 +皑 +铄 +棰 +罔 +辅 +晶 +苦 +牟 +闽 +\ +烃 +饮 +聿 +丙 +蛳 +朱 +煤 +涔 +鳖 +犁 +罐 +荼 +砒 +淦 +妤 +黏 +戎 +孑 +婕 +瑾 +戢 +钵 +枣 +捋 +砥 +衩 +狙 +桠 +稣 +阎 +肃 +梏 +诫 +孪 +昶 +婊 +衫 +嗔 +侃 +塞 +蜃 +樵 +峒 +貌 +屿 +欺 +缫 +阐 +栖 +诟 +珞 +荭 +吝 +萍 +嗽 +恂 +啻 +蜴 +磬 +峋 +俸 +豫 +谎 +徊 +镍 +韬 +魇 +晴 +U +囟 +猜 +蛮 +坐 +囿 +伴 +亭 +肝 +佗 +蝠 +妃 +胞 +滩 +榴 +氖 +垩 +苋 +砣 +扪 +馏 +姓 +轩 +厉 +夥 +侈 +禀 +垒 +岑 +赏 +钛 +辐 +痔 +披 +纸 +碳 +“ +坞 +蠓 +挤 +荥 +沅 +悔 +铧 +帼 +蒌 +蝇 +a +p +y +n +g +哀 +浆 +瑶 +凿 +桶 +馈 +皮 +奴 +苜 +佤 +伶 +晗 +铱 +炬 +优 +弊 +氢 +恃 +甫 +攥 +端 +锌 +灰 +稹 +炝 +曙 +邋 +亥 +眶 +碾 +拉 +萝 +绔 +捷 +浍 +腋 +姑 +菖 +凌 +涞 +麽 +锢 +桨 +潢 +绎 +镰 +殆 +锑 +渝 +铬 +困 +绽 +觎 +匈 +糙 +暑 +裹 +鸟 +盔 +肽 +迷 +綦 +『 +亳 +佝 +俘 +钴 +觇 +骥 +仆 +疝 +跪 +婶 +郯 +瀹 +唉 +脖 +踞 +针 +晾 +忒 +扼 +瞩 +叛 +椒 +疟 +嗡 +邗 +肆 +跆 +玫 +忡 +捣 +咧 +唆 +艄 +蘑 +潦 +笛 +阚 +沸 +泻 +掊 +菽 +贫 +斥 +髂 +孢 +镂 +赂 +麝 +鸾 +屡 +衬 +苷 +恪 +叠 +希 +粤 +爻 +喝 +茫 +惬 +郸 +绻 +庸 +撅 +碟 +宄 +妹 +膛 +叮 +饵 +崛 +嗲 +椅 +冤 +搅 +咕 +敛 +尹 +垦 +闷 +蝉 +霎 +勰 +败 +蓑 +泸 +肤 +鹌 +幌 +焦 +浠 +鞍 +刁 +舰 +乙 +竿 +裔 +。 +茵 +函 +伊 +兄 +丨 +娜 +匍 +謇 +莪 +宥 +似 +蝽 +翳 +酪 +翠 +粑 +薇 +祢 +骏 +赠 +叫 +Q +噤 +噻 +竖 +芗 +莠 +潭 +俊 +羿 +耜 +O +郫 +趁 +嗪 +囚 +蹶 +芒 +洁 +笋 +鹑 +敲 +硝 +啶 +堡 +渲 +揩 +』 +携 +宿 +遒 +颍 +扭 +棱 +割 +萜 +蔸 +葵 +琴 +捂 +饰 +衙 +耿 +掠 +募 +岂 +窖 +涟 +蔺 +瘤 +柞 +瞪 +怜 +匹 +距 +楔 +炜 +哆 +秦 +缎 +幼 +茁 +绪 +痨 +恨 +楸 +娅 +瓦 +桩 +雪 +嬴 +伏 +榔 +妥 +铿 +拌 +眠 +雍 +缇 +‘ +卓 +搓 +哌 +觞 +噩 +屈 +哧 +髓 +咦 +巅 +娑 +侑 +淫 +膳 +祝 +勾 +姊 +莴 +胄 +疃 +薛 +蜷 +胛 +巷 +芙 +芋 +熙 +闰 +勿 +窃 +狱 +剩 +钏 +幢 +陟 +铛 +慧 +靴 +耍 +k +浙 +浇 +飨 +惟 +绗 +祜 +澈 +啼 +咪 +磷 +摞 +诅 +郦 +抹 +跃 +壬 +吕 +肖 +琏 +颤 +尴 +剡 +抠 +凋 +赚 +泊 +津 +宕 +殷 +倔 +氲 +漫 +邺 +涎 +怠 +$ +垮 +荬 +遵 +俏 +叹 +噢 +饽 +蜘 +孙 +筵 +疼 +鞭 +羧 +牦 +箭 +潴 +c +眸 +祭 +髯 +啖 +坳 +愁 +芩 +驮 +倡 +巽 +穰 +沃 +胚 +怒 +凤 +槛 +剂 +趵 +嫁 +v +邢 +灯 +鄢 +桐 +睽 +檗 +锯 +槟 +婷 +嵋 +圻 +诗 +蕈 +颠 +遭 +痢 +芸 +怯 +馥 +竭 +锗 +徜 +恭 +遍 +籁 +剑 +嘱 +苡 +龄 +僧 +桑 +潸 +弘 +澶 +楹 +悲 +讫 +愤 +腥 +悸 +谍 +椹 +呢 +桓 +葭 +攫 +阀 +翰 +躲 +敖 +柑 +郎 +笨 +橇 +呃 +魁 +燎 +脓 +葩 +磋 +垛 +玺 +狮 +沓 +砜 +蕊 +锺 +罹 +蕉 +翱 +虐 +闾 +巫 +旦 +茱 +嬷 +枯 +鹏 +贡 +芹 +汛 +矫 +绁 +拣 +禺 +佃 +讣 +舫 +惯 +乳 +趋 +疲 +挽 +岚 +虾 +衾 +蠹 +蹂 +飓 +氦 +铖 +孩 +稞 +瑜 +壅 +掀 +勘 +妓 +畅 +髋 +W +庐 +牲 +蓿 +榕 +练 +垣 +唱 +邸 +菲 +昆 +婺 +穿 +绡 +麒 +蚱 +掂 +愚 +泷 +涪 +漳 +妩 +娉 +榄 +讷 +觅 +旧 +藤 +煮 +呛 +柳 +腓 +叭 +庵 +烷 +阡 +罂 +蜕 +擂 +猖 +咿 +媲 +脉 +【 +沏 +貅 +黠 +熏 +哲 +烁 +坦 +酵 +兜 +× +潇 +撒 +剽 +珩 +圹 +乾 +摸 +樟 +帽 +嗒 +襄 +魂 +轿 +憬 +锡 +〕 +喃 +皆 +咖 +隅 +脸 +残 +泮 +袂 +鹂 +珊 +囤 +捆 +咤 +误 +徨 +闹 +淙 +芊 +淋 +怆 +囗 +拨 +梳 +渤 +R +G +绨 +蚓 +婀 +幡 +狩 +麾 +谢 +唢 +裸 +旌 +伉 +纶 +裂 +驳 +砼 +咛 +澄 +樨 +蹈 +宙 +澍 +倍 +貔 +操 +勇 +蟠 +摈 +砧 +虬 +够 +缁 +悦 +藿 +撸 +艹 +摁 +淹 +豇 +虎 +榭 +ˉ +吱 +d +° +喧 +荀 +踱 +侮 +奋 +偕 +饷 +犍 +惮 +坑 +璎 +徘 +宛 +妆 +袈 +倩 +窦 +昂 +荏 +乖 +K +怅 +撰 +鳙 +牙 +袁 +酞 +X +痿 +琼 +闸 +雁 +趾 +荚 +虻 +涝 +《 +杏 +韭 +偈 +烤 +绫 +鞘 +卉 +症 +遢 +蓥 +诋 +杭 +荨 +匆 +竣 +簪 +辙 +敕 +虞 +丹 +缭 +咩 +黟 +m +淤 +瑕 +咂 +铉 +硼 +茨 +嶂 +痒 +畸 +敬 +涿 +粪 +窘 +熟 +叔 +嫔 +盾 +忱 +裘 +憾 +梵 +赡 +珙 +咯 +娘 +庙 +溯 +胺 +葱 +痪 +摊 +荷 +卞 +乒 +髦 +寐 +铭 +坩 +胗 +枷 +爆 +溟 +嚼 +羚 +砬 +轨 +惊 +挠 +罄 +竽 +菏 +氧 +浅 +楣 +盼 +枢 +炸 +阆 +杯 +谏 +噬 +淇 +渺 +俪 +秆 +墓 +泪 +跻 +砌 +痰 +垡 +渡 +耽 +釜 +讶 +鳎 +煞 +呗 +韶 +舶 +绷 +鹳 +缜 +旷 +铊 +皱 +龌 +檀 +霖 +奄 +槐 +艳 +蝶 +旋 +哝 +赶 +骞 +蚧 +腊 +盈 +丁 +` +蜚 +矸 +蝙 +睨 +嚓 +僻 +鬼 +醴 +夜 +彝 +磊 +笔 +拔 +栀 +糕 +厦 +邰 +纫 +逭 +纤 +眦 +膊 +馍 +躇 +烯 +蘼 +冬 +诤 +暄 +骶 +哑 +瘠 +」 +臊 +丕 +愈 +咱 +螺 +擅 +跋 +搏 +硪 +谄 +笠 +淡 +嘿 +骅 +谧 +鼎 +皋 +姚 +歼 +蠢 +驼 +耳 +胬 +挝 +涯 +狗 +蒽 +孓 +犷 +凉 +芦 +箴 +铤 +孤 +嘛 +坤 +V +茴 +朦 +挞 +尖 +橙 +诞 +搴 +碇 +洵 +浚 +帚 +蜍 +漯 +柘 +嚎 +讽 +芭 +荤 +咻 +祠 +秉 +跖 +埃 +吓 +糯 +眷 +馒 +惹 +娼 +鲑 +嫩 +讴 +轮 +瞥 +靶 +褚 +乏 +缤 +宋 +帧 +删 +驱 +碎 +扑 +俩 +俄 +偏 +涣 +竹 +噱 +皙 +佰 +渚 +唧 +斡 +# +镉 +刀 +崎 +筐 +佣 +夭 +贰 +肴 +峙 +哔 +艿 +匐 +牺 +镛 +缘 +仡 +嫡 +劣 +枸 +堀 +梨 +簿 +鸭 +蒸 +亦 +稽 +浴 +{ +衢 +束 +槲 +j +阁 +揍 +疥 +棋 +潋 +聪 +窜 +乓 +睛 +插 +冉 +阪 +苍 +搽 +「 +蟾 +螟 +幸 +仇 +樽 +撂 +慢 +跤 +幔 +俚 +淅 +覃 +觊 +溶 +妖 +帛 +侨 +曰 +妾 +泗 +· +: +瀘 +風 +Ë +( +) +∶ +紅 +紗 +瑭 +雲 +頭 +鶏 +財 +許 +• +¥ +樂 +焗 +麗 +— +; +滙 +東 +榮 +繪 +興 +… +門 +業 +π +楊 +國 +顧 +é +盤 +寳 +Λ +龍 +鳳 +島 +誌 +緣 +結 +銭 +萬 +勝 +祎 +璟 +優 +歡 +臨 +時 +購 += +★ +藍 +昇 +鐵 +觀 +勅 +農 +聲 +畫 +兿 +術 +發 +劉 +記 +專 +耑 +園 +書 +壴 +種 +Ο +● +褀 +號 +銀 +匯 +敟 +锘 +葉 +橪 +廣 +進 +蒄 +鑽 +阝 +祙 +貢 +鍋 +豊 +夬 +喆 +團 +閣 +開 +燁 +賓 +館 +酡 +沔 +順 ++ +硚 +劵 +饸 +陽 +車 +湓 +復 +萊 +氣 +軒 +華 +堃 +迮 +纟 +戶 +馬 +學 +裡 +電 +嶽 +獨 +マ +シ +サ +ジ +燘 +袪 +環 +❤ +臺 +灣 +専 +賣 +孖 +聖 +攝 +線 +▪ +α +傢 +俬 +夢 +達 +莊 +喬 +貝 +薩 +劍 +羅 +壓 +棛 +饦 +尃 +璈 +囍 +醫 +G +I +A +# +N +鷄 +髙 +嬰 +啓 +約 +隹 +潔 +賴 +藝 +~ +寶 +籣 +麺 +  +嶺 +√ +義 +網 +峩 +長 +∧ +魚 +機 +構 +② +鳯 +偉 +L +B +㙟 +畵 +鴿 +' +詩 +溝 +嚞 +屌 +藔 +佧 +玥 +蘭 +織 +1 +3 +9 +0 +7 +點 +砭 +鴨 +鋪 +銘 +廳 +弍 +‧ +創 +湯 +坶 +℃ +卩 +骝 +& +烜 +荘 +當 +潤 +扞 +係 +懷 +碶 +钅 +蚨 +讠 +☆ +叢 +爲 +埗 +涫 +塗 +→ +楽 +現 +鯨 +愛 +瑪 +鈺 +忄 +悶 +藥 +飾 +樓 +視 +孬 +ㆍ +燚 +苪 +師 +① +丼 +锽 +│ +韓 +標 +è +兒 +閏 +匋 +張 +漢 +Ü +髪 +會 +閑 +檔 +習 +裝 +の +峯 +菘 +輝 +И +雞 +釣 +億 +浐 +K +O +R +8 +H +E +P +T +W +D +S +C +M +F +姌 +饹 +» +晞 +廰 +ä +嵯 +鷹 +負 +飲 +絲 +冚 +楗 +澤 +綫 +區 +❋ +← +質 +靑 +揚 +③ +滬 +統 +産 +協 +﹑ +乸 +畐 +經 +運 +際 +洺 +岽 +為 +粵 +諾 +崋 +豐 +碁 +ɔ +V +2 +6 +齋 +誠 +訂 +´ +勑 +雙 +陳 +無 +í +泩 +媄 +夌 +刂 +i +c +t +o +r +a +嘢 +耄 +燴 +暃 +壽 +媽 +靈 +抻 +體 +唻 +É +冮 +甹 +鎮 +錦 +ʌ +蜛 +蠄 +尓 +駕 +戀 +飬 +逹 +倫 +貴 +極 +Я +Й +寬 +磚 +嶪 +郎 +職 +| +間 +n +d +剎 +伈 +課 +飛 +橋 +瘊 +№ +譜 +骓 +圗 +滘 +縣 +粿 +咅 +養 +濤 +彳 +® +% +Ⅱ +啰 +㴪 +見 +矞 +薬 +糁 +邨 +鲮 +顔 +罱 +З +選 +話 +贏 +氪 +俵 +競 +瑩 +繡 +枱 +β +綉 +á +獅 +爾 +™ +麵 +戋 +淩 +徳 +個 +劇 +場 +務 +簡 +寵 +h +實 +膠 +轱 +圖 +築 +嘣 +樹 +㸃 +營 +耵 +孫 +饃 +鄺 +飯 +麯 +遠 +輸 +坫 +孃 +乚 +閃 +鏢 +㎡ +題 +廠 +關 +↑ +爺 +將 +軍 +連 +篦 +覌 +參 +箸 +- +窠 +棽 +寕 +夀 +爰 +歐 +呙 +閥 +頡 +熱 +雎 +垟 +裟 +凬 +勁 +帑 +馕 +夆 +疌 +枼 +馮 +貨 +蒤 +樸 +彧 +旸 +靜 +龢 +暢 +㐱 +鳥 +珺 +鏡 +灡 +爭 +堷 +廚 +Ó +騰 +診 +┅ +蘇 +褔 +凱 +頂 +豕 +亞 +帥 +嘬 +⊥ +仺 +桖 +複 +饣 +絡 +穂 +顏 +棟 +納 +▏ +濟 +親 +設 +計 +攵 +埌 +烺 +ò +頤 +燦 +蓮 +撻 +節 +講 +濱 +濃 +娽 +洳 +朿 +燈 +鈴 +護 +膚 +铔 +過 +補 +Z +U +5 +4 +坋 +闿 +䖝 +餘 +缐 +铞 +貿 +铪 +桼 +趙 +鍊 +[ +㐂 +垚 +菓 +揸 +捲 +鐘 +滏 +𣇉 +爍 +輪 +燜 +鴻 +鮮 +動 +鹞 +鷗 +丄 +慶 +鉌 +翥 +飮 +腸 +⇋ +漁 +覺 +來 +熘 +昴 +翏 +鲱 +圧 +鄉 +萭 +頔 +爐 +嫚 +г +貭 +類 +聯 +幛 +輕 +訓 +鑒 +夋 +锨 +芃 +珣 +䝉 +扙 +嵐 +銷 +處 +ㄱ +語 +誘 +苝 +歸 +儀 +燒 +楿 +內 +粢 +葒 +奧 +麥 +礻 +滿 +蠔 +穵 +瞭 +態 +鱬 +榞 +硂 +鄭 +黃 +煙 +祐 +奓 +逺 +* +瑄 +獲 +聞 +薦 +讀 +這 +樣 +決 +問 +啟 +們 +執 +説 +轉 +單 +隨 +唘 +帶 +倉 +庫 +還 +贈 +尙 +皺 +■ +餅 +產 +○ +∈ +報 +狀 +楓 +賠 +琯 +嗮 +禮 +` +傳 +> +≤ +嗞 +Φ +≥ +換 +咭 +∣ +↓ +曬 +ε +応 +寫 +″ +終 +様 +純 +費 +療 +聨 +凍 +壐 +郵 +ü +黒 +∫ +製 +塊 +調 +軽 +確 +撃 +級 +馴 +Ⅲ +涇 +繹 +數 +碼 +證 +狒 +処 +劑 +< +晧 +賀 +衆 +] +櫥 +兩 +陰 +絶 +對 +鯉 +憶 +◎ +p +e +Y +蕒 +煖 +頓 +測 +試 +鼽 +僑 +碩 +妝 +帯 +≈ +鐡 +舖 +權 +喫 +倆 +ˋ +該 +悅 +ā +俫 +. +f +s +b +m +k +g +u +j +貼 +淨 +濕 +針 +適 +備 +l +/ +給 +謢 +強 +觸 +衛 +與 +⊙ +$ +緯 +變 +⑴ +⑵ +⑶ +㎏ +殺 +∩ +幚 +─ +價 +▲ +離 +ú +ó +飄 +烏 +関 +閟 +﹝ +﹞ +邏 +輯 +鍵 +驗 +訣 +導 +歷 +屆 +層 +▼ +儱 +錄 +熳 +ē +艦 +吋 +錶 +辧 +飼 +顯 +④ +禦 +販 +気 +対 +枰 +閩 +紀 +幹 +瞓 +貊 +淚 +△ +眞 +墊 +Ω +獻 +褲 +縫 +緑 +亜 +鉅 +餠 +{ +} +◆ +蘆 +薈 +█ +◇ +溫 +彈 +晳 +粧 +犸 +穩 +訊 +崬 +凖 +熥 +П +舊 +條 +紋 +圍 +Ⅳ +筆 +尷 +難 +雜 +錯 +綁 +識 +頰 +鎖 +艶 +□ +殁 +殼 +⑧ +├ +▕ +鵬 +ǐ +ō +ǒ +糝 +綱 +▎ +μ +盜 +饅 +醬 +籤 +蓋 +釀 +鹽 +據 +à +ɡ +辦 +◥ +彐 +┌ +婦 +獸 +鲩 +伱 +ī +蒟 +蒻 +齊 +袆 +腦 +寧 +凈 +妳 +煥 +詢 +偽 +謹 +啫 +鯽 +騷 +鱸 +損 +傷 +鎻 +髮 +買 +冏 +儥 +両 +﹢ +∞ +載 +喰 +z +羙 +悵 +燙 +曉 +員 +組 +徹 +艷 +痠 +鋼 +鼙 +縮 +細 +嚒 +爯 +≠ +維 +" +鱻 +壇 +厍 +帰 +浥 +犇 +薡 +軎 +² +應 +醜 +刪 +緻 +鶴 +賜 +噁 +軌 +尨 +镔 +鷺 +槗 +彌 +葚 +濛 +請 +溇 +緹 +賢 +訪 +獴 +瑅 +資 +縤 +陣 +蕟 +栢 +韻 +祼 +恁 +伢 +謝 +劃 +涑 +總 +衖 +踺 +砋 +凉 +籃 +駿 +苼 +瘋 +昽 +紡 +驊 +腎 +﹗ +響 +杋 +剛 +嚴 +禪 +歓 +槍 +傘 +檸 +檫 +炣 +勢 +鏜 +鎢 +銑 +尐 +減 +奪 +惡 +θ +僮 +婭 +臘 +ū +ì +殻 +鉄 +∑ +蛲 +焼 +緖 +續 +紹 +懮 \ No newline at end of file diff --git a/deepdoc/vision/operators.py b/deepdoc/vision/operators.py new file mode 100644 index 0000000000000000000000000000000000000000..382fe3635ff827799f4907d77f150cca72f2560c --- /dev/null +++ b/deepdoc/vision/operators.py @@ -0,0 +1,711 @@ +# +# Copyright 2024 The InfiniFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import sys +import six +import cv2 +import numpy as np +import math +from PIL import Image + + +class DecodeImage(object): + """ decode image """ + + def __init__(self, + img_mode='RGB', + channel_first=False, + ignore_orientation=False, + **kwargs): + self.img_mode = img_mode + self.channel_first = channel_first + self.ignore_orientation = ignore_orientation + + def __call__(self, data): + img = data['image'] + if six.PY2: + assert isinstance(img, str) and len( + img) > 0, "invalid input 'img' in DecodeImage" + else: + assert isinstance(img, bytes) and len( + img) > 0, "invalid input 'img' in DecodeImage" + img = np.frombuffer(img, dtype='uint8') + if self.ignore_orientation: + img = cv2.imdecode(img, cv2.IMREAD_IGNORE_ORIENTATION | + cv2.IMREAD_COLOR) + else: + img = cv2.imdecode(img, 1) + if img is None: + return None + if self.img_mode == 'GRAY': + img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) + elif self.img_mode == 'RGB': + assert img.shape[2] == 3, 'invalid shape of image[%s]' % ( + img.shape) + img = img[:, :, ::-1] + + if self.channel_first: + img = img.transpose((2, 0, 1)) + + data['image'] = img + return data + + +class StandardizeImage(object): + """normalize image + Args: + mean (list): im - mean + std (list): im / std + is_scale (bool): whether need im / 255 + norm_type (str): type in ['mean_std', 'none'] + """ + + def __init__(self, mean, std, is_scale=True, norm_type='mean_std'): + self.mean = mean + self.std = std + self.is_scale = is_scale + self.norm_type = norm_type + + def __call__(self, im, im_info): + """ + Args: + im (np.ndarray): image (np.ndarray) + im_info (dict): info of image + Returns: + im (np.ndarray): processed image (np.ndarray) + im_info (dict): info of processed image + """ + im = im.astype(np.float32, copy=False) + if self.is_scale: + scale = 1.0 / 255.0 + im *= scale + + if self.norm_type == 'mean_std': + mean = np.array(self.mean)[np.newaxis, np.newaxis, :] + std = np.array(self.std)[np.newaxis, np.newaxis, :] + im -= mean + im /= std + return im, im_info + + +class NormalizeImage(object): + """ normalize image such as substract mean, divide std + """ + + def __init__(self, scale=None, mean=None, std=None, order='chw', **kwargs): + if isinstance(scale, str): + scale = eval(scale) + self.scale = np.float32(scale if scale is not None else 1.0 / 255.0) + mean = mean if mean is not None else [0.485, 0.456, 0.406] + std = std if std is not None else [0.229, 0.224, 0.225] + + shape = (3, 1, 1) if order == 'chw' else (1, 1, 3) + self.mean = np.array(mean).reshape(shape).astype('float32') + self.std = np.array(std).reshape(shape).astype('float32') + + def __call__(self, data): + img = data['image'] + from PIL import Image + if isinstance(img, Image.Image): + img = np.array(img) + assert isinstance(img, + np.ndarray), "invalid input 'img' in NormalizeImage" + data['image'] = ( + img.astype('float32') * self.scale - self.mean) / self.std + return data + + +class ToCHWImage(object): + """ convert hwc image to chw image + """ + + def __init__(self, **kwargs): + pass + + def __call__(self, data): + img = data['image'] + from PIL import Image + if isinstance(img, Image.Image): + img = np.array(img) + data['image'] = img.transpose((2, 0, 1)) + return data + + +class Fasttext(object): + def __init__(self, path="None", **kwargs): + import fasttext + self.fast_model = fasttext.load_model(path) + + def __call__(self, data): + label = data['label'] + fast_label = self.fast_model[label] + data['fast_label'] = fast_label + return data + + +class KeepKeys(object): + def __init__(self, keep_keys, **kwargs): + self.keep_keys = keep_keys + + def __call__(self, data): + data_list = [] + for key in self.keep_keys: + data_list.append(data[key]) + return data_list + + +class Pad(object): + def __init__(self, size=None, size_div=32, **kwargs): + if size is not None and not isinstance(size, (int, list, tuple)): + raise TypeError("Type of target_size is invalid. Now is {}".format( + type(size))) + if isinstance(size, int): + size = [size, size] + self.size = size + self.size_div = size_div + + def __call__(self, data): + + img = data['image'] + img_h, img_w = img.shape[0], img.shape[1] + if self.size: + resize_h2, resize_w2 = self.size + assert ( + img_h < resize_h2 and img_w < resize_w2 + ), '(h, w) of target size should be greater than (img_h, img_w)' + else: + resize_h2 = max( + int(math.ceil(img.shape[0] / self.size_div) * self.size_div), + self.size_div) + resize_w2 = max( + int(math.ceil(img.shape[1] / self.size_div) * self.size_div), + self.size_div) + img = cv2.copyMakeBorder( + img, + 0, + resize_h2 - img_h, + 0, + resize_w2 - img_w, + cv2.BORDER_CONSTANT, + value=0) + data['image'] = img + return data + + +class LinearResize(object): + """resize image by target_size and max_size + Args: + target_size (int): the target size of image + keep_ratio (bool): whether keep_ratio or not, default true + interp (int): method of resize + """ + + def __init__(self, target_size, keep_ratio=True, interp=cv2.INTER_LINEAR): + if isinstance(target_size, int): + target_size = [target_size, target_size] + self.target_size = target_size + self.keep_ratio = keep_ratio + self.interp = interp + + def __call__(self, im, im_info): + """ + Args: + im (np.ndarray): image (np.ndarray) + im_info (dict): info of image + Returns: + im (np.ndarray): processed image (np.ndarray) + im_info (dict): info of processed image + """ + assert len(self.target_size) == 2 + assert self.target_size[0] > 0 and self.target_size[1] > 0 + im_channel = im.shape[2] + im_scale_y, im_scale_x = self.generate_scale(im) + im = cv2.resize( + im, + None, + None, + fx=im_scale_x, + fy=im_scale_y, + interpolation=self.interp) + im_info['im_shape'] = np.array(im.shape[:2]).astype('float32') + im_info['scale_factor'] = np.array( + [im_scale_y, im_scale_x]).astype('float32') + return im, im_info + + def generate_scale(self, im): + """ + Args: + im (np.ndarray): image (np.ndarray) + Returns: + im_scale_x: the resize ratio of X + im_scale_y: the resize ratio of Y + """ + origin_shape = im.shape[:2] + im_c = im.shape[2] + if self.keep_ratio: + im_size_min = np.min(origin_shape) + im_size_max = np.max(origin_shape) + target_size_min = np.min(self.target_size) + target_size_max = np.max(self.target_size) + im_scale = float(target_size_min) / float(im_size_min) + if np.round(im_scale * im_size_max) > target_size_max: + im_scale = float(target_size_max) / float(im_size_max) + im_scale_x = im_scale + im_scale_y = im_scale + else: + resize_h, resize_w = self.target_size + im_scale_y = resize_h / float(origin_shape[0]) + im_scale_x = resize_w / float(origin_shape[1]) + return im_scale_y, im_scale_x + + +class Resize(object): + def __init__(self, size=(640, 640), **kwargs): + self.size = size + + def resize_image(self, img): + resize_h, resize_w = self.size + ori_h, ori_w = img.shape[:2] # (h, w, c) + ratio_h = float(resize_h) / ori_h + ratio_w = float(resize_w) / ori_w + img = cv2.resize(img, (int(resize_w), int(resize_h))) + return img, [ratio_h, ratio_w] + + def __call__(self, data): + img = data['image'] + if 'polys' in data: + text_polys = data['polys'] + + img_resize, [ratio_h, ratio_w] = self.resize_image(img) + if 'polys' in data: + new_boxes = [] + for box in text_polys: + new_box = [] + for cord in box: + new_box.append([cord[0] * ratio_w, cord[1] * ratio_h]) + new_boxes.append(new_box) + data['polys'] = np.array(new_boxes, dtype=np.float32) + data['image'] = img_resize + return data + + +class DetResizeForTest(object): + def __init__(self, **kwargs): + super(DetResizeForTest, self).__init__() + self.resize_type = 0 + self.keep_ratio = False + if 'image_shape' in kwargs: + self.image_shape = kwargs['image_shape'] + self.resize_type = 1 + if 'keep_ratio' in kwargs: + self.keep_ratio = kwargs['keep_ratio'] + elif 'limit_side_len' in kwargs: + self.limit_side_len = kwargs['limit_side_len'] + self.limit_type = kwargs.get('limit_type', 'min') + elif 'resize_long' in kwargs: + self.resize_type = 2 + self.resize_long = kwargs.get('resize_long', 960) + else: + self.limit_side_len = 736 + self.limit_type = 'min' + + def __call__(self, data): + img = data['image'] + src_h, src_w, _ = img.shape + if sum([src_h, src_w]) < 64: + img = self.image_padding(img) + + if self.resize_type == 0: + # img, shape = self.resize_image_type0(img) + img, [ratio_h, ratio_w] = self.resize_image_type0(img) + elif self.resize_type == 2: + img, [ratio_h, ratio_w] = self.resize_image_type2(img) + else: + # img, shape = self.resize_image_type1(img) + img, [ratio_h, ratio_w] = self.resize_image_type1(img) + data['image'] = img + data['shape'] = np.array([src_h, src_w, ratio_h, ratio_w]) + return data + + def image_padding(self, im, value=0): + h, w, c = im.shape + im_pad = np.zeros((max(32, h), max(32, w), c), np.uint8) + value + im_pad[:h, :w, :] = im + return im_pad + + def resize_image_type1(self, img): + resize_h, resize_w = self.image_shape + ori_h, ori_w = img.shape[:2] # (h, w, c) + if self.keep_ratio is True: + resize_w = ori_w * resize_h / ori_h + N = math.ceil(resize_w / 32) + resize_w = N * 32 + ratio_h = float(resize_h) / ori_h + ratio_w = float(resize_w) / ori_w + img = cv2.resize(img, (int(resize_w), int(resize_h))) + # return img, np.array([ori_h, ori_w]) + return img, [ratio_h, ratio_w] + + def resize_image_type0(self, img): + """ + resize image to a size multiple of 32 which is required by the network + args: + img(array): array with shape [h, w, c] + return(tuple): + img, (ratio_h, ratio_w) + """ + limit_side_len = self.limit_side_len + h, w, c = img.shape + + # limit the max side + if self.limit_type == 'max': + if max(h, w) > limit_side_len: + if h > w: + ratio = float(limit_side_len) / h + else: + ratio = float(limit_side_len) / w + else: + ratio = 1. + elif self.limit_type == 'min': + if min(h, w) < limit_side_len: + if h < w: + ratio = float(limit_side_len) / h + else: + ratio = float(limit_side_len) / w + else: + ratio = 1. + elif self.limit_type == 'resize_long': + ratio = float(limit_side_len) / max(h, w) + else: + raise Exception('not support limit type, image ') + resize_h = int(h * ratio) + resize_w = int(w * ratio) + + resize_h = max(int(round(resize_h / 32) * 32), 32) + resize_w = max(int(round(resize_w / 32) * 32), 32) + + try: + if int(resize_w) <= 0 or int(resize_h) <= 0: + return None, (None, None) + img = cv2.resize(img, (int(resize_w), int(resize_h))) + except BaseException: + print(img.shape, resize_w, resize_h) + sys.exit(0) + ratio_h = resize_h / float(h) + ratio_w = resize_w / float(w) + return img, [ratio_h, ratio_w] + + def resize_image_type2(self, img): + h, w, _ = img.shape + + resize_w = w + resize_h = h + + if resize_h > resize_w: + ratio = float(self.resize_long) / resize_h + else: + ratio = float(self.resize_long) / resize_w + + resize_h = int(resize_h * ratio) + resize_w = int(resize_w * ratio) + + max_stride = 128 + resize_h = (resize_h + max_stride - 1) // max_stride * max_stride + resize_w = (resize_w + max_stride - 1) // max_stride * max_stride + img = cv2.resize(img, (int(resize_w), int(resize_h))) + ratio_h = resize_h / float(h) + ratio_w = resize_w / float(w) + + return img, [ratio_h, ratio_w] + + +class E2EResizeForTest(object): + def __init__(self, **kwargs): + super(E2EResizeForTest, self).__init__() + self.max_side_len = kwargs['max_side_len'] + self.valid_set = kwargs['valid_set'] + + def __call__(self, data): + img = data['image'] + src_h, src_w, _ = img.shape + if self.valid_set == 'totaltext': + im_resized, [ratio_h, ratio_w] = self.resize_image_for_totaltext( + img, max_side_len=self.max_side_len) + else: + im_resized, (ratio_h, ratio_w) = self.resize_image( + img, max_side_len=self.max_side_len) + data['image'] = im_resized + data['shape'] = np.array([src_h, src_w, ratio_h, ratio_w]) + return data + + def resize_image_for_totaltext(self, im, max_side_len=512): + + h, w, _ = im.shape + resize_w = w + resize_h = h + ratio = 1.25 + if h * ratio > max_side_len: + ratio = float(max_side_len) / resize_h + resize_h = int(resize_h * ratio) + resize_w = int(resize_w * ratio) + + max_stride = 128 + resize_h = (resize_h + max_stride - 1) // max_stride * max_stride + resize_w = (resize_w + max_stride - 1) // max_stride * max_stride + im = cv2.resize(im, (int(resize_w), int(resize_h))) + ratio_h = resize_h / float(h) + ratio_w = resize_w / float(w) + return im, (ratio_h, ratio_w) + + def resize_image(self, im, max_side_len=512): + """ + resize image to a size multiple of max_stride which is required by the network + :param im: the resized image + :param max_side_len: limit of max image size to avoid out of memory in gpu + :return: the resized image and the resize ratio + """ + h, w, _ = im.shape + + resize_w = w + resize_h = h + + # Fix the longer side + if resize_h > resize_w: + ratio = float(max_side_len) / resize_h + else: + ratio = float(max_side_len) / resize_w + + resize_h = int(resize_h * ratio) + resize_w = int(resize_w * ratio) + + max_stride = 128 + resize_h = (resize_h + max_stride - 1) // max_stride * max_stride + resize_w = (resize_w + max_stride - 1) // max_stride * max_stride + im = cv2.resize(im, (int(resize_w), int(resize_h))) + ratio_h = resize_h / float(h) + ratio_w = resize_w / float(w) + + return im, (ratio_h, ratio_w) + + +class KieResize(object): + def __init__(self, **kwargs): + super(KieResize, self).__init__() + self.max_side, self.min_side = kwargs['img_scale'][0], kwargs[ + 'img_scale'][1] + + def __call__(self, data): + img = data['image'] + points = data['points'] + src_h, src_w, _ = img.shape + im_resized, scale_factor, [ratio_h, ratio_w + ], [new_h, new_w] = self.resize_image(img) + resize_points = self.resize_boxes(img, points, scale_factor) + data['ori_image'] = img + data['ori_boxes'] = points + data['points'] = resize_points + data['image'] = im_resized + data['shape'] = np.array([new_h, new_w]) + return data + + def resize_image(self, img): + norm_img = np.zeros([1024, 1024, 3], dtype='float32') + scale = [512, 1024] + h, w = img.shape[:2] + max_long_edge = max(scale) + max_short_edge = min(scale) + scale_factor = min(max_long_edge / max(h, w), + max_short_edge / min(h, w)) + resize_w, resize_h = int(w * float(scale_factor) + 0.5), int(h * float( + scale_factor) + 0.5) + max_stride = 32 + resize_h = (resize_h + max_stride - 1) // max_stride * max_stride + resize_w = (resize_w + max_stride - 1) // max_stride * max_stride + im = cv2.resize(img, (resize_w, resize_h)) + new_h, new_w = im.shape[:2] + w_scale = new_w / w + h_scale = new_h / h + scale_factor = np.array( + [w_scale, h_scale, w_scale, h_scale], dtype=np.float32) + norm_img[:new_h, :new_w, :] = im + return norm_img, scale_factor, [h_scale, w_scale], [new_h, new_w] + + def resize_boxes(self, im, points, scale_factor): + points = points * scale_factor + img_shape = im.shape[:2] + points[:, 0::2] = np.clip(points[:, 0::2], 0, img_shape[1]) + points[:, 1::2] = np.clip(points[:, 1::2], 0, img_shape[0]) + return points + + +class SRResize(object): + def __init__(self, + imgH=32, + imgW=128, + down_sample_scale=4, + keep_ratio=False, + min_ratio=1, + mask=False, + infer_mode=False, + **kwargs): + self.imgH = imgH + self.imgW = imgW + self.keep_ratio = keep_ratio + self.min_ratio = min_ratio + self.down_sample_scale = down_sample_scale + self.mask = mask + self.infer_mode = infer_mode + + def __call__(self, data): + imgH = self.imgH + imgW = self.imgW + images_lr = data["image_lr"] + transform2 = ResizeNormalize( + (imgW // self.down_sample_scale, imgH // self.down_sample_scale)) + images_lr = transform2(images_lr) + data["img_lr"] = images_lr + if self.infer_mode: + return data + + images_HR = data["image_hr"] + label_strs = data["label"] + transform = ResizeNormalize((imgW, imgH)) + images_HR = transform(images_HR) + data["img_hr"] = images_HR + return data + + +class ResizeNormalize(object): + def __init__(self, size, interpolation=Image.BICUBIC): + self.size = size + self.interpolation = interpolation + + def __call__(self, img): + img = img.resize(self.size, self.interpolation) + img_numpy = np.array(img).astype("float32") + img_numpy = img_numpy.transpose((2, 0, 1)) / 255 + return img_numpy + + +class GrayImageChannelFormat(object): + """ + format gray scale image's channel: (3,h,w) -> (1,h,w) + Args: + inverse: inverse gray image + """ + + def __init__(self, inverse=False, **kwargs): + self.inverse = inverse + + def __call__(self, data): + img = data['image'] + img_single_channel = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + img_expanded = np.expand_dims(img_single_channel, 0) + + if self.inverse: + data['image'] = np.abs(img_expanded - 1) + else: + data['image'] = img_expanded + + data['src_image'] = img + return data + + +class Permute(object): + """permute image + Args: + to_bgr (bool): whether convert RGB to BGR + channel_first (bool): whether convert HWC to CHW + """ + + def __init__(self, ): + super(Permute, self).__init__() + + def __call__(self, im, im_info): + """ + Args: + im (np.ndarray): image (np.ndarray) + im_info (dict): info of image + Returns: + im (np.ndarray): processed image (np.ndarray) + im_info (dict): info of processed image + """ + im = im.transpose((2, 0, 1)).copy() + return im, im_info + + +class PadStride(object): + """ padding image for model with FPN, instead PadBatch(pad_to_stride) in original config + Args: + stride (bool): model with FPN need image shape % stride == 0 + """ + + def __init__(self, stride=0): + self.coarsest_stride = stride + + def __call__(self, im, im_info): + """ + Args: + im (np.ndarray): image (np.ndarray) + im_info (dict): info of image + Returns: + im (np.ndarray): processed image (np.ndarray) + im_info (dict): info of processed image + """ + coarsest_stride = self.coarsest_stride + if coarsest_stride <= 0: + return im, im_info + im_c, im_h, im_w = im.shape + pad_h = int(np.ceil(float(im_h) / coarsest_stride) * coarsest_stride) + pad_w = int(np.ceil(float(im_w) / coarsest_stride) * coarsest_stride) + padding_im = np.zeros((im_c, pad_h, pad_w), dtype=np.float32) + padding_im[:, :im_h, :im_w] = im + return padding_im, im_info + + +def decode_image(im_file, im_info): + """read rgb image + Args: + im_file (str|np.ndarray): input can be image path or np.ndarray + im_info (dict): info of image + Returns: + im (np.ndarray): processed image (np.ndarray) + im_info (dict): info of processed image + """ + if isinstance(im_file, str): + with open(im_file, 'rb') as f: + im_read = f.read() + data = np.frombuffer(im_read, dtype='uint8') + im = cv2.imdecode(data, 1) # BGR mode, but need RGB mode + im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) + else: + im = im_file + im_info['im_shape'] = np.array(im.shape[:2], dtype=np.float32) + im_info['scale_factor'] = np.array([1., 1.], dtype=np.float32) + return im, im_info + + +def preprocess(im, preprocess_ops): + # process image by preprocess_ops + im_info = { + 'scale_factor': np.array( + [1., 1.], dtype=np.float32), + 'im_shape': None, + } + im, im_info = decode_image(im, im_info) + for operator in preprocess_ops: + im, im_info = operator(im, im_info) + return im, im_info diff --git a/deepdoc/vision/postprocess.py b/deepdoc/vision/postprocess.py new file mode 100644 index 0000000000000000000000000000000000000000..ec6f69d08c4f0e0eeaabf94264b72fc5649db35b --- /dev/null +++ b/deepdoc/vision/postprocess.py @@ -0,0 +1,353 @@ +import copy + +import numpy as np +import cv2 +from shapely.geometry import Polygon +import pyclipper + + +def build_post_process(config, global_config=None): + support_dict = ['DBPostProcess', 'CTCLabelDecode'] + + config = copy.deepcopy(config) + module_name = config.pop('name') + if module_name == "None": + return + if global_config is not None: + config.update(global_config) + assert module_name in support_dict, Exception( + 'post process only support {}'.format(support_dict)) + module_class = eval(module_name)(**config) + return module_class + + +class DBPostProcess(object): + """ + The post process for Differentiable Binarization (DB). + """ + + def __init__(self, + thresh=0.3, + box_thresh=0.7, + max_candidates=1000, + unclip_ratio=2.0, + use_dilation=False, + score_mode="fast", + box_type='quad', + **kwargs): + self.thresh = thresh + self.box_thresh = box_thresh + self.max_candidates = max_candidates + self.unclip_ratio = unclip_ratio + self.min_size = 3 + self.score_mode = score_mode + self.box_type = box_type + assert score_mode in [ + "slow", "fast" + ], "Score mode must be in [slow, fast] but got: {}".format(score_mode) + + self.dilation_kernel = None if not use_dilation else np.array( + [[1, 1], [1, 1]]) + + def polygons_from_bitmap(self, pred, _bitmap, dest_width, dest_height): + ''' + _bitmap: single map with shape (1, H, W), + whose values are binarized as {0, 1} + ''' + + bitmap = _bitmap + height, width = bitmap.shape + + boxes = [] + scores = [] + + contours, _ = cv2.findContours((bitmap * 255).astype(np.uint8), + cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) + + for contour in contours[:self.max_candidates]: + epsilon = 0.002 * cv2.arcLength(contour, True) + approx = cv2.approxPolyDP(contour, epsilon, True) + points = approx.reshape((-1, 2)) + if points.shape[0] < 4: + continue + + score = self.box_score_fast(pred, points.reshape(-1, 2)) + if self.box_thresh > score: + continue + + if points.shape[0] > 2: + box = self.unclip(points, self.unclip_ratio) + if len(box) > 1: + continue + else: + continue + box = box.reshape(-1, 2) + + _, sside = self.get_mini_boxes(box.reshape((-1, 1, 2))) + if sside < self.min_size + 2: + continue + + box = np.array(box) + box[:, 0] = np.clip( + np.round(box[:, 0] / width * dest_width), 0, dest_width) + box[:, 1] = np.clip( + np.round(box[:, 1] / height * dest_height), 0, dest_height) + boxes.append(box.tolist()) + scores.append(score) + return boxes, scores + + def boxes_from_bitmap(self, pred, _bitmap, dest_width, dest_height): + ''' + _bitmap: single map with shape (1, H, W), + whose values are binarized as {0, 1} + ''' + + bitmap = _bitmap + height, width = bitmap.shape + + outs = cv2.findContours((bitmap * 255).astype(np.uint8), cv2.RETR_LIST, + cv2.CHAIN_APPROX_SIMPLE) + if len(outs) == 3: + img, contours, _ = outs[0], outs[1], outs[2] + elif len(outs) == 2: + contours, _ = outs[0], outs[1] + + num_contours = min(len(contours), self.max_candidates) + + boxes = [] + scores = [] + for index in range(num_contours): + contour = contours[index] + points, sside = self.get_mini_boxes(contour) + if sside < self.min_size: + continue + points = np.array(points) + if self.score_mode == "fast": + score = self.box_score_fast(pred, points.reshape(-1, 2)) + else: + score = self.box_score_slow(pred, contour) + if self.box_thresh > score: + continue + + box = self.unclip(points, self.unclip_ratio).reshape(-1, 1, 2) + box, sside = self.get_mini_boxes(box) + if sside < self.min_size + 2: + continue + box = np.array(box) + + box[:, 0] = np.clip( + np.round(box[:, 0] / width * dest_width), 0, dest_width) + box[:, 1] = np.clip( + np.round(box[:, 1] / height * dest_height), 0, dest_height) + boxes.append(box.astype("int32")) + scores.append(score) + return np.array(boxes, dtype="int32"), scores + + def unclip(self, box, unclip_ratio): + poly = Polygon(box) + distance = poly.area * unclip_ratio / poly.length + offset = pyclipper.PyclipperOffset() + offset.AddPath(box, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON) + expanded = np.array(offset.Execute(distance)) + return expanded + + def get_mini_boxes(self, contour): + bounding_box = cv2.minAreaRect(contour) + points = sorted(list(cv2.boxPoints(bounding_box)), key=lambda x: x[0]) + + index_1, index_2, index_3, index_4 = 0, 1, 2, 3 + if points[1][1] > points[0][1]: + index_1 = 0 + index_4 = 1 + else: + index_1 = 1 + index_4 = 0 + if points[3][1] > points[2][1]: + index_2 = 2 + index_3 = 3 + else: + index_2 = 3 + index_3 = 2 + + box = [ + points[index_1], points[index_2], points[index_3], points[index_4] + ] + return box, min(bounding_box[1]) + + def box_score_fast(self, bitmap, _box): + ''' + box_score_fast: use bbox mean score as the mean score + ''' + h, w = bitmap.shape[:2] + box = _box.copy() + xmin = np.clip(np.floor(box[:, 0].min()).astype("int32"), 0, w - 1) + xmax = np.clip(np.ceil(box[:, 0].max()).astype("int32"), 0, w - 1) + ymin = np.clip(np.floor(box[:, 1].min()).astype("int32"), 0, h - 1) + ymax = np.clip(np.ceil(box[:, 1].max()).astype("int32"), 0, h - 1) + + mask = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8) + box[:, 0] = box[:, 0] - xmin + box[:, 1] = box[:, 1] - ymin + cv2.fillPoly(mask, box.reshape(1, -1, 2).astype("int32"), 1) + return cv2.mean(bitmap[ymin:ymax + 1, xmin:xmax + 1], mask)[0] + + def box_score_slow(self, bitmap, contour): + ''' + box_score_slow: use polyon mean score as the mean score + ''' + h, w = bitmap.shape[:2] + contour = contour.copy() + contour = np.reshape(contour, (-1, 2)) + + xmin = np.clip(np.min(contour[:, 0]), 0, w - 1) + xmax = np.clip(np.max(contour[:, 0]), 0, w - 1) + ymin = np.clip(np.min(contour[:, 1]), 0, h - 1) + ymax = np.clip(np.max(contour[:, 1]), 0, h - 1) + + mask = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8) + + contour[:, 0] = contour[:, 0] - xmin + contour[:, 1] = contour[:, 1] - ymin + + cv2.fillPoly(mask, contour.reshape(1, -1, 2).astype("int32"), 1) + return cv2.mean(bitmap[ymin:ymax + 1, xmin:xmax + 1], mask)[0] + + def __call__(self, outs_dict, shape_list): + pred = outs_dict['maps'] + if not isinstance(pred, np.ndarray): + pred = pred.numpy() + pred = pred[:, 0, :, :] + segmentation = pred > self.thresh + + boxes_batch = [] + for batch_index in range(pred.shape[0]): + src_h, src_w, ratio_h, ratio_w = shape_list[batch_index] + if self.dilation_kernel is not None: + mask = cv2.dilate( + np.array(segmentation[batch_index]).astype(np.uint8), + self.dilation_kernel) + else: + mask = segmentation[batch_index] + if self.box_type == 'poly': + boxes, scores = self.polygons_from_bitmap(pred[batch_index], + mask, src_w, src_h) + elif self.box_type == 'quad': + boxes, scores = self.boxes_from_bitmap(pred[batch_index], mask, + src_w, src_h) + else: + raise ValueError( + "box_type can only be one of ['quad', 'poly']") + + boxes_batch.append({'points': boxes}) + return boxes_batch + + +class BaseRecLabelDecode(object): + """ Convert between text-label and text-index """ + + def __init__(self, character_dict_path=None, use_space_char=False): + self.beg_str = "sos" + self.end_str = "eos" + self.reverse = False + self.character_str = [] + + if character_dict_path is None: + self.character_str = "0123456789abcdefghijklmnopqrstuvwxyz" + dict_character = list(self.character_str) + else: + with open(character_dict_path, "rb") as fin: + lines = fin.readlines() + for line in lines: + line = line.decode('utf-8').strip("\n").strip("\r\n") + self.character_str.append(line) + if use_space_char: + self.character_str.append(" ") + dict_character = list(self.character_str) + if 'arabic' in character_dict_path: + self.reverse = True + + dict_character = self.add_special_char(dict_character) + self.dict = {} + for i, char in enumerate(dict_character): + self.dict[char] = i + self.character = dict_character + + def pred_reverse(self, pred): + pred_re = [] + c_current = '' + for c in pred: + if not bool(re.search('[a-zA-Z0-9 :*./%+-]', c)): + if c_current != '': + pred_re.append(c_current) + pred_re.append(c) + c_current = '' + else: + c_current += c + if c_current != '': + pred_re.append(c_current) + + return ''.join(pred_re[::-1]) + + def add_special_char(self, dict_character): + return dict_character + + def decode(self, text_index, text_prob=None, is_remove_duplicate=False): + """ convert text-index into text-label. """ + result_list = [] + ignored_tokens = self.get_ignored_tokens() + batch_size = len(text_index) + for batch_idx in range(batch_size): + selection = np.ones(len(text_index[batch_idx]), dtype=bool) + if is_remove_duplicate: + selection[1:] = text_index[batch_idx][1:] != text_index[ + batch_idx][:-1] + for ignored_token in ignored_tokens: + selection &= text_index[batch_idx] != ignored_token + + char_list = [ + self.character[text_id] + for text_id in text_index[batch_idx][selection] + ] + if text_prob is not None: + conf_list = text_prob[batch_idx][selection] + else: + conf_list = [1] * len(selection) + if len(conf_list) == 0: + conf_list = [0] + + text = ''.join(char_list) + + if self.reverse: # for arabic rec + text = self.pred_reverse(text) + + result_list.append((text, np.mean(conf_list).tolist())) + return result_list + + def get_ignored_tokens(self): + return [0] # for ctc blank + + +class CTCLabelDecode(BaseRecLabelDecode): + """ Convert between text-label and text-index """ + + def __init__(self, character_dict_path=None, use_space_char=False, + **kwargs): + super(CTCLabelDecode, self).__init__(character_dict_path, + use_space_char) + + def __call__(self, preds, label=None, *args, **kwargs): + if isinstance(preds, tuple) or isinstance(preds, list): + preds = preds[-1] + if not isinstance(preds, np.ndarray): + preds = preds.numpy() + preds_idx = preds.argmax(axis=2) + preds_prob = preds.max(axis=2) + text = self.decode(preds_idx, preds_prob, is_remove_duplicate=True) + if label is None: + return text + label = self.decode(label) + return text, label + + def add_special_char(self, dict_character): + dict_character = ['blank'] + dict_character + return dict_character diff --git a/deepdoc/vision/ragFlow.py b/deepdoc/vision/ragFlow.py new file mode 100644 index 0000000000000000000000000000000000000000..c64a4e6ab733228daa4b806b2fe4f0b8b09bd4d7 --- /dev/null +++ b/deepdoc/vision/ragFlow.py @@ -0,0 +1,313 @@ +import copy +import time +import os + +from huggingface_hub import snapshot_download + +from .operators import * +import numpy as np +import onnxruntime as ort +import logging +from .postprocess import build_post_process + +from typing import List + +def get_deepdoc_directory(): + PROJECT_BASE = os.path.abspath( + os.path.join( + os.path.dirname(os.path.realpath(__file__)), + os.pardir + ) + ) + return PROJECT_BASE +def transform(data, ops=None): + """ transform """ + if ops is None: + ops = [] + for op in ops: + data = op(data) + if data is None: + return None + return data + + +def create_operators(op_param_list, global_config=None): + """ + create operators based on the config + + Args: + params(list): a dict list, used to create some operators + """ + assert isinstance( + op_param_list, list), ('operator config should be a list') + ops = [] + for operator in op_param_list: + assert isinstance(operator, + dict) and len(operator) == 1, "yaml format error" + op_name = list(operator)[0] + param = {} if operator[op_name] is None else operator[op_name] + if global_config is not None: + param.update(global_config) + op = eval(op_name)(**param) + ops.append(op) + return ops + + +def load_model(model_dir, nm): + model_file_path = os.path.join(model_dir, nm + ".onnx") + if not os.path.exists(model_file_path): + raise ValueError("not find model file path {}".format( + model_file_path)) + + options = ort.SessionOptions() + options.enable_cpu_mem_arena = False + options.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL + options.intra_op_num_threads = 2 + options.inter_op_num_threads = 2 + if False and ort.get_device() == "GPU": + sess = ort.InferenceSession( + model_file_path, + options=options, + providers=['CUDAExecutionProvider']) + else: + sess = ort.InferenceSession( + model_file_path, + options=options, + providers=['CPUExecutionProvider']) + print(model_file_path) + print(sess.get_modelmeta().description) + return sess, sess.get_inputs()[0] + + +class RagFlowTextDetector: + """ + The class depends on TextDetector to perform its primary function of detecting text and retrieving bounding boxes. + """ + def __init__(self, model_dir): + pre_process_list = [{ + 'DetResizeForTest': { + 'limit_side_len': 960, + 'limit_type': "max", + } + }, { + 'NormalizeImage': { + 'std': [0.229, 0.224, 0.225], + 'mean': [0.485, 0.456, 0.406], + 'scale': '1./255.', + 'order': 'hwc' + } + }, { + 'ToCHWImage': None + }, { + 'KeepKeys': { + 'keep_keys': ['image', 'shape'] + } + }] + postprocess_params = {"name": "DBPostProcess", "thresh": 0.3, "box_thresh": 0.5, "max_candidates": 1000, + "unclip_ratio": 1.5, "use_dilation": False, "score_mode": "fast", "box_type": "quad"} + + self.postprocess_op = build_post_process(postprocess_params) + self.predictor, self.input_tensor = load_model(model_dir, 'det') + + img_h, img_w = self.input_tensor.shape[2:] + if isinstance(img_h, str) or isinstance(img_w, str): + pass + elif img_h is not None and img_w is not None and img_h > 0 and img_w > 0: + pre_process_list[0] = { + 'DetResizeForTest': { + 'image_shape': [img_h, img_w] + } + } + self.preprocess_op = create_operators(pre_process_list) + + def order_points_clockwise(self, pts): + rect = np.zeros((4, 2), dtype="float32") + s = pts.sum(axis=1) + rect[0] = pts[np.argmin(s)] + rect[2] = pts[np.argmax(s)] + tmp = np.delete(pts, (np.argmin(s), np.argmax(s)), axis=0) + diff = np.diff(np.array(tmp), axis=1) + rect[1] = tmp[np.argmin(diff)] + rect[3] = tmp[np.argmax(diff)] + return rect + + def clip_det_res(self, points, img_height, img_width): + for pno in range(points.shape[0]): + points[pno, 0] = int(min(max(points[pno, 0], 0), img_width - 1)) + points[pno, 1] = int(min(max(points[pno, 1], 0), img_height - 1)) + return points + + def filter_tag_det_res(self, dt_boxes, image_shape): + img_height, img_width = image_shape[0:2] + dt_boxes_new = [] + for box in dt_boxes: + if isinstance(box, list): + box = np.array(box) + box = self.order_points_clockwise(box) + box = self.clip_det_res(box, img_height, img_width) + rect_width = int(np.linalg.norm(box[0] - box[1])) + rect_height = int(np.linalg.norm(box[0] - box[3])) + if rect_width <= 3 or rect_height <= 3: + continue + dt_boxes_new.append(box) + dt_boxes = np.array(dt_boxes_new) + return dt_boxes + + def filter_tag_det_res_only_clip(self, dt_boxes, image_shape): + img_height, img_width = image_shape[0:2] + dt_boxes_new = [] + for box in dt_boxes: + if isinstance(box, list): + box = np.array(box) + box = self.clip_det_res(box, img_height, img_width) + dt_boxes_new.append(box) + dt_boxes = np.array(dt_boxes_new) + return dt_boxes + + def __call__(self, img): + ori_im = img.copy() + data = {'image': img} + + st = time.time() + data = transform(data, self.preprocess_op) + img, shape_list = data + if img is None: + return None, 0 + img = np.expand_dims(img, axis=0) + shape_list = np.expand_dims(shape_list, axis=0) + img = img.copy() + input_dict = {} + input_dict[self.input_tensor.name] = img + for i in range(100000): + try: + outputs = self.predictor.run(None, input_dict) + break + except Exception as e: + if i >= 3: + raise e + time.sleep(5) + + post_result = self.postprocess_op({"maps": outputs[0]}, shape_list) + dt_boxes = post_result[0]['points'] + dt_boxes = self.filter_tag_det_res(dt_boxes, ori_im.shape) + + return dt_boxes, time.time() - st + + +class RagFlow(): + def __init__(self, model_dir=None): + + if not model_dir: + try: + model_dir = os.path.join( + get_deepdoc_directory(), + "models") + self.text_detector = RagFlowTextDetector(model_dir) + + + except Exception as e: + model_dir = snapshot_download(repo_id="InfiniFlow/deepdoc", + local_dir=os.path.join(get_deepdoc_directory(), "models"), + local_dir_use_symlinks=False) + self.text_detector = RagFlowTextDetector(model_dir) + + + self.drop_score = 0.5 + self.crop_image_res_index = 0 + + def get_rotate_crop_image(self, img, points): + ''' + img_height, img_width = img.shape[0:2] + left = int(np.min(points[:, 0])) + right = int(np.max(points[:, 0])) + top = int(np.min(points[:, 1])) + bottom = int(np.max(points[:, 1])) + img_crop = img[top:bottom, left:right, :].copy() + points[:, 0] = points[:, 0] - left + points[:, 1] = points[:, 1] - top + ''' + assert len(points) == 4, "shape of points must be 4*2" + img_crop_width = int( + max( + np.linalg.norm(points[0] - points[1]), + np.linalg.norm(points[2] - points[3]))) + img_crop_height = int( + max( + np.linalg.norm(points[0] - points[3]), + np.linalg.norm(points[1] - points[2]))) + pts_std = np.float32([[0, 0], [img_crop_width, 0], + [img_crop_width, img_crop_height], + [0, img_crop_height]]) + M = cv2.getPerspectiveTransform(points, pts_std) + dst_img = cv2.warpPerspective( + img, + M, (img_crop_width, img_crop_height), + borderMode=cv2.BORDER_REPLICATE, + flags=cv2.INTER_CUBIC) + dst_img_height, dst_img_width = dst_img.shape[0:2] + if dst_img_height * 1.0 / dst_img_width >= 1.5: + dst_img = np.rot90(dst_img) + return dst_img + + def sorted_boxes(self, dt_boxes): + """ + Sort text boxes in order from top to bottom, left to right + args: + dt_boxes(array):detected text boxes with shape [4, 2] + return: + sorted boxes(array) with shape [4, 2] + """ + num_boxes = dt_boxes.shape[0] + sorted_boxes = sorted(dt_boxes, key=lambda x: (x[0][1], x[0][0])) + _boxes = list(sorted_boxes) + + for i in range(num_boxes - 1): + for j in range(i, -1, -1): + if abs(_boxes[j + 1][0][1] - _boxes[j][0][1]) < 10 and \ + (_boxes[j + 1][0][0] < _boxes[j][0][0]): + tmp = _boxes[j] + _boxes[j] = _boxes[j + 1] + _boxes[j + 1] = tmp + else: + break + return _boxes + + def detect(self, img): + time_dict = {'det': 0, 'rec': 0, 'cls': 0, 'all': 0} + + if img is None: + return None, None, time_dict + + start = time.time() + dt_boxes, elapse = self.text_detector(img) + time_dict['det'] = elapse + + + return zip(self.sorted_boxes(dt_boxes), [ + ("", 0) for _ in range(len(dt_boxes))]) + + def recognize(self, ori_im, box): + img_crop = self.get_rotate_crop_image(ori_im, box) + + rec_res, elapse = self.text_recognizer([img_crop]) + text, score = rec_res[0] + if score < self.drop_score: + return "" + return text + + def predict(self,img:np.ndarray=None)-> List[List[float]]: + """ + Return np array of bounding boxes - for each box 4 points of 2 coordinates + """ + time_dict = {'det': 0, 'rec': 0, 'cls': 0, 'all': 0} + + dt_boxes, elapse = self.text_detector(img) + time_dict['det'] = elapse + + + dt_boxes = self.sorted_boxes(dt_boxes) + + + return dt_boxes + + diff --git a/detectionAndOcrTable1.py b/detectionAndOcrTable1.py new file mode 100644 index 0000000000000000000000000000000000000000..d2e1b8ab860448691f2da693351da7120ac62533 --- /dev/null +++ b/detectionAndOcrTable1.py @@ -0,0 +1,425 @@ +from typing import Tuple, List, Sequence, Optional, Union +from torchvision import transforms +from torch import nn, Tensor +from PIL import Image +from pathlib import Path +from bs4 import BeautifulSoup as bs + +import numpy as np +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] +from transformers import AutoModelForObjectDetection +import torch +import matplotlib.pyplot as plt +import matplotlib.patches as patches +from matplotlib.patches import Patch + +from unitable import UnitablePredictor +from doctrfiles import DoctrWordDetector,DoctrTextRecognizer +from utils import crop_an_Image,cropImageExtraMargin +from utils import denoisingAndSharpening + +#based on this notebook:https://github.com/NielsRogge/Transformers-Tutorials/blob/master/Table%20Transformer/Inference_with_Table_Transformer_(TATR)_for_parsing_tables.ipynb +class MaxResize(object): + def __init__(self, max_size=800): + self.max_size = max_size + + def __call__(self, image): + width, height = image.size + current_max_size = max(width, height) + scale = self.max_size / current_max_size + resized_image = image.resize((int(round(scale*width)), int(round(scale*height)))) + + return resized_image + + +html_table_template = ( + + lambda table: f""" + + + + + {table} +
""" +) + +class DetectionAndOcrTable1(): + def __init__(self,englishFlag=True): + self.unitablePredictor = UnitablePredictor() + self.wordDetector = DoctrWordDetector(architecture="db_resnet50", + path_weights="doctrfiles/models/db_resnet50-79bd7d70.pt", + path_config_json ="doctrfiles/models/db_resnet50_config.json") + + + if englishFlag: + self.textRecognizer = DoctrTextRecognizer(architecture="master", path_weights="./doctrfiles/models/master-fde31e4a.pt", + path_config_json="./doctrfiles/models/master.json") + else: + self.textRecognizer = DoctrTextRecognizer(architecture="parseq", path_weights="./doctrfiles/models/doctr-multilingual-parseq.bin", + path_config_json="./doctrfiles/models/multilingual-parseq-config.json") + + + @staticmethod + def build_table_from_html_and_cell( + structure: List[str], content: List[str] = None + ) -> List[str]: + """Build table from html and cell token list""" + assert structure is not None + html_code = list() + + # deal with empty table + if content is None: + content = ["placeholder"] * len(structure) + + for tag in structure: + if tag in ("[]", ">[]"): + if len(content) == 0: + continue + cell = content.pop(0) + html_code.append(tag.replace("[]", cell)) + else: + html_code.append(tag) + + return html_code + + @staticmethod + def save_detection(detected_lines_images:List[ImageType], prefix = './res/test1/res_'): + i = 0 + for img in detected_lines_images: + pilimg = Image.fromarray(img) + pilimg.save(prefix+str(i)+'.png') + i=i+1 + + @staticmethod + # for output bounding box post-processing + def box_cxcywh_to_xyxy(x): + x_c, y_c, w, h = x.unbind(-1) + b = [(x_c - 0.5 * w), (y_c - 0.5 * h), (x_c + 0.5 * w), (y_c + 0.5 * h)] + return torch.stack(b, dim=1) + + @staticmethod + def rescale_bboxes(out_bbox, size): + img_w, img_h = size + b = DetectionAndOcrTable1.box_cxcywh_to_xyxy(out_bbox) + b = b * torch.tensor([img_w, img_h, img_w, img_h], dtype=torch.float32) + return b + + @staticmethod + def outputs_to_objects(outputs, img_size, id2label): + m = outputs.logits.softmax(-1).max(-1) + pred_labels = list(m.indices.detach().cpu().numpy())[0] + pred_scores = list(m.values.detach().cpu().numpy())[0] + pred_bboxes = outputs['pred_boxes'].detach().cpu()[0] + pred_bboxes = [elem.tolist() for elem in DetectionAndOcrTable1.rescale_bboxes(pred_bboxes, img_size)] + + objects = [] + for label, score, bbox in zip(pred_labels, pred_scores, pred_bboxes): + class_label = id2label[int(label)] + if not class_label == 'no object': + objects.append({'label': class_label, 'score': float(score), + 'bbox': [float(elem) for elem in bbox]}) + + return objects + + @staticmethod + def fig2img(fig): + """Convert a Matplotlib figure to a PIL Image and return it""" + import io + buf = io.BytesIO() + fig.savefig(buf) + buf.seek(0) + img = Image.open(buf) + return img + #For that, the TATR authors employ some padding to make sure the borders of the table are included. + + @staticmethod + def objects_to_crops(img, tokens, objects, class_thresholds, padding=10): + """ + Process the bounding boxes produced by the table detection model into + cropped table images and cropped tokens. + """ + + table_crops = [] + for obj in objects: + # abit unecessary here cause i crop them anywyas + if obj['score'] < class_thresholds[obj['label']]: + continue + + cropped_table = {} + + bbox = obj['bbox'] + bbox = [bbox[0]-padding, bbox[1]-padding, bbox[2]+padding, bbox[3]+padding] + + cropped_img = img.crop(bbox) + + # Add padding to the cropped image + padded_width = cropped_img.width + 40 + padded_height = cropped_img.height +40 + + new_img_np = np.full((padded_height, padded_width, 3), fill_value=255, dtype=np.uint8) + y_offset = (padded_height - cropped_img.height) // 2 + x_offset = (padded_width - cropped_img.width) // 2 + new_img_np[y_offset:y_offset + cropped_img.height, x_offset:x_offset+cropped_img.width] = np.array(cropped_img) + + padded_img = Image.fromarray(new_img_np,'RGB') + + + table_tokens = [token for token in tokens if iob(token['bbox'], bbox) >= 0.5] + for token in table_tokens: + token['bbox'] = [token['bbox'][0]-bbox[0] + padding, + token['bbox'][1]-bbox[1] + padding, + token['bbox'][2]-bbox[0] + padding, + token['bbox'][3]-bbox[1] + padding] + + # If table is predicted to be rotated, rotate cropped image and tokens/words: + if obj['label'] == 'table rotated': + padded_img = padded_img.rotate(270, expand=True) + for token in table_tokens: + bbox = token['bbox'] + bbox = [padded_img.size[0]-bbox[3]-1, + bbox[0], + padded_img.size[0]-bbox[1]-1, + bbox[2]] + token['bbox'] = bbox + + cropped_table['image'] = padded_img + cropped_table['tokens'] = table_tokens + + table_crops.append(cropped_table) + + return table_crops + + @staticmethod + def visualize_detected_tables(img, det_tables, out_path=None): + plt.imshow(img, interpolation="lanczos") + fig = plt.gcf() + fig.set_size_inches(20, 20) + ax = plt.gca() + + for det_table in det_tables: + bbox = det_table['bbox'] + + if det_table['label'] == 'table': + facecolor = (1, 0, 0.45) + edgecolor = (1, 0, 0.45) + alpha = 0.3 + linewidth = 2 + hatch='//////' + elif det_table['label'] == 'table rotated': + facecolor = (0.95, 0.6, 0.1) + edgecolor = (0.95, 0.6, 0.1) + alpha = 0.3 + linewidth = 2 + hatch='//////' + else: + continue + + rect = patches.Rectangle(bbox[:2], bbox[2]-bbox[0], bbox[3]-bbox[1], linewidth=linewidth, + edgecolor='none',facecolor=facecolor, alpha=0.1) + ax.add_patch(rect) + rect = patches.Rectangle(bbox[:2], bbox[2]-bbox[0], bbox[3]-bbox[1], linewidth=linewidth, + edgecolor=edgecolor,facecolor='none',linestyle='-', alpha=alpha) + ax.add_patch(rect) + rect = patches.Rectangle(bbox[:2], bbox[2]-bbox[0], bbox[3]-bbox[1], linewidth=0, + edgecolor=edgecolor,facecolor='none',linestyle='-', hatch=hatch, alpha=0.2) + ax.add_patch(rect) + + plt.xticks([], []) + plt.yticks([], []) + + legend_elements = [Patch(facecolor=(1, 0, 0.45), edgecolor=(1, 0, 0.45), + label='Table', hatch='//////', alpha=0.3), + Patch(facecolor=(0.95, 0.6, 0.1), edgecolor=(0.95, 0.6, 0.1), + label='Table (rotated)', hatch='//////', alpha=0.3)] + plt.legend(handles=legend_elements, bbox_to_anchor=(0.5, -0.02), loc='upper center', borderaxespad=0, + fontsize=10, ncol=2) + plt.gcf().set_size_inches(10, 10) + plt.axis('off') + + if out_path is not None: + plt.savefig(out_path, bbox_inches='tight', dpi=150) + + return fig + + + def predict(self,image:Image.Image,debugfolder_filename_page_name,denoise=False): + + + """ + 0. Locate the table using Table detection + 1. Unitable + """ + print("Running table transformer + Unitable Hybrid Model") + + # Step 0 : Locate the table using Table detection TODO + + #First we load a Table Transformer pre-trained for table detection. We use the "no_timm" version here to load the checkpoint with a Transformers-native backbone. + model = AutoModelForObjectDetection.from_pretrained("microsoft/table-transformer-detection", revision="no_timm") + device = "cuda" if torch.cuda.is_available() else "cpu" + model.to(device) + + #Preparing the image for the model + detection_transform = transforms.Compose([ + MaxResize(800), + transforms.ToTensor(), + transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + ]) + pixel_values = detection_transform(image).unsqueeze(0) + pixel_values = pixel_values.to(device) + + # Next, we forward the pixel values through the model. + # The model outputs logits of shape (batch_size, num_queries, num_labels + 1). The +1 is for the "no object" class. + with torch.no_grad(): + outputs = model(pixel_values) + + # update id2label to include "no object" + id2label = model.config.id2label + id2label[len(model.config.id2label)] = "no object" + + #[{'label': 'table', 'score': 0.9999570846557617, 'bbox': [110.24547576904297, 73.31171417236328, 1024.609130859375, 308.7159423828125]}] + objects = DetectionAndOcrTable1.outputs_to_objects(outputs, image.size, id2label) + + #Only do these for objects with score greater than 0.8 + objects = [obj for obj in objects if obj['score'] > 0.95] + + print("detected object from the table transformers are") + print(objects) + if objects: + + #Next, we crop the table out of the image. For that, the TATR authors employ some padding to make sure the borders of the table are included. + + + tokens = [] + detection_class_thresholds = { + "table": 0.95, #this is a bit double cause we do up there another filtering but didn't want to modify too much from original code + "table rotated": 0.95, + "no object": 10 + } + crop_padding = 10 + + + tables_crops = DetectionAndOcrTable1.objects_to_crops(image, tokens, objects, detection_class_thresholds, padding=crop_padding) + + cropped_tables =[] + for i in range (len(tables_crops)): + cropped_table = tables_crops[i]['image'].convert("RGB") + cropped_table.save(debugfolder_filename_page_name+"cropped_table_"+str(i)+".png") + cropped_tables.append(cropped_table) + + # Step 1: Unitable + #This take PIL Images as input + if denoise: + cropped_tables =denoisingAndSharpening(cropped_tables) + pred_htmls, pred_bboxs = self.unitablePredictor.predict(cropped_tables,debugfolder_filename_page_name) + + table_codes = [] + for k in range(len(cropped_tables)): + pred_html =pred_htmls[k] + pred_bbox = pred_bboxs[k] + + # Some tabless have a lot of words in their header + # So for the headers, give doctr word ddetector doesn't work when the images aren't square + table_header_cells = 0 + header_exists = False + for cell in pred_html: + if cell=='>[]' or cell == '[]': + table_header_cells += 1 + if cell =='': + header_exists = True + break + if not header_exists: + table_header_cells = 0 + pred_cell = [] + cell_imgs_to_viz = [] + cell_img_num=0 + + # Find what one line should be if there is a cell with a single line + one_line_height = 100000 + for i in range(table_header_cells): + box = pred_bbox[i] + xmin, ymin, xmax, ymax = box + current_box_height = abs(ymax-ymin) + if current_box_height 0 and current_box_height>one_line_height+5: + + cell_img= cropImageExtraMargin([fourbytwo],cropped_tables[k],margin=1.4)[0] + table_header_cells -= 1 + + #List of 4 x 2 + detection_results = self.wordDetector.predict(cell_img,sort_vertical=True) + + input_to_recog = [] + if detection_results == []: + input_to_recog.append(cell_img) + else: + + for wordbox in detection_results: + + cropped_image= crop_an_Image(wordbox.box,cell_img) + if cropped_image.shape[0] >0 and cropped_image.shape[1]>0: + input_to_recog.append(cropped_image) + else: + print("Empty image") + else: + cell_img = crop_an_Image(fourbytwo,cropped_tables[k]) + if table_header_cells>0: + table_header_cells -= 1 + if cell_img.shape[0] >0 and cell_img.shape[1]>0: + input_to_recog =[cell_img] + + cell_imgs_to_viz.append(cell_img) + + + if input_to_recog != []: + words = self.textRecognizer.predict_for_tables(input_to_recog) + cell_output = " ".join(words) + pred_cell.append(cell_output) + else: + #Don't lose empty cell + pred_cell.append("") + + + print(pred_cell) + #Step3 : + pred_code = self.build_table_from_html_and_cell(pred_html, pred_cell) + pred_code = "".join(pred_code) + pred_code = html_table_template(pred_code) + + + soup = bs(pred_code) + #formatted and indented) string representation of the HTML document + table_code = soup.prettify() + print(table_code) + + # Append extracted table to table_codes + table_codes.append(table_code) + + return table_codes + + + + + + + + diff --git a/detectionAndOcrTable2.py b/detectionAndOcrTable2.py new file mode 100644 index 0000000000000000000000000000000000000000..ce2769c5259bf98d3ea5cc1df164d7b84e63c56c --- /dev/null +++ b/detectionAndOcrTable2.py @@ -0,0 +1,306 @@ +from typing import Tuple, List, Sequence, Optional, Union +from torchvision import transforms +from torch import nn, Tensor +from PIL import Image +from pathlib import Path +from bs4 import BeautifulSoup as bs + +import numpy as np +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] +from transformers import AutoModelForObjectDetection +import torch +import matplotlib.pyplot as plt +import matplotlib.patches as patches +from matplotlib.patches import Patch + +from unitable import UnitableFullPredictor + +#based on this notebook:https://github.com/NielsRogge/Transformers-Tutorials/blob/master/Table%20Transformer/Inference_with_Table_Transformer_(TATR)_for_parsing_tables.ipynb +class MaxResize(object): + def __init__(self, max_size=800): + self.max_size = max_size + + def __call__(self, image): + width, height = image.size + current_max_size = max(width, height) + scale = self.max_size / current_max_size + resized_image = image.resize((int(round(scale*width)), int(round(scale*height)))) + + return resized_image + +def iob(boxA, boxB): + """ + Calculate the Intersection over Bounding Box (IoB) of two bounding boxes. + + Parameters: + - boxA: list or tuple with [xmin, ymin, xmax, ymax] of the first box + - boxB: list or tuple with [xmin, ymin, xmax, ymax] of the second box + + Returns: + - iob: float, the IoB ratio + """ + # Determine the coordinates of the intersection rectangle + xA = max(boxA[0], boxB[0]) + yA = max(boxA[1], boxB[1]) + xB = min(boxA[2], boxB[2]) + yB = min(boxA[3], boxB[3]) + + # Compute the area of intersection rectangle + interWidth = max(0, xB - xA) + interHeight = max(0, yB - yA) + interArea = interWidth * interHeight + + # Compute the area of boxB (the second box) + boxBArea = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1]) + + # Compute the Intersection over Bounding Box (IoB) ratio + iob = interArea / float(boxBArea) + + return iob + +class DetectionAndOcrTable2(): + #This components can take in entire pdf page as input , scan for tables and return the table in html format + #Uses the full unitable model - different to DetectionAndOcrTable1 + def __init__(self): + self.unitableFullPredictor = UnitableFullPredictor() + + + @staticmethod + def save_detection(detected_lines_images:List[ImageType], prefix = './res/test1/res_'): + i = 0 + for img in detected_lines_images: + pilimg = Image.fromarray(img) + pilimg.save(prefix+str(i)+'.png') + i=i+1 + + @staticmethod + # for output bounding box post-processing + def box_cxcywh_to_xyxy(x): + x_c, y_c, w, h = x.unbind(-1) + b = [(x_c - 0.5 * w), (y_c - 0.5 * h), (x_c + 0.5 * w), (y_c + 0.5 * h)] + return torch.stack(b, dim=1) + + @staticmethod + def rescale_bboxes(out_bbox, size): + img_w, img_h = size + b = DetectionAndOcrTable2.box_cxcywh_to_xyxy(out_bbox) + b = b * torch.tensor([img_w, img_h, img_w, img_h], dtype=torch.float32) + return b + + @staticmethod + def outputs_to_objects(outputs, img_size, id2label): + m = outputs.logits.softmax(-1).max(-1) + pred_labels = list(m.indices.detach().cpu().numpy())[0] + pred_scores = list(m.values.detach().cpu().numpy())[0] + pred_bboxes = outputs['pred_boxes'].detach().cpu()[0] + pred_bboxes = [elem.tolist() for elem in DetectionAndOcrTable2.rescale_bboxes(pred_bboxes, img_size)] + + objects = [] + for label, score, bbox in zip(pred_labels, pred_scores, pred_bboxes): + class_label = id2label[int(label)] + if not class_label == 'no object': + objects.append({'label': class_label, 'score': float(score), + 'bbox': [float(elem) for elem in bbox]}) + + return objects + + + @staticmethod + def visualize_detected_tables(img, det_tables, out_path=None): + plt.imshow(img, interpolation="lanczos") + fig = plt.gcf() + fig.set_size_inches(20, 20) + ax = plt.gca() + + for det_table in det_tables: + bbox = det_table['bbox'] + + if det_table['label'] == 'table': + facecolor = (1, 0, 0.45) + edgecolor = (1, 0, 0.45) + alpha = 0.3 + linewidth = 2 + hatch='//////' + elif det_table['label'] == 'table rotated': + facecolor = (0.95, 0.6, 0.1) + edgecolor = (0.95, 0.6, 0.1) + alpha = 0.3 + linewidth = 2 + hatch='//////' + else: + continue + + rect = patches.Rectangle(bbox[:2], bbox[2]-bbox[0], bbox[3]-bbox[1], linewidth=linewidth, + edgecolor='none',facecolor=facecolor, alpha=0.1) + ax.add_patch(rect) + rect = patches.Rectangle(bbox[:2], bbox[2]-bbox[0], bbox[3]-bbox[1], linewidth=linewidth, + edgecolor=edgecolor,facecolor='none',linestyle='-', alpha=alpha) + ax.add_patch(rect) + rect = patches.Rectangle(bbox[:2], bbox[2]-bbox[0], bbox[3]-bbox[1], linewidth=0, + edgecolor=edgecolor,facecolor='none',linestyle='-', hatch=hatch, alpha=0.2) + ax.add_patch(rect) + + plt.xticks([], []) + plt.yticks([], []) + + legend_elements = [Patch(facecolor=(1, 0, 0.45), edgecolor=(1, 0, 0.45), + label='Table', hatch='//////', alpha=0.3), + Patch(facecolor=(0.95, 0.6, 0.1), edgecolor=(0.95, 0.6, 0.1), + label='Table (rotated)', hatch='//////', alpha=0.3)] + plt.legend(handles=legend_elements, bbox_to_anchor=(0.5, -0.02), loc='upper center', borderaxespad=0, + fontsize=10, ncol=2) + plt.gcf().set_size_inches(10, 10) + plt.axis('off') + + if out_path is not None: + plt.savefig(out_path, bbox_inches='tight', dpi=150) + + return fig + + #For that, the TATR authors employ some padding to make sure the borders of the table are included. + @staticmethod + def objects_to_crops(img, tokens, objects, class_thresholds, padding=10): + """ + Process the bounding boxes produced by the table detection model into + cropped table images and cropped tokens. + """ + + table_crops = [] + for obj in objects: + # abit unecessary here cause i crop them anywyas + if obj['score'] < class_thresholds[obj['label']]: + print('skipping object with score', obj['score']) + continue + + cropped_table = {} + + bbox = obj['bbox'] + bbox = [bbox[0]-padding, bbox[1]-padding, bbox[2]+padding, bbox[3]+padding] + + cropped_img = img.crop(bbox) + + # Add padding to the cropped image + padded_width = cropped_img.width + 40 + padded_height = cropped_img.height +40 + + new_img_np = np.full((padded_height, padded_width, 3), fill_value=255, dtype=np.uint8) + y_offset = (padded_height - cropped_img.height) // 2 + x_offset = (padded_width - cropped_img.width) // 2 + new_img_np[y_offset:y_offset + cropped_img.height, x_offset:x_offset+cropped_img.width] = np.array(cropped_img) + + padded_img = Image.fromarray(new_img_np,'RGB') + + + table_tokens = [token for token in tokens if iob(token['bbox'], bbox) >= 0.5] + for token in table_tokens: + token['bbox'] = [token['bbox'][0]-bbox[0] + padding, + token['bbox'][1]-bbox[1] + padding, + token['bbox'][2]-bbox[0] + padding, + token['bbox'][3]-bbox[1] + padding] + + # If table is predicted to be rotated, rotate cropped image and tokens/words: + if obj['label'] == 'table rotated': + padded_img = padded_img.rotate(270, expand=True) + for token in table_tokens: + bbox = token['bbox'] + bbox = [padded_img.size[0]-bbox[3]-1, + bbox[0], + padded_img.size[0]-bbox[1]-1, + bbox[2]] + token['bbox'] = bbox + + cropped_table['image'] = padded_img + cropped_table['tokens'] = table_tokens + + table_crops.append(cropped_table) + + return table_crops + + def predict(self,image:Image.Image,debugfolder_filename_page_name): + + + """ + 0. Locate the table using Table detection + 1. Unitable + """ + + # Step 0 : Locate the table using Table detection TODO + + #First we load a Table Transformer pre-trained for table detection. We use the "no_timm" version here to load the checkpoint with a Transformers-native backbone. + model = AutoModelForObjectDetection.from_pretrained("microsoft/table-transformer-detection", revision="no_timm") + device = "cuda" if torch.cuda.is_available() else "cpu" + model.to(device) + + #Preparing the image for the model + detection_transform = transforms.Compose([ + MaxResize(800), + transforms.ToTensor(), + transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + ]) + pixel_values = detection_transform(image).unsqueeze(0) + pixel_values = pixel_values.to(device) + + # Next, we forward the pixel values through the model. + # The model outputs logits of shape (batch_size, num_queries, num_labels + 1). The +1 is for the "no object" class. + with torch.no_grad(): + outputs = model(pixel_values) + + # update id2label to include "no object" + id2label = model.config.id2label + id2label[len(model.config.id2label)] = "no object" + + #[{'label': 'table', 'score': 0.9999570846557617, 'bbox': [110.24547576904297, 73.31171417236328, 1024.609130859375, 308.7159423828125]}] + objects = DetectionAndOcrTable2.outputs_to_objects(outputs, image.size, id2label) + + #Only do these for objects with score greater than 0.8 + objects = [obj for obj in objects if obj['score'] > 0.95] + + print(objects) + if objects: + fig = DetectionAndOcrTable2.visualize_detected_tables(image, objects,out_path = "./res/table_debug/table_former_detection.jpg") + + #Next, we crop the table out of the image. For that, the TATR authors employ some padding to make sure the borders of the table are included. + + + tokens = [] + detection_class_thresholds = { + "table": 0.95, + "table rotated": 0.95, + "no object": 10 + } + crop_padding = 10 + + + tables_crops = DetectionAndOcrTable2.objects_to_crops(image, tokens, objects, detection_class_thresholds, padding=crop_padding) + + #[{'image': , 'tokens': []}] + #print(tables_crops) + + #TODO: Handle the case where there are multiple tables + cropped_tables =[] + for i in range (len(tables_crops)): + cropped_table = tables_crops[i]['image'].convert("RGB") + cropped_table.save(debugfolder_filename_page_name +"cropped_table_"+str(i)+".png") + cropped_tables.append(cropped_table) + + print("number of cropped tables found: "+str(len(cropped_tables))) + + + # Step 1: Unitable + #This take PIL Images as input + table_codes = self.unitableFullPredictor.predict(cropped_tables,debugfolder_filename_page_name) + + else: + return + + + + + + + + + + diff --git a/detectionAndOcrTable3.py b/detectionAndOcrTable3.py new file mode 100644 index 0000000000000000000000000000000000000000..4b345512f950b873aea2e5df7a2ddf4a4c2fce5b --- /dev/null +++ b/detectionAndOcrTable3.py @@ -0,0 +1,267 @@ +from typing import Tuple, List, Sequence, Optional, Union +from torchvision import transforms +from torch import nn, Tensor +from PIL import Image +from pathlib import Path +from bs4 import BeautifulSoup as bs + +import numpy as np +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] +from transformers import AutoModelForObjectDetection +import torch +import matplotlib.pyplot as plt +import matplotlib.patches as patches +from matplotlib.patches import Patch +from utils import draw_only_box + +from unitable import UnitablePredictor +from ultralyticsplus import YOLO, render_result +from doctrfiles import DoctrWordDetector,DoctrTextRecognizer +from utils import crop_an_Image,cropImageExtraMargin +from utils import denoisingAndSharpening +""" +USES YOLO FOR DETECITON INSTEAD OF TABLE TRANSFORMER +Table TransFORMER +""" + + +html_table_template = ( + + lambda table: f""" + + + + + {table} +
""" +) + +class DetectionAndOcrTable3(): + #This components can take in entire pdf page as input , scan for tables and return the table in html format + #Uses the full unitable model - different to DetectionAndOcrTable1 + def __init__(self,englishFlag = True): + self.unitablePredictor = UnitablePredictor() + self.detector = YOLO('foduucom/table-detection-and-extraction') + # set model parameters + self.detector.overrides['conf'] = 0.25 # NMS confidence threshold + self.detector.overrides['iou'] = 0.45 # NMS IoU threshold + self.detector.overrides['agnostic_nms'] = False # NMS class-agnostic + self.detector.overrides['max_det'] = 1000 # maximum number of detections per image + + self.wordDetector = DoctrWordDetector(architecture="db_resnet50", + path_weights="doctrfiles/models/db_resnet50-79bd7d70.pt", + path_config_json ="doctrfiles/models/db_resnet50_config.json") + + + if englishFlag: + self.textRecognizer = DoctrTextRecognizer(architecture="master", path_weights="./doctrfiles/models/master-fde31e4a.pt", + path_config_json="./doctrfiles/models/master.json") + else: + self.textRecognizer = DoctrTextRecognizer(architecture="parseq", path_weights="./doctrfiles/models/doctr-multilingual-parseq.bin", + path_config_json="./doctrfiles/models/multilingual-parseq-config.json") + + + + @staticmethod + def save_detection(detected_lines_images:List[ImageType], prefix = './res/test1/res_'): + i = 0 + for img in detected_lines_images: + pilimg = Image.fromarray(img) + pilimg.save(prefix+str(i)+'.png') + i=i+1 + + @staticmethod + def build_table_from_html_and_cell( + structure: List[str], content: List[str] = None + ) -> List[str]: + """Build table from html and cell token list""" + assert structure is not None + html_code = list() + + # deal with empty table + if content is None: + content = ["placeholder"] * len(structure) + + for tag in structure: + if tag in ("[]", ">[]"): + if len(content) == 0: + continue + cell = content.pop(0) + html_code.append(tag.replace("[]", cell)) + else: + html_code.append(tag) + + return html_code + """ + Valid 'Boxes' object attributes and properties are: + + Attributes: + boxes (torch.Tensor) or (numpy.ndarray): A tensor or numpy array containing the detection boxes, + with shape (num_boxes, 6). + orig_shape (torch.Tensor) or (numpy.ndarray): Original image size, in the format (height, width). + + Properties: + xyxy (torch.Tensor) or (numpy.ndarray): The boxes in xyxy format. + conf (torch.Tensor) or (numpy.ndarray): The confidence values of the boxes. + cls (torch.Tensor) or (numpy.ndarray): The class values of the boxes. + xywh (torch.Tensor) or (numpy.ndarray): The boxes in xywh format. + xyxyn (torch.Tensor) or (numpy.ndarray): The boxes in xyxy format normalized by original image size. + xywhn (torch.Tensor) or (numpy.ndarray): The boxes in xywh format normalized by original image size. + """ + # Image is page image + def predict(self,image:Image.Image,debugfolder_filename_page_name = None,denoise =False): + + results = self.detector.predict(image) + + #Array of bboxes + bbxs = results[0].boxes.xyxy.int().tolist() + #Array of confidences + conf = results[0].boxes.conf.float().tolist() + print(bbxs) + print(conf) + + #images_to_recognizer = cropImage(bxs, img) + img_to_save = draw_only_box(image, bbxs) + img_to_save.save(debugfolder_filename_page_name+"detectionBoxRes.png", quality=95) + + # we need something to draw the detection + + + cropped_tables =[] + for i in range (len(bbxs)): + # TODO: find the right confidence and padding values + if conf[i]< 0.65: + continue + + padded = [bbxs[i][0]-10,bbxs[i][1]-10,bbxs[i][2]+10,bbxs[i][3]+10] + + cropped_table = image.convert("RGB").crop(padded) + cropped_table.save(debugfolder_filename_page_name +"yolo_cropped_table_"+str(i)+".png") + cropped_tables.append(cropped_table) + + print("number of cropped tables found: "+str(len(cropped_tables))) + + # Step 1: Unitable + #This take PIL Images as input + if cropped_tables != []: + if denoise: + cropped_tables =denoisingAndSharpening(cropped_tables) + pred_htmls, pred_bboxs = self.unitablePredictor.predict(cropped_tables,debugfolder_filename_page_name) + table_codes = [] + + for k in range(len(cropped_tables)): + pred_html =pred_htmls[k] + pred_bbox = pred_bboxs[k] + + # Some tabless have a lot of words in their header + # So for the headers, give doctr word ddetector doesn't work when the images aren't square + table_header_cells = 0 + header_exists = False + for cell in pred_html: + if cell=='>[]' or cell == '[]': + table_header_cells += 1 + if cell =='': + header_exists = True + break + if not header_exists: + table_header_cells = 0 + pred_cell = [] + cell_imgs_to_viz = [] + cell_img_num=0 + + # Find what one line should be if there is a cell with a single line + one_line_height = 100000 + for i in range(table_header_cells): + box = pred_bbox[i] + xmin, ymin, xmax, ymax = box + current_box_height = abs(ymax-ymin) + if current_box_height 0 and current_box_height>one_line_height+5: + + cell_img= cropImageExtraMargin([fourbytwo],cropped_tables[k],margin=1.4)[0] + table_header_cells -= 1 + + #List of 4 x 2 + detection_results = self.wordDetector.predict(cell_img,sort_vertical=True) + + input_to_recog = [] + if detection_results == []: + input_to_recog.append(cell_img) + else: + + for wordbox in detection_results: + + cropped_image= crop_an_Image(wordbox.box,cell_img) + if cropped_image.shape[0] >0 and cropped_image.shape[1]>0: + input_to_recog.append(cropped_image) + else: + print("Empty image") + else: + cell_img = crop_an_Image(fourbytwo,cropped_tables[k]) + if table_header_cells>0: + table_header_cells -= 1 + if cell_img.shape[0] >0 and cell_img.shape[1]>0: + input_to_recog =[cell_img] + + cell_imgs_to_viz.append(cell_img) + + if input_to_recog != []: + words = self.textRecognizer.predict_for_tables(input_to_recog) + cell_output = " ".join(words) + pred_cell.append(cell_output) + else: + #Don't lose empty cell + pred_cell.append("") + + + #self.save_detection(cell_imgs_to_viz,prefix = './res/test4/cell_imgs_') + print(pred_cell) + #Step3 : + pred_code = self.build_table_from_html_and_cell(pred_html, pred_cell) + pred_code = "".join(pred_code) + pred_code = html_table_template(pred_code) + + + soup = bs(pred_code) + #formatted and indented) string representation of the HTML document + table_code = soup.prettify() + print(table_code) + table_codes.append(table_code) + + return table_codes + return [] + + + + + + + + + + + + + diff --git a/detectionAndOcrTable4.py b/detectionAndOcrTable4.py new file mode 100644 index 0000000000000000000000000000000000000000..a18a588eab26b94433840d709b7a3dd31c45c4ca --- /dev/null +++ b/detectionAndOcrTable4.py @@ -0,0 +1,112 @@ +from typing import Tuple, List, Sequence, Optional, Union +from torchvision import transforms +from torch import nn, Tensor +from PIL import Image +from pathlib import Path +from bs4 import BeautifulSoup as bs + +import numpy as np +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] +from transformers import AutoModelForObjectDetection +import torch +import matplotlib.pyplot as plt +import matplotlib.patches as patches +from matplotlib.patches import Patch +from utils import draw_only_box + +from unitable import UnitableFullPredictor +from ultralyticsplus import YOLO, render_result +""" +USES YOLO FOR DETECITON INSTEAD OF TABLE TRANSFORMER +Table TransFORMER +""" + +class DetectionAndOcrTable4(): + #This components can take in entire pdf page as input , scan for tables and return the table in html format + #Uses the full unitable model - different to DetectionAndOcrTable1 + def __init__(self): + self.unitableFullPredictor = UnitableFullPredictor() + self.detector = YOLO('foduucom/table-detection-and-extraction') + # set model parameters + self.detector.overrides['conf'] = 0.25 # NMS confidence threshold + self.detector.overrides['iou'] = 0.45 # NMS IoU threshold + self.detector.overrides['agnostic_nms'] = False # NMS class-agnostic + self.detector.overrides['max_det'] = 1000 # maximum number of detections per image + + + + @staticmethod + def save_detection(detected_lines_images:List[ImageType], prefix = './res/test1/res_'): + i = 0 + for img in detected_lines_images: + pilimg = Image.fromarray(img) + pilimg.save(prefix+str(i)+'.png') + i=i+1 + """ + Valid 'Boxes' object attributes and properties are: + + Attributes: + boxes (torch.Tensor) or (numpy.ndarray): A tensor or numpy array containing the detection boxes, + with shape (num_boxes, 6). + orig_shape (torch.Tensor) or (numpy.ndarray): Original image size, in the format (height, width). + + Properties: + xyxy (torch.Tensor) or (numpy.ndarray): The boxes in xyxy format. + conf (torch.Tensor) or (numpy.ndarray): The confidence values of the boxes. + cls (torch.Tensor) or (numpy.ndarray): The class values of the boxes. + xywh (torch.Tensor) or (numpy.ndarray): The boxes in xywh format. + xyxyn (torch.Tensor) or (numpy.ndarray): The boxes in xyxy format normalized by original image size. + xywhn (torch.Tensor) or (numpy.ndarray): The boxes in xywh format normalized by original image size. + """ + # Image is page image + def predict(self,image:Image.Image,debugfolder_filename_page_name = None): + + results = self.detector.predict(image) + + #Array of bboxes + bbxs = results[0].boxes.xyxy.int().tolist() + #Array of confidences + conf = results[0].boxes.conf.float().tolist() + print(bbxs) + print(conf) + + #images_to_recognizer = cropImage(bxs, img) + img_to_save = draw_only_box(image, bbxs) + img_to_save.save(debugfolder_filename_page_name+"detectionBoxRes.png", quality=95) + + # we need something to draw the detection + + + cropped_tables =[] + for i in range (len(bbxs)): + # TODO: find the right confidence and padding values + if conf[i]< 0.65: + continue + + padded = [bbxs[i][0]-10,bbxs[i][1]-10,bbxs[i][2]+10,bbxs[i][3]+10] + + cropped_table = image.convert("RGB").crop(padded) + cropped_table.save(debugfolder_filename_page_name +"yolo_cropped_table_"+str(i)+".png") + cropped_tables.append(cropped_table) + + print("number of cropped tables found: "+str(len(cropped_tables))) + + # Step 1: Unitable + #This take PIL Images as input + if cropped_tables != []: + table_codes = self.unitableFullPredictor.predict(cropped_tables,debugfolder_filename_page_name) + return table_codes + + + + + + + + + + + + diff --git a/doctrfiles/__init__.py b/doctrfiles/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..a8c520f52ab0b969e24fe7ec70e4e9b6bea33864 --- /dev/null +++ b/doctrfiles/__init__.py @@ -0,0 +1,4 @@ +from .doctr_recognizer import DoctrTextRecognizer +from .word_detector import Wordboxes,DoctrWordDetector + +__all__ = ['DoctrTextRecognizer','DoctrWordDetector','Wordboxes'] \ No newline at end of file diff --git a/doctrfiles/doctr_recognizer.py b/doctrfiles/doctr_recognizer.py new file mode 100644 index 0000000000000000000000000000000000000000..8b10c0d4714001f53e13ae7a346f15156d4fad1e --- /dev/null +++ b/doctrfiles/doctr_recognizer.py @@ -0,0 +1,183 @@ +import os +from abc import ABC +from pathlib import Path +from typing import Any, List, Literal, Mapping, Optional, Tuple +from zipfile import ZipFile +import json +from typing import Any, List, Literal, Mapping, Optional,Dict +import uuid +from doctr.models.preprocessor import PreProcessor +from doctr.models.recognition.predictor import RecognitionPredictor # pylint: disable=W0611 +from doctr.models.recognition.zoo import ARCHS, recognition +import torch +# Numpy image type +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] + +from utils import WordAnnotation,getlogger + +class DoctrTextRecognizer(): + + def __init__( + self, + architecture: str, + path_weights: str, + path_config_json: str = None, + ) -> None: + """ + :param architecture: DocTR supports various text recognition models, e.g. "crnn_vgg16_bn", + "crnn_mobilenet_v3_small". The full list can be found here: + https://github.com/mindee/doctr/blob/main/doctr/models/recognition/zoo.py#L16. + :param path_weights: Path to the weights of the model + :param device: "cpu" or "cuda". + :param lib: "TF" or "PT" or None. If None, env variables USE_TENSORFLOW, USE_PYTORCH will be used. + :param path_config_json: Path to a json file containing the configuration of the model. Useful, if you have + a model trained on custom vocab. + """ + + self.architecture = architecture + self.path_weights = path_weights + + self.name = self.get_name(self.path_weights, self.architecture) + + self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + self.path_config_json = path_config_json + + self.built_model = self.build_model(self.architecture, self.path_config_json) + self.load_model(self.path_weights, self.built_model, self.device) + self.doctr_predictor = self.get_wrapped_model() + + def predict(self, inputs: Dict[uuid.UUID, Tuple[ImageType,WordAnnotation]]) -> List[WordAnnotation]: + + """ + Prediction on a batch of text lines + + :param images: Dictionary where key is word's object id and the value is tupe of cropped image and word annotation + :return: A list of DetectionResult + """ + if inputs: + + + predictor =self.doctr_predictor + device = self.device + + word_uuids = list(inputs.keys()) + cropped_images = [value[0] for value in inputs.values()] + + raw_output = predictor(list(cropped_images)) + det_results =[] + for uuid, output in zip(word_uuids, raw_output): + ann = inputs[uuid][1] + ann.text = output[0] + det_results.append(ann) + return det_results + return [] + + def predict_for_tables(self, inputs: List[ImageType]) -> List[str]: + + if inputs: + + predictor =self.doctr_predictor + device = self.device + + raw_output = predictor(list(inputs)) + det_results =[] + for output in raw_output: + det_results.append(output[0]) + return det_results + return [] + + @staticmethod + def load_model(path_weights: str, doctr_predictor: Any, device: torch.device) -> None: + """Loading model weights + 1. Load the State Dictionary: + state_dict = torch.load(path_weights, map_location=device) loads the state dictionary from the specified file path and maps it to the specified device. + 2. Modify Keys in the State Dictionary: + The code prepends "model." to each key in the state dictionary. This is likely necessary to match the keys expected by the doctr_predictor model. + 3. Load State Dictionary into Model: + doctr_predictor.load_state_dict(state_dict) loads the modified state dictionary into the model. + 4. Move Model to Device: + doctr_predictor.to(device) moves the model to the specified device. + """ + state_dict = torch.load(path_weights, map_location=device) + for key in list(state_dict.keys()): + state_dict["model." + key] = state_dict.pop(key) + doctr_predictor.load_state_dict(state_dict) + doctr_predictor.to(device) + + @staticmethod + def build_model(architecture: str, path_config_json: Optional[str] = None) -> "RecognitionPredictor": + """Building the model + 1. Specific keys (arch, url, task) are removed from custom_configs. + mean and std values are moved to recognition_configs. + 2. Creating model + Check Architecture Type: + Case 1 : + If architecture is a string, it checks if it's in the predefined set of architectures (ARCHS). + If valid, it creates an instance of the model using the specified architecture and custom configurations. + Handle Custom Architecture Instances: + Case 2 : + If architecture is not a string, it checks if it's an **instance** of one of the recognized model classes (e.g., recognition.CRNN, recognition.SAR, etc.). + If valid, it assigns the provided architecture to model. + Get Input Shape and Create RecognitionPredictor: + + 3. Retrieves the input_shape from the model's configuration. + 4. Returns an instance of RecognitionPredictor initialized with a PreProcessor and the model. + """ + + # inspired and adapted from https://github.com/mindee/doctr/blob/main/doctr/models/recognition/zoo.py + custom_configs = {} + batch_size = 1024 + recognition_configs = {} + if path_config_json: + with open(path_config_json, "r", encoding="utf-8") as f: + custom_configs = json.load(f) + custom_configs.pop("arch", None) + custom_configs.pop("url", None) + custom_configs.pop("task", None) + recognition_configs["mean"] = custom_configs.pop("mean") + recognition_configs["std"] = custom_configs.pop("std") + #batch_size = custom_configs.pop("batch_size") + recognition_configs["batch_size"] = batch_size + + if isinstance(architecture, str): + if architecture not in ARCHS: + raise ValueError(f"unknown architecture '{architecture}'") + + model = recognition.__dict__[architecture](pretrained=True, pretrained_backbone=True, **custom_configs) + else: + if not isinstance( + architecture, + (recognition.CRNN, recognition.SAR, recognition.MASTER, recognition.ViTSTR, recognition.PARSeq), + ): + raise ValueError(f"unknown architecture: {type(architecture)}") + model = architecture + + input_shape = model.cfg["input_shape"][-2:] + """ + (class) PreProcessor + Implements an abstract preprocessor object which performs casting, resizing, batching and normalization. + + Args: + output_size: expected size of each page in format (H, W) + batch_size: the size of page batches + mean: mean value of the training distribution by channel + std: standard deviation of the training distribution by channel + """ + return RecognitionPredictor(PreProcessor(input_shape, preserve_aspect_ratio=True, **recognition_configs), model) + + + def get_wrapped_model(self) -> Any: + """ + Get the inner (wrapped) model. + """ + doctr_predictor = self.build_model(self.architecture, self.path_config_json) + device_str = torch.device("cuda" if torch.cuda.is_available() else "cpu") + self.load_model(self.path_weights, doctr_predictor, device_str) + return doctr_predictor + + @staticmethod + def get_name(path_weights: str, architecture: str) -> str: + """Returns the name of the model""" + return f"doctr_{architecture}" + "_".join(Path(path_weights).parts[-2:]) diff --git a/doctrfiles/models/config-multi2.json b/doctrfiles/models/config-multi2.json new file mode 100644 index 0000000000000000000000000000000000000000..29cdd1e78236bd909120b0c1251f962e88b74cf8 --- /dev/null +++ b/doctrfiles/models/config-multi2.json @@ -0,0 +1,21 @@ +{ + "mean": [ + 0.694, + 0.695, + 0.693 + ], + "std": [ + 0.299, + 0.296, + 0.301 + ], + "input_shape": [ + 3, + 32, + 128 + ], + "vocab": "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~°£€¥¢฿äöüßÄÖÜẞàâéèêëîïôùûçÀÂÉÈÊËÎÏÔÙÛǧ", + "url": "https://doctr-static.mindee.com/models?id=v0.3.1/crnn_vgg16_bn-9762b0b0.pt&src=0", + "arch": "crnn_vgg16_bn", + "task": "recognition" +} \ No newline at end of file diff --git a/doctrfiles/models/db_mobilenet_v3_large-81e9b152.pt b/doctrfiles/models/db_mobilenet_v3_large-81e9b152.pt new file mode 100644 index 0000000000000000000000000000000000000000..889ccf770ee8368df86669dbee9e0397fb4590a9 --- /dev/null +++ b/doctrfiles/models/db_mobilenet_v3_large-81e9b152.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81e9b152c11e9681f5eb4a2ec72e5f5d67df8ab860a846e1004756badfa5d37a +size 16987510 diff --git a/doctrfiles/models/db_resnet34-cb6aed9e.pt b/doctrfiles/models/db_resnet34-cb6aed9e.pt new file mode 100644 index 0000000000000000000000000000000000000000..b52c30e04513d04976bb92bde241ff318af30113 --- /dev/null +++ b/doctrfiles/models/db_resnet34-cb6aed9e.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb6aed9e4252c8a92d381de1b15e1e75461f7a125a4262ef16768a4b9f797347 +size 89991042 diff --git a/doctrfiles/models/db_resnet50-79bd7d70.pt b/doctrfiles/models/db_resnet50-79bd7d70.pt new file mode 100644 index 0000000000000000000000000000000000000000..093c08d03f1aee22081b3182a587b2df1b4fd1f8 --- /dev/null +++ b/doctrfiles/models/db_resnet50-79bd7d70.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79bd7d702506703b89cf11afa42d12aebf5cf25c3618e6ffd5f85772240ca483 +size 102021912 diff --git a/doctrfiles/models/db_resnet50_config.json b/doctrfiles/models/db_resnet50_config.json new file mode 100644 index 0000000000000000000000000000000000000000..38f21c2e8cdab8872a5fb25625a2d541c388ea46 --- /dev/null +++ b/doctrfiles/models/db_resnet50_config.json @@ -0,0 +1,20 @@ +{ +"mean": [ + 0.798, + 0.785, + 0.772 +], +"std": [ + 0.264, + 0.2749, + 0.287 +], +"input_shape": [ + 3, + 1024, + 1024 +], +"url": "https://doctr-static.mindee.com/models?id=v0.7.0/parseq-56125471.pt&src=0", +"arch": "db_resnet50", +"task": "detection" +} \ No newline at end of file diff --git a/doctrfiles/models/doctr-multilingual-parseq.bin b/doctrfiles/models/doctr-multilingual-parseq.bin new file mode 100644 index 0000000000000000000000000000000000000000..4e1b2683bc3af57a31716a8b4f5f99bb4ec84589 --- /dev/null +++ b/doctrfiles/models/doctr-multilingual-parseq.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5b1d3f3b9d8ab994e94c671c47828b9a4079f20b4288eb5f0ba3c6dacf6c237 +size 47872130 diff --git a/doctrfiles/models/master-fde31e4a.pt b/doctrfiles/models/master-fde31e4a.pt new file mode 100644 index 0000000000000000000000000000000000000000..8f0fa380e83c1eb42a09ba04ee9cc5d33c365f11 --- /dev/null +++ b/doctrfiles/models/master-fde31e4a.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fde31e4a9612670af83daf4b730dd9c56216806589546b09290abc347ca3a49d +size 243889428 diff --git a/doctrfiles/models/master.json b/doctrfiles/models/master.json new file mode 100644 index 0000000000000000000000000000000000000000..84ecb9726c08ee1760b4493128c2fb68a3151c2a --- /dev/null +++ b/doctrfiles/models/master.json @@ -0,0 +1,21 @@ +{ + "mean": [ + 0.694, + 0.695, + 0.693 + ], + "std": [ + 0.299, + 0.296, + 0.301 + ], + "input_shape": [ + 3, + 32, + 128 + ], + "vocab": "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~°£€¥¢฿àâéèêëîïôùûüçÀÂÉÈÊËÎÏÔÙÛÜÇ", + "url": null, + "arch": "master", + "task": "recognition" +} \ No newline at end of file diff --git a/doctrfiles/models/multi2.bin b/doctrfiles/models/multi2.bin new file mode 100644 index 0000000000000000000000000000000000000000..12d6b0244165525459dc91c5297e3645bdd5268b --- /dev/null +++ b/doctrfiles/models/multi2.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bdc3c6922cad527714504b84a9d0efaa6b679d8ca8050a003611076eb514757 +size 63310142 diff --git a/doctrfiles/models/multilingual-parseq-config.json b/doctrfiles/models/multilingual-parseq-config.json new file mode 100644 index 0000000000000000000000000000000000000000..caa15f66c229a8b79c715a73cf35064362d85a17 --- /dev/null +++ b/doctrfiles/models/multilingual-parseq-config.json @@ -0,0 +1,21 @@ +{ + "mean": [ + 0.694, + 0.695, + 0.693 + ], + "std": [ + 0.299, + 0.296, + 0.301 + ], + "input_shape": [ + 3, + 32, + 128 + ], + "vocab": "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~°£€¥¢฿àâéèêëîïôùûüçÀÂÉÈÊËÎÏÔÙÛÜÇáãíóõúÁÃÍÓÕÚñÑ¡¿äößÄÖẞčďěňřšťůýžČĎĚŇŘŠŤŮÝŽąćęłńśźżĄĆĘŁŃŚŹŻìòÌÒæøåÆØŧ", + "url": "https://doctr-static.mindee.com/models?id=v0.7.0/parseq-56125471.pt&src=0", + "arch": "parseq", + "task": "recognition" +} \ No newline at end of file diff --git a/doctrfiles/word_detector.py b/doctrfiles/word_detector.py new file mode 100644 index 0000000000000000000000000000000000000000..8b6538653561cd70dc780cf8cb5a1045b6a78c4b --- /dev/null +++ b/doctrfiles/word_detector.py @@ -0,0 +1,282 @@ + +import os +from abc import ABC +from pathlib import Path +from typing import Any, List, Literal, Mapping, Optional, Tuple, Union, Dict, Type, Sequence +import json +import logging +import torch +from doctr.models.preprocessor import PreProcessor +from doctr.models.detection.predictor import DetectionPredictor # pylint: disable=W0611 +from doctr.models.detection.zoo import detection_predictor,detection + +import numpy.typing as npt +import numpy as np +from numpy import uint8 +ImageType = npt.NDArray[uint8] + + +from utils import Annotation,getlogger,group_words_into_lines + +ARCHS = [ + "db_resnet34", + "db_resnet50", + "db_mobilenet_v3_large", + "linknet_resnet18", + "linknet_resnet34", + "linknet_resnet50", + "fast_tiny", + "fast_small", + "fast_base", + ] +class Wordboxes: + def __init__(self,score, box): + self.box = box + self.score = score + +class DoctrWordDetector(): + """ + A deepdoctection wrapper of DocTr text line detector. We model text line detection as ObjectDetector + and assume to use this detector in a ImageLayoutService. + DocTr supports several text line detection implementations but provides only a subset of pre-trained models. + The most usable one for document OCR for which a pre-trained model exists is DBNet as described in “Real-time Scene + Text Detection with Differentiable Binarization”, with a ResNet-50 backbone. This model can be used in either + Tensorflow or PyTorch. + Some other pre-trained models exist that have not been registered in `ModelCatalog`. Please check the DocTr library + and organize the download of the pre-trained model by yourself. + + **Example:** + + path_weights_tl = ModelDownloadManager.maybe_download_weights_and_configs("doctr/db_resnet50/pt + /db_resnet50-ac60cadc.pt") + # Use "doctr/db_resnet50/tf/db_resnet50-adcafc63.zip" for Tensorflow + + categories = ModelCatalog.get_profile("doctr/db_resnet50/pt/db_resnet50-ac60cadc.pt").categories + det = DoctrTextlineDetector("db_resnet50",path_weights_tl,categories,"cpu") + layout = ImageLayoutService(det,to_image=True, crop_image=True) + + path_weights_tr = dd.ModelDownloadManager.maybe_download_weights_and_configs("doctr/crnn_vgg16_bn + /pt/crnn_vgg16_bn-9762b0b0.pt") + rec = DoctrTextRecognizer("crnn_vgg16_bn", path_weights_tr, "cpu") + text = TextExtractionService(rec, extract_from_roi="word") + + analyzer = DoctectionPipe(pipeline_component_list=[layout,text]) + + path = "/path/to/image_dir" + df = analyzer.analyze(path = path) + + for dp in df: + ... + """ + + def __init__( + self, + architecture: str, + path_weights: str, + path_config_json:str + ) -> None: + """ + :param architecture: DocTR supports various text line detection models, e.g. "db_resnet50", + "db_mobilenet_v3_large". The full list can be found here: + https://github.com/mindee/doctr/blob/main/doctr/models/detection/zoo.py#L20 + :param path_weights: Path to the weights of the model + :param categories: A dict with the model output label and value + :param device: "cpu" or "cuda" or any tf.device or torch.device. The device must be compatible with the dll + :param lib: "TF" or "PT" or None. If None, env variables USE_TENSORFLOW, USE_PYTORCH will be used. + """ + self.architecture = architecture + self.path_weights = path_weights + self.path_config_json =path_config_json + + # Ensure the correct device is chosen (either CPU or CUDA if available) + self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + # Initialize the model with the given architecture and path to weights + self.doctr_predictor = self.get_wrapped_model() + + """ + Two static method so that they can be called without creating an instance of the class + Also, they don't require any instance specific data + """ + + def get_wrapped_model( + self + ) -> Any: + """ + Get the inner (wrapped) model. + + :param architecture: DocTR supports various text line detection models, e.g. "db_resnet50", + "db_mobilenet_v3_large". The full list can be found here: + https://github.com/mindee/doctr/blob/main/doctr/models/detection/zoo.py#L20 + :param path_weights: Path to the weights of the model + + :return: Inner model which is a "nn.Module" in PyTorch or a "tf.keras.Model" in Tensorflow + """ + + """ + (function) detection_predictor: ((arch: Any = "db_resnet50", pretrained: bool = False, assume_straight_pages: bool = True, **kwargs: Any) -> DetectionPredictor) + """ + #doctr_predictor = detection_predictor(arch=architecture, pretrained=False, pretrained_backbone=False) + #doctr_predictor = detection_predictor(arch=architecture, pretrained=False) + + doctr_predictor = self.build_model(self.architecture, self.path_config_json) + + self.load_model(self.path_weights, doctr_predictor, self.device) + return doctr_predictor + @staticmethod + def build_model(arch: str, pretrained = False,assume_straight_pages=True, path_config_json: Optional[str] = None) -> "DetectionPredictor": + """Building the model + 1. Specific keys (arch, url, task) are removed from custom_configs. + mean and std values are moved to recognition_configs. + 2. Creating model + Check Architecture Type: + Case 1 : + If architecture is a string, it checks if it's in the predefined set of architectures (ARCHS). + If valid, it creates an instance of the model using the specified architecture and custom configurations. + Handle Custom Architecture Instances: + Case 2 : + If architecture is not a string, it checks if it's an **instance** of one of the recognized model classes (e.g., recognition.CRNN, recognition.SAR, etc.). + If valid, it assigns the provided architecture to model. + Get Input Shape and Create RecognitionPredictor: + + 3. Retrieves the input_shape from the model's configuration. + 4. Returns an instance of RecognitionPredictor initialized with a PreProcessor and the model. + """ + + custom_configs = {} + batch_size = 4 + detection_configs = {} + if path_config_json: + with open(path_config_json, "r", encoding="utf-8") as f: + custom_configs = json.load(f) + custom_configs.pop("arch", None) + custom_configs.pop("url", None) + custom_configs.pop("task", None) + detection_configs["mean"] = custom_configs.pop("mean") + detection_configs["std"] = custom_configs.pop("std") + #batch_size = custom_configs.pop("batch_size") + detection_configs["batch_size"] = batch_size + if isinstance(arch, str): + if arch not in ARCHS: + raise ValueError(f"unknown architecture '{arch}'") + + model = detection.__dict__[arch]( + pretrained=pretrained, + assume_straight_pages=assume_straight_pages + ) + + else: + if not isinstance(arch, (detection.DBNet, detection.LinkNet, detection.FAST)): + raise ValueError(f"unknown architecture: {type(arch)}") + + model = arch + model.assume_straight_pages = assume_straight_pages + + input_shape = model.cfg["input_shape"][-2:] + + predictor = DetectionPredictor( + PreProcessor(input_shape, batch_size=batch_size,**detection_configs), + model + ) + return predictor + + @staticmethod + def load_model(path_weights: str, doctr_predictor: Any, device: torch.device) -> None: + """Loading model weights + 1. Load the State Dictionary: + state_dict = torch.load(path_weights, map_location=device) loads the state dictionary from the specified file path and maps it to the specified device. + 2. Modify Keys in the State Dictionary: + The code prepends "model." to each key in the state dictionary. This is likely necessary to match the keys expected by the doctr_predictor model. + 3. Load State Dictionary into Model: + doctr_predictor.load_state_dict(state_dict) loads the modified state dictionary into the model. + 4. Move Model to Device: + doctr_predictor.to(device) moves the model to the specified device. + """ + state_dict = torch.load(path_weights, map_location=device) + for key in list(state_dict.keys()): + state_dict["model." + key] = state_dict.pop(key) + doctr_predictor.load_state_dict(state_dict) + doctr_predictor.to(device) + + + def predict(self, np_img: ImageType,sort_vertical = False) -> List[Wordboxes]: + """ + Prediction per image. + + :param np_img: image as numpy array + + :return: A list of DetectionResult + """ + + raw_output =self.doctr_predictor([np_img]) + height, width = np_img.shape[:2] + + """ + raw_output is arrary of dictionary with just one key "words" + 1-4th element : coordinates You take first 4 elements in this array by doing box[:4] + 5th element - score + But those are 4 point and we need 4X2 + type(raw_output[0]["words"]) are numpy arrary + Okay hypothesis :xmin, ymin, xmax, ymax + Points should be ordered in this order :left_lower, right_lower, right_upper, left_upper + """ + + logger = getlogger("array") + # Check if the logger has any handlers + if (logger.hasHandlers()): + logger.handlers.clear() + + # Create a handler + handler = logging.StreamHandler() + + # Create a formatter and add it to the handler + formatter = logging.Formatter('%(levelname)s:%(message)s') + handler.setFormatter(formatter) + + # Add the handler to the logger + logger.addHandler(handler) + #logger.info(raw_output[0]["words"]) + + #array is numpy array of shape (n,5) where n is number of words and 5 is size of each element(array) with coordinate(xmin,ymin,xmax,ymax) + score + + array = raw_output[0]["words"] + if not sort_vertical: + #Only When input has one line + sorted_array = array[array[:, 0].argsort()] + else: + #When input can have multiple lines + sorted_array = group_words_into_lines(array) + #logger.info(sorted_array) + + + detection_results = [] + for box in sorted_array: + xmin, ymin, xmax, ymax = box[:4] + xmin = xmin*width + ymin = ymin*height + xmax = xmax*width + ymax = ymax*height + newb = np.array([ + [xmin, ymin], + [xmax, ymin], + [xmax, ymax], + [xmin, ymax] + ], dtype=np.float32) + assert newb.shape == (4, 2), f"Points array must be of shape (4, 2), but got {box.shape}" + assert newb.dtype == np.float32, f"Points array must be of dtype float32, but got {box.dtype}" + + w = Wordboxes( + score=box[4], + box = newb + ) + + detection_results.append(w) + + return detection_results + + + + + + + diff --git a/image-1.png b/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e6e84c8925ce0e1176d559ae4b05d26240d995a Binary files /dev/null and b/image-1.png differ diff --git a/image-2.png b/image-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2027dd96b8b986186aff152f27f655ce20d3e8a0 Binary files /dev/null and b/image-2.png differ diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd5f37270123801a5c753003a8c7ca960ca301e Binary files /dev/null and b/image.png differ diff --git a/june11.jpg b/june11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e244b174a15cc5a926b8b7c72d520c9746d790a1 Binary files /dev/null and b/june11.jpg differ diff --git a/main.py b/main.py new file mode 100644 index 0000000000000000000000000000000000000000..2a92e0ec41c001720138309223680ae9f93b3faa --- /dev/null +++ b/main.py @@ -0,0 +1,295 @@ + +import os +import traceback +import argparse +from typing import List, Tuple, Set, Dict + +import time +from PIL import Image +import numpy as np +import logging +import pandas as pd +from bs4 import BeautifulSoup + +from utils import cropImages +from utils import draw_only_box,draw_box_with_text,getlogger,Annotation +from ocr_component1 import OCRComponent1 +from detectionAndOcrTable1 import DetectionAndOcrTable1 +from detectionAndOcrTable2 import DetectionAndOcrTable2 +from detectionAndOcrTable3 import DetectionAndOcrTable3 +from detectionAndOcrTable4 import DetectionAndOcrTable4 +from ocrTable1 import OcrTable1 +from ocrTable2 import OcrTable2 +from pdf2image import convert_from_path + + + +def convertHTMLToCSV(html:str,output_path:str)->str: + + # empty list + data = [] + + # for getting the header from + # the HTML file + list_header = [] + soup = BeautifulSoup(html,'html.parser') + header = soup.find_all("table")[0].find("tr") + + for items in header: + try: + list_header.append(items.get_text()) + except: + continue + + # for getting the data + HTML_data = soup.find_all("table")[0].find_all("tr")[1:] + + for element in HTML_data: + sub_data = [] + for sub_element in element: + try: + sub_data.append(sub_element.get_text()) + except: + continue + data.append(sub_data) + + # Storing the data into Pandas + # DataFrame + dataFrame = pd.DataFrame(data = data, columns = list_header) + + # Converting Pandas DataFrame + # into CSV file + dataFrame.to_csv(output_path) + +def saveResults(image_list, results, labels, output_dir='output/', threshold=0.5): + if not os.path.exists(output_dir): + os.makedirs(output_dir) + for idx, im in enumerate(image_list): + im = draw_only_box(im, results[idx], labels, threshold=threshold) + + out_path = os.path.join(output_dir, f"{idx}.jpg") + im.save(out_path, quality=95) + print("save result to: " + out_path) + +def InputToImages(input_path:str,resolution=300)-> List[Image.Image]: + """ + input is file location to image + return : List of Pillow image objects + """ + images=[] + try: + img =Image.open(input_path) + if img.mode == 'RGBA': + img = img.convert('RGB') + images.append(img) + except Exception as e: + traceback.print_exc() + return images + +def drawTextDetRes(bxs :List[List[float]],img:Image.Image,output_path:str): + """ + draw layout analysis results + """ + """bxs_draw is xmin, ymin, xmax, ymax""" + bxs_draw = [[b[0][0], b[0][1], b[1][0], b[-1][1]] for b in bxs if b[0][0] <= b[1][0] and b[0][1] <= b[-1][1]] + + #images_to_recognizer = cropImage(bxs, img) + img_to_save = draw_only_box(img, bxs_draw) + img_to_save.save(output_path, quality=95) + +def test_ocr_component1(test_file="TestingFiles/OCRTest1German.pdf", debug_folder = './res/table1/',englishFlag = False): + #Takes as input image of a single page and returns the detected lines and words + # + if not os.path.exists(debug_folder): + os.makedirs(debug_folder) + images = convert_from_path(test_file) + ocr = OCRComponent1(englishFlag) + ocr_results = {} + for page_number,img in enumerate(images): + + + line_annotations= ocr.predict(img = np.array(img)) + ocr_results[page_number] = line_annotations + + """boxes_to_draw =[] + for list_of_ann in word_annotations: + for ann in list_of_ann: + logger.info(ann.text) + b = ann.box + boxes_to_draw.append(b) + + img_to_save = draw_only_box(img,boxes_to_draw) + img_to_save.save("res/12June_2_lines.png", quality=95) + """ + + line_boxes_to_draw =[] + #print("Detected lines are ") + #print(len(line_annotations.items())) + for index,ann in line_annotations.items(): + + b = ann.box + line_boxes_to_draw.append(b) + line_words = "" + #print("detected words per line") + #print(len(ann.words)) + for wordann in ann.words: + line_words += wordann.text +" " + print(line_words) + + img_to_save1 = draw_only_box(img,line_boxes_to_draw) + imgname = test_file.split("/")[-1][:-4] + img_to_save1.save(debug_folder+imgname+"_"+str(page_number)+"_bbox_detection.png", quality=95) + + return ocr_results + + +def test_tableOcrOnly1(test_file = './cropped_table_0.png' , debug_folder = './res/table1/',denoise = False,englishFlag = False): + if not os.path.exists(debug_folder): + os.makedirs(debug_folder) + #Hybrid Unitable +DocTR + #Good at these kind of tables - with a lot of texts + table = OcrTable1(englishFlag) + image = Image.open(test_file).convert("RGB") + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_" + + table_code = table.predict([image],debugfolder_filename_page_name,denoise = denoise) + with open(debugfolder_filename_page_name+'output.txt', 'w') as file: + file.write(table_code) + return table_code + +def test_tableOcrOnly2(test_file = './cropped_table_1.png' , debug_folder = './res/table2/'): + if not os.path.exists(debug_folder): + os.makedirs(debug_folder) + table = OcrTable2() + + #FullUnitable + #Good at these kind of tables - with not much text + + image = Image.open(test_file).convert("RGB") + table.predict([image],debug_folder) + +def test_table_component1(test_file = 'TestingFiles/TableOCRTestEnglish.pdf', debug_folder ='./res/table_debug2/',denoise = False,englishFlag = True): + table_predictor = DetectionAndOcrTable1(englishFlag) + if not os.path.exists(debug_folder): + os.makedirs(debug_folder) + + images = convert_from_path(test_file) + for page_number,img in enumerate(images): + + #print(img.mode) + print("Looking at page:") + print(page_number) + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_"+ str(page_number)+'_' + table_codes = table_predictor.predict(img,debugfolder_filename_page_name=debugfolder_filename_page_name,denoise = denoise) + for index, table_code in enumerate(table_codes): + with open(debugfolder_filename_page_name+str(index)+'output.xls', 'w') as file: + file.write(table_code) + +def test_table_component2(test_file = 'TestingFiles/TableOCRTestEnglish.pdf', debug_folder ='./res/table_debug2/'): + #This components can take in entire pdf page as input , scan for tables and return the table in html format + #Uses the full unitable model + if not os.path.exists(debug_folder): + os.makedirs(debug_folder) + table_predictor = DetectionAndOcrTable2() + + images = convert_from_path(test_file) + for page_number,img in enumerate(images): + print("Looking at page:") + print(page_number) + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_"+ str(page_number)+'_' + table_codes = table_predictor.predict(img,debugfolder_filename_page_name=debugfolder_filename_page_name) + for index, table_code in enumerate(table_codes): + with open(debugfolder_filename_page_name+str(index)+'output.xls', 'w',encoding='utf-8') as file: + file.write(table_code) + +def test_table_component3(test_file = 'TestingFiles/TableOCRTestEnglish.pdf',debug_folder ='./res/table_debug3/',denoise = False,englishFlag = True): + if not os.path.exists(debug_folder): + os.makedirs(debug_folder) + table_predictor = DetectionAndOcrTable3(englishFlag) + + images = convert_from_path(test_file) + for page_number,img in enumerate(images): + #print(img.mode) + print("Looking at page:") + print(page_number) + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_"+ str(page_number)+'_' + table_codes = table_predictor.predict(img,debugfolder_filename_page_name=debugfolder_filename_page_name) + for index, table_code in enumerate(table_codes): + with open(debugfolder_filename_page_name+str(index)+'output.xls', 'w',encoding='utf-8') as file: + file.write(table_code) + + + +def test_table_component4(test_file = 'TestingFiles/TableOCRTestEnglish.pdf',debug_folder ='./res/table_debug3/'): + if not os.path.exists(debug_folder): + os.makedirs(debug_folder) + table_predictor = DetectionAndOcrTable4() + + images = convert_from_path(test_file) + for page_number,img in enumerate(images): + #print(img.mode) + print("Looking at page:") + print(page_number) + parts = test_file.split("/") + filename = parts[-1][:-4] + debugfolder_filename_page_name= debug_folder+filename+"_"+ str(page_number)+'_' + table_codes = table_predictor.predict(img,debugfolder_filename_page_name=debugfolder_filename_page_name) + for index, table_code in enumerate(table_codes): + with open(debugfolder_filename_page_name+str(index)+'output.xls', 'w',encoding='utf-8') as file: + file.write(table_code) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Process some strings.') + parser.add_argument('ocr', type=str, help='type in id of the component to test') + parser.add_argument('--test_file',type=str, help='path to the testing file') + parser.add_argument('--debug_folder',type=str, help='path to the folder you want to save your results in') + parser.add_argument('--englishFlag',type=bool, help='Whether your pdf is in english => could lead to better results ') + parser.add_argument('--denoise',type=bool, help='preprocessing for not clean scans ') + + args = parser.parse_args() + start = time.time() + if args.ocr == "ocr1": + test_ocr_component1(args.test_file,args.debug_folder, args.englishFlag) + elif args.ocr == "table1": + test_tableOcrOnly1(args.test_file,args.debug_folder,args.englishFlag,args.denoise) + elif args.ocr == "table2": + test_tableOcrOnly2(args.test_file,args.debug_folder) + elif args.ocr =="pdftable1": + test_table_component1(args.test_file,args.debug_folder,args.englishFlag,args.denoise) + elif args.ocr =="pdftable2": + test_table_component2(args.test_file,args.debug_folder) + elif args.ocr =="pdftable3": + test_table_component3(args.test_file,args.debug_folder,args.englishFlag,args.denoise) + elif args.ocr =="pdftable4": + test_table_component4(args.test_file,args.debug_folder) + + #test_table_component1() + #test_ocr_component1("TestingFilesImages/OCRTest3English_0.jpg") + #test_tableOcrOnly2() + #test_tableOcrOnly2() + #test_tableOcrOnly2_singleImage() + + # Example run + # python main.py pdftable2 --test_file TestingFiles/TableOCRTestEnglish.pdf --debug_foler ./res/table_debug2/ + # python main.py ocr1 --test_file TestingFiles/OCRTest1German.pdf --debug_repo ./res/ocrdebug1/ + # python main.py table1 --test_file ./cropped_table_0.png --debug_repo ./res/table1/ + # python main.py table2 --test_file ./cropped_table_1.png --debug_repo ./res/table2/ + # python main.py pdftable1 --test_file TestingFiles/TableOCRTestEnglish.pdf --debug_foler ./res/table_debug2/ + + + + + + + end = time.time() + print("The entire pipeline took " , end-start) + diff --git a/nougat.py b/nougat.py new file mode 100644 index 0000000000000000000000000000000000000000..e093d151ca96442ee2e1f5f1eb95d67154dcd78e --- /dev/null +++ b/nougat.py @@ -0,0 +1,43 @@ +from typing import List, Tuple, Set, Dict + +from huggingface_hub import hf_hub_download +import re +from PIL import Image +from transformers import NougatProcessor, VisionEncoderDecoderModel +from datasets import load_dataset +import torch +from doctrfiles import DetectionResult +# Numpy image type +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] + + +def run_nougat(inputs: List[Tuple[int, ImageType]])-> List[DetectionResult]: + processor = NougatProcessor.from_pretrained("facebook/nougat-base") + model = VisionEncoderDecoderModel.from_pretrained("facebook/nougat-base") + + device = "cuda" if torch.cuda.is_available() else "cpu" + model.to(device) + + detection_results =[] + for index, np_img in inputs: + image = Image.fromarray(np_img) + pixel_values = processor(image, return_tensors="pt").pixel_values + + # generate transcription (here we only generate 30 tokens) + outputs = model.generate( + pixel_values.to(device), + min_length=1, + max_new_tokens=30, + bad_words_ids=[[processor.tokenizer.unk_token_id]], + ) + + sequence = processor.batch_decode(outputs, skip_special_tokens=True)[0] + sequence = processor.post_process_generation(sequence, fix_markdown=False) + # note: we're using repr here such for the sake of printing the \n characters, feel free to just print the sequence + text = sequence + detection_results.append(DetectionResult(score=1, text=text, index=index)) + + return detection_results + diff --git a/ocrTable1.py b/ocrTable1.py new file mode 100644 index 0000000000000000000000000000000000000000..cbd584e2fa99bcd37964aab0054ebc255be9520b --- /dev/null +++ b/ocrTable1.py @@ -0,0 +1,209 @@ +from typing import Tuple, List, Sequence, Optional, Union +from torchvision import transforms +from torch import nn, Tensor +from PIL import Image +from pathlib import Path +from bs4 import BeautifulSoup as bs +from unitable import UnitablePredictor +from doctrfiles import DoctrWordDetector,DoctrTextRecognizer +import numpy as np +from utils import crop_an_Image,cropImageExtraMargin +from utils import denoisingAndSharpening +import numpy.typing as npt +from numpy import uint8 + + +ImageType = npt.NDArray[uint8] + +html_table_template = ( + + lambda table: f""" + + + + + {table} +
""" +) + +class OcrTable1(): + def __init__(self,englishFlag = True): + self.wordDetector = DoctrWordDetector(architecture="db_resnet50", + path_weights="./doctrfiles/models/db_resnet50-79bd7d70.pt", + path_config_json ="./doctrfiles/models/db_resnet50_config.json") + + self.unitablePredictor = UnitablePredictor() + + if englishFlag: + self.textRecognizer = DoctrTextRecognizer(architecture="master", path_weights="./doctrfiles/models/master-fde31e4a.pt", + path_config_json="./doctrfiles/models/master.json") + else: + self.textRecognizer = DoctrTextRecognizer(architecture="parseq", path_weights="./doctrfiles/models/doctr-multilingual-parseq.bin", + path_config_json="./doctrfiles/models/multilingual-parseq-config.json") + + + @staticmethod + def build_table_from_html_and_cell( + structure: List[str], content: List[str] = None + ) -> List[str]: + """Build table from html and cell token list""" + assert structure is not None + html_code = list() + + # deal with empty table + if content is None: + content = ["placeholder"] * len(structure) + + for tag in structure: + if tag in ("[]", ">[]"): + if len(content) == 0: + continue + cell = content.pop(0) + html_code.append(tag.replace("[]", cell)) + else: + html_code.append(tag) + + return html_code + + @staticmethod + def save_detection(detected_lines_images:List[ImageType],prefix = './res/test1/res_'): + i = 0 + for img in detected_lines_images: + pilimg = Image.fromarray(img) + pilimg.save(prefix+str(i)+'.png') + i=i+1 + + + def predict(self,images:List[ImageType],debug_folder="./res",denoise=False): + + """ + this hardcodes 0 into images and bbxs cause they are made to get multiple images but this component will only get one image + """ + + # Step 0 : Locate the table using Table detection TODO + # PreProcessing + if denoise: + images = denoisingAndSharpening(images) + else: + images = images + + pred_htmls, bbxs = self.unitablePredictor.predict(images,debug_folder) + + #pred_html =['', '', '[]', '', '', '[]', '', '', '', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', '', '[]', '[]', '[]', '[]', '[]', '[]', '[]', '', ''] + #bbxs = [[608, 33, 820, 106], [72, 125, 1353, 212], [377, 255, 654, 340], [709, 255, 989, 340], [1044, 255, 1330, 340], [166, 364, 254, 394], [351, 451, 517, 484], [520, 424, 676, 538], [689, 451, 839, 484], [859, 424, 1011, 538], [1024, 424, 1181, 511], [1194, 424, 1353, 538], [420, 614, 446, 644], [592, 614, 615, 644], [761, 614, 784, 644], [930, 614, 953, 644], [1096, 614, 1119, 644], [1262, 614, 1285, 644], [72, 671, 185, 701], [315, 671, 351, 701], [394, 671, 462, 701], [595, 671, 631, 701], [728, 671, 797, 701], [930, 671, 966, 701], [1063, 671, 1132, 701], [1268, 671, 1304, 701], [72, 698, 205, 728], [315, 698, 351, 728], [416, 698, 462, 728], [589, 698, 631, 728], [748, 698, 790, 728], [924, 698, 966, 728], [1089, 698, 1132, 728], [1259, 698, 1304, 728], [72, 725, 208, 755], [315, 725, 351, 755], [416, 725, 462, 755], [595, 725, 631, 755], [751, 725, 797, 755], [930, 725, 966, 755], [1063, 725, 1135, 755], [1268, 725, 1304, 755], [72, 752, 211, 782], [315, 752, 351, 782], [416, 752, 462, 782], [595, 752, 631, 782], [764, 752, 797, 782], [946, 752, 966, 782], [1089, 752, 1132, 782], [1268, 752, 1304, 782], [72, 780, 179, 810], [315, 780, 351, 810], [416, 780, 462, 810], [595, 780, 631, 810], [764, 780, 797, 810], [946, 780, 966, 810], [1089, 780, 1132, 810], [1268, 780, 1304, 810], [72, 807, 182, 837], [315, 807, 351, 837], [416, 807, 462, 837], [595, 807, 631, 837], [751, 807, 797, 837], [946, 807, 966, 837], [1089, 807, 1132, 837], [1268, 807, 1304, 837], [72, 834, 169, 864], [315, 834, 351, 864], [416, 834, 462, 864], [595, 834, 631, 864], [764, 834, 797, 864], [946, 834, 966, 864], [1089, 834, 1132, 864], [1268, 834, 1304, 864], [72, 861, 189, 891], [315, 861, 351, 891], [416, 861, 462, 891], [595, 861, 631, 891], [764, 861, 797, 891], [946, 861, 966, 891], [1089, 861, 1132, 891], [1268, 861, 1304, 891], [72, 888, 189, 918], [315, 888, 351, 918], [416, 888, 462, 918], [595, 888, 631, 918], [751, 888, 797, 918], [946, 888, 966, 918], [1089, 888, 1132, 918], [1268, 888, 1304, 918], [72, 915, 179, 945], [315, 915, 351, 945], [416, 915, 462, 945], [595, 915, 631, 945], [764, 915, 797, 945], [946, 915, 966, 945], [1089, 915, 1132, 945], [1268, 915, 1304, 945], [72, 943, 241, 973], [315, 943, 351, 973], [416, 943, 462, 973], [595, 943, 631, 973], [764, 943, 797, 973], [946, 943, 966, 973], [1089, 943, 1132, 973], [1268, 943, 1304, 973], [72, 970, 231, 1000], [315, 970, 351, 1000], [394, 970, 462, 1000], [595, 970, 631, 1000], [751, 970, 797, 1000], [930, 970, 966, 1000], [1063, 970, 1132, 1000], [1268, 970, 1304, 1000], [72, 997, 211, 1027], [315, 997, 351, 1027], [416, 997, 462, 1027], [595, 997, 631, 1027], [764, 997, 797, 1027], [946, 997, 966, 1027], [1089, 997, 1132, 1027], [1268, 997, 1304, 1027], [72, 1024, 198, 1054], [315, 1024, 351, 1054], [394, 1024, 462, 1054], [595, 1024, 631, 1054], [764, 1024, 797, 1054], [946, 1024, 966, 1054], [1063, 1024, 1132, 1054], [1268, 1024, 1304, 1054], [72, 1051, 231, 1081], [315, 1051, 351, 1081], [394, 1051, 462, 1081], [595, 1051, 631, 1081], [764, 1051, 797, 1081], [946, 1051, 966, 1081], [1063, 1051, 1132, 1081], [1268, 1051, 1304, 1081], [124, 1108, 195, 1138], [315, 1108, 351, 1138], [381, 1108, 462, 1138], [595, 1108, 631, 1138], [728, 1108, 797, 1138], [946, 1108, 966, 1138], [1054, 1108, 1135, 1138], [1268, 1108, 1304, 1138]] + + #Step2: Crop the images from the returned bboxes + pred_cell = [] + cell_imgs_to_viz = [] + cell_img_num=0 + + # Some tabless have a lot of words in their header + # So for the headers, give doctr word ddetector doesn't work when the images aren't square + table_header_cells = 0 + header_exists = False + for cell in pred_html: + if cell=='>[]' or cell == '[]': + table_header_cells += 1 + if cell =='': + header_exists = True + break + if not header_exists: + table_header_cells = 0 + pred_cell = [] + cell_imgs_to_viz = [] + cell_img_num=0 + + one_line_height = 100000 + for i in range(table_header_cells): + box = bbxs[0][i] + xmin, ymin, xmax, ymax = box + current_box_height = abs(ymax-ymin) + if current_box_height 0 and current_box_height>one_line_height+5: + + cell_img = cropImageExtraMargin([fourbytwo],images[0])[0] + table_header_cells -= 1 + + #List of 4 x 2 + detection_results = self.wordDetector.predict(cell_img,sort_vertical=True) + + input_to_recog = [] + if detection_results == []: + input_to_recog.append(cell_img) + else: + #print("Debugging the issue") + for wordbox in detection_results: + #print(wordbox.box) + #print(cell_img.shape) + cropped_image= crop_an_Image(wordbox.box,cell_img) + #print(cropped_image.shape) + if cropped_image.shape[0] >0 and cropped_image.shape[1]>0: + input_to_recog.append(cropped_image) + else: + print("Empty image") + + else:# For normal cells don't do word detection! + cell_img = crop_an_Image(fourbytwo,images[0]) + if table_header_cells>0: + table_header_cells -= 1 + if cell_img.shape[0] >0 and cell_img.shape[1]>0: + input_to_recog =[cell_img] + + + cell_imgs_to_viz.append(cell_img) + cell_img_num = cell_img_num+1 + + + if input_to_recog != []: + words = self.textRecognizer.predict_for_tables(input_to_recog) + cell_output = " ".join(words) + pred_cell.append(cell_output) + else: + #Don't lose empty cell + pred_cell.append("") + + + self.save_detection(cell_imgs_to_viz,prefix = './res/test1/cell_imgs_') + + + print(pred_cell) + #Step3 : + pred_html = pred_htmls[0] + pred_code = self.build_table_from_html_and_cell(pred_html, pred_cell) + print(pred_code) + pred_code = "".join(pred_code) + pred_code = html_table_template(pred_code) + + # Display the HTML table + soup = bs(pred_code) + #formatted and indented) string representation of the HTML document + table_code = soup.prettify() + print(table_code) + return table_code + + + + + + + + diff --git a/ocrTable2.py b/ocrTable2.py new file mode 100644 index 0000000000000000000000000000000000000000..9d8813439c44fb401dac5c03644244a781aa38cd --- /dev/null +++ b/ocrTable2.py @@ -0,0 +1,50 @@ +from typing import Tuple, List, Sequence, Optional, Union +from torchvision import transforms +from torch import nn, Tensor +from PIL import Image +from pathlib import Path +from bs4 import BeautifulSoup as bs +from unitable import UnitableFullPredictor +from unitable import UnitableFullSinglePredictor +from doctrfiles import DoctrWordDetector,DoctrTextRecognizer +import numpy as np +from utils import crop_an_Image,cropImageExtraMargin +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] + + +class OcrTable2(): + #Takes as input the table image - no table detection + def __init__(self): + + self.unitablePredictor = UnitableFullPredictor() + #self.unitablePredictor = UnitableFullSinglePredictor() + + + @staticmethod + def save_detection(detected_lines_images:List[ImageType], prefix = './res/test1/res_'): + i = 0 + for img in detected_lines_images: + pilimg = Image.fromarray(img) + pilimg.save(prefix+str(i)+'.png') + i=i+1 + + def predict(self,images,debug_repo="./res/test1"): + + + # Step 1: Get table structure and bbox for cell contents from unitable + + table_code = self.unitablePredictor.predict(images,debug_repo) + + + + + + + + + + + + diff --git a/ocr_component1.py b/ocr_component1.py new file mode 100644 index 0000000000000000000000000000000000000000..d5bd00df06e2f262ec9541699d858904fd60b4f5 --- /dev/null +++ b/ocr_component1.py @@ -0,0 +1,219 @@ +from typing import Any, List, Literal, Mapping, Optional, Tuple +import time + +from PIL import Image +# Numpy image type +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] + +import numpy as np +import uuid + +from doctrfiles import DoctrWordDetector,DoctrTextRecognizer,Wordboxes +from deepdoc import RagFlow +from utils import LineAnnotation,WordAnnotation,getlogger,cropImageExtraMargin,crop_an_Image,cropImages,get_new_coord +from numpy.typing import NDArray + +MARGIN_FACTOR = 1.4 +class OCRComponent1(): + """ + This component uses RagFlow as text line detector + Uses DocTR's word detector and text recognizer + """ + def __init__(self,englishflag =False): + logger = getlogger("1") + start_time = time.time() + self.textlineDetector = RagFlow() + end_time = time.time() + execution_time = end_time - start_time + logger.info(f"time to initialize Ragflow: {execution_time} seconds") + + + start_time = time.time() + """ + self.wordDetector = DoctrWordDetector(architecture="db_resnet50", + path_weights="doctrfiles/models/db_resnet50-79bd7d70.pt") + + """ + + self.wordDetector = DoctrWordDetector(architecture="db_resnet50", + path_weights="doctrfiles/models/db_resnet50-79bd7d70.pt", + path_config_json ="doctrfiles/models/db_resnet50_config.json") + + + end_time = time.time() + + execution_time = end_time - start_time + logger.info(f"time to initialize DoctrWordDetectorDebug: {execution_time} seconds") + start_time = time.time() + if not englishflag: + self.textRecognizer = DoctrTextRecognizer(architecture="parseq", path_weights="doctrfiles/models/doctr-multilingual-parseq.bin", + path_config_json="doctrfiles/models/multilingual-parseq-config.json") + else: + self.textRecognizer = DoctrTextRecognizer(architecture="master", path_weights="doctrfiles/models/master-fde31e4a.pt", + path_config_json="doctrfiles/models/master.json") + end_time = time.time() + execution_time = end_time - start_time + logger.info(f"time to initialize DoctrTextRecognizer: {execution_time} seconds") + + + @staticmethod + def save_detection(detected_lines_images:List[ImageType], prefix = './res/test1/res_'): + i = 0 + for img in detected_lines_images: + pilimg = Image.fromarray(img) + pilimg.save(prefix+str(i)+'.png') + i=i+1 + + @staticmethod + def convert_coordinates(original_coord = NDArray[np.float32],detection_res = NDArray[np.float32])-> NDArray[np.float32]: + """ + Type if original_coord : np.array([ + [xmin, ymin], + [xmax, ymin], + [xmax, ymax], + [xmin, ymax] + ] + """ + height = original_coord[3][1] - original_coord[0][1] + width = original_coord[1][0] - original_coord[0][0] + if width/height<1.6: + bigger = max(height,width) + new_height = int(bigger *3) + new_width = int(bigger*3) + else: + bigger = max(height,width) + new_height = int(bigger *MARGIN_FACTOR) + new_width = int(bigger*MARGIN_FACTOR) + + y_offset = (new_height - height) // 2 + x_offset = (new_width - width) // 2 + #new_img[y_offset:y_offset + height, x_offset:x_offset+width] = dst_img + #x,y offsets are the min x and y + + # Calculate relative coordinate to the original image in the padded image + + rel = np.array( + [ + [detection_res[0][0] - x_offset, detection_res[0][1]-y_offset], + [detection_res[1][0] - x_offset, detection_res[1][1]-y_offset], + [detection_res[2][0] - x_offset, detection_res[2][1]-y_offset], + [detection_res[3][0] - x_offset, detection_res[3][1]-y_offset], + ] + ) + xmin = original_coord[0][0] + ymin = original_coord[0][1] + xmax = original_coord[1][0] + ymax = original_coord[2][1] + #This used to return 4 x 2 array + #rel_in_page =[[xmin+b[0],ymin+b[1]] for b in rel] + #Now returns 4x1 array + rel_in_page = np.array([xmin+rel[0][0],ymin+rel[0][1], xmin +rel[1][0], ymin +rel[2][1]]) + return rel_in_page + + + + def predict(self, img:ImageType)->Tuple[List[LineAnnotation],List[WordAnnotation]]: + + logger = getlogger("1") + start_time = time.time() + + """ + bxs : Text line detection results - bounding boxes + Each element looks like : [array([[ 90., 98.], + [313., 100.], + [312., 129.], + [ 90., 127.]], dtype=float32) + [left_lower, right_lower, right_upper, left_upper] + """ + # 4x2 array + bxs:List[NDArray[np.float32]] = self.textlineDetector.predict(img = np.array(img)) + + end_time = time.time() + execution_time = end_time - start_time + logger.info(f"time to detecttextline: {execution_time} seconds") + + line_annotations = {} + straightboxs = [] + for points in bxs: + xmin, ymin, xmax, ymax = get_new_coord(img.shape[1],img.shape[0],points) + b = np.array([ + [xmin, ymin], + [xmax, ymin], + [xmax, ymax], + [xmin, ymax] + ], dtype=np.float32) + straightboxs.append(b) + ann = LineAnnotation(box =[xmin, ymin, xmax, ymax]) + line_annotations[ann.index] = ann + + """ + detected_lines_images : cropped images of detected lines + """ + # Double computation in line 117 - we calculate the straight lines again + #Straightboxes : 4x 2 array + detected_lines_images:List[ImageType] = cropImageExtraMargin(straightboxs, img,margin =MARGIN_FACTOR,straight=True) + #self.save_detection(detected_lines_images,prefix = './res/12June_two_Line_') + start_time = time.time() + word_annotations =[] + + #viz_word_detection =[] + for uuid, lineimg in zip(line_annotations.keys(),detected_lines_images): + + original_coord = line_annotations[uuid].box + xmin, ymin, xmax, ymax = original_coord + original_coord_b = np.array([ + [xmin, ymin], + [xmax, ymin], + [xmax, ymax], + [xmin, ymax] + ], dtype=np.float32) + + #List of 4 x 2 + detection_results :List[Wordboxes]= self.wordDetector.predict(lineimg) + + input_Word_recog ={} + + for wordbox in detection_results: + #So i think cropped_image's expected form is different that what is being returned + #takes in 4x2 array : box + cropped_image= crop_an_Image(wordbox.box,lineimg) + """ + We need to convert coordintes in wordbox.box to the original image + wordbox.box = np.array(wordbox.box) + """ + #original_coord_b :4x2 array + #coord_in_page :4 x 1 array + coord_in_page = self.convert_coordinates(original_coord_b,wordbox.box) + #logger.info("returned coordinate in page ") + #logger.info(coord_in_page) + + + wordAnn = WordAnnotation(box = coord_in_page, text = None) + word_uuid = wordAnn.index + input_Word_recog[word_uuid]= [cropped_image,wordAnn] + #print("uuid is ") + #print(uuid) + #print(len(line_annotations[uuid].words)) + line_annotations[uuid].words.append(wordAnn) + + #viz_word_detection.append(cropped_image) + + + #input_Word_recog contains only word detection + #It is dictionary of annotation id as key, than as values - list of cropped_image and Annotation Instance with key as uuid + + word_annotations_in_line = self.textRecognizer.predict(input_Word_recog) + word_annotations.append(word_annotations_in_line) + + #self.save_detection(viz_word_detection,prefix = './res/test4/rel_page_') + end_time = time.time() + execution_time = end_time - start_time + logger.info(f"Entire DocTR pipeline: {execution_time} seconds") + return line_annotations + + + + + diff --git a/ocr_component2.py b/ocr_component2.py new file mode 100644 index 0000000000000000000000000000000000000000..0f4577af3f09660ec27d706bea84bd07c66cbd96 --- /dev/null +++ b/ocr_component2.py @@ -0,0 +1,24 @@ + +import pdfplumber + +if __name__ == '__main__': + #input can be path to your PDF file or file object, loaded as bytes + with pdfplumber.open('/myhome/alps/TestingFiles/OCRTest1German.pdf') as pdf: + for page in pdf.pages: + im = page.to_image() + #extract_words() - Returns a list of all word-looking things and their bounding boxes + #Example: + #[{'text': 'Inhaltsverzeichnis', 'x0': 33.99, 'x1': 111.77713499999999, 'top': 36.59723999999994, 'doctop': 36.59723999999994, 'bottom': 46.58723999999995, 'upright': True, 'height': 9.990000000000009, 'width': 77.78713499999998, 'direction': 'ltr'}, {'text': 'Übersicht', 'x0': 33.99, 'x1': 71.4912, 't + + extracted_words = page.extract_words() + print(extracted_words) + for word in extracted_words: + print(word['text']) + word['x0'] + + + """ + Using the Page.extract_text(...) method, we grab every character on the page, line by line, using keep_blank_chars=True to retain all those whitespace characters as literal characters: + + text = p0.extract_text(keep_blank_chars=True) + """ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..20bcabbc0057f16b3e62ddd6fc1506e77e9ea461 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,47 @@ +onnxruntime-gpu==1.17.1 +#from deepdoctection +pdfplumber==0.11.0 +numpy>=1.21 +Pillow== 10.3.0 +huggingface_hub==0.22.2 +six==1.16.0 +opencv-python==4.9.0.80 +shapely==2.0.3 +pyclipper==1.3.0.post5 +python-doctr==0.7.0 +torch==1.13.1+cu117 +torchvision==0.14.1+cu117 +transformers==4.39.3 +datasets +pymupdf +python-Levenshtein +nltk +torch==1.13.1+cu117 +torchvision==0.14.1+cu117 +torchaudio==0.13.1 + +# Add this line as a comment to remind the user of the extra index URL +# Install with: pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cu117 + +#unitable +torchtext==0.14.1 +jsonlines +beautifulsoup4 +matplotlib +hydra-core +hydra_colorlog +apted +Distance +lxml==4.9.3 +torchmetrics +wandb +einops +ptflops +tokenizers +pycocotools +faster-coco-eval +pdf2image +ultralyticsplus==0.0.28 +ultralytics==8.0.43 +gradio +gradio-pdf diff --git a/res0.png b/res0.png new file mode 100644 index 0000000000000000000000000000000000000000..264a223f0a47c0400aa584d7b11632c4abed2ccb --- /dev/null +++ b/res0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47ea95af507e071c8ecf0d1b63744cf493e03082f39f41167e80c9d3fcd7470a +size 1578582 diff --git a/table_drawn_bbox_with_extra.png b/table_drawn_bbox_with_extra.png new file mode 100644 index 0000000000000000000000000000000000000000..20554f9cd53797a36fcf3f34056f8a4a6152f552 --- /dev/null +++ b/table_drawn_bbox_with_extra.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:add5dacbb1a28a4094d260617a328ed460f1569a464a20f20cb58193a8b8c8aa +size 1290568 diff --git a/table_resize_with_padding.png b/table_resize_with_padding.png new file mode 100644 index 0000000000000000000000000000000000000000..d8333398e93761cddc23313a56c4087b067e8fc4 Binary files /dev/null and b/table_resize_with_padding.png differ diff --git a/unitable/CONFIG.mk b/unitable/CONFIG.mk new file mode 100644 index 0000000000000000000000000000000000000000..e33fa44f8a89aa74a8b2c8108f8dad1132ce1695 --- /dev/null +++ b/unitable/CONFIG.mk @@ -0,0 +1,337 @@ +################################################## +# Configurations # +################################################## + +# +# Datasets +# + +# label type +LABEL_IMAGE = ++trainer.label_type="image" +LABEL_HTML = ++trainer.label_type="html" "++trainer.train.loss_weights.html=1" +LABEL_CELL = ++trainer.label_type="cell" "++trainer.train.loss_weights.cell=1" +LABEL_BBOX = ++trainer.label_type="bbox" "++trainer.train.loss_weights.bbox=1" +MEAN = [0.86597056,0.88463002,0.87491087] +STD = [0.20686628,0.18201602,0.18485524] + +# augmentation +AUG_VQVAE = dataset/augmentation=vqvae +AUG_BEIT = dataset/augmentation=beit \ + ++dataset.augmentation.mean=$(MEAN) ++dataset.augmentation.std=$(STD) +AUG_RESIZE_NORM = dataset/augmentation=resize_normalize \ + ++dataset.augmentation.transforms.2.mean=$(MEAN) ++dataset.augmentation.transforms.2.std=$(STD) + +# single dataset +DATA_SINGLE = dataset=single_dataset +PUBTABNET = $(DATA_SINGLE) \ + +dataset/pubtabnet@dataset.train_dataset=train_dataset \ + +dataset/pubtabnet@dataset.valid_dataset=valid_dataset \ + +dataset/pubtabnet@dataset.test_dataset=test_dataset +MINIPUBTABNET = $(DATA_SINGLE) \ + +dataset/mini_pubtabnet@dataset.train_dataset=train_dataset \ + +dataset/mini_pubtabnet@dataset.valid_dataset=valid_dataset \ + +dataset/mini_pubtabnet@dataset.test_dataset=test_dataset + +# multiple datasets +DATA_MULTI = dataset=concat_dataset +PUBTABNET_M = +dataset/pubtabnet@dataset.train.d1=train_dataset \ + +dataset/pubtabnet@dataset.valid.d1=valid_dataset \ + +dataset/pubtabnet@dataset.test.d1=test_dataset +SYN_MARKET_M = +dataset/synthtabnet_marketing@dataset.train.d2=train_dataset \ + +dataset/synthtabnet_marketing@dataset.valid.d2=valid_dataset \ + +dataset/synthtabnet_marketing@dataset.test.d2=test_dataset +SYN_FIN_M = +dataset/synthtabnet_fintabnet@dataset.train.d3=train_dataset \ + +dataset/synthtabnet_fintabnet@dataset.valid.d3=valid_dataset \ + +dataset/synthtabnet_fintabnet@dataset.test.d3=test_dataset +SYN_SPARSE_M = +dataset/synthtabnet_sparse@dataset.train.d4=train_dataset \ + +dataset/synthtabnet_sparse@dataset.valid.d4=valid_dataset \ + +dataset/synthtabnet_sparse@dataset.test.d4=test_dataset +SYN_PUB_M = +dataset/synthtabnet_pubtabnet@dataset.train.d5=train_dataset \ + +dataset/synthtabnet_pubtabnet@dataset.valid.d5=valid_dataset \ + +dataset/synthtabnet_pubtabnet@dataset.test.d5=test_dataset +PUBTABLES_M = +dataset/pubtables1m@dataset.train.d7=train_dataset \ + +dataset/pubtables1m@dataset.valid.d7=valid_dataset \ + +dataset/pubtables1m@dataset.test.d7=test_dataset +TABLEBANK_M = +dataset/tablebank@dataset.train.d8=train_dataset \ + +dataset/tablebank@dataset.valid.d8=valid_dataset \ + +dataset/tablebank@dataset.test.d8=test_dataset +FINTABNET_M = +dataset/fintabnet@dataset.train.d9=train_dataset \ + +dataset/fintabnet@dataset.valid.d9=valid_dataset \ + +dataset/fintabnet@dataset.test.d9=test_dataset + +DATA_VQVAE_1M = $(DATA_MULTI) \ + $(PUBTABNET_M) $(SYN_MARKET_M) $(SYN_FIN_M) $(SYN_SPARSE_M) +DATA_VQVAE_2M = $(DATA_MULTI) \ + $(PUBTABNET_M) $(SYN_MARKET_M) $(SYN_FIN_M) $(SYN_SPARSE_M) $(SYN_PUB_M) \ + $(PUBTABLES_M) $(TABLEBANK_M) + +PUBTABLES1M = $(DATA_MULTI) $(PUBTABLES_M) +FINTABNET = $(DATA_MULTI) $(FINTABNET_M) + +PUB_SYN = $(DATA_MULTI) \ + $(PUBTABNET_M) $(SYN_MARKET_M) $(SYN_FIN_M) $(SYN_SPARSE_M) $(SYN_PUB_M) + +PUB_SYN_FIN = $(DATA_MULTI) $(PUBTABNET_M) $(FINTABNET_M) \ + $(SYN_MARKET_M) $(SYN_FIN_M) $(SYN_SPARSE_M) $(SYN_PUB_M) + +PUB_SYN_PUB1M = $(DATA_MULTI) $(PUBTABNET_M) $(PUBTABLES_M) \ + $(SYN_MARKET_M) $(SYN_FIN_M) $(SYN_SPARSE_M) $(SYN_PUB_M) + +SYN = $(DATA_MULTI) $(SYN_MARKET_M) $(SYN_FIN_M) $(SYN_SPARSE_M) $(SYN_PUB_M) + +SYN_fin = $(DATA_MULTI) $(SYN_FIN_M) +SYN_market = $(DATA_MULTI) $(SYN_MARKET_M) +SYN_pub = $(DATA_MULTI) $(SYN_PUB_M) +SYN_sparse = $(DATA_MULTI) $(SYN_SPARSE_M) + +# +# Vocab +# +VOCAB_NONE = vocab=empty +VOCAB_HTML = vocab=html +VOCAB_BBOX = vocab=bbox +VOCAB_CELL = vocab=cell + + +# +# Trainer +# + +# trainer type +TRAINER_VQVAE = trainer=vqvae +TRAINER_BEIT = trainer=beit +TRAINER_TABLE = trainer=table + +# input image size +I224 = ++trainer.img_size=[224,224] +I448 = ++trainer.img_size=[448,448] +I112_448 = ++trainer.img_size=[112,448] + +# max sequence length +SEQ200 = trainer.max_seq_len=200 +SEQ512 = trainer.max_seq_len=512 +SEQ1024 = trainer.max_seq_len=1024 + +# batch size + epoch +BATCH24 = ++trainer.train.dataloader.batch_size=24 ++trainer.valid.dataloader.batch_size=24 +BATCH48 = ++trainer.train.dataloader.batch_size=48 ++trainer.valid.dataloader.batch_size=48 +BATCH72 = ++trainer.train.dataloader.batch_size=72 ++trainer.valid.dataloader.batch_size=72 +BATCH80 = ++trainer.train.dataloader.batch_size=80 ++trainer.valid.dataloader.batch_size=80 +BATCH96 = ++trainer.train.dataloader.batch_size=96 ++trainer.valid.dataloader.batch_size=96 +BATCH256 = ++trainer.train.dataloader.batch_size=256 ++trainer.valid.dataloader.batch_size=256 +BATCH384 = ++trainer.train.dataloader.batch_size=384 ++trainer.valid.dataloader.batch_size=384 + +EPOCH24 = ++trainer.train.epochs=24 +EPOCH30 = ++trainer.train.epochs=30 +EPOCH48 = ++trainer.train.epochs=48 + +# optimizer +OPT_ADAMW = trainer/train/optimizer=adamw +OPT_WD5e2 = ++trainer.train.optimizer.weight_decay=5e-2 + +# lr + scheduler +LR_5e4 = ++trainer.train.optimizer.lr=5e-4 +LR_3e4 = ++trainer.train.optimizer.lr=3e-4 +LR_1e4 = ++trainer.train.optimizer.lr=1e-4 +LR_8e5 = ++trainer.train.optimizer.lr=8e-5 + +LR_cosine = trainer/train/lr_scheduler=cosine ++trainer.train.lr_scheduler.lr_lambda.min_ratio=5e-3 +LR_cosine93k_warm6k = $(LR_cosine) ++trainer.train.lr_scheduler.lr_lambda.total_step=93400 ++trainer.train.lr_scheduler.lr_lambda.warmup=5800 +LR_cosine77k_warm8k = $(LR_cosine) ++trainer.train.lr_scheduler.lr_lambda.total_step=76600 ++trainer.train.lr_scheduler.lr_lambda.warmup=7660 +LR_cosine30k_warm4k = $(LR_cosine) ++trainer.train.lr_scheduler.lr_lambda.total_step=30500 ++trainer.train.lr_scheduler.lr_lambda.warmup=4000 +LR_cosine8k_warm1k = $(LR_cosine) ++trainer.train.lr_scheduler.lr_lambda.total_step=7600 ++trainer.train.lr_scheduler.lr_lambda.warmup=800 +LR_cosine44k_warm6k = $(LR_cosine) ++trainer.train.lr_scheduler.lr_lambda.total_step=44100 ++trainer.train.lr_scheduler.lr_lambda.warmup=5500 +LR_cosine118k_warm15k = $(LR_cosine) ++trainer.train.lr_scheduler.lr_lambda.total_step=117800 ++trainer.train.lr_scheduler.lr_lambda.warmup=14700 +LR_cosine216k_warm27k = $(LR_cosine) ++trainer.train.lr_scheduler.lr_lambda.total_step=216000 ++trainer.train.lr_scheduler.lr_lambda.warmup=27000 +LR_cosine32k = $(LR_cosine) ++trainer.train.lr_scheduler.lr_lambda.total_step=32000 ++trainer.train.lr_scheduler.lr_lambda.warmup=0 +LR_cosine118k = $(LR_cosine) ++trainer.train.lr_scheduler.lr_lambda.total_step=118000 ++trainer.train.lr_scheduler.lr_lambda.warmup=0 + +GRAD_CLIP12 = ++trainer.train.grad_clip=12 + +# vqvae +VQVAE_TEMP_1M = ++trainer.train.starting_temp=1. \ + ++trainer.train.temp_min=5e-3 ++trainer.train.temp_anneal_rate=1e-3 +VQVAE_TEMP_2M = ++trainer.train.starting_temp=1. \ + ++trainer.train.temp_min=1e-3 ++trainer.train.temp_anneal_rate=2e-4 + +# pretraining specific +TRANS448_VQVAE224_GRID28_MASK300 = ++trainer.trans_size=[448,448] ++trainer.vqvae_size=[224,224] ++trainer.grid_size=28 ++trainer.num_mask_patches=300 +VQVAE1M_WEIGHTS = $(MODEL_VQVAE) ++trainer.vqvae_weights="../unitable_weights/vqvae_1m.pt" +VQVAE2M_WEIGHTS = $(MODEL_VQVAE_L) ++trainer.vqvae_weights="../unitable_weights/vqvae_2m.pt" + +# finetuning specific +WEIGHTS_mtim_1m_base = ++trainer.trainer.beit_pretrained_weights="../unitable_weights/ssp_1m_base.pt" +WEIGHTS_mtim_1m_large = ++trainer.trainer.beit_pretrained_weights="../unitable_weights/ssp_1m_large.pt" +WEIGHTS_mtim_2m_base = ++trainer.trainer.beit_pretrained_weights="../unitable_weights/ssp_2m_base.pt" +WEIGHTS_mtim_2m_large = ++trainer.trainer.beit_pretrained_weights="../unitable_weights/ssp_2m_large.pt" +LOCK_MTIM_4 = ++trainer.trainer.freeze_beit_epoch=4 + +# +# Models +# + +# model type +MODEL_VQVAE = model=vqvae +MODEL_VQVAE_L = $(MODEL_VQVAE) ++model.codebook_tokens=16384 ++model.hidden_dim=512 +MODEL_BEIT = model=beit +MODEL_ENCODER_DECODER = model=encoderdecoder + +# backbone for input preprocessing: resnet, linear projection, and convstem +IMGCNN = model/model/backbone=imgcnn +IMGLINEAR = model/model/backbone=imglinear +IMGCONVSTEM = model/model/backbone=imgconvstem + +# number of layers +E4 = ++model.model.encoder.nlayer=4 +E12 = ++model.model.encoder.nlayer=12 +E24 = ++model.model.encoder.nlayer=24 +D4 = ++model.model.decoder.nlayer=4 + +# transformer layer: attention heads, hidden size, activation, norm +FF4 = ++model.ff_ratio=4 + +NHEAD8 = ++model.nhead=8 +NHEAD12 = ++model.nhead=12 + +NORM_FIRST = ++model.norm_first=true +NORM_LAST = ++model.norm_first=false + +ACT_RELU = ++model.activation="relu" +ACT_GELU = ++model.activation="gelu" + +D_MODEL512 = ++model.d_model=512 +D_MODEL768 = ++model.d_model=768 + +# regularization +REG_d00 = ++model.dropout=0.0 +REG_d02 = ++model.dropout=0.2 + +# linear projection patch size +P16 = ++model.backbone_downsampling_factor=16 +P28 = ++model.backbone_downsampling_factor=28 +P32 = ++model.backbone_downsampling_factor=32 + +# cnn backbone +R18 = ++model.model.backbone.backbone._target_=torchvision.models.resnet18 \ + ++model.model.backbone.output_channels=512 + +MTIM_BASE = $(MODEL_BEIT) $(IMGLINEAR) $(NHEAD8) $(FF4) $(ACT_GELU) \ + $(NORM_FIRST) $(D_MODEL512) $(REG_d02) $(P16) $(E4) +MTIM_LARGE = $(MODEL_BEIT) $(IMGLINEAR) $(NHEAD12) $(FF4) $(ACT_GELU) \ + $(NORM_FIRST) $(D_MODEL768) $(REG_d02) $(P16) $(E12) + +ARCH_BASE = $(MTIM_BASE) $(MODEL_ENCODER_DECODER) $(D4) +ARCH_LARGE = $(MTIM_LARGE) $(MODEL_ENCODER_DECODER) $(D4) + + +############################################### +# Experiments # +############################################### + +TRAIN_vqvae := $(VOCAB_NONE) \ + $(LABEL_IMAGE) $(AUG_VQVAE) $(I224) \ + $(TRAINER_VQVAE) $(OPT_ADAMW) $(LR_1e4) $(EPOCH24) + +TRAIN_mtim := $(VOCAB_NONE) \ + $(LABEL_IMAGE) $(AUG_BEIT) \ + $(TRAINER_BEIT) $(OPT_ADAMW) $(OPT_WD5e2) $(LR_5e4) \ + $(TRANS448_VQVAE224_GRID28_MASK300) + +# +# mini_pubtabnet pretraining example (dataset code: mini) +# + +# vq-vae +# > make experiments/vqvae_mini/.done_pretrain +EXP_vqvae_mini := $(TRAIN_vqvae) $(MINIPUBTABNET) $(VQVAE_TEMP_2M) $(BATCH80) $(MODEL_VQVAE) $(LR_cosine32k) + +# visual encoder pretraining - masked tabular image modeling (MTIM) +# > make experiments/mtim_mini_base/.done_pretrain +EXP_mtim_mini_base := $(TRAIN_mtim) $(MINIPUBTABNET) $(VQVAE2M_WEIGHTS) $(MTIM_BASE) \ + $(BATCH384) $(LR_cosine8k_warm1k) $(EPOCH24) + +# +# mini_pubtabnet finetuning example +# + +# table structure (task code: html) +# > make experiments/ssp_2m_mini_html_base/.done_finetune +TRAIN_mini_html := $(VOCAB_HTML) \ + $(MINIPUBTABNET) $(LABEL_HTML) $(AUG_RESIZE_NORM) \ + $(TRAINER_TABLE) $(I448) $(SEQ512) \ + $(EPOCH48) $(OPT_ADAMW) $(OPT_WD5e2) $(LR_8e5) + +EXP_ssp_2m_mini_html_base := $(TRAIN_mini_html) $(ARCH_BASE) \ + $(WEIGHTS_mtim_2m_base) $(LOCK_MTIM_4) $(BATCH72) $(LR_cosine93k_warm6k) + +# table cell bbox (task code: bbox) +# > make experiments/ssp_2m_mini_bbox_base/.done_finetune +TRAIN_mini_bbox := $(VOCAB_BBOX) \ + $(MINIPUBTABNET) $(LABEL_BBOX) $(AUG_RESIZE_NORM) \ + $(TRAINER_TABLE) $(I448) $(SEQ1024) \ + $(EPOCH30) $(OPT_ADAMW) $(OPT_WD5e2) $(LR_3e4) $(GRAD_CLIP12) + +EXP_ssp_2m_mini_bbox_base := $(TRAIN_mini_bbox) $(ARCH_BASE) \ + $(WEIGHTS_mtim_2m_base) $(LOCK_MTIM_4) $(BATCH48) $(LR_cosine77k_warm8k) + +# table cell content (task code: cell) +# > make experiments/ssp_2m_mini_cell_base/.done_finetune +TRAIN_mini_cell := $(VOCAB_CELL) \ + $(MINIPUBTABNET) $(LABEL_CELL) $(AUG_RESIZE_NORM) \ + $(TRAINER_TABLE) $(I112_448) $(SEQ200) \ + $(EPOCH24) $(OPT_ADAMW) $(OPT_WD5e2) $(LR_8e5) $(GRAD_CLIP12) + +EXP_ssp_2m_mini_cell_base := $(TRAIN_mini_cell) $(ARCH_BASE) \ + $(WEIGHTS_mtim_2m_base) $(LOCK_MTIM_4) $(BATCH24) $(LR_cosine216k_warm27k) + +# +# cross-dataset pretraining +# + +# vq-vae +EXP_vqvae_1M := $(TRAIN_vqvae) $(DATA_VQVAE_1M) $(VQVAE_TEMP_1M) $(BATCH80) $(MODEL_VQVAE) $(LR_cosine32k) +EXP_vqvae_2M := $(TRAIN_vqvae) $(DATA_VQVAE_2M) $(VQVAE_TEMP_2M) $(BATCH48) $(MODEL_VQVAE_L) $(LR_cosine118k) + +# visual encoder pretraining +EXP_mtim_1M_base := $(TRAIN_mtim) $(PUB_SYN) $(VQVAE1M_WEIGHTS) $(MTIM_BASE) \ + $(BATCH384) $(LR_cosine8k_warm1k) $(EPOCH24) +EXP_mtim_1M_large := $(TRAIN_mtim) $(PUB_SYN) $(VQVAE1M_WEIGHTS) $(MTIM_LARGE) \ + $(BATCH96) $(LR_cosine30k_warm4k) $(EPOCH24) +EXP_mtim_2M_base := $(TRAIN_mtim) $(DATA_VQVAE_2M) $(VQVAE2M_WEIGHTS) $(MTIM_BASE) \ + $(BATCH256) $(LR_cosine44k_warm6k) $(EPOCH48) +EXP_mtim_2M_large := $(TRAIN_mtim) $(DATA_VQVAE_2M) $(VQVAE2M_WEIGHTS) $(MTIM_LARGE) \ + $(BATCH96) $(LR_cosine118k_warm15k) $(EPOCH48) + +# +# cross-dataset finetuning +# + +# table structure +# > make experiments/ssp_2m_syn_pub_html_medium/.done_finetune +TRAIN_syn_pub_html := $(VOCAB_HTML) \ + $(PUB_SYN) $(LABEL_HTML) $(AUG_RESIZE_NORM) \ + $(TRAINER_TABLE) $(I448) $(SEQ512) \ + $(EPOCH48) $(OPT_ADAMW) $(OPT_WD5e2) $(LR_8e5) + +EXP_ssp_2m_syn_pub_html_large := $(TRAIN_syn_pub_html) $(ARCH_LARGE) \ + $(WEIGHTS_mtim_2m_large) $(LOCK_MTIM_4) $(BATCH72) $(LR_cosine93k_warm6k) + +# table cell bbox +# > make experiments/ssp_2m_syn_pub_bbox_medium/.done_finetune +TRAIN_syn_pub_bbox := $(VOCAB_BBOX) \ + $(PUB_SYN) $(LABEL_BBOX) $(AUG_RESIZE_NORM) \ + $(TRAINER_TABLE) $(I448) $(SEQ1024) \ + $(EPOCH30) $(OPT_ADAMW) $(OPT_WD5e2) $(LR_3e4) $(GRAD_CLIP12) + +EXP_ssp_2m_syn_pub_bbox_large := $(TRAIN_syn_pub_bbox) $(ARCH_LARGE) \ + $(WEIGHTS_mtim_2m_large) $(LOCK_MTIM_4) $(BATCH48) $(LR_cosine77k_warm8k) + +# table cell content +# > make experiments/syn_pub_pub1m_cell_medium/.done_finetune +TRAIN_syn_pub_pub1m_cell := $(VOCAB_CELL) \ + $(PUB_SYN_PUB1M) $(LABEL_CELL) $(AUG_RESIZE_NORM) \ + $(TRAINER_TABLE) $(I112_448) $(SEQ200) \ + $(EPOCH24) $(OPT_ADAMW) $(OPT_WD5e2) $(LR_8e5) $(GRAD_CLIP12) + +EXP_ssp_2m_syn_pub_pub1m_cell_large := $(TRAIN_syn_pub_pub1m_cell) $(ARCH_LARGE) \ + $(WEIGHTS_mtim_2m_base) $(LOCK_MTIM_4) $(BATCH24) $(LR_cosine216k_warm27k) \ No newline at end of file diff --git a/unitable/LICENSE b/unitable/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..0d212aaeaf2eef890387f73499c34d3352241edc --- /dev/null +++ b/unitable/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 ShengYun (Anthony) Peng. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/unitable/Makefile b/unitable/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4bbbf490f7aa735a3c8fd3a41ce5103548fc25d4 --- /dev/null +++ b/unitable/Makefile @@ -0,0 +1,85 @@ +SHELL := /bin/bash +VENV_NAME := unitable +CONDA_ACTIVATE := source $$(conda info --base)/etc/profile.d/conda.sh && conda activate $(VENV_NAME) +PYTHON := $(CONDA_ACTIVATE) && python +PIP := $(CONDA_ACTIVATE) && pip3 +# Stacked single-node multi-worker: https://pytorch.org/docs/stable/elastic/run.html#stacked-single-node-multi-worker +TORCHRUN = $(CONDA_ACTIVATE) && torchrun --rdzv-backend=c10d --rdzv_endpoint localhost:0 --nnodes=1 --nproc_per_node=$(NGPU) + +# Taken from https://tech.davis-hansson.com/p/make/ +ifeq ($(origin .RECIPEPREFIX), undefined) + $(error This Make does not support .RECIPEPREFIX. Please use GNU Make 4.0 or later) +endif +.RECIPEPREFIX = > + +# +# Virtual Environment Targets +# +clean: +> rm -f .venv_done + +.done_venv: clean +> conda create -n $(VENV_NAME) python=3.9 -y +> $(PIP) install -r requirements.txt +> $(PIP) install -e . +> touch $@ + +# +# Download pretrained and UniTable model weights +# +WEIGHTS_PATH = experiments/unitable_weights +M_VQVAE_1M = $(WEIGHTS_PATH)/vqvae_1m.pt +M_VQVAE_2M = $(WEIGHTS_PATH)/vqvae_2m.pt +M_SSP_1M_BASE = $(WEIGHTS_PATH)/ssp_1m_base.pt +M_SSP_1M_LARGE = $(WEIGHTS_PATH)/ssp_1m_large.pt +M_SSP_2M_BASE = $(WEIGHTS_PATH)/ssp_2m_base.pt +M_SSP_2M_LARGE = $(WEIGHTS_PATH)/ssp_2m_large.pt +UNITABLE_HTML = $(WEIGHTS_PATH)/unitable_large_structure.pt +UNITABLE_BBOX = $(WEIGHTS_PATH)/unitable_large_bbox.pt +UNITABLE_CELL = $(WEIGHTS_PATH)/unitable_large_content.pt + +.done_download_weights: +ifeq ("$(words $(wildcard $(WEIGHTS_PATH)/*.pt))", "9") +> $(info All 9 model weights have already been downloaded to $(WEIGHTS_PATH).) +else +> $(info There should be 9 weights file under $(WEIGHTS_PATH), but only $(words $(wildcard $(WEIGHTS_PATH)/*.pt)) are found.) +> $(info Begin downloading weights from HuggingFace ...) +> wget -c https://huggingface.co/poloclub/UniTable/resolve/main/vqvae_1m.pt -P $(WEIGHTS_PATH) +> wget -c https://huggingface.co/poloclub/UniTable/resolve/main/vqvae_2m.pt -P $(WEIGHTS_PATH) +> wget -c https://huggingface.co/poloclub/UniTable/resolve/main/ssp_1m_base.pt -P $(WEIGHTS_PATH) +> wget -c https://huggingface.co/poloclub/UniTable/resolve/main/ssp_1m_large.pt -P $(WEIGHTS_PATH) +> wget -c https://huggingface.co/poloclub/UniTable/resolve/main/ssp_2m_base.pt -P $(WEIGHTS_PATH) +> wget -c https://huggingface.co/poloclub/UniTable/resolve/main/ssp_2m_large.pt -P $(WEIGHTS_PATH) +> wget -c https://huggingface.co/poloclub/UniTable/resolve/main/unitable_large_structure.pt -P $(WEIGHTS_PATH) +> wget -c https://huggingface.co/poloclub/UniTable/resolve/main/unitable_large_bbox.pt -P $(WEIGHTS_PATH) +> wget -c https://huggingface.co/poloclub/UniTable/resolve/main/unitable_large_content.pt -P $(WEIGHTS_PATH) +> $(info Completed!) +endif + +# +# Python Targets +# +include CONFIG.mk +SRC := src +BEST_MODEL = "../$(word 1,$(subst -, ,$*))/model/best.pt" +RESULT_JSON := html.json +TEDS_STRUCTURE = -f "../experiments/$*/$(RESULT_JSON)" -s + +###################### +NGPU := 1 # number of gpus used in the experiments + +.SECONDARY: + +# vq-vae and self-supervised pretraining +experiments/%/.done_pretrain: +> @echo "Using experiment configurations from variable EXP_$*" +> cd $(SRC) && $(TORCHRUN) -m main ++name=$* $(EXP_$*) ++trainer.mode="train" +> touch $@ + +# finetuning from SSP weights for table structure, cell bbox and cell content +experiments/%/.done_finetune: +> @echo "Finetuning phase 1 - using experiment configurations from variable EXP_$*" +> cd $(SRC) && $(TORCHRUN) -m main ++name=$* $(EXP_$*) ++trainer.mode="train" +> @echo "Finetuning phase 2 - starting from epoch 4" +> cd $(SRC) && $(TORCHRUN) -m main ++name=$* $(EXP_$*) ++trainer.mode="train" ++trainer.trainer.snapshot="epoch3_snapshot.pt" ++trainer.trainer.beit_pretrained_weights=null +> touch $@ \ No newline at end of file diff --git a/unitable/README.md b/unitable/README.md new file mode 100644 index 0000000000000000000000000000000000000000..a3a2cb6d44e2246133bd17b947f85022657c96d2 --- /dev/null +++ b/unitable/README.md @@ -0,0 +1,14 @@ +# UniTable: Towards a Unified Table Foundation Model + +![alt text](image1.png) + +1. 📈 [High-Performance Transformers for Table Structure Recognition Need Early Convolutions](https://arxiv.org/abs/2311.05565). ShengYun Peng, Seongmin Lee, Xiaojing Wang, Rajarajeswari Balasubramaniyan, Duen Horng Chau. In *NeurIPS Second Table Representation Learning Workshop*, 2023. (Oral) +2. 🚀 [Self-Supervised Pretraining for Table Structure Recognition Transformer](https://arxiv.org/abs/2402.15578). ShengYun Peng, Seongmin Lee, Xiaojing Wang, Rajarajeswari Balasubramaniyan, Duen Horng Chau. In *AAAI Scientific Document Understanding Workshop*, 2024. (Oral) +3. 🆕 [UniTable: Towards a Unified Framework for Table Structure Recognition via Self-Supervised Pretraining](https://arxiv.org/abs/2403.04822). ShengYun Peng, Seongmin Lee, Xiaojing Wang, Rajarajeswari Balasubramaniyan, Duen Horng Chau. ArXiv, 2024. + +## Implementation details + +![alt text](image2.png) + +![alt text](image3.png) + diff --git a/unitable/__init__.py b/unitable/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..93718b10f0df24d732e58f2986f010185a2f4d01 --- /dev/null +++ b/unitable/__init__.py @@ -0,0 +1,5 @@ +from .unitable_predictor import UnitablePredictor +from .unitable_full import UnitableFullPredictor +from .unitable_full_singleimage import UnitableFullSinglePredictor + +__all__ = ['UnitablePredictor','UnitableFullPredictor','UnitableFullSinglePredictor'] \ No newline at end of file diff --git a/unitable/configs/dataset/augmentation/beit.yaml b/unitable/configs/dataset/augmentation/beit.yaml new file mode 100644 index 0000000000000000000000000000000000000000..20ab02ece03eac0871578ea48288457570547470 --- /dev/null +++ b/unitable/configs/dataset/augmentation/beit.yaml @@ -0,0 +1,7 @@ +_target_: src.datamodule.augmentation.AugmentationForMIM +mean: [0.86597056, 0.88463002, 0.87491087] +std: [0.20686628, 0.18201602, 0.18485524] +trans_size: ${trainer.trans_size} +vqvae_size: ${trainer.vqvae_size} +trans_interpolation: bicubic +vqvae_interpolation: lanczos \ No newline at end of file diff --git a/unitable/configs/dataset/augmentation/resize_normalize.yaml b/unitable/configs/dataset/augmentation/resize_normalize.yaml new file mode 100644 index 0000000000000000000000000000000000000000..64511c87c1a4f9c62f45d2e3ffb6caa3e4956396 --- /dev/null +++ b/unitable/configs/dataset/augmentation/resize_normalize.yaml @@ -0,0 +1,9 @@ +_target_: torchvision.transforms.Compose +transforms: + - _target_: torchvision.transforms.Resize + size: ${trainer.img_size} + - _target_: torchvision.transforms.ToTensor + - _target_: torchvision.transforms.Normalize + mean: [0.86597056, 0.88463002, 0.87491087] + std: [0.20686628, 0.18201602, 0.18485524] + diff --git a/unitable/configs/dataset/augmentation/vqvae.yaml b/unitable/configs/dataset/augmentation/vqvae.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f421374ba98362278f23cf559e36993dd995c877 --- /dev/null +++ b/unitable/configs/dataset/augmentation/vqvae.yaml @@ -0,0 +1,5 @@ +_target_: torchvision.transforms.Compose +transforms: + - _target_: torchvision.transforms.Resize + size: ${trainer.img_size} + - _target_: torchvision.transforms.ToTensor \ No newline at end of file diff --git a/unitable/configs/dataset/concat_dataset.yaml b/unitable/configs/dataset/concat_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d015291136221b4740ca85cce7150e34a752796a --- /dev/null +++ b/unitable/configs/dataset/concat_dataset.yaml @@ -0,0 +1,29 @@ +defaults: + - _self_ + - augmentation: beit + # - pubtabnet@train.d1: train_dataset + # - pubtabnet@valid.d1: valid_dataset + # - synthtabnet_marketing@train.d2: train_dataset + # - synthtabnet_marketing@valid.d2: valid_dataset + # - synthtabnet_fintabnet@train.d3: train_dataset + # - synthtabnet_fintabnet@valid.d3: valid_dataset + # - synthtabnet_sparse@train.d4: train_dataset + # - synthtabnet_sparse@valid.d4: valid_dataset + # - synthtabnet_pubtabnet@train.d5: train_dataset + # - synthtabnet_pubtabnet@valid.d5: valid_dataset + + +label_type: ${trainer.label_type} +cell_limit: 10 + +train_dataset: + _target_: torch.utils.data.ConcatDataset + datasets: ${oc.dict.values:..train} + +valid_dataset: + _target_: torch.utils.data.ConcatDataset + datasets: ${oc.dict.values:..valid} + +test_dataset: + _target_: torch.utils.data.ConcatDataset + datasets: ${oc.dict.values:..test} \ No newline at end of file diff --git a/unitable/configs/dataset/fintabnet/test_dataset.yaml b/unitable/configs/dataset/fintabnet/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f660ab55e1415ceec352c78e145bc797678b8d23 --- /dev/null +++ b/unitable/configs/dataset/fintabnet/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - valid_dataset + +jsonl_filename: clean_FinTabNet_1.0.0_cell_test.jsonl \ No newline at end of file diff --git a/unitable/configs/dataset/fintabnet/train_dataset.yaml b/unitable/configs/dataset/fintabnet/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..cff986413d35552ba699759b5a0b139fccfcbb1b --- /dev/null +++ b/unitable/configs/dataset/fintabnet/train_dataset.yaml @@ -0,0 +1,5 @@ +_target_: src.datamodule.FinTabNet +root_dir: ../../../../DATASETS/finTabNet +label_type: ${dataset.label_type} +jsonl_filename: clean_FinTabNet_1.0.0_cell_train.jsonl +transform: ${dataset.augmentation} \ No newline at end of file diff --git a/unitable/configs/dataset/fintabnet/valid_dataset.yaml b/unitable/configs/dataset/fintabnet/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..490c758fa25c6f5485e45c9c29a8bc7d053be839 --- /dev/null +++ b/unitable/configs/dataset/fintabnet/valid_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +jsonl_filename: clean_FinTabNet_1.0.0_cell_val.jsonl \ No newline at end of file diff --git a/unitable/configs/dataset/icdar/test_dataset.yaml b/unitable/configs/dataset/icdar/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5eaa17a3ff1530a8122002f4e7b1735e35e1be2a --- /dev/null +++ b/unitable/configs/dataset/icdar/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - valid_dataset + +split: test \ No newline at end of file diff --git a/unitable/configs/dataset/icdar/train_dataset.yaml b/unitable/configs/dataset/icdar/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fe712216d824c2de44b2c4b0d36662cff7f0def8 --- /dev/null +++ b/unitable/configs/dataset/icdar/train_dataset.yaml @@ -0,0 +1,5 @@ +_target_: src.datamodule.ICDAR +root_dir: ../../../../DATASETS/ICDAR-2013 +label_type: ${dataset.label_type} +split: train +transform: ${dataset.augmentation} \ No newline at end of file diff --git a/unitable/configs/dataset/icdar/valid_dataset.yaml b/unitable/configs/dataset/icdar/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f649896a9e21eb1eb3b1e0d0edfe92b8d65e94af --- /dev/null +++ b/unitable/configs/dataset/icdar/valid_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: val \ No newline at end of file diff --git a/unitable/configs/dataset/mini_pubtabnet/test_dataset.yaml b/unitable/configs/dataset/mini_pubtabnet/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9200cab491d7aef23296a82f59bee6adfb5ccaa8 --- /dev/null +++ b/unitable/configs/dataset/mini_pubtabnet/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - valid_dataset + +cell_limit: 256 \ No newline at end of file diff --git a/unitable/configs/dataset/mini_pubtabnet/train_dataset.yaml b/unitable/configs/dataset/mini_pubtabnet/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..248173846adc12dfec93b2b88e7e5ad7a40d4226 --- /dev/null +++ b/unitable/configs/dataset/mini_pubtabnet/train_dataset.yaml @@ -0,0 +1,8 @@ + +_target_: src.datamodule.pubtabnet.PubTabNet +root_dir: ../../dataset/mini_pubtabnet +label_type: ${dataset.label_type} +split: train +json_html: mini_pubtabnet_examples.jsonl +transform: ${dataset.augmentation} +cell_limit: 150 \ No newline at end of file diff --git a/unitable/configs/dataset/mini_pubtabnet/valid_dataset.yaml b/unitable/configs/dataset/mini_pubtabnet/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..414f84109a18c5455892546255dff6cf5e1c4b70 --- /dev/null +++ b/unitable/configs/dataset/mini_pubtabnet/valid_dataset.yaml @@ -0,0 +1,2 @@ +defaults: + - train_dataset \ No newline at end of file diff --git a/unitable/configs/dataset/pubtables1m/test_dataset.yaml b/unitable/configs/dataset/pubtables1m/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5eaa17a3ff1530a8122002f4e7b1735e35e1be2a --- /dev/null +++ b/unitable/configs/dataset/pubtables1m/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - valid_dataset + +split: test \ No newline at end of file diff --git a/unitable/configs/dataset/pubtables1m/train_dataset.yaml b/unitable/configs/dataset/pubtables1m/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6450375e5c2405d81e8cf247dc5cd31db9d33550 --- /dev/null +++ b/unitable/configs/dataset/pubtables1m/train_dataset.yaml @@ -0,0 +1,6 @@ +_target_: src.datamodule.PubTables +root_dir: ../../../../DATASETS/pubtables1m/PubTables-1M-Structure +label_type: ${dataset.label_type} +split: train +transform: ${dataset.augmentation} +cell_limit: ${dataset.cell_limit} \ No newline at end of file diff --git a/unitable/configs/dataset/pubtables1m/valid_dataset.yaml b/unitable/configs/dataset/pubtables1m/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f649896a9e21eb1eb3b1e0d0edfe92b8d65e94af --- /dev/null +++ b/unitable/configs/dataset/pubtables1m/valid_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: val \ No newline at end of file diff --git a/unitable/configs/dataset/pubtabnet/test_dataset.yaml b/unitable/configs/dataset/pubtabnet/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9200cab491d7aef23296a82f59bee6adfb5ccaa8 --- /dev/null +++ b/unitable/configs/dataset/pubtabnet/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - valid_dataset + +cell_limit: 256 \ No newline at end of file diff --git a/unitable/configs/dataset/pubtabnet/train_dataset.yaml b/unitable/configs/dataset/pubtabnet/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..eaed8a932ab4310dae89dcc8b1be498f521a4314 --- /dev/null +++ b/unitable/configs/dataset/pubtabnet/train_dataset.yaml @@ -0,0 +1,7 @@ +_target_: src.datamodule.PubTabNet +root_dir: ../../../../DATASETS/pubtabnet +label_type: ${dataset.label_type} +split: train +json_html: clean_html_PubTabNet_2.0.0.jsonl +transform: ${dataset.augmentation} +cell_limit: ${dataset.cell_limit} \ No newline at end of file diff --git a/unitable/configs/dataset/pubtabnet/valid_dataset.yaml b/unitable/configs/dataset/pubtabnet/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f649896a9e21eb1eb3b1e0d0edfe92b8d65e94af --- /dev/null +++ b/unitable/configs/dataset/pubtabnet/valid_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: val \ No newline at end of file diff --git a/unitable/configs/dataset/single_dataset.yaml b/unitable/configs/dataset/single_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..cf0edafd9d16c816814cafae40aec27298379616 --- /dev/null +++ b/unitable/configs/dataset/single_dataset.yaml @@ -0,0 +1,9 @@ +defaults: + - _self_ + - augmentation: beit + # - pubtabnet@train_dataset: train_dataset + # - pubtabnet@valid_dataset: valid_dataset + # - pubtabnet@test_dataset: test_dataset + +label_type: ${trainer.label_type} +cell_limit: 10 \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_fintabnet/test_dataset.yaml b/unitable/configs/dataset/synthtabnet_fintabnet/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0d7c26c1ec5e0d2312a9f767f72127b6c52c8751 --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_fintabnet/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: test \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_fintabnet/train_dataset.yaml b/unitable/configs/dataset/synthtabnet_fintabnet/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e20e9e2ae424f01daffd9b7b6f69beb4ed34a56f --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_fintabnet/train_dataset.yaml @@ -0,0 +1,7 @@ +_target_: src.datamodule.Synthtabnet +root_dir: ../../../../DATASETS/synthtabnet/fintabnet +label_type: ${dataset.label_type} +split: train +json_html: clean_html_synthetic_data.jsonl +transform: ${dataset.augmentation} +cell_limit: ${dataset.cell_limit} \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_fintabnet/valid_dataset.yaml b/unitable/configs/dataset/synthtabnet_fintabnet/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f649896a9e21eb1eb3b1e0d0edfe92b8d65e94af --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_fintabnet/valid_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: val \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_marketing/test_dataset.yaml b/unitable/configs/dataset/synthtabnet_marketing/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0d7c26c1ec5e0d2312a9f767f72127b6c52c8751 --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_marketing/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: test \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_marketing/train_dataset.yaml b/unitable/configs/dataset/synthtabnet_marketing/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..96e11ce0790dcdcf50b8704a30d71042abe94b56 --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_marketing/train_dataset.yaml @@ -0,0 +1,7 @@ +_target_: src.datamodule.Synthtabnet +root_dir: ../../../../DATASETS/synthtabnet/marketing +label_type: ${dataset.label_type} +split: train +json_html: clean_html_synthetic_data.jsonl +transform: ${dataset.augmentation} +cell_limit: ${dataset.cell_limit} \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_marketing/valid_dataset.yaml b/unitable/configs/dataset/synthtabnet_marketing/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f649896a9e21eb1eb3b1e0d0edfe92b8d65e94af --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_marketing/valid_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: val \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_pubtabnet/test_dataset.yaml b/unitable/configs/dataset/synthtabnet_pubtabnet/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0d7c26c1ec5e0d2312a9f767f72127b6c52c8751 --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_pubtabnet/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: test \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_pubtabnet/train_dataset.yaml b/unitable/configs/dataset/synthtabnet_pubtabnet/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..816764b42516b2281b220acc9804a3a77c1e7704 --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_pubtabnet/train_dataset.yaml @@ -0,0 +1,7 @@ +_target_: src.datamodule.Synthtabnet +root_dir: ../../../../DATASETS/synthtabnet/pubtabnet +label_type: ${dataset.label_type} +split: train +json_html: clean_html_synthetic_data.jsonl +transform: ${dataset.augmentation} +cell_limit: ${dataset.cell_limit} \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_pubtabnet/valid_dataset.yaml b/unitable/configs/dataset/synthtabnet_pubtabnet/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f649896a9e21eb1eb3b1e0d0edfe92b8d65e94af --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_pubtabnet/valid_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: val \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_sparse/test_dataset.yaml b/unitable/configs/dataset/synthtabnet_sparse/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0d7c26c1ec5e0d2312a9f767f72127b6c52c8751 --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_sparse/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: test \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_sparse/train_dataset.yaml b/unitable/configs/dataset/synthtabnet_sparse/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..95a5223f912db09a39b9dd440064fbebb6de4569 --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_sparse/train_dataset.yaml @@ -0,0 +1,7 @@ +_target_: src.datamodule.Synthtabnet +root_dir: ../../../../DATASETS/synthtabnet/sparse +label_type: ${dataset.label_type} +split: train +json_html: clean_html_synthetic_data.jsonl +transform: ${dataset.augmentation} +cell_limit: ${dataset.cell_limit} \ No newline at end of file diff --git a/unitable/configs/dataset/synthtabnet_sparse/valid_dataset.yaml b/unitable/configs/dataset/synthtabnet_sparse/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f649896a9e21eb1eb3b1e0d0edfe92b8d65e94af --- /dev/null +++ b/unitable/configs/dataset/synthtabnet_sparse/valid_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: val \ No newline at end of file diff --git a/unitable/configs/dataset/tablebank/test_dataset.yaml b/unitable/configs/dataset/tablebank/test_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5eaa17a3ff1530a8122002f4e7b1735e35e1be2a --- /dev/null +++ b/unitable/configs/dataset/tablebank/test_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - valid_dataset + +split: test \ No newline at end of file diff --git a/unitable/configs/dataset/tablebank/train_dataset.yaml b/unitable/configs/dataset/tablebank/train_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dcd7cca9542e26e0774a2512df266cf002422293 --- /dev/null +++ b/unitable/configs/dataset/tablebank/train_dataset.yaml @@ -0,0 +1,5 @@ +_target_: src.datamodule.TableBank +root_dir: ../../../../DATASETS/tablebank/Recognition +label_type: ${dataset.label_type} +split: train +transform: ${dataset.augmentation} diff --git a/unitable/configs/dataset/tablebank/valid_dataset.yaml b/unitable/configs/dataset/tablebank/valid_dataset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f649896a9e21eb1eb3b1e0d0edfe92b8d65e94af --- /dev/null +++ b/unitable/configs/dataset/tablebank/valid_dataset.yaml @@ -0,0 +1,4 @@ +defaults: + - train_dataset + +split: val \ No newline at end of file diff --git a/unitable/configs/main.yaml b/unitable/configs/main.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d2088f6a949188afdeec43d7cc51289e5379f5ae --- /dev/null +++ b/unitable/configs/main.yaml @@ -0,0 +1,23 @@ +defaults: + - _self_ + - dataset: mini_pubtabnet + - model: encoderdecoder + - trainer: table + - vocab: html + - override hydra/job_logging: colorlog + - override hydra/hydra_logging: colorlog + + +hydra: + run: + dir: ../experiments/${name} + sweep: + dir: ../experiments/${name} + job: + name: ${name} + chdir: true + +wandb: + project: UniTable + +seed: 1234 \ No newline at end of file diff --git a/unitable/configs/model/beit.yaml b/unitable/configs/model/beit.yaml new file mode 100644 index 0000000000000000000000000000000000000000..be193c1f6ede8b778abeef28b985a5d9372b2743 --- /dev/null +++ b/unitable/configs/model/beit.yaml @@ -0,0 +1,35 @@ +defaults: + - _self_ + - model/backbone: imglinear + - model/encoder: transformer + +nhead: 12 +ff_ratio: 4 +activation: gelu +norm_first: true +d_model: 768 +dropout: 0.0 +backbone_downsampling_factor: 16 + +codebook_tokens: 8192 +hidden_dim: 256 + +model: + _target_: src.model.beit.BeitEncoder + d_model: ${model.d_model} + codebook_tokens: ${model.codebook_tokens} + dropout: ${model.dropout} + norm_layer: + _partial_: true + _target_: torch.nn.LayerNorm + eps: 1e-6 + +model_vqvae: + _target_: src.model.vqvae.DiscreteVAE + image_size: ${trainer.vqvae_size} + codebook_tokens: ${model.codebook_tokens} + codebook_dim: 512 + num_layers: 3 + hidden_dim: ${model.hidden_dim} + smooth_l1_loss: false + kl_div_loss_weight: 0.0 \ No newline at end of file diff --git a/unitable/configs/model/encoderdecoder.yaml b/unitable/configs/model/encoderdecoder.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fe49d97979a2858df45d87b37510c2e2bb54cf1e --- /dev/null +++ b/unitable/configs/model/encoderdecoder.yaml @@ -0,0 +1,29 @@ +defaults: + - _self_ + - model/backbone: imgcnn + - model/encoder: transformer + - model/decoder: transformer + + +nhead: 4 +ff_ratio: 2 +activation: relu +norm_first: false +d_model: 512 +dropout: 0.5 +backbone_downsampling_factor: 16 + + +model: + _target_: src.model.EncoderDecoder + vocab_size: -1 + d_model: ${model.d_model} + padding_idx: -1 + max_seq_len: ${trainer.max_seq_len} + dropout: ${model.dropout} + norm_layer: + _partial_: true + _target_: torch.nn.LayerNorm + eps: 1e-6 + + diff --git a/unitable/configs/model/model/backbone/imgcnn.yaml b/unitable/configs/model/model/backbone/imgcnn.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b177db3e545a342d6324d3be9048573dac8a09b8 --- /dev/null +++ b/unitable/configs/model/model/backbone/imgcnn.yaml @@ -0,0 +1,9 @@ +_target_: src.model.components.ImgCnnBackbone +backbone: + _target_: torchvision.models.resnet18 +output_channels: 512 +d_model: ${model.d_model} +drop_layer: + - 3 + - 8 + - 9 \ No newline at end of file diff --git a/unitable/configs/model/model/backbone/imgconvstem.yaml b/unitable/configs/model/model/backbone/imgconvstem.yaml new file mode 100644 index 0000000000000000000000000000000000000000..023e1af851817ed9f5ae8ff556693211bfc2a4f6 --- /dev/null +++ b/unitable/configs/model/model/backbone/imgconvstem.yaml @@ -0,0 +1,5 @@ +_target_: src.model.components.ImgConvStemBackbone +d_model: ${model.d_model} +downsample_factor: ${model.backbone_downsampling_factor} +output_channels: 192 +kernel_size: 3 \ No newline at end of file diff --git a/unitable/configs/model/model/backbone/imglinear.yaml b/unitable/configs/model/model/backbone/imglinear.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dabed69e8fcd5843538666b92188fd2b7e739f41 --- /dev/null +++ b/unitable/configs/model/model/backbone/imglinear.yaml @@ -0,0 +1,3 @@ +_target_: src.model.components.ImgLinearBackbone +d_model: ${model.d_model} +patch_size: ${model.backbone_downsampling_factor} \ No newline at end of file diff --git a/unitable/configs/model/model/decoder/transformer.yaml b/unitable/configs/model/model/decoder/transformer.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e16c6d562847cd8650cb00c056ece3f1bf2b163f --- /dev/null +++ b/unitable/configs/model/model/decoder/transformer.yaml @@ -0,0 +1,8 @@ +_target_: src.model.components.Decoder +d_model: ${model.d_model} +nhead: ${model.nhead} +dropout: ${model.dropout} +activation: ${model.activation} +norm_first: ${model.norm_first} +nlayer: 4 +ff_ratio: ${model.ff_ratio} \ No newline at end of file diff --git a/unitable/configs/model/model/encoder/transformer.yaml b/unitable/configs/model/model/encoder/transformer.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9cdcde30dd06b34e2d80fdd8c7f45060779e8087 --- /dev/null +++ b/unitable/configs/model/model/encoder/transformer.yaml @@ -0,0 +1,8 @@ +_target_: src.model.components.Encoder +d_model: ${model.d_model} +nhead: ${model.nhead} +dropout: ${model.dropout} +activation: ${model.activation} +norm_first: ${model.norm_first} +nlayer: 2 +ff_ratio: ${model.ff_ratio} \ No newline at end of file diff --git a/unitable/configs/model/vqvae.yaml b/unitable/configs/model/vqvae.yaml new file mode 100644 index 0000000000000000000000000000000000000000..294740cb59e4cbe24b5a5393d3dea6d75dcee3c9 --- /dev/null +++ b/unitable/configs/model/vqvae.yaml @@ -0,0 +1,15 @@ +defaults: + - _self_ + +codebook_tokens: 8192 +hidden_dim: 256 + +model: + _target_: src.model.vqvae.DiscreteVAE + image_size: ${trainer.img_size} + codebook_tokens: ${model.codebook_tokens} + codebook_dim: 512 + num_layers: 3 + hidden_dim: ${model.hidden_dim} + smooth_l1_loss: false + kl_div_loss_weight: 0.0 \ No newline at end of file diff --git a/unitable/configs/trainer/beit.yaml b/unitable/configs/trainer/beit.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bde1f1751d8127b0bcbe4e2e10e41d6987e4fb6c --- /dev/null +++ b/unitable/configs/trainer/beit.yaml @@ -0,0 +1,40 @@ +defaults: + - _self_ + - train/lr_scheduler: exponential + - train/optimizer: adam + +mode: train +trans_size: 448 +vqvae_size: 224 +grid_size: 28 +num_mask_patches: 300 +min_num_patches: 16 +max_seq_len: null + +vqvae_weights: null + +train: + epochs: 20 + grad_clip: 5 + save_every: 3 + dataloader: + _target_: src.datamodule.dataloader.dataloader_beit + batch_size: 48 + grid_size: ${trainer.grid_size} + num_mask_patches: ${trainer.num_mask_patches} + min_num_patches: ${trainer.min_num_patches} +valid: + dataloader: + _target_: src.datamodule.dataloader.dataloader_beit + batch_size: 48 + grid_size: ${trainer.grid_size} + num_mask_patches: ${trainer.num_mask_patches} + min_num_patches: ${trainer.min_num_patches} +test: + metrics: null + + +trainer: + _target_: src.trainer.BeitTrainer + snapshot: null + model_weights: null \ No newline at end of file diff --git a/unitable/configs/trainer/table.yaml b/unitable/configs/trainer/table.yaml new file mode 100644 index 0000000000000000000000000000000000000000..07b1248b5e9284b1b4b3a9bea92f337e1290a245 --- /dev/null +++ b/unitable/configs/trainer/table.yaml @@ -0,0 +1,56 @@ +defaults: + - _self_ + - train/lr_scheduler: step + - train/optimizer: adam + + +mode: train +img_size: [448,448] +max_seq_len: 512 +label_type: html+cell+bbox + +train: + target: ${trainer.label_type} + img_size: ${trainer.img_size} + loss_weights: + table: 0 + html: 0 + cell: 0 + bbox: 0 + grad_clip: 5 + epochs: 24 + save_every: 1 + max_seq_len: ${trainer.max_seq_len} + dataloader: + _target_: src.datamodule.dataloader_html + batch_size: 48 + label_type: ${trainer.label_type} +valid: + target: ${trainer.label_type} + img_size: ${trainer.img_size} + loss_weights: ${trainer.train.loss_weights} + max_seq_len: ${trainer.max_seq_len} + dataloader: + _target_: src.datamodule.dataloader_html + batch_size: 48 + label_type: ${trainer.label_type} +test: + target: ${trainer.train.target} + img_size: ${trainer.img_size} + loss_weights: ${trainer.train.loss_weights} + metrics: teds + max_seq_len: ${trainer.max_seq_len} + sampling: greedy + save_to_prefix: html_table_result + dataloader: + _target_: src.datamodule.dataloader_html + batch_size: 96 + label_type: ${trainer.label_type} + + +trainer: + _target_: src.trainer.TableTrainer + snapshot: null + model_weights: null + beit_pretrained_weights: null + freeze_beit_epoch: null \ No newline at end of file diff --git a/unitable/configs/trainer/train/lr_scheduler/cosine.yaml b/unitable/configs/trainer/train/lr_scheduler/cosine.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e7314232c59a71c2d0cd295c4f499cf73c6b75d4 --- /dev/null +++ b/unitable/configs/trainer/train/lr_scheduler/cosine.yaml @@ -0,0 +1,7 @@ +_target_: torch.optim.lr_scheduler.LambdaLR +lr_lambda: + _partial_: true + _target_: src.utils.cosine_schedule_with_warmup + warmup: 6 + min_ratio: 5e-3 + total_step: ${trainer.train.epochs} diff --git a/unitable/configs/trainer/train/lr_scheduler/exponential.yaml b/unitable/configs/trainer/train/lr_scheduler/exponential.yaml new file mode 100644 index 0000000000000000000000000000000000000000..632cb7c3b0af5a8bf101b2134daaff2822f7a98b --- /dev/null +++ b/unitable/configs/trainer/train/lr_scheduler/exponential.yaml @@ -0,0 +1,2 @@ +_target_: torch.optim.lr_scheduler.ExponentialLR +gamma: 0.98 \ No newline at end of file diff --git a/unitable/configs/trainer/train/lr_scheduler/step.yaml b/unitable/configs/trainer/train/lr_scheduler/step.yaml new file mode 100644 index 0000000000000000000000000000000000000000..68ca3a58735941e1f2198978fded413acb6c4953 --- /dev/null +++ b/unitable/configs/trainer/train/lr_scheduler/step.yaml @@ -0,0 +1,3 @@ +_target_: torch.optim.lr_scheduler.StepLR +step_size: 12 +gamma: 0.1 \ No newline at end of file diff --git a/unitable/configs/trainer/train/optimizer/adam.yaml b/unitable/configs/trainer/train/optimizer/adam.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fa8a47a08b62ceb8915d67a33ca483aa0b4d71df --- /dev/null +++ b/unitable/configs/trainer/train/optimizer/adam.yaml @@ -0,0 +1,3 @@ +_target_: torch.optim.Adam +lr: 1e-4 +weight_decay: 1e-4 \ No newline at end of file diff --git a/unitable/configs/trainer/train/optimizer/adamw.yaml b/unitable/configs/trainer/train/optimizer/adamw.yaml new file mode 100644 index 0000000000000000000000000000000000000000..660a00e487a5724de07106724517c71b35baa021 --- /dev/null +++ b/unitable/configs/trainer/train/optimizer/adamw.yaml @@ -0,0 +1,4 @@ +_target_: torch.optim.AdamW +lr: 1e-4 +betas: [0.9, 0.999] +weight_decay: 1e-4 \ No newline at end of file diff --git a/unitable/configs/trainer/vqvae.yaml b/unitable/configs/trainer/vqvae.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3954ab3b3d8568cbdf26cd1ac086f0414c3dfe35 --- /dev/null +++ b/unitable/configs/trainer/vqvae.yaml @@ -0,0 +1,33 @@ +defaults: + - _self_ + - train/lr_scheduler: exponential + - train/optimizer: adam + +mode: train +img_size: [256,256] +label_type: image +max_seq_len: null + +train: + epochs: 20 + grad_clip: 0.2 + starting_temp: 1. + temp_min: 0.06 + temp_anneal_rate: 1e-6 + save_every: 3 + dataloader: + _target_: src.datamodule.dataloader.dataloader_vae + batch_size: 48 +valid: + dataloader: + _target_: src.datamodule.dataloader.dataloader_vae + batch_size: 48 +test: + metrics: null + + +trainer: + _target_: src.trainer.VqvaeTrainer + snapshot: null + model_weights: null + diff --git a/unitable/configs/vocab/bbox.yaml b/unitable/configs/vocab/bbox.yaml new file mode 100644 index 0000000000000000000000000000000000000000..40990e38e65a2159844f5bb950845dcad9c46d7d --- /dev/null +++ b/unitable/configs/vocab/bbox.yaml @@ -0,0 +1,3 @@ +need_vocab: true +type: html +dir: ${hydra:runtime.cwd}/../vocab/vocab_bbox.json \ No newline at end of file diff --git a/unitable/configs/vocab/cell.yaml b/unitable/configs/vocab/cell.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5e3be3b77ef5ed58c9544eb7580a0806ec465e55 --- /dev/null +++ b/unitable/configs/vocab/cell.yaml @@ -0,0 +1,3 @@ +need_vocab: true +type: cell +dir: ${hydra:runtime.cwd}/../vocab/vocab_cell_6k.json \ No newline at end of file diff --git a/unitable/configs/vocab/empty.yaml b/unitable/configs/vocab/empty.yaml new file mode 100644 index 0000000000000000000000000000000000000000..751fba4b96057de156f218474e8a66da09d055c2 --- /dev/null +++ b/unitable/configs/vocab/empty.yaml @@ -0,0 +1 @@ +need_vocab: false \ No newline at end of file diff --git a/unitable/configs/vocab/html.yaml b/unitable/configs/vocab/html.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0ed5f5efd2f042f24bd978a10718c5d48121f3a6 --- /dev/null +++ b/unitable/configs/vocab/html.yaml @@ -0,0 +1,3 @@ +need_vocab: true +type: html +dir: ${hydra:runtime.cwd}/../vocab/vocab_html.json \ No newline at end of file diff --git a/unitable/image1.png b/unitable/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..4bdc016ccdbdafc386df9a0ece0cd8079a348461 Binary files /dev/null and b/unitable/image1.png differ diff --git a/unitable/image2.png b/unitable/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..ba1c81a0bd5e761ccf24a5defa8b9151641d5db0 Binary files /dev/null and b/unitable/image2.png differ diff --git a/unitable/image3.png b/unitable/image3.png new file mode 100644 index 0000000000000000000000000000000000000000..ba6e158820016a2e8bad89c02b94705f014f6958 Binary files /dev/null and b/unitable/image3.png differ diff --git a/unitable/notebooks/full_pipeline.ipynb b/unitable/notebooks/full_pipeline.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..ede798b561c7a889cd469e372f5c71256a0e7fae --- /dev/null +++ b/unitable/notebooks/full_pipeline.ipynb @@ -0,0 +1,2045 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "from IPython.display import display, HTML\n", + "\n", + "from typing import Tuple, List, Sequence, Optional, Union\n", + "from pathlib import Path\n", + "import re\n", + "import torch\n", + "import tokenizers as tk\n", + "from PIL import Image\n", + "from matplotlib import pyplot as plt\n", + "from matplotlib import patches\n", + "from torchvision import transforms\n", + "from torch import nn, Tensor\n", + "from functools import partial\n", + "from bs4 import BeautifulSoup as bs\n", + "import warnings\n", + "\n", + "from src.model import EncoderDecoder, ImgLinearBackbone, Encoder, Decoder\n", + "from src.utils import subsequent_mask, pred_token_within_range, greedy_sampling, bbox_str_to_token_list, cell_str_to_token_list, html_str_to_token_list, build_table_from_html_and_cell, html_table_template\n", + "from src.trainer.utils import VALID_HTML_TOKEN, VALID_BBOX_TOKEN, INVALID_CELL_TOKEN\n", + "\n", + "warnings.filterwarnings('ignore')\n", + "device = torch.device(\"cuda:0\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Check all model weights have been downloaded to experiments/unitable_weights\n", + "MODEL_FILE_NAME = [\"unitable_large_structure.pt\", \"unitable_large_bbox.pt\", \"unitable_large_content.pt\"]\n", + "MODEL_DIR = Path(\"../experiments/unitable_weights\")\n", + "\n", + "assert all([(MODEL_DIR / name).is_file() for name in MODEL_FILE_NAME]), f\"Please download model weights from HuggingFace: https://huggingface.co/poloclub/UniTable/tree/main\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Load tabular image\n", + "image_name = \"PMC2838834_005_00.png\"\n", + "image_path = f\"../dataset/mini_pubtabnet/train/{image_name}\"\n", + "image = Image.open(image_path).convert(\"RGB\")\n", + "image_size = image.size\n", + "\n", + "fig, ax = plt.subplots(figsize=(12, 10))\n", + "ax.imshow(image)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# UniTable large model\n", + "d_model = 768\n", + "patch_size = 16\n", + "nhead = 12\n", + "dropout = 0.2\n", + "\n", + "backbone = ImgLinearBackbone(d_model=d_model, patch_size=patch_size)\n", + "encoder = Encoder(\n", + " d_model=d_model,\n", + " nhead=nhead,\n", + " dropout = dropout,\n", + " activation=\"gelu\",\n", + " norm_first=True,\n", + " nlayer=12,\n", + " ff_ratio=4,\n", + ")\n", + "decoder = Decoder(\n", + " d_model=d_model,\n", + " nhead=nhead,\n", + " dropout = dropout,\n", + " activation=\"gelu\",\n", + " norm_first=True,\n", + " nlayer=4,\n", + " ff_ratio=4,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def autoregressive_decode(\n", + " model: EncoderDecoder,\n", + " image: Tensor,\n", + " prefix: Sequence[int],\n", + " max_decode_len: int,\n", + " eos_id: int,\n", + " token_whitelist: Optional[Sequence[int]] = None,\n", + " token_blacklist: Optional[Sequence[int]] = None,\n", + ") -> Tensor:\n", + " model.eval()\n", + " with torch.no_grad():\n", + " memory = model.encode(image)\n", + " context = torch.tensor(prefix, dtype=torch.int32).repeat(image.shape[0], 1).to(device)\n", + "\n", + " for _ in range(max_decode_len):\n", + " eos_flag = [eos_id in k for k in context]\n", + " if all(eos_flag):\n", + " break\n", + "\n", + " with torch.no_grad():\n", + " causal_mask = subsequent_mask(context.shape[1]).to(device)\n", + " logits = model.decode(\n", + " memory, context, tgt_mask=causal_mask, tgt_padding_mask=None\n", + " )\n", + " logits = model.generator(logits)[:, -1, :]\n", + "\n", + " logits = pred_token_within_range(\n", + " logits.detach(),\n", + " white_list=token_whitelist,\n", + " black_list=token_blacklist,\n", + " )\n", + "\n", + " next_probs, next_tokens = greedy_sampling(logits)\n", + " context = torch.cat([context, next_tokens], dim=1)\n", + " return context\n", + "\n", + "def load_vocab_and_model(\n", + " vocab_path: Union[str, Path],\n", + " max_seq_len: int,\n", + " model_weights: Union[str, Path],\n", + ") -> Tuple[tk.Tokenizer, EncoderDecoder]:\n", + " vocab = tk.Tokenizer.from_file(vocab_path)\n", + " model = EncoderDecoder(\n", + " backbone=backbone,\n", + " encoder=encoder,\n", + " decoder=decoder,\n", + " vocab_size=vocab.get_vocab_size(),\n", + " d_model=d_model,\n", + " padding_idx=vocab.token_to_id(\"\"),\n", + " max_seq_len=max_seq_len,\n", + " dropout=dropout,\n", + " norm_layer=partial(nn.LayerNorm, eps=1e-6)\n", + " )\n", + "\n", + " model.load_state_dict(torch.load(model_weights, map_location=\"cpu\"))\n", + " model = model.to(device)\n", + " return vocab, model\n", + "\n", + "def image_to_tensor(image: Image, size: Tuple[int, int]) -> Tensor:\n", + " T = transforms.Compose([\n", + " transforms.Resize(size),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=[0.86597056,0.88463002,0.87491087], std = [0.20686628,0.18201602,0.18485524])\n", + " ])\n", + " image_tensor = T(image)\n", + " image_tensor = image_tensor.to(device).unsqueeze(0)\n", + "\n", + " return image_tensor\n", + "\n", + "def rescale_bbox(\n", + " bbox: Sequence[Sequence[float]],\n", + " src: Tuple[int, int],\n", + " tgt: Tuple[int, int]\n", + ") -> Sequence[Sequence[float]]:\n", + " assert len(src) == len(tgt) == 2\n", + " ratio = [tgt[0] / src[0], tgt[1] / src[1]] * 2\n", + " bbox = [[int(round(i * j)) for i, j in zip(entry, ratio)] for entry in bbox]\n", + " return bbox" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Table structure extraction\n", + "vocab, model = load_vocab_and_model(\n", + " vocab_path=\"../vocab/vocab_html.json\",\n", + " max_seq_len=784,\n", + " model_weights=MODEL_DIR / MODEL_FILE_NAME[0],\n", + ")\n", + "\n", + "# Image transformation\n", + "image_tensor = image_to_tensor(image, size=(448, 448))\n", + "\n", + "# Inference\n", + "pred_html = autoregressive_decode(\n", + " model=model,\n", + " image=image_tensor,\n", + " prefix=[vocab.token_to_id(\"[html]\")],\n", + " max_decode_len=512,\n", + " eos_id=vocab.token_to_id(\"\"),\n", + " token_whitelist=[vocab.token_to_id(i) for i in VALID_HTML_TOKEN],\n", + " token_blacklist = None\n", + ")\n", + "\n", + "# Convert token id to token text\n", + "pred_html = pred_html.detach().cpu().numpy()[0]\n", + "pred_html = vocab.decode(pred_html, skip_special_tokens=False)\n", + "pred_html = html_str_to_token_list(pred_html)\n", + "\n", + "# print(pred_html)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Table cell bbox detection\n", + "vocab, model = load_vocab_and_model(\n", + " vocab_path=\"../vocab/vocab_bbox.json\",\n", + " max_seq_len=1024,\n", + " model_weights=MODEL_DIR / MODEL_FILE_NAME[1],\n", + ")\n", + "\n", + "# Image transformation\n", + "image_tensor = image_to_tensor(image, size=(448, 448))\n", + "\n", + "# Inference\n", + "pred_bbox = autoregressive_decode(\n", + " model=model,\n", + " image=image_tensor,\n", + " prefix=[vocab.token_to_id(\"[bbox]\")],\n", + " max_decode_len=1024,\n", + " eos_id=vocab.token_to_id(\"\"),\n", + " token_whitelist=[vocab.token_to_id(i) for i in VALID_BBOX_TOKEN[: 449]],\n", + " token_blacklist = None\n", + ")\n", + "\n", + "# Convert token id to token text\n", + "pred_bbox = pred_bbox.detach().cpu().numpy()[0]\n", + "pred_bbox = vocab.decode(pred_bbox, skip_special_tokens=False)\n", + "\n", + "# print(pred_bbox)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize detected bbox\n", + "pred_bbox = bbox_str_to_token_list(pred_bbox)\n", + "pred_bbox = rescale_bbox(pred_bbox, src=(448, 448), tgt=image_size)\n", + "\n", + "fig, ax = plt.subplots(figsize=(12, 10))\n", + "for i in pred_bbox:\n", + " rect = patches.Rectangle(i[:2], i[2] - i[0], i[3] - i[1], linewidth=1, edgecolor='r', facecolor='none')\n", + " ax.add_patch(rect)\n", + "ax.set_axis_off()\n", + "ax.imshow(image)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Table cell content recognition\n", + "vocab, model = load_vocab_and_model(\n", + " vocab_path=\"../vocab/vocab_cell_6k.json\",\n", + " max_seq_len=200,\n", + " model_weights=MODEL_DIR / MODEL_FILE_NAME[2],\n", + ")\n", + "\n", + "# Cell image cropping and transformation\n", + "image_tensor = [image_to_tensor(image.crop(bbox), size=(112, 448)) for bbox in pred_bbox]\n", + "image_tensor = torch.cat(image_tensor, dim=0)\n", + "\n", + "# Inference\n", + "pred_cell = autoregressive_decode(\n", + " model=model,\n", + " image=image_tensor,\n", + " prefix=[vocab.token_to_id(\"[cell]\")],\n", + " max_decode_len=200,\n", + " eos_id=vocab.token_to_id(\"\"),\n", + " token_whitelist=None,\n", + " token_blacklist = [vocab.token_to_id(i) for i in INVALID_CELL_TOKEN]\n", + ")\n", + "\n", + "# Convert token id to token text\n", + "pred_cell = pred_cell.detach().cpu().numpy()\n", + "pred_cell = vocab.decode_batch(pred_cell, skip_special_tokens=False)\n", + "pred_cell = [cell_str_to_token_list(i) for i in pred_cell]\n", + "pred_cell = [re.sub(r'(\\d).\\s+(\\d)', r'\\1.\\2', i) for i in pred_cell]\n", + "\n", + "# print(pred_cell)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " Main cellular process\n", + " \n", + " Modulated pathways\n", + " \n", + " P value\n", + " \n", + " Genes in pathway\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " Expressed\n", + " \n", + " total\n", + "
\n", + " \n", + " \n", + " + PMN\n", + " \n", + " - PMN\n", + " \n", + " + PMN\n", + " \n", + " PMN\n", + " \n", + "
\n", + " Cell cycle\n", + " \n", + " Role of APC in cell cycle regulation\n", + " \n", + " 1.040E - 09\n", + " \n", + " 8.149E - 08\n", + " \n", + " 15\n", + " \n", + " 12\n", + " \n", + " 32\n", + "
\n", + " \n", + " Chromosome condensation in prometaphase\n", + " \n", + " 4.131E - 06\n", + " \n", + " 8.392E - 11\n", + " \n", + " 9\n", + " \n", + " 12\n", + " \n", + " 20\n", + "
\n", + " \n", + " The metaphase checkpoint\n", + " \n", + " 4.423E - 06\n", + " \n", + " 1.474E - 04\n", + " \n", + " 12\n", + " \n", + " 9\n", + " \n", + " 36\n", + "
\n", + " \n", + " Spindle assembly and chromosome separation\n", + " \n", + " 3.170E - 04\n", + " \n", + " 1.937E - 03\n", + " \n", + " 9\n", + " \n", + " 7\n", + " \n", + " 32\n", + "
\n", + " \n", + " Start of DNA replication in early S phase\n", + " \n", + " 1.284E - 03\n", + " \n", + " 3.115E - 02\n", + " \n", + " 8\n", + " \n", + " 5\n", + " \n", + " 31\n", + "
\n", + " \n", + " Initiation of mitosis\n", + " \n", + " 1.544E - 03\n", + " \n", + " 2.483E - 03\n", + " \n", + " 7\n", + " \n", + " 6\n", + " \n", + " 25\n", + "
\n", + " \n", + " Sister chromatid cohesion\n", + " \n", + " 1.530E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 21\n", + "
\n", + " \n", + " Transition and termination of DNA replication\n", + " \n", + " \n", + " 1.523E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " 26\n", + "
\n", + " \n", + " Role of Nek in cell cycle regulation\n", + " \n", + " \n", + " 2.390E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " 29\n", + "
\n", + " \n", + " Nucleocytoplasmic transport of CDK / Cyclins\n", + " \n", + " \n", + " 4.386E - 02\n", + " \n", + " \n", + " 3\n", + " \n", + " 14\n", + "
\n", + " Immune response\n", + " \n", + " Alternative complement pathway\n", + " \n", + " 4.539E - 07\n", + " \n", + " 2.737E - 02\n", + " \n", + " 12\n", + " \n", + " 5\n", + " \n", + " 30\n", + "
\n", + " \n", + " Fc gamma R - mediated phagocytosis\n", + " \n", + " 1.606E - 03\n", + " \n", + " 9.058E - 03\n", + " \n", + " 8\n", + " \n", + " 6\n", + " \n", + " 32\n", + "
\n", + " \n", + " Antigen presentation by MHC class II\n", + " \n", + " 6.046E - 03\n", + " \n", + " 2.644E - 03\n", + " \n", + " 4\n", + " \n", + " 4\n", + " \n", + " 11\n", + "
\n", + " \n", + " Classic complement pathway\n", + " \n", + " 1.517E - 05\n", + " \n", + " \n", + " 12\n", + " \n", + " \n", + " 40\n", + "
\n", + " \n", + " Antiviral actions of Interferons\n", + " \n", + " 2.431E - 04\n", + " \n", + " \n", + " 9\n", + " \n", + " \n", + " 31\n", + "
\n", + " \n", + " CCR3 signalling\n", + " \n", + " 8.728E - 04\n", + " \n", + " \n", + " 12\n", + " \n", + " \n", + " 59\n", + "
\n", + " \n", + " Lectin Induced complement pathway\n", + " \n", + " 1.251E - 03\n", + " \n", + " \n", + " 9\n", + " \n", + " \n", + " 38\n", + "
\n", + " \n", + " Lipoxin inhibitory action on Superoxide production\n", + " \n", + " 1.544E - 03\n", + " \n", + " 2.483E - 03\n", + " \n", + " 7\n", + " \n", + " 6\n", + " \n", + " 25\n", + "
\n", + " \n", + " IFN alpha / beta signalling pathway\n", + " \n", + " 6.214E - 03\n", + " \n", + " \n", + " 6\n", + " \n", + " \n", + " 24\n", + "
\n", + " \n", + " IL - 10 signalling pathway\n", + " \n", + " 2.245E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 23\n", + "
\n", + " \n", + " Antigen presentation by MHC class I\n", + " \n", + " 3.675E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 26\n", + "
\n", + " \n", + " Transcription regulation of granulocyte development\n", + " \n", + " \n", + " 3.115E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " 31\n", + "
\n", + " Oxidative stress\n", + " \n", + " ROS production\n", + " \n", + " 8.932E - 04\n", + " \n", + " 4.113E - 02\n", + " \n", + " 7\n", + " \n", + " 4\n", + " \n", + " 23\n", + "
\n", + " Apoptosis\n", + " \n", + " Inhibition of ROS induced apoptosis\n", + " \n", + " 3.675E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 26\n", + "
\n", + " G protein signalling\n", + " \n", + " Rac2 regulation pathway\n", + " \n", + " 4.957E - 03\n", + " \n", + " 4.113E - 02\n", + " \n", + " 6\n", + " \n", + " 4\n", + " \n", + " 23\n", + "
\n", + " \n", + " RAC1 in cellular process\n", + " \n", + " 1.361E - 02\n", + " \n", + " \n", + " 6\n", + " \n", + " \n", + " 28\n", + "
\n", + " Cytoskeleton remodelling\n", + " \n", + " Regulation of actin cytoskeleton by Rho GTPases\n", + " \n", + " 8.972E - 03\n", + " \n", + " \n", + " \n", + " 5\n", + " \n", + " 23\n", + "
\n", + " \n", + " Alpha - 1A adrenergic receptor - dependent inhibition of PI3K\n", + " \n", + " 2.887E - 02\n", + " \n", + " \n", + " \n", + " 3\n", + " \n", + " 12\n", + "
\n", + " Metabolic process\n", + " \n", + " Lipoprotein metabolism I. Chylomicron, VLDL and LDL metabolism\n", + " \n", + " 1.630E - 02\n", + " \n", + " 9.007E - 07\n", + " \n", + " 3\n", + " \n", + " 6\n", + " \n", + " 8\n", + "
\n", + " \n", + " Lipoprotein metabolism II. HDL metabolism\n", + " \n", + " 1.630E - 02\n", + " \n", + " 9.007E - 07\n", + " \n", + " 3\n", + " \n", + " 6\n", + " \n", + " 8\n", + "
\n", + " \n", + " G - alpha ( q ) regulation of lipid metabolism\n", + " \n", + " 2.245E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 23\n", + "
\n", + " \n", + " Urea cycle\n", + " \n", + " 3.675E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 26\n", + "
\n", + " \n", + " LDL metabolism during development of fatty streak lesion\n", + " \n", + " 1.870E - 02\n", + " \n", + " \n", + " \n", + " 2\n", + " \n", + " 4\n", + "
\n", + " \n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Combine the table structure and cell content\n", + "pred_code = build_table_from_html_and_cell(pred_html, pred_cell)\n", + "pred_code = \"\".join(pred_code)\n", + "pred_code = html_table_template(pred_code)\n", + "\n", + "# Display the HTML table\n", + "soup = bs(pred_code)\n", + "table_code = soup.prettify()\n", + "display(HTML(table_code))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " Main cellular process\n", + " \n", + " Modulated pathways\n", + " \n", + " P value\n", + " \n", + " Genes in pathway\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " Expressed\n", + " \n", + " total\n", + "
\n", + " \n", + " \n", + " + PMN\n", + " \n", + " - PMN\n", + " \n", + " + PMN\n", + " \n", + " PMN\n", + " \n", + "
\n", + " Cell cycle\n", + " \n", + " Role of APC in cell cycle regulation\n", + " \n", + " 1.040E - 09\n", + " \n", + " 8.149E - 08\n", + " \n", + " 15\n", + " \n", + " 12\n", + " \n", + " 32\n", + "
\n", + " \n", + " Chromosome condensation in prometaphase\n", + " \n", + " 4.131E - 06\n", + " \n", + " 8.392E - 11\n", + " \n", + " 9\n", + " \n", + " 12\n", + " \n", + " 20\n", + "
\n", + " \n", + " The metaphase checkpoint\n", + " \n", + " 4.423E - 06\n", + " \n", + " 1.474E - 04\n", + " \n", + " 12\n", + " \n", + " 9\n", + " \n", + " 36\n", + "
\n", + " \n", + " Spindle assembly and chromosome separation\n", + " \n", + " 3.170E - 04\n", + " \n", + " 1.937E - 03\n", + " \n", + " 9\n", + " \n", + " 7\n", + " \n", + " 32\n", + "
\n", + " \n", + " Start of DNA replication in early S phase\n", + " \n", + " 1.284E - 03\n", + " \n", + " 3.115E - 02\n", + " \n", + " 8\n", + " \n", + " 5\n", + " \n", + " 31\n", + "
\n", + " \n", + " Initiation of mitosis\n", + " \n", + " 1.544E - 03\n", + " \n", + " 2.483E - 03\n", + " \n", + " 7\n", + " \n", + " 6\n", + " \n", + " 25\n", + "
\n", + " \n", + " Sister chromatid cohesion\n", + " \n", + " 1.530E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 21\n", + "
\n", + " \n", + " Transition and termination of DNA replication\n", + " \n", + " \n", + " 1.523E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " 26\n", + "
\n", + " \n", + " Role of Nek in cell cycle regulation\n", + " \n", + " \n", + " 2.390E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " 29\n", + "
\n", + " \n", + " Nucleocytoplasmic transport of CDK / Cyclins\n", + " \n", + " \n", + " 4.386E - 02\n", + " \n", + " \n", + " 3\n", + " \n", + " 14\n", + "
\n", + " Immune response\n", + " \n", + " Alternative complement pathway\n", + " \n", + " 4.539E - 07\n", + " \n", + " 2.737E - 02\n", + " \n", + " 12\n", + " \n", + " 5\n", + " \n", + " 30\n", + "
\n", + " \n", + " Fc gamma R - mediated phagocytosis\n", + " \n", + " 1.606E - 03\n", + " \n", + " 9.058E - 03\n", + " \n", + " 8\n", + " \n", + " 6\n", + " \n", + " 32\n", + "
\n", + " \n", + " Antigen presentation by MHC class II\n", + " \n", + " 6.046E - 03\n", + " \n", + " 2.644E - 03\n", + " \n", + " 4\n", + " \n", + " 4\n", + " \n", + " 11\n", + "
\n", + " \n", + " Classic complement pathway\n", + " \n", + " 1.517E - 05\n", + " \n", + " \n", + " 12\n", + " \n", + " \n", + " 40\n", + "
\n", + " \n", + " Antiviral actions of Interferons\n", + " \n", + " 2.431E - 04\n", + " \n", + " \n", + " 9\n", + " \n", + " \n", + " 31\n", + "
\n", + " \n", + " CCR3 signalling\n", + " \n", + " 8.728E - 04\n", + " \n", + " \n", + " 12\n", + " \n", + " \n", + " 59\n", + "
\n", + " \n", + " Lectin Induced complement pathway\n", + " \n", + " 1.251E - 03\n", + " \n", + " \n", + " 9\n", + " \n", + " \n", + " 38\n", + "
\n", + " \n", + " Lipoxin inhibitory action on Superoxide production\n", + " \n", + " 1.544E - 03\n", + " \n", + " 2.483E - 03\n", + " \n", + " 7\n", + " \n", + " 6\n", + " \n", + " 25\n", + "
\n", + " \n", + " IFN alpha / beta signalling pathway\n", + " \n", + " 6.214E - 03\n", + " \n", + " \n", + " 6\n", + " \n", + " \n", + " 24\n", + "
\n", + " \n", + " IL - 10 signalling pathway\n", + " \n", + " 2.245E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 23\n", + "
\n", + " \n", + " Antigen presentation by MHC class I\n", + " \n", + " 3.675E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 26\n", + "
\n", + " \n", + " Transcription regulation of granulocyte development\n", + " \n", + " \n", + " 3.115E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " 31\n", + "
\n", + " Oxidative stress\n", + " \n", + " ROS production\n", + " \n", + " 8.932E - 04\n", + " \n", + " 4.113E - 02\n", + " \n", + " 7\n", + " \n", + " 4\n", + " \n", + " 23\n", + "
\n", + " Apoptosis\n", + " \n", + " Inhibition of ROS induced apoptosis\n", + " \n", + " 3.675E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 26\n", + "
\n", + " G protein signalling\n", + " \n", + " Rac2 regulation pathway\n", + " \n", + " 4.957E - 03\n", + " \n", + " 4.113E - 02\n", + " \n", + " 6\n", + " \n", + " 4\n", + " \n", + " 23\n", + "
\n", + " \n", + " RAC1 in cellular process\n", + " \n", + " 1.361E - 02\n", + " \n", + " \n", + " 6\n", + " \n", + " \n", + " 28\n", + "
\n", + " Cytoskeleton remodelling\n", + " \n", + " Regulation of actin cytoskeleton by Rho GTPases\n", + " \n", + " 8.972E - 03\n", + " \n", + " \n", + " \n", + " 5\n", + " \n", + " 23\n", + "
\n", + " \n", + " Alpha - 1A adrenergic receptor - dependent inhibition of PI3K\n", + " \n", + " 2.887E - 02\n", + " \n", + " \n", + " \n", + " 3\n", + " \n", + " 12\n", + "
\n", + " Metabolic process\n", + " \n", + " Lipoprotein metabolism I. Chylomicron, VLDL and LDL metabolism\n", + " \n", + " 1.630E - 02\n", + " \n", + " 9.007E - 07\n", + " \n", + " 3\n", + " \n", + " 6\n", + " \n", + " 8\n", + "
\n", + " \n", + " Lipoprotein metabolism II. HDL metabolism\n", + " \n", + " 1.630E - 02\n", + " \n", + " 9.007E - 07\n", + " \n", + " 3\n", + " \n", + " 6\n", + " \n", + " 8\n", + "
\n", + " \n", + " G - alpha ( q ) regulation of lipid metabolism\n", + " \n", + " 2.245E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 23\n", + "
\n", + " \n", + " Urea cycle\n", + " \n", + " 3.675E - 02\n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " 26\n", + "
\n", + " \n", + " LDL metabolism during development of fatty streak lesion\n", + " \n", + " 1.870E - 02\n", + " \n", + " \n", + " \n", + " 2\n", + " \n", + " 4\n", + "
\n", + " \n", + "\n", + "\n" + ] + } + ], + "source": [ + "# Raw HTML table code\n", + "print(table_code)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation - Proceed only if you have the groundtruth annotation." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "from src.utils.teds import TEDS\n", + "import jsonlines\n", + "from src.vocab.constant import CELL_SPECIAL" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Load groundtruth annotation\n", + "annotation_path = \"../dataset/mini_pubtabnet/mini_pubtabnet_examples.jsonl\"\n", + "with jsonlines.open(annotation_path) as f:\n", + " for obj in f:\n", + " if obj[\"filename\"] == image_name:\n", + " anno_html_raw = obj[\"html\"][\"structure\"][\"tokens\"]\n", + " anno_cell_raw = [\"\".join(cell[\"tokens\"]) for cell in obj[\"html\"][\"cells\"] if cell[\"tokens\"]]\n", + " break\n", + "\n", + "anno_html = []\n", + "idx = 0\n", + "while idx < len(anno_html_raw):\n", + " if \"[\" in anno_html_raw[idx]:\n", + " assert idx + 1 < len(anno_html_raw)\n", + " assert anno_html_raw[idx + 1] == \"]\"\n", + " anno_html.append(anno_html_raw[idx] + \"]\")\n", + " idx = idx + 2\n", + " else:\n", + " anno_html.append(anno_html_raw[idx])\n", + " idx = idx + 1\n", + "\n", + "anno_cell = []\n", + "for txt in anno_cell_raw:\n", + " for black in CELL_SPECIAL:\n", + " txt = txt.replace(black, \"\")\n", + " anno_cell.append(txt)\n", + "\n", + "anno_code = \"\".join(build_table_from_html_and_cell(anno_html, anno_cell))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Evaluate table structure only (S-TEDS)\n", + "teds = TEDS(structure_only=True)\n", + "teds.evaluate(pred_code, html_table_template(anno_code))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9523398767490218" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Evaluate both table structure and cell content (TEDS)\n", + "teds = TEDS(structure_only=False)\n", + "teds.evaluate(pred_code, html_table_template(anno_code))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "adp", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/unitable/requirements.txt b/unitable/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..b3c394d201ea73feab07804c53068cb53072292b --- /dev/null +++ b/unitable/requirements.txt @@ -0,0 +1,20 @@ +torch +torchvision +torchaudio +torchtext +jsonlines +beautifulsoup4 +matplotlib +hydra-core +hydra_colorlog +apted +Distance +lxml==4.9.3 +torchmetrics +wandb +einops +ptflops +tokenizers +pycocotools +torchmetrics +faster-coco-eval \ No newline at end of file diff --git a/unitable/setup.py b/unitable/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..ee6861148c8a639508709f5a158f5d32471b91ab --- /dev/null +++ b/unitable/setup.py @@ -0,0 +1,4 @@ +from setuptools import find_packages +from setuptools import setup + +setup(name="unitable", version="1.0.0", packages=find_packages()) \ No newline at end of file diff --git a/unitable/src/datamodule/__init__.py b/unitable/src/datamodule/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3c6456bbfa0e3f9973469d1135aab34010a7a993 --- /dev/null +++ b/unitable/src/datamodule/__init__.py @@ -0,0 +1,6 @@ +from .pubtabnet import PubTabNet +from .synthtabnet import Synthtabnet +from .dataloader import dataloader_vae, dataloader_beit, dataloader_html +from .pubtables1m import PubTables +from .tablebank import TableBank +from .fintabnet import FinTabNet diff --git a/unitable/src/datamodule/augmentation.py b/unitable/src/datamodule/augmentation.py new file mode 100644 index 0000000000000000000000000000000000000000..0258c64d94b7687e01d8097c20c0122f7ede5788 --- /dev/null +++ b/unitable/src/datamodule/augmentation.py @@ -0,0 +1,108 @@ +from typing import Tuple, Any, Optional, Union +from torch import Tensor +import random +from PIL import Image +import torchvision.transforms.functional as F +from torchvision import datasets, transforms + +from torchvision.transforms.transforms import _setup_size + + +_PIL_INTERPOLATION = { + "bilinear": Image.BILINEAR, + "bicubic": Image.BICUBIC, + "lanczos": Image.LANCZOS, + "hamming": Image.HAMMING, +} + +get_interpolation = lambda method: _PIL_INTERPOLATION.get(method, Image.BILINEAR) + + +class RandomResizedCropAndInterpolationWithTwoPic(transforms.RandomResizedCrop): + """Ensure both crops of vqvae and visual encoder have the same scale and size.""" + + def __init__( + self, + size: Union[int, Tuple[int, int]], # transformer + second_size: Union[int, Tuple[int, int]], # vqvae + scale: Tuple[float, float] = (0.08, 1.0), + ratio: Tuple[float, float] = (3.0 / 4.0, 4.0 / 3.0), + interpolation: str = "bilinear", + second_interpolation: str = "lanczos", + ): + self.second_size = _setup_size( + second_size, + error_msg="Please provide only two dimensions (h, w) for second size.", + ) + + if interpolation == "random": + interpolation = random.choice( + [get_interpolation("bilinear"), get_interpolation("bicubic")] + ) + else: + interpolation = get_interpolation(interpolation) + self.second_interpolation = get_interpolation(second_interpolation) + + super().__init__( + size=size, scale=scale, ratio=ratio, interpolation=interpolation + ) + + def forward(self, img: Image): + i, j, h, w = self.get_params(img, self.scale, self.ratio) + out = F.resized_crop(img, i, j, h, w, self.size, self.interpolation) + out_second = F.resized_crop( + img, i, j, h, w, self.second_size, self.second_interpolation + ) + + return out, out_second + + +class AugmentationForMIM(object): + def __init__( + self, + mean: float, + std: float, + trans_size: Union[int, Tuple[int, int]], + vqvae_size: Union[int, Tuple[int, int]], + trans_interpolation: str, + vqvae_interpolation: str, + ) -> None: + self.common_transform = transforms.Compose( + [ + transforms.ColorJitter(brightness=0.4, contrast=0.4, saturation=0.4), + transforms.RandomHorizontalFlip(p=0.5), + RandomResizedCropAndInterpolationWithTwoPic( + size=trans_size, + second_size=vqvae_size, + interpolation=trans_interpolation, + second_interpolation=vqvae_interpolation, + ), + ] + ) + + self.trans_transform = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize(mean=mean, std=std)] + ) + + self.vqvae_transform = transforms.ToTensor() + + def __call__(self, img: Image) -> Tuple[Tensor, Tensor]: + trans_img, vqvae_img = self.common_transform(img) + trans_img = self.trans_transform(trans_img) + vqvae_img = self.vqvae_transform(vqvae_img) + + return trans_img, vqvae_img + + +if __name__ == "__main__": + mean = [240.380, 240.390, 240.486] + std = [45.735, 45.785, 45.756] + + T = RandomResizedCropAndInterpolationWithTwoPic( + size=(256, 256), + second_size=(256, 256), + interpolation="bicubic", + second_interpolation="lanczos", + ) + + print(T) diff --git a/unitable/src/datamodule/dataloader.py b/unitable/src/datamodule/dataloader.py new file mode 100644 index 0000000000000000000000000000000000000000..25c44c10334e1400cd25b34ffe7e121edf656f31 --- /dev/null +++ b/unitable/src/datamodule/dataloader.py @@ -0,0 +1,133 @@ +from typing import Any +from torch.utils.data import DataLoader, Dataset, Sampler +from functools import partial +import tokenizers as tk +import torch +from torch.utils.data import default_collate +from ..utils.mask_generator import MaskGenerator +from ..utils import ( + prepare_html_seq, + prepare_cell_seq, + prepare_bbox_seq, +) + + +class Collator: + def __init__( + self, + vocab: tk.Tokenizer, + max_seq_len: int, + label_type: str, + ) -> None: + self.vocab = vocab + self.vocab.enable_truncation(max_seq_len) + self.label_type = label_type + + def __call__(self, batch) -> Any: + return self._collate_batch(batch, self.vocab, self.label_type) + + def _collate_batch( + self, + batch: list[dict], + vocab: tk.Tokenizer, + label_type: str, + ): + if "cell" in label_type: + image_list = [j for i in batch for j in i[0]] + else: + image_list = [i["image"] for i in batch] + image_list = default_collate(image_list) + + if "cell" in label_type: + filename = [(j["filename"], j["bbox_id"]) for i in batch for j in i[1]] + else: + filename = [i["filename"] for i in batch] + label = dict(filename=filename) + + if "html" in label_type: + html_list = ["".join(prepare_html_seq(i["html"])) for i in batch] + label["html"] = vocab.encode_batch(html_list) + + if "cell" in label_type: + cell_list = [ + " ".join(prepare_cell_seq(j["cell"])) for i in batch for j in i[1] + ] + label["cell"] = vocab.encode_batch(cell_list) + + if "bbox" in label_type: + bbox_list = [" ".join(prepare_bbox_seq(i["bbox"])) for i in batch] + label["bbox"] = vocab.encode_batch(bbox_list) + + return image_list, label + + +def generate_mask_for_batch_samples( + batch, grid_size: int, num_mask_patches: int, min_num_patches: int +): + N = len(batch) + mg = MaskGenerator( + input_size=grid_size, + num_mask_patches=num_mask_patches, + min_num_patches=min_num_patches, + ) + mask_list = [mg() for _ in range(N)] + return default_collate(batch), default_collate(mask_list) + + +def dataloader_vae( + dataset: Dataset, batch_size: int, sampler: Sampler = None, **kwargs +) -> DataLoader: + dataloader = DataLoader( + dataset, batch_size, sampler=sampler, num_workers=8, pin_memory=True + ) + + return dataloader + + +def dataloader_beit( + dataset: Dataset, + grid_size: int, + num_mask_patches: int, + min_num_patches: int, + batch_size: int, + sampler: Sampler = None, + **kwargs +): + dataloader = DataLoader( + dataset, + batch_size, + sampler=sampler, + collate_fn=partial( + generate_mask_for_batch_samples, + grid_size=grid_size, + num_mask_patches=num_mask_patches, + min_num_patches=min_num_patches, + ), + num_workers=8, + pin_memory=True, + ) + + return dataloader + + +def dataloader_html( + dataset: Dataset, + batch_size: int, + vocab: tk.Tokenizer, + max_seq_len: int, + label_type: str, + sampler=None, +) -> DataLoader: + collate_fn = Collator(vocab, max_seq_len, label_type) + + dataloader = DataLoader( + dataset, + batch_size=batch_size, + shuffle=False, + num_workers=8, + collate_fn=collate_fn, + pin_memory=True, + sampler=sampler, + ) + + return dataloader diff --git a/unitable/src/datamodule/fintabnet.py b/unitable/src/datamodule/fintabnet.py new file mode 100644 index 0000000000000000000000000000000000000000..e6c65837da02d3bb9eb06862483c118a2a24ac72 --- /dev/null +++ b/unitable/src/datamodule/fintabnet.py @@ -0,0 +1,50 @@ +from typing import Any, Literal, Union +from pathlib import Path +import jsonlines +from PIL import Image +from torch import Tensor +from torch.utils.data import Dataset +import torchvision.transforms as transforms + + +class FinTabNet(Dataset): + """Load PubTabNet for different training purposes.""" + + def __init__( + self, + root_dir: Union[Path, str], + label_type: Literal["image", "html", "cell", "bbox"], + transform: transforms = None, + jsonl_filename: Union[Path, str] = None, + ) -> None: + super().__init__() + + self.root_dir = Path(root_dir) + self.label_type = label_type + self.transform = transform + + if label_type != "image": + jsonl_file = self.root_dir / jsonl_filename + with jsonlines.open(jsonl_file) as f: + self.image_label_pair = list(f) + + def __len__(self): + return len(self.image_label_pair) + + def __getitem__(self, index: int) -> Any: + if self.label_type == "image": + raise ValueError("FinTabNet is not used in pretraining.") + else: + obj = self.image_label_pair[index] + img_name = f"{obj['table_id']}.png" + img = Image.open(self.root_dir / "image" / img_name) + if self.transform: + img = self.transform(img) + + sample = dict(filename=obj["filename"], image=img) + + if self.label_type == "html": + sample["html"] = obj["html"]["structure"]["tokens"] + return sample + else: + raise ValueError("Task not supported in current dataset.") diff --git a/unitable/src/datamodule/pubtables1m.py b/unitable/src/datamodule/pubtables1m.py new file mode 100644 index 0000000000000000000000000000000000000000..633f4c379304f7b3b7973c7104c467f94297eb1b --- /dev/null +++ b/unitable/src/datamodule/pubtables1m.py @@ -0,0 +1,105 @@ +from typing import Any, Literal, Union +from pathlib import Path +import jsonlines +from PIL import Image +from torch import Tensor +from torch.utils.data import Dataset +import torchvision.transforms as transforms +import numpy as np +import os +import json + +from src.utils import bbox_augmentation_resize + + +class PubTables(Dataset): + """PubTables-1M-Structure""" + + def __init__( + self, + root_dir: Union[Path, str], + label_type: Literal["image", "cell", "bbox"], + split: Literal["train", "val", "test"], + transform: transforms = None, + cell_limit: int = 100, + ) -> None: + super().__init__() + + self.root_dir = Path(root_dir) + self.split = split + self.label_type = label_type + self.transform = transform + self.cell_limit = cell_limit + + tmp = os.listdir(self.root_dir / self.split) + + self.image_list = [i.split(".xml")[0] for i in tmp] + + def __len__(self): + return len(self.image_list) + + def __getitem__(self, index: int) -> Any: + name = self.image_list[index] + img = Image.open(os.path.join(self.root_dir, "images", name + ".jpg")) + + if self.label_type == "image": + if self.transform: + img = self.transform(img) + return img + elif "bbox" in self.label_type: + img_size = img.size + if self.transform: + img = self.transform(img) + tgt_size = img.shape[-1] + with open( + os.path.join(self.root_dir, "words", name + "_words.json"), "r" + ) as f: + obj = json.load(f) + + obj[:] = [ + v + for i in obj + if "bbox" in i.keys() + and all([i["bbox"][w + 2] > i["bbox"][w] for w in range(2)]) + for v in bbox_augmentation_resize( + [ + min(max(i["bbox"][0], 0), img_size[0]), + min(max(i["bbox"][1], 0), img_size[1]), + min(max(i["bbox"][2], 0), img_size[0]), + min(max(i["bbox"][3], 0), img_size[1]), + ], + img_size, + tgt_size, + ) + ] + + sample = {"filename": name, "image": img, "bbox": obj} + return sample + + elif "cell" in self.label_type: + img_size = img.size + with open( + os.path.join(self.root_dir, "words", name + "_words.json"), "r" + ) as f: + obj = json.load(f) + + bboxes_texts = [ + (i["bbox"], i["text"]) + for idx, i in enumerate(obj) + if "bbox" in i + and i["bbox"][0] < i["bbox"][2] + and i["bbox"][1] < i["bbox"][3] + and i["bbox"][0] >= 0 + and i["bbox"][1] >= 0 + and i["bbox"][2] < img_size[0] + and i["bbox"][3] < img_size[1] + and idx < self.cell_limit + ] + + img_bboxes = [self.transform(img.crop(bbox[0])) for bbox in bboxes_texts] + + text_bboxes = [ + {"filename": name, "bbox_id": i, "cell": j[1]} + for i, j in enumerate(bboxes_texts) + ] + return img_bboxes, text_bboxes diff --git a/unitable/src/datamodule/pubtabnet.py b/unitable/src/datamodule/pubtabnet.py new file mode 100644 index 0000000000000000000000000000000000000000..3466955b191e04c372cf559a293b9b41fb73f941 --- /dev/null +++ b/unitable/src/datamodule/pubtabnet.py @@ -0,0 +1,104 @@ +from typing import Any, Literal, Union +from pathlib import Path +from PIL import Image +from torch import Tensor +from torch.utils.data import Dataset +import torchvision.transforms as transforms +import numpy as np +import os + +from src.utils import load_json_annotations, bbox_augmentation_resize + + +# average html annotation length: train: 181.327 149.753 +# samples train: 500777, val: 9115 +class PubTabNet(Dataset): + """Load PubTabNet for different training purposes.""" + + def __init__( + self, + root_dir: Union[Path, str], + label_type: Literal["image", "html", "cell", "bbox"], + split: Literal["train", "val"], + transform: transforms = None, + json_html: Union[Path, str] = None, + cell_limit: int = 150, + ) -> None: + super().__init__() + + self.root_dir = Path(root_dir) + self.split = split + self.label_type = label_type + self.transform = transform + self.cell_limit = cell_limit + + self.img_list = os.listdir(self.root_dir / self.split) + + if label_type != "image": + self.image_label_pair = load_json_annotations( + json_file_dir=Path(root_dir) / json_html, split=self.split + ) + + def __len__(self): + return len(self.img_list) + + def __getitem__(self, index: int) -> Any: + if self.label_type == "image": + img = Image.open(self.root_dir / self.split / self.img_list[index]) + if self.transform: + sample = self.transform(img) + return sample + else: + obj = self.image_label_pair[index] + img = Image.open(self.root_dir / self.split / obj[0]) + + if self.label_type == "html": + if self.transform: + img = self.transform(img) + sample = dict( + filename=obj[0], image=img, html=obj[1]["structure"]["tokens"] + ) + return sample + elif self.label_type == "cell": + bboxes_texts = [ + (i["bbox"], "".join(i["tokens"])) + for idx, i in enumerate(obj[1]["cells"]) + if "bbox" in i + and i["bbox"][0] < i["bbox"][2] + and i["bbox"][1] < i["bbox"][3] + and idx < self.cell_limit + ] + + img_bboxes = [ + self.transform(img.crop(bbox[0])) for bbox in bboxes_texts + ] + + text_bboxes = [ + {"filename": obj[0], "bbox_id": i, "cell": j[1]} + for i, j in enumerate(bboxes_texts) + ] + return img_bboxes, text_bboxes + else: + img_size = img.size + if self.transform: + img = self.transform(img) + tgt_size = img.shape[-1] + sample = dict(filename=obj[0], image=img) + + bboxes = [ + entry["bbox"] + for entry in obj[1]["cells"] + if "bbox" in entry + and entry["bbox"][0] < entry["bbox"][2] + and entry["bbox"][1] < entry["bbox"][3] + ] + + bboxes[:] = [ + i + for entry in bboxes + for i in bbox_augmentation_resize(entry, img_size, tgt_size) + ] + + sample["bbox"] = bboxes + + return sample diff --git a/unitable/src/datamodule/synthtabnet.py b/unitable/src/datamodule/synthtabnet.py new file mode 100644 index 0000000000000000000000000000000000000000..997b97134c1c68ea93e9b2ef5b538c3a0e8ffd85 --- /dev/null +++ b/unitable/src/datamodule/synthtabnet.py @@ -0,0 +1,115 @@ +from typing import Any, Literal, Union +from pathlib import Path +import jsonlines +from PIL import Image +from torch import Tensor +from torch.utils.data import Dataset +import torchvision.transforms as transforms +import numpy as np +import os + +from src.utils import load_json_annotations, bbox_augmentation_resize + +# invalid data pairs: image_000000_1634629424.098128.png has 4 channels +INVALID_DATA = [ + { + "dataset": "fintabnet", + "split": "train", + "image": "image_009379_1634631303.201671.png", + }, + { + "dataset": "marketing", + "split": "train", + "image": "image_000000_1634629424.098128.png", + }, +] + + +class Synthtabnet(Dataset): + def __init__( + self, + root_dir: Union[Path, str], + label_type: Literal["image", "html", "all"], + split: Literal["train", "val", "test"], + transform: transforms = None, + json_html: Union[Path, str] = None, + cell_limit: int = 100, + ) -> None: + super().__init__() + + self.root_dir = Path(root_dir) / "images" + self.split = split + self.label_type = label_type + self.transform = transform + self.cell_limit = cell_limit + + # SSP only needs image + self.img_list = os.listdir(self.root_dir / self.split) + if label_type != "image": + self.image_label_pair = load_json_annotations( + json_file_dir=Path(root_dir) / json_html, split=split + ) + + def __len__(self): + return len(self.img_list) + + def __getitem__(self, index: int) -> Any: + if self.label_type == "image": + img = Image.open(self.root_dir / self.split / self.img_list[index]) + if self.transform: + sample = self.transform(img) + return sample + else: + obj = self.image_label_pair[index] + img = Image.open(self.root_dir / self.split / obj[0]) + + if self.label_type == "html": + if self.transform: + img = self.transform(img) + sample = dict( + filename=obj[0], image=img, html=obj[1]["structure"]["tokens"] + ) + return sample + elif self.label_type == "cell": + bboxes_texts = [ + (i["bbox"], "".join(i["tokens"])) + for idx, i in enumerate(obj[1]["cells"]) + if "bbox" in i + and i["bbox"][0] < i["bbox"][2] + and i["bbox"][1] < i["bbox"][3] + and idx < self.cell_limit + ] + + img_bboxes = [ + self.transform(img.crop(bbox[0])) for bbox in bboxes_texts + ] # you can limit the total cropped cells to lower gpu memory + + text_bboxes = [ + {"filename": obj[0], "bbox_id": i, "cell": j[1]} + for i, j in enumerate(bboxes_texts) + ] + return img_bboxes, text_bboxes + else: + img_size = img.size + if self.transform: + img = self.transform(img) + tgt_size = img.shape[-1] + sample = dict(filename=obj[0], image=img) + + bboxes = [ + entry["bbox"] + for entry in obj[1]["cells"] + if "bbox" in entry + and entry["bbox"][0] < entry["bbox"][2] + and entry["bbox"][1] < entry["bbox"][3] + ] + + bboxes[:] = [ + i + for entry in bboxes + for i in bbox_augmentation_resize(entry, img_size, tgt_size) + ] + + sample["bbox"] = bboxes + + return sample diff --git a/unitable/src/datamodule/tablebank.py b/unitable/src/datamodule/tablebank.py new file mode 100644 index 0000000000000000000000000000000000000000..99942c71fa579e81ccaf8497ac62d89c3bf923cf --- /dev/null +++ b/unitable/src/datamodule/tablebank.py @@ -0,0 +1,47 @@ +from typing import Any, Literal, Union +from pathlib import Path +import jsonlines +from PIL import Image +from torch import Tensor +from torch.utils.data import Dataset +import torchvision.transforms as transforms +import numpy as np +import os +import json + + +class TableBank(Dataset): + """tablebank recognition""" + + def __init__( + self, + root_dir: Union[Path, str], + label_type: Literal["image"], + split: Literal["train", "val", "test"], + transform: transforms = None, + ) -> None: + super().__init__() + + assert label_type == "image", "No annotations" + + self.root_dir = Path(root_dir) + self.label_type = label_type + self.transform = transform + self.image_list = os.listdir(self.root_dir / "images") + + if split == "val" or split == "test": + self.image_list = self.image_list[:1000] + + def __len__(self): + return len(self.image_list) + + def __getitem__(self, index: int) -> Any: + name = self.image_list[index] + img = Image.open(os.path.join(self.root_dir, "images", name)) + if self.transform: + img = self.transform(img) + + if self.label_type == "image": + return img + else: + raise ValueError("TableBank doesn't have HTML annotations.") diff --git a/unitable/src/main.py b/unitable/src/main.py new file mode 100644 index 0000000000000000000000000000000000000000..f50d17d94507dff3529734f3b52c0e39a5b62dfa --- /dev/null +++ b/unitable/src/main.py @@ -0,0 +1,170 @@ +from typing import Any +import hydra +import logging +import os +import wandb +import torch +import tokenizers as tk +from omegaconf import DictConfig, OmegaConf +from hydra.utils import get_original_cwd, instantiate +from pathlib import Path +import torch.multiprocessing as mp +from torch.utils.data.distributed import DistributedSampler +from torch.distributed import init_process_group, destroy_process_group + +from src.utils import printer, count_total_parameters + +log = logging.getLogger(__name__) + + +@hydra.main(config_path="../configs", config_name="main", version_base="1.3") +def main(cfg: DictConfig): + torch.manual_seed(cfg.seed) + ddp_setup() + device = int(os.environ["LOCAL_RANK"]) + cwd = Path(get_original_cwd()) + exp_dir = Path(os.getcwd()) # experiment directory + + if cfg.trainer.mode == "train": + (exp_dir / "snapshot").mkdir(parents=True, exist_ok=True) + (exp_dir / "model").mkdir(parents=True, exist_ok=True) + if device == 0: + wandb.init(project=cfg.wandb.project, name=cfg.name, resume=True) + + # vocab is used in finetuning, not in self-supervised pretraining + vocab = None + if cfg.vocab.need_vocab: + log.info( + printer( + device, + f"Loading {cfg.vocab.type} vocab from {(cwd / cfg.vocab.dir).resolve()}", + ) + ) + vocab = tk.Tokenizer.from_file(str(cwd / cfg.vocab.dir)) + + # dataset + if cfg.trainer.mode == "train": + log.info(printer(device, "Loading training dataset")) + train_dataset = instantiate(cfg.dataset.train_dataset) + + log.info(printer(device, "Loading validation dataset")) + valid_dataset = instantiate(cfg.dataset.valid_dataset) + + train_kwargs = { + "dataset": train_dataset, + "sampler": DistributedSampler(train_dataset), + "vocab": vocab, + "max_seq_len": cfg.trainer.max_seq_len, + } + + valid_kwargs = { + "dataset": valid_dataset, + "sampler": DistributedSampler(valid_dataset), + "vocab": vocab, + "max_seq_len": cfg.trainer.max_seq_len, + } + + train_dataloader = instantiate(cfg.trainer.train.dataloader, **train_kwargs) + valid_dataloader = instantiate(cfg.trainer.valid.dataloader, **valid_kwargs) + elif cfg.trainer.mode == "test": + # load testing dataset, same as valid for ssl + log.info(printer(device, "Loading testing dataset")) + test_dataset = instantiate(cfg.dataset.test_dataset) + + test_kwargs = { + "dataset": test_dataset, + "sampler": DistributedSampler(test_dataset), + "vocab": vocab, + "max_seq_len": cfg.trainer.max_seq_len, + } + + test_dataloader = instantiate(cfg.trainer.test.dataloader, **test_kwargs) + + # model + log.info(printer(device, "Loading model ...")) + model_name = str(cfg.model.model._target_).split(".")[-1] + if model_name == "DiscreteVAE": + model = instantiate(cfg.model.model) + elif model_name == "BeitEncoder": + max_seq_len = ( + cfg.trainer.trans_size[0] // cfg.model.backbone_downsampling_factor + ) * (cfg.trainer.trans_size[1] // cfg.model.backbone_downsampling_factor) + model = instantiate( + cfg.model.model, + max_seq_len=max_seq_len, + ) + # load pretrained vqvae + model_vqvae = instantiate(cfg.model.model_vqvae) + + log.info(printer(device, "Loading pretrained VQVAE model ...")) + assert Path( + cfg.trainer.vqvae_weights + ).is_file(), f"VQVAE weights doesn't exist: {cfg.trainer.vqvae_weights}" + model_vqvae.load_state_dict( + torch.load(cfg.trainer.vqvae_weights, map_location="cpu") + ) + elif model_name == "EncoderDecoder": + max_seq_len = max( + (cfg.trainer.img_size[0] // cfg.model.backbone_downsampling_factor) + * (cfg.trainer.img_size[1] // cfg.model.backbone_downsampling_factor), + cfg.trainer.max_seq_len, + ) # for positional embedding + model = instantiate( + cfg.model.model, + max_seq_len=max_seq_len, + vocab_size=vocab.get_vocab_size(), + padding_idx=vocab.token_to_id(""), + ) + + log.info( + printer(device, f"Total parameters: {count_total_parameters(model) / 1e6:.2f}M") + ) + + # trainer + log.info(printer(device, "Loading trainer ...")) + trainer_name = str(cfg.trainer.trainer._target_).split(".")[-1] + trainer_kwargs = { + "device": device, + "model": model, + "log": log, + "exp_dir": exp_dir, + "snapshot": ( + exp_dir / "snapshot" / cfg.trainer.trainer.snapshot + if cfg.trainer.trainer.snapshot + else None + ), + } + + if trainer_name == "VqvaeTrainer": + trainer = instantiate(cfg.trainer.trainer, **trainer_kwargs) + elif trainer_name == "BeitTrainer": + trainer_kwargs["model_vqvae"] = model_vqvae + trainer = instantiate(cfg.trainer.trainer, **trainer_kwargs) + elif trainer_name == "TableTrainer": + trainer_kwargs["vocab"] = vocab + trainer = instantiate(cfg.trainer.trainer, **trainer_kwargs) + else: + raise ValueError(f"The provided trainer type {trainer_name} is not supported.") + + if cfg.trainer.mode == "train": + log.info(printer(device, "Training starts ...")) + trainer.train( + train_dataloader, valid_dataloader, cfg.trainer.train, cfg.trainer.valid + ) + elif cfg.trainer.mode == "test": + log.info(printer(device, "Evaluation starts ...")) + save_to = exp_dir / cfg.name + save_to.mkdir(parents=True, exist_ok=True) + trainer.test(test_dataloader, cfg.trainer.test, save_to=save_to) + else: + raise NotImplementedError + + destroy_process_group() + + +def ddp_setup(): + init_process_group(backend="nccl") + + +if __name__ == "__main__": + main() diff --git a/unitable/src/model/__init__.py b/unitable/src/model/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e66b16bd55002a8bb24b221033da4a7838a03fca --- /dev/null +++ b/unitable/src/model/__init__.py @@ -0,0 +1,4 @@ +from .beit import BeitEncoder +from .vqvae import DiscreteVAE +from .encoderdecoder import EncoderDecoder +from .components import * \ No newline at end of file diff --git a/unitable/src/model/beit.py b/unitable/src/model/beit.py new file mode 100644 index 0000000000000000000000000000000000000000..9443e5db8054c22f19bf74537421bfee72e2a1f6 --- /dev/null +++ b/unitable/src/model/beit.py @@ -0,0 +1,127 @@ +import math +import torch +from torch import nn, Tensor +from functools import partial + +from .components import ImgLinearBackbone, PositionEmbedding, Encoder + + +class BeitEncoder(nn.Module): + def __init__( + self, + d_model: int, # embed_dim + backbone: nn.Module, + max_seq_len: int, # for positional embedding + codebook_tokens: int, + dropout: float, + encoder: Encoder, + norm_layer: nn.Module, + init_std: float = 0.02, + ) -> None: + super().__init__() + + self.d_model = d_model + self.init_std = init_std + + self.backbone = backbone + self.pos_embed = PositionEmbedding( + max_seq_len=max_seq_len, d_model=d_model, dropout=dropout + ) + + self.encoder = encoder + self.norm = norm_layer(d_model) + self.generator = nn.Linear(d_model, codebook_tokens) + + self.trunc_normal = partial( + nn.init.trunc_normal_, std=init_std, a=-init_std, b=init_std + ) + self.apply(self._init_weights) + + self.mask_token = nn.Parameter(torch.zeros(1, 1, d_model)) + + def _init_weights(self, m: nn.Module): + if isinstance(m, nn.Linear): + self.trunc_normal(m.weight) + if m.bias is not None: + nn.init.constant_(m.bias, 0.0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.weight, 1.0) + nn.init.constant_(m.bias, 0.0) + elif isinstance(m, nn.Conv2d): + self.trunc_normal(m.weight) + if m.bias is not None: + nn.init.constant_(m.bias, 0.0) + elif isinstance(m, PositionEmbedding): + self.trunc_normal(m.embedding.weight) + + @torch.jit.ignore + def no_weight_decay(self): + return {"pos_embed"} + + def forward( + self, x: Tensor, bool_masked_pos: Tensor, return_all_tokens: bool = False + ): + x = self.backbone(x) + B, S, E = x.shape + assert E == self.d_model + + mask_token = self.mask_token.expand(B, S, -1) + + w = bool_masked_pos.unsqueeze(-1).type_as(mask_token) + x = x * (1 - w) + mask_token * w + + x = self.pos_embed(x) + + x = self.encoder(x) + x = self.norm(x) + + if return_all_tokens: + return self.generator(x) + else: + return self.generator(x[bool_masked_pos]) + + +if __name__ == "__main__": + d_model = 512 + patch_size = 16 + nhead = 8 + dropout = 0.0 + acitvation = "gelu" + norm_first = True + nlayer = 12 + ff_ratio = 4 + norm_layer = partial(nn.LayerNorm, eps=1e-6) + codebook_tokens = 8192 + + img_size = 448 + + max_seq_len = (img_size // patch_size) ** 2 + + backbone = ImgLinearBackbone(d_model=d_model, patch_size=patch_size) + encoder = Encoder( + d_model=d_model, + nhead=nhead, + dropout=dropout, + activation=acitvation, + norm_first=norm_first, + nlayer=nlayer, + ff_ratio=ff_ratio, + ) + + model = BeitEncoder( + d_model=d_model, + backbone=backbone, + max_seq_len=max_seq_len, + codebook_tokens=codebook_tokens, + dropout=dropout, + encoder=encoder, + norm_layer=norm_layer, + ) + + print(model) + + x = torch.rand((1, 3, img_size, img_size)) + bool_masked_pos = torch.rand((1, (img_size // patch_size) ** 2)) < 0.5 + y = model(x, bool_masked_pos) + print(torch.sum(bool_masked_pos)) + print(y.shape) diff --git a/unitable/src/model/components.py b/unitable/src/model/components.py new file mode 100644 index 0000000000000000000000000000000000000000..9a6bc9ffc6aae0434e9881daeb499e9963f9cb60 --- /dev/null +++ b/unitable/src/model/components.py @@ -0,0 +1,232 @@ +from typing import Optional, Tuple +import torch +from torch import nn, Tensor +from torchvision.ops.misc import Conv2dNormActivation + + +__all__ = [ + "ImgCnnBackbone", + "ImgLinearBackbone", + "ImgConvStemBackbone", + "PositionEmbedding", + "Encoder", + "Decoder", + "TokenEmbedding", +] + + +class ImgCnnBackbone(nn.Module): + def __init__( + self, + backbone: nn.Module, + output_channels: int, + d_model: int, + drop_layer: Tuple = None, + ) -> None: + super().__init__() + + # drop layers for classification & maxpooling for higher feature resolution + layers = list(backbone.children()) + nlayer = len(layers) + keep_layer = set([i for i in range(nlayer)]) - set(drop_layer) + backbone = [layers[i] for i in keep_layer] + self.backbone = nn.Sequential(*backbone) + self.proj = nn.Linear(output_channels, d_model) + self.channels = output_channels + + def forward(self, x: Tensor) -> Tensor: + x = self.backbone(x) + x = x.flatten(start_dim=-2).transpose(1, 2) + assert x.shape[-1] == self.channels, "Image channels size mismatch." + x = self.proj(x) + return x + + +class ImgLinearBackbone(nn.Module): + def __init__( + self, + d_model: int, + patch_size: int, + in_chan: int = 3, + ) -> None: + super().__init__() + + self.conv_proj = nn.Conv2d( + in_chan, out_channels=d_model, kernel_size=patch_size, stride=patch_size + ) + self.d_model = d_model + + def forward(self, x: Tensor) -> Tensor: + x = self.conv_proj(x) + x = x.flatten(start_dim=-2).transpose(1, 2) + return x + + +class ImgConvStemBackbone(nn.Module): + def __init__( + self, + d_model: int, + downsample_factor: int, + output_channels: int, + kernel_size: int, + ) -> None: + super().__init__() + + assert downsample_factor % 2 == 0 + assert output_channels % (downsample_factor // 2) == 0 + input_channels = output_channels // (downsample_factor // 2) + + layers = [ + Conv2dNormActivation( + 3, input_channels, kernel_size=kernel_size, stride=2, padding=1 + ) + ] + + while input_channels != output_channels: + layers.append( + Conv2dNormActivation( + input_channels, + input_channels * 2, + kernel_size=kernel_size, + stride=2, + padding=1, + ) + ) + input_channels = input_channels * 2 + + layers.append(nn.Conv2d(output_channels, d_model, kernel_size=1)) + + self.conv_stem = nn.Sequential(*layers) + + def forward(self, x: Tensor) -> Tensor: + x = self.conv_stem(x) + x = x.flatten(start_dim=-2).transpose(1, 2) + return x + + +class Encoder(nn.Module): + def __init__( + self, + d_model: int, + nhead: int, + dropout: float, + activation: str, + norm_first: bool, + nlayer: int, + ff_ratio: int = 4, + ) -> None: + super().__init__() + + encoder_layer = nn.TransformerEncoderLayer( + d_model, + nhead=nhead, + dim_feedforward=ff_ratio * d_model, + dropout=dropout, + activation=activation, + batch_first=True, + norm_first=norm_first, + ) + + self.encoder = nn.TransformerEncoder(encoder_layer, num_layers=nlayer) + + def forward(self, x: Tensor) -> Tensor: + x = self.encoder(x) + return x + + +class Decoder(nn.Module): + def __init__( + self, + d_model: int, + nhead: int, + dropout: float, + activation: str, + norm_first: bool, + nlayer: int, + ff_ratio: int = 4, + ) -> None: + super().__init__() + decoder_layer = nn.TransformerDecoderLayer( + d_model, + nhead, + dim_feedforward=ff_ratio * d_model, + dropout=dropout, + activation=activation, + batch_first=True, + norm_first=norm_first, + ) + + self.decoder = nn.TransformerDecoder(decoder_layer, nlayer) + + def forward( + self, x: Tensor, memory: Tensor, tgt_mask: Tensor, tgt_padding_mask: Tensor + ) -> Tensor: + x = self.decoder( + x, memory, tgt_mask=tgt_mask, tgt_key_padding_mask=tgt_padding_mask + ) + return x + + +class PositionEmbedding(nn.Module): + def __init__(self, max_seq_len: int, d_model: int, dropout: float) -> None: + super().__init__() + self.embedding = nn.Embedding(max_seq_len, d_model) + self.dropout = nn.Dropout(dropout) + + def forward(self, x: Tensor) -> Tensor: + # assume x is batch first + out = self.embedding(torch.arange(x.shape[1], device=x.device)) + return self.dropout(out + x) + + +class TokenEmbedding(nn.Module): + def __init__( + self, + vocab_size: int, + d_model: int, + padding_idx: int, + ) -> None: + super().__init__() + assert vocab_size > 0 + self.embedding = nn.Embedding(vocab_size, d_model, padding_idx=padding_idx) + + def forward(self, x: Tensor) -> Tensor: + return self.embedding(x) + + +class PrintLayer(nn.Module): + """Only for debugging when loss is nan.""" + + def __init__(self): + super().__init__() + + def forward(self, x): + print( + "torch.isfinite(x).all(): {}, min. {:.5f}, max. {:.5f}".format( + torch.isfinite(x).all(), x.min(), x.max() + ) + ) + return x + + +if __name__ == "__main__": + from torchvision import models + + x = torch.rand(1, 3, 392, 392) + model = ImgConvStemBackbone( + d_model=512, downsample_factor=16, output_channels=64, kernel_size=5 + ) + y = model(x) + print(model) + print(y.shape) + + model = ImgCnnBackbone( + backbone=models.resnet34(), + output_channels=512, + d_model=512, + drop_layer=(3, 8, 9), + ) + + # print(model) + y = model(x) + print(y.shape) diff --git a/unitable/src/model/encoderdecoder.py b/unitable/src/model/encoderdecoder.py new file mode 100644 index 0000000000000000000000000000000000000000..070bcc033b1efe541ba90db5eab6d6fa17ec3451 --- /dev/null +++ b/unitable/src/model/encoderdecoder.py @@ -0,0 +1,109 @@ +import torch +from torch import Tensor, nn +from functools import partial + +from .components import ( + ImgCnnBackbone, + ImgLinearBackbone, + ImgConvStemBackbone, + Encoder, + Decoder, + PositionEmbedding, + TokenEmbedding, +) + + +class EncoderDecoder(nn.Module): + """Encoder decoder architecture that takes in a tabular image and generates the text output. + Backbone serves as the image processor. There are three types of backbones: CNN, linear projection, and ConvStem. + + Args: + ---- + backbone: tabular image processor + encoder: transformer encoder + decoder: transformer decoder + vocab_size: size of the vocabulary + d_model: feature size + padding_idx: index of in the vocabulary + max_seq_len: max sequence length of generated text + dropout: dropout rate + norm_layer: layernorm + init_std: std in weights initialization + """ + + def __init__( + self, + backbone: nn.Module, + encoder: nn.Module, + decoder: nn.Module, + vocab_size: int, + d_model: int, + padding_idx: int, + max_seq_len: int, + dropout: float, + norm_layer: nn.Module, + init_std: float = 0.02, + ): + super().__init__() + + self.backbone = backbone + self.encoder = encoder + self.decoder = decoder + self.norm = norm_layer(d_model) + self.token_embed = TokenEmbedding( + vocab_size=vocab_size, d_model=d_model, padding_idx=padding_idx + ) + self.pos_embed = PositionEmbedding( + max_seq_len=max_seq_len, d_model=d_model, dropout=dropout + ) + self.generator = nn.Linear(d_model, vocab_size) + + self.trunc_normal = partial( + nn.init.trunc_normal_, std=init_std, a=-init_std, b=init_std + ) + self.apply(self._init_weights) + + def _init_weights(self, m: nn.Module): + if isinstance(m, nn.Linear): + self.trunc_normal(m.weight) + if m.bias is not None: + nn.init.constant_(m.bias, 0.0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.weight, 1.0) + nn.init.constant_(m.bias, 0.0) + elif isinstance(m, nn.Conv2d): + self.trunc_normal(m.weight) + if m.bias is not None: + nn.init.constant_(m.bias, 0.0) + elif isinstance(m, PositionEmbedding): + self.trunc_normal(m.embedding.weight) + elif isinstance(m, TokenEmbedding): + self.trunc_normal(m.embedding.weight) + + @torch.jit.ignore + def no_weight_decay(self): + return {"token_embed", "pos_embed"} + + def encode(self, src: Tensor) -> Tensor: + src_feature = self.backbone(src) + src_feature = self.pos_embed(src_feature) + memory = self.encoder(src_feature) + memory = self.norm(memory) + return memory + + def decode( + self, memory: Tensor, tgt: Tensor, tgt_mask: Tensor, tgt_padding_mask: Tensor + ) -> Tensor: + tgt_feature = self.pos_embed(self.token_embed(tgt)) + tgt = self.decoder(tgt_feature, memory, tgt_mask, tgt_padding_mask) + + return tgt + + def forward( + self, src: Tensor, tgt: Tensor, tgt_mask: Tensor, tgt_padding_mask: Tensor + ) -> Tensor: + memory = self.encode(src) + tgt = self.decode(memory, tgt, tgt_mask, tgt_padding_mask) + tgt = self.generator(tgt) + + return tgt diff --git a/unitable/src/model/vqvae.py b/unitable/src/model/vqvae.py new file mode 100644 index 0000000000000000000000000000000000000000..edcfffc6d4717bb718a684a9de740e437ba495f9 --- /dev/null +++ b/unitable/src/model/vqvae.py @@ -0,0 +1,213 @@ +import torch +from torch import nn, Tensor, einsum +from typing import Optional, Tuple +import math +from functools import partial +from collections import OrderedDict +import torch.nn.functional as F +from einops import rearrange + + +def exists(val): + return val is not None + + +def default(val, d): + return val if exists(val) else d + + +def eval_decorator(fn): + def inner(model, *args, **kwargs): + was_training = model.training + model.eval() + out = fn(model, *args, **kwargs) + model.train(was_training) + return out + + return inner + + +class ResBlock(nn.Module): + def __init__(self, chan_in, hidden_size, chan_out): + super().__init__() + self.net = nn.Sequential( + nn.Conv2d(chan_in, hidden_size, 3, padding=1), + nn.ReLU(), + nn.Conv2d(hidden_size, hidden_size, 3, padding=1), + nn.ReLU(), + nn.Conv2d(hidden_size, chan_out, 1), + ) + + def forward(self, x): + return self.net(x) + x + + +class BasicVAE(nn.Module): + def get_codebook_indices(self, images): + raise NotImplementedError() + + def decode(self, img_seq): + raise NotImplementedError() + + def get_codebook_probs(self, img_seq): + raise NotImplementedError() + + def get_image_tokens_size(self): + pass + + def get_image_size(self): + pass + + +class DiscreteVAE(BasicVAE): + def __init__( + self, + image_size: Tuple[int, int] = [256, 256], # input image size + codebook_tokens: int = 512, # codebook vocab size + codebook_dim: int = 512, # codebook embedding dimension + num_layers: int = 3, # layers of resnet blocks in encoder/decoder + hidden_dim: int = 64, # dimension in resnet blocks + channels: int = 3, # input channels + smooth_l1_loss: bool = False, # prevents exploding gradients + temperature: float = 0.9, # tau in gumbel softmax + straight_through: bool = False, # if True, the returned samples will be discretized as one-hot vectors, but will be differentiated as if it is the soft sample in autograd + kl_div_loss_weight: float = 0.0, + ): + super().__init__() + assert num_layers >= 1, "number of layers must be greater than or equal to 1" + + self.image_size = image_size + self.codebook_tokens = codebook_tokens + self.num_layers = num_layers + self.temperature = temperature + self.straight_through = straight_through + self.codebook = nn.Embedding(codebook_tokens, codebook_dim) + + encoder_layers = list() + decoder_layers = list() + + encoder_in = channels + decoder_in = codebook_dim + + for _ in range(num_layers): + encoder_layers.append( + nn.Sequential( + nn.Conv2d(encoder_in, hidden_dim, 4, stride=2, padding=1), nn.ReLU() + ) + ) + encoder_layers.append( + ResBlock( + chan_in=hidden_dim, hidden_size=hidden_dim, chan_out=hidden_dim + ) + ) + encoder_in = hidden_dim + + decoder_layers.append( + nn.Sequential( + nn.ConvTranspose2d(decoder_in, hidden_dim, 4, stride=2, padding=1), + nn.ReLU(), + ) + ) + decoder_layers.append( + ResBlock( + chan_in=hidden_dim, hidden_size=hidden_dim, chan_out=hidden_dim + ) + ) + decoder_in = hidden_dim + + encoder_layers.append(nn.Conv2d(hidden_dim, codebook_tokens, 1)) + decoder_layers.append(nn.Conv2d(hidden_dim, channels, 1)) + + self.encoder = nn.Sequential(*encoder_layers) + self.decoder = nn.Sequential(*decoder_layers) + + self.loss_fn = F.smooth_l1_loss if smooth_l1_loss else F.mse_loss + self.kl_div_loss_weight = kl_div_loss_weight + + def get_image_size(self): + return self.image_size + + def get_image_tokens_size(self) -> int: + ds_ratio = math.pow(2, self.num_layers) + return int((self.image_size[0] // ds_ratio) * (self.image_size[1] // ds_ratio)) + + @torch.no_grad() + @eval_decorator + def get_codebook_indices(self, images: Tensor): + logits = self.forward(images, return_logits=True) + codebook_indices = logits.argmax(dim=1) + return codebook_indices + + @torch.no_grad() + @eval_decorator + def get_codebook_probs(self, images: Tensor): + logits = self.forward(images, return_logits=True) + return nn.Softmax(dim=1)(logits) + + def decode(self, img_seq: Tensor): + image_embeds = self.codebook(img_seq) + image_embeds = image_embeds.permute((0, 3, 1, 2)).contiguous() + + # image_embeds = rearrange(image_embeds, "b h w d -> b d h w", h=h, w=w) + images = self.decoder(image_embeds) + return images + + def forward( + self, + img: Tensor, + return_loss: bool = False, + return_recons: bool = False, + return_logits: bool = False, + temp=None, + ) -> Tuple[Tensor, Optional[Tensor]]: + assert ( + img.shape[-1] == self.image_size[0] and img.shape[-2] == self.image_size[1] + ), f"input must have the correct image size {self.image_size}" + + logits = self.encoder(img) + + if return_logits: + return logits # return logits for getting hard image indices for DALL-E training + + temp = default(temp, self.temperature) + soft_one_hot = F.gumbel_softmax( + logits, tau=temp, dim=1, hard=self.straight_through + ) + sampled = einsum( + "b n h w, n d -> b d h w", soft_one_hot, self.codebook.weight + ).contiguous() + out = self.decoder(sampled) + + if not return_loss: + return out + + # reconstruction loss + recon_loss = self.loss_fn(img, out) + + # kl divergence + logits = rearrange(logits, "b n h w -> b (h w) n").contiguous() + qy = F.softmax(logits, dim=-1) + + log_qy = torch.log(qy + 1e-10) + log_uniform = torch.log( + torch.tensor([1.0 / self.codebook_tokens], device=img.device) + ) + kl_div = F.kl_div(log_uniform, log_qy, None, None, "batchmean", log_target=True) + + loss = recon_loss + (kl_div * self.kl_div_loss_weight) + + if not return_recons: + return loss + + return loss, out + + +if __name__ == "__main__": + input = torch.rand(1, 3, 256, 256) + model = DiscreteVAE() + loss, output = model(input, return_loss=True, return_recons=True) + + print(model) + print(model.get_image_tokens_size()) + print(model.get_codebook_indices(input).shape) + print(loss, output.shape, output.max(), output.min()) diff --git a/unitable/src/trainer/__init__.py b/unitable/src/trainer/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..fd8672021a681e33691c8de196a1877221074ace --- /dev/null +++ b/unitable/src/trainer/__init__.py @@ -0,0 +1,3 @@ +from .train_beit import BeitTrainer +from .train_vqvae import VqvaeTrainer +from .train_table import TableTrainer \ No newline at end of file diff --git a/unitable/src/trainer/train_beit.py b/unitable/src/trainer/train_beit.py new file mode 100644 index 0000000000000000000000000000000000000000..658c0fdf05664c9a87c184af1c61c91f537b174f --- /dev/null +++ b/unitable/src/trainer/train_beit.py @@ -0,0 +1,245 @@ +import wandb +from pathlib import Path +from typing import Tuple, List, Union, Dict +from omegaconf import DictConfig +from hydra.utils import instantiate +import logging +import torch +import time +from torch import nn, Tensor, autograd +from torch.utils.data import DataLoader +from torch.nn.parallel import DistributedDataParallel as DDP + +from ..utils import printer, compute_grad_norm +from ..trainer.utils import configure_optimizer_weight_decay + +SNAPSHOT_KEYS = set(["EPOCH", "STEP", "OPTIMIZER", "LR_SCHEDULER", "MODEL", "LOSS"]) + + +class BeitTrainer: + def __init__( + self, + device: int, + model: nn.Module, + model_vqvae: nn.Module, + log: logging.Logger, + exp_dir: Path, + snapshot: Path = None, + model_weights: Path = None, # only for testing + ) -> None: + self.device = device + self.log = log + self.exp_dir = exp_dir + self.criterion = nn.CrossEntropyLoss() + assert ( + snapshot is None or model_weights is None + ), "Snapshot and model weights cannot be set at the same time." + + self.model = model + if snapshot is not None and snapshot.is_file(): + self.snapshot = self.load_snapshot(snapshot) + self.model.load_state_dict(self.snapshot["MODEL"]) + self.start_epoch = self.snapshot["EPOCH"] + self.global_step = self.snapshot["STEP"] + elif model_weights is not None and model_weights.is_file(): + self.load_model(model_weights) + else: + self.snapshot = None + self.start_epoch = 0 + self.global_step = 0 + + self.model = self.model.to(device) + self.model = DDP(self.model, device_ids=[device]) + self.model_vqvae = model_vqvae.to(device) + + # https://discuss.pytorch.org/t/extra-10gb-memory-on-gpu-0-in-ddp-tutorial/118113 + torch.cuda.set_device(device) # master gpu takes up extra memory + torch.cuda.empty_cache() + + def train_epoch(self, epoch: int, grad_clip: float = None): + start = time.time() + total_loss = 0.0 + total_samples = 0 + + for i, obj in enumerate(self.train_dataloader): + (trans_image, vqvae_image), bool_mask_pos = obj + trans_image, vqvae_image, bool_mask_pos = ( + trans_image.to(self.device), + vqvae_image.to(self.device), + bool_mask_pos.to(self.device), + ) + + with torch.no_grad(): + input_ids = self.model_vqvae.get_codebook_indices(vqvae_image).flatten( + 1 + ) + bool_mask_pos = bool_mask_pos.flatten(1).to(torch.bool) + labels = input_ids[bool_mask_pos] + + with autograd.detect_anomaly(): + outputs = self.model( + trans_image, bool_mask_pos, return_all_tokens=False + ) + loss = self.criterion(outputs, labels) + + self.optimizer.zero_grad() + loss.backward() + if grad_clip: + nn.utils.clip_grad_norm_( + self.model.parameters(), max_norm=grad_clip + ) + self.optimizer.step() + + loss = loss.detach().cpu().data + total_loss += loss * trans_image.shape[0] + total_samples += trans_image.shape[0] + + self.lr_scheduler.step() + self.global_step += 1 + + if i % 10 == 0: + grad_norm = compute_grad_norm(self.model) + lr = self.optimizer.param_groups[0]["lr"] + elapsed = time.time() - start + self.log.info( + printer( + self.device, + f"Epoch {epoch} Step {i + 1}/{len(self.train_dataloader)} | Loss {loss:.4f} ({total_loss / total_samples:.4f}) | Grad norm {grad_norm:.3f} | {total_samples / elapsed:4.1f} images/s | lr {lr:5.1e}", + ) + ) + + if i % 100 == 0 and self.device == 0: + lr = self.optimizer.param_groups[0]["lr"] + log_info = { + "epoch": epoch, + "train_loss": loss, + "learning rate": lr, + "grad_norm": grad_norm, + } + + wandb.log( + log_info, + step=self.global_step, + ) + + return total_loss / total_samples + + def train( + self, + train_dataloader: DataLoader, + valid_dataloader: DataLoader, + train_cfg: DictConfig, + valid_cfg: DictConfig, + ): + self.train_dataloader = train_dataloader + self.valid_dataloader = valid_dataloader + + # ensure correct weight decay: https://github.com/karpathy/minGPT/blob/37baab71b9abea1b76ab957409a1cc2fbfba8a26/mingpt/model.py#L215 + optim_params = configure_optimizer_weight_decay( + self.model.module, weight_decay=train_cfg.optimizer.weight_decay + ) + self.optimizer = instantiate(train_cfg.optimizer, optim_params) + + self.lr_scheduler = instantiate( + train_cfg.lr_scheduler, optimizer=self.optimizer + ) + + if self.snapshot is not None: + self.optimizer.load_state_dict(self.snapshot["OPTIMIZER"]) + self.lr_scheduler.load_state_dict(self.snapshot["LR_SCHEDULER"]) + + best_loss = float("inf") + self.model.train() + for epoch in range(self.start_epoch, train_cfg.epochs): + train_dataloader.sampler.set_epoch(epoch) + train_loss = self.train_epoch(epoch, grad_clip=train_cfg.grad_clip) + + torch.cuda.empty_cache() + + valid_loss = self.valid(valid_cfg) + + if self.device == 0: + wandb.log( + { + "train loss (epoch)": train_loss, + "valid loss (epoch)": valid_loss, + }, + step=self.global_step, + ) + + if epoch % train_cfg.save_every == 0: + self.save_snapshot(epoch, best_loss) + if valid_loss < best_loss: + self.save_model(epoch) + best_loss = valid_loss + + def valid(self, cfg: DictConfig): + total_samples = 0 + total_loss = 0.0 + + self.model.eval() + for i, obj in enumerate(self.valid_dataloader): + (trans_image, vqvae_image), bool_mask_pos = obj + trans_image, vqvae_image, bool_mask_pos = ( + trans_image.to(self.device), + vqvae_image.to(self.device), + bool_mask_pos.to(self.device), + ) + + with torch.no_grad(): + input_ids = self.model_vqvae.get_codebook_indices(vqvae_image).flatten( + 1 + ) + bool_mask_pos = bool_mask_pos.flatten(1).to(torch.bool) + labels = input_ids[bool_mask_pos] + + outputs = self.model( + trans_image, bool_mask_pos, return_all_tokens=False + ) + loss = self.criterion(outputs, labels) + + loss = loss.detach().cpu().data + total_loss += loss * trans_image.shape[0] + total_samples += trans_image.shape[0] + + if i % 10 == 0: + self.log.info( + printer( + self.device, + f"Valid: Step {i + 1}/{len(self.valid_dataloader)} | Loss {loss:.4f} ({total_loss / total_samples:.4f})", + ) + ) + + return total_loss / total_samples + + def save_model(self, epoch: int): + filename = Path(self.exp_dir) / "model" / f"epoch{epoch}_model.pt" + torch.save(self.model.module.state_dict(), filename) + self.log.info(printer(self.device, f"Saving model to {filename}")) + filename = Path(self.exp_dir) / "model" / f"best.pt" + torch.save(self.model.module.state_dict(), filename) + + def load_model(self, path: Union[str, Path]): + self.model.load_state_dict(torch.load(path, map_location="cpu")) + self.log.info(printer(self.device, f"Loading model from {path}")) + + def save_snapshot(self, epoch: int, best_loss: float): + state_info = { + "EPOCH": epoch + 1, + "STEP": self.global_step, + "OPTIMIZER": self.optimizer.state_dict(), + "LR_SCHEDULER": self.lr_scheduler.state_dict(), + "MODEL": self.model.module.state_dict(), + "LOSS": best_loss, + } + + snapshot_path = Path(self.exp_dir) / "snapshot" / f"epoch{epoch}_snapshot.pt" + torch.save(state_info, snapshot_path) + + self.log.info(printer(self.device, f"Saving snapshot to {snapshot_path}")) + + def load_snapshot(self, path: Path): + self.log.info(printer(self.device, f"Loading snapshot from {path}")) + snapshot = torch.load(path, map_location="cpu") + assert SNAPSHOT_KEYS.issubset(snapshot.keys()) + return snapshot diff --git a/unitable/src/trainer/train_table.py b/unitable/src/trainer/train_table.py new file mode 100644 index 0000000000000000000000000000000000000000..a604fcc5e18b4d8ae025477259e193c27c3e3586 --- /dev/null +++ b/unitable/src/trainer/train_table.py @@ -0,0 +1,467 @@ +from typing import Tuple, List, Union, Dict, Optional +import torch +import wandb +import json +import os +from torch import nn, Tensor, autograd +from torch.utils.data import DataLoader +from omegaconf import DictConfig +from hydra.utils import instantiate +import logging +from pathlib import Path +from torch.nn.parallel import DistributedDataParallel as DDP +import tokenizers as tk +import torch.nn.functional as F + +from .utils import ( + Batch, + configure_optimizer_weight_decay, + turn_off_beit_grad, + VALID_HTML_TOKEN, + INVALID_CELL_TOKEN, + VALID_BBOX_TOKEN, +) +from ..utils import ( + printer, + compute_grad_norm, + count_total_parameters, + batch_autoregressive_decode, + combine_filename_pred_gt, +) + +SNAPSHOT_KEYS = set(["EPOCH", "STEP", "OPTIMIZER", "LR_SCHEDULER", "MODEL", "LOSS"]) + + +class TableTrainer: + """A trainer for table recognition. The supported tasks are: + 1) table structure extraction + 2) table cell bbox detection + 3) table cell content recognition + + Args: + ---- + device: gpu id + vocab: a vocab shared among all tasks + model: model architecture + log: logger + exp_dir: the experiment directory that saves logs, wandb files, model weights, and checkpoints (snapshots) + snapshot: specify which snapshot to use, only used in training + model_weights: specify which model weight to use, only used in testing + beit_pretrained_weights: load SSL pretrained visual encoder + freeze_beit_epoch: freeze beit weights for the first {freeze_beit_epoch} epochs + """ + + def __init__( + self, + device: int, + vocab: tk.Tokenizer, + model: nn.Module, + log: logging.Logger, + exp_dir: Path, + snapshot: Path = None, + model_weights: str = None, + beit_pretrained_weights: str = None, + freeze_beit_epoch: int = None, + ) -> None: + self.device = device + self.log = log + self.exp_dir = exp_dir + self.vocab = vocab + self.padding_idx = vocab.token_to_id("") + self.freeze_beit_epoch = freeze_beit_epoch + + # loss for training html, cell + self.criterion = nn.CrossEntropyLoss(ignore_index=self.padding_idx) + + self.model = model + + if ( + beit_pretrained_weights is not None + and Path(beit_pretrained_weights).is_file() + ): + self.load_pretrained_beit(Path(beit_pretrained_weights)) + + assert ( + snapshot is None or model_weights is None + ), "Cannot set snapshot and model_weights at the same time!" + + if snapshot is not None and snapshot.is_file(): + self.snapshot = self.load_snapshot(snapshot) + self.model.load_state_dict(self.snapshot["MODEL"]) + self.start_epoch = self.snapshot["EPOCH"] + self.global_step = self.snapshot["STEP"] + elif model_weights is not None and Path(model_weights).is_file(): + self.load_model(Path(model_weights)) + else: + self.snapshot = None + self.start_epoch = 0 + self.global_step = 0 + + if freeze_beit_epoch and freeze_beit_epoch > 0: + self._freeze_beit() + + self.model = self.model.to(device) + self.model = DDP(self.model, device_ids=[device]) + + # https://discuss.pytorch.org/t/extra-10gb-memory-on-gpu-0-in-ddp-tutorial/118113 + torch.cuda.set_device(device) # master gpu takes up extra memory + torch.cuda.empty_cache() + + def _freeze_beit(self): + if self.start_epoch < self.freeze_beit_epoch: + turn_off_beit_grad(self.model) + self.log.info( + printer( + self.device, + f"Lock SSL params for {self.freeze_beit_epoch} epochs (params: {count_total_parameters(self.model) / 1e6:.2f}M) - Current epoch {self.start_epoch + 1}", + ) + ) + else: + self.log.info( + printer( + self.device, + f"Unlock all weights (params: {count_total_parameters(self.model) / 1e6:.2f}M) - Current epoch {self.start_epoch + 1}", + ) + ) + + def train_epoch( + self, + epoch: int, + target: str, + loss_weights: List[float], + grad_clip: float = None, + ): + avg_loss = 0.0 + + # load data from dataloader + for i, obj in enumerate(self.train_dataloader): + batch = Batch(device=self.device, target=target, vocab=self.vocab, obj=obj) + + with autograd.detect_anomaly(): + loss, _ = batch.inference( + self.model, + criterion=self.criterion, + criterion_bbox=self.criterion_bbox, + loss_weights=loss_weights, + ) + + total_loss = loss["total"] + + self.optimizer.zero_grad() + total_loss.backward() + if grad_clip: + nn.utils.clip_grad_norm_( + self.model.parameters(), max_norm=grad_clip + ) + self.optimizer.step() + + total_loss = total_loss.detach().cpu().data + avg_loss += total_loss + self.lr_scheduler.step() + self.global_step += 1 + + if i % 10 == 0: + grad_norm = compute_grad_norm(self.model) + lr = self.optimizer.param_groups[0]["lr"] + # elapsed = time.time() - start + + loss_info = f"Loss {total_loss:.3f} ({avg_loss / (i + 1):.3f})" + if not isinstance(loss["html"], int): + loss_info += f" Html {loss['html'].detach().cpu().data:.3f}" + if not isinstance(loss["cell"], int): + loss_info += f" Cell {loss['cell'].detach().cpu().data:.3f}" + if not isinstance(loss["bbox"], int): + loss_info += f" Bbox {loss['bbox'].detach().cpu().data:.3f}" + self.log.info( + printer( + self.device, + f"Epoch {epoch} Step {i + 1}/{len(self.train_dataloader)} | {loss_info} | Grad norm {grad_norm:.3f} | lr {lr:5.1e}", + ) + ) + + if i % 100 == 0 and self.device == 0: + log_info = { + "epoch": epoch, + "train_total_loss": total_loss, + "learning rate": lr, + "grad_norm": grad_norm, + } + + wandb.log( + log_info, + step=self.global_step, + ) + + def train( + self, + train_dataloader: DataLoader, + valid_dataloader: DataLoader, + train_cfg: DictConfig, + valid_cfg: DictConfig, + ): + self.train_dataloader = train_dataloader + self.valid_dataloader = valid_dataloader + + # ensure correct weight decay: https://github.com/karpathy/minGPT/blob/37baab71b9abea1b76ab957409a1cc2fbfba8a26/mingpt/model.py#L215 + optim_params = configure_optimizer_weight_decay( + self.model.module, weight_decay=train_cfg.optimizer.weight_decay + ) + + self.optimizer = instantiate(train_cfg.optimizer, optim_params) + + self.lr_scheduler = instantiate( + train_cfg.lr_scheduler, optimizer=self.optimizer + ) + + if self.snapshot is not None: + self.optimizer.load_state_dict(self.snapshot["OPTIMIZER"]) + self.lr_scheduler.load_state_dict(self.snapshot["LR_SCHEDULER"]) + + self.criterion_bbox = None + if "bbox" in train_cfg.target: + tmp = [ + self.vocab.token_to_id(i) + for i in VALID_BBOX_TOKEN[ + : train_cfg.img_size[0] + 2 + ] # +1 for +1 for bbox == img_size + ] + tmp = [1.0 if i in tmp else 0.0 for i in range(self.vocab.get_vocab_size())] + self.criterion_bbox = nn.CrossEntropyLoss( + weight=torch.tensor(tmp, device=self.device), + ignore_index=self.padding_idx, + ) + + best_loss = float("inf") + self.model.train() + + if self.freeze_beit_epoch and self.start_epoch < self.freeze_beit_epoch: + max_epoch = self.freeze_beit_epoch + else: + max_epoch = train_cfg.epochs + for epoch in range(self.start_epoch, max_epoch): + train_dataloader.sampler.set_epoch(epoch) + + self.train_epoch( + epoch, + grad_clip=train_cfg.grad_clip, + target=train_cfg.target, + loss_weights=train_cfg.loss_weights, + ) + + torch.cuda.empty_cache() + + valid_loss = self.valid(valid_cfg) + + if self.device == 0: + wandb.log( + {"valid loss (epoch)": valid_loss}, + step=self.global_step, + ) + + if epoch % train_cfg.save_every == 0: + self.save_snapshot(epoch, best_loss) + if valid_loss < best_loss: + self.save_model(epoch) + best_loss = valid_loss + + def valid(self, cfg: DictConfig): + total_loss = 0.0 + avg_loss = 0.0 + total_samples = 0 + + self.model.eval() + for i, obj in enumerate(self.valid_dataloader): + batch = Batch( + device=self.device, target=cfg.target, vocab=self.vocab, obj=obj + ) + with torch.no_grad(): + loss, _ = batch.inference( + self.model, + criterion=self.criterion, + criterion_bbox=self.criterion_bbox, + loss_weights=cfg.loss_weights, + ) + + total_loss = loss["total"] + total_loss = total_loss.detach().cpu().data + avg_loss += total_loss * batch.image.shape[0] + total_samples += batch.image.shape[0] + + if i % 10 == 0: + loss_info = f"Loss {total_loss:.3f} ({avg_loss / total_samples:.3f})" + if not isinstance(loss["html"], int): + loss_info += f" Html {loss['html'].detach().cpu().data:.3f}" + if not isinstance(loss["cell"], int): + loss_info += f" Cell {loss['cell'].detach().cpu().data:.3f}" + if not isinstance(loss["bbox"], int): + loss_info += f" Bbox {loss['bbox'].detach().cpu().data:.3f}" + self.log.info( + printer( + self.device, + f"Valid: Step {i + 1}/{len(self.valid_dataloader)} | {loss_info}", + ) + ) + + return avg_loss / total_samples + + def test(self, test_dataloader: DataLoader, cfg: DictConfig, save_to: str): + total_result = dict() + for i, obj in enumerate(test_dataloader): + batch = Batch( + device=self.device, target=cfg.target, vocab=self.vocab, obj=obj + ) + + if cfg.target == "html": + prefix = [self.vocab.token_to_id("[html]")] + valid_token_whitelist = [ + self.vocab.token_to_id(i) for i in VALID_HTML_TOKEN + ] + valid_token_blacklist = None + elif cfg.target == "cell": + prefix = [self.vocab.token_to_id("[cell]")] + valid_token_whitelist = None + valid_token_blacklist = [ + self.vocab.token_to_id(i) for i in INVALID_CELL_TOKEN + ] + elif cfg.target == "bbox": + prefix = [self.vocab.token_to_id("[bbox]")] + valid_token_whitelist = [ + self.vocab.token_to_id(i) + for i in VALID_BBOX_TOKEN[: cfg.img_size[0]] + ] + valid_token_blacklist = None + else: + raise NotImplementedError + + pred_id = batch_autoregressive_decode( + device=self.device, + model=self.model, + batch_data=batch, + prefix=prefix, + max_decode_len=cfg.max_seq_len, + eos_id=self.vocab.token_to_id(""), + valid_token_whitelist=valid_token_whitelist, + valid_token_blacklist=valid_token_blacklist, + sampling=cfg.sampling, + ) + + if cfg.target == "html": + result = combine_filename_pred_gt( + filename=batch.name, + pred_id=pred_id, + gt_id=batch.html_tgt, + vocab=self.vocab, + type="html", + ) + elif cfg.target == "cell": + result = combine_filename_pred_gt( + filename=batch.name, + pred_id=pred_id, + gt_id=batch.cell_tgt, + vocab=self.vocab, + type="cell", + ) + elif cfg.target == "bbox": + result = combine_filename_pred_gt( + filename=batch.name, + pred_id=pred_id, + gt_id=batch.bbox_tgt, + vocab=self.vocab, + type="bbox", + ) + else: + raise NotImplementedError + + total_result.update(result) + + if i % 10 == 0: + self.log.info( + printer( + self.device, + f"Test: Step {i + 1}/{len(test_dataloader)}", + ) + ) + + self.log.info( + printer( + self.device, + f"Converting {len(total_result)} samples to html tables ...", + ) + ) + + with open( + os.path.join(save_to, cfg.save_to_prefix + f"_{self.device}.json"), + "w", + encoding="utf-8", + ) as f: + json.dump(total_result, f, indent=4) + + return total_result + + def save_model(self, epoch: int): + filename = Path(self.exp_dir) / "model" / f"epoch{epoch}_model.pt" + torch.save(self.model.module.state_dict(), filename) + self.log.info(printer(self.device, f"Saving model to {filename}")) + filename = Path(self.exp_dir) / "model" / "best.pt" + torch.save(self.model.module.state_dict(), filename) + + def load_model(self, path: Union[str, Path]): + self.model.load_state_dict(torch.load(path, map_location="cpu")) + self.log.info(printer(self.device, f"Loading model from {path}")) + + def save_snapshot(self, epoch: int, best_loss: float): + state_info = { + "EPOCH": epoch + 1, + "STEP": self.global_step, + "OPTIMIZER": self.optimizer.state_dict(), + "LR_SCHEDULER": self.lr_scheduler.state_dict(), + "MODEL": self.model.module.state_dict(), + "LOSS": best_loss, + } + + snapshot_path = Path(self.exp_dir) / "snapshot" / f"epoch{epoch}_snapshot.pt" + torch.save(state_info, snapshot_path) + + self.log.info(printer(self.device, f"Saving snapshot to {snapshot_path}")) + + def load_snapshot(self, path: Path): + self.log.info(printer(self.device, f"Loading snapshot from {path}")) + snapshot = torch.load(path, map_location="cpu") + assert SNAPSHOT_KEYS.issubset(snapshot.keys()) + return snapshot + + def load_pretrained_beit(self, path: Path): + self.log.info(printer(self.device, f"Loading pretrained BEiT from {path}")) + beit = torch.load(path, map_location="cpu") + redundant_keys_in_beit = [ + "cls_token", + "mask_token", + "generator.weight", + "generator.bias", + ] + for key in redundant_keys_in_beit: + if key in beit: + del beit[key] + + # max_seq_len in finetuning may go beyond the length in pretraining + if ( + self.model.pos_embed.embedding.weight.shape[0] + != beit["pos_embed.embedding.weight"].shape[0] + ): + emb_shape = self.model.pos_embed.embedding.weight.shape + ckpt_emb = beit["pos_embed.embedding.weight"].clone() + assert emb_shape[1] == ckpt_emb.shape[1] + + ckpt_emb = ckpt_emb.unsqueeze(0).permute(0, 2, 1) + ckpt_emb = F.interpolate(ckpt_emb, emb_shape[0], mode="nearest") + beit["pos_embed.embedding.weight"] = ckpt_emb.permute(0, 2, 1).squeeze() + + out = self.model.load_state_dict(beit, strict=False) + + # ensure missing keys are just token_embed, decoder, and generator + missing_keys_prefix = ("token_embed", "decoder", "generator") + for key in out[0]: + assert key.startswith( + missing_keys_prefix + ), f"Key {key} should be loaded from BEiT, but missing in current state dict." + assert len(out[1]) == 0, f"Unexpected keys from BEiT: {out[1]}" diff --git a/unitable/src/trainer/train_vqvae.py b/unitable/src/trainer/train_vqvae.py new file mode 100644 index 0000000000000000000000000000000000000000..4ea682ed48ca2f7d58df66023df08ce3988400a4 --- /dev/null +++ b/unitable/src/trainer/train_vqvae.py @@ -0,0 +1,297 @@ +import math +import wandb +from pathlib import Path +from typing import Tuple, List, Union, Dict +from omegaconf import DictConfig +from hydra.utils import instantiate +import logging +import torch +import time +from functools import partial +from torch import nn, Tensor, autograd +from torch.utils.data import DataLoader +from torch.optim import Adam +from torch.nn.parallel import DistributedDataParallel as DDP +import torch.distributed as dist +from torchvision.utils import make_grid + +from ..utils import printer, compute_grad_norm + +SNAPSHOT_KEYS = set(["EPOCH", "STEP", "OPTIMIZER", "LR_SCHEDULER", "MODEL", "LOSS"]) + + +class VqvaeTrainer: + def __init__( + self, + device: int, + model: nn.Module, + log: logging.Logger, + exp_dir: Path, + snapshot: Path = None, + model_weights: Path = None, # only for testing + ) -> None: + self.device = device + self.log = log + self.exp_dir = exp_dir + assert ( + snapshot is None or model_weights is None + ), "Snapshot and model weights cannot be set at the same time." + + self.model = model + if snapshot is not None and snapshot.is_file(): + self.snapshot = self.load_snapshot(snapshot) + self.model.load_state_dict(self.snapshot["MODEL"]) + self.start_epoch = self.snapshot["EPOCH"] + self.global_step = self.snapshot["STEP"] + elif model_weights is not None and model_weights.is_file(): + self.load_model(model_weights) + else: + self.snapshot = None + self.start_epoch = 0 + + self.model = self.model.to(device) + self.model = DDP(self.model, device_ids=[device]) + + # https://discuss.pytorch.org/t/extra-10gb-memory-on-gpu-0-in-ddp-tutorial/118113 + torch.cuda.set_device(device) # master gpu takes up extra memory + torch.cuda.empty_cache() + + def train_epoch( + self, + epoch: int, + starting_temp: float, + anneal_rate: float, + temp_min: float, + grad_clip: float = None, + ): + start = time.time() + total_loss = 0.0 + total_samples = 0 + + # load data from dataloader + for i, obj in enumerate(self.train_dataloader): + if isinstance(obj, Tensor): + img = obj.to(self.device) + elif isinstance(obj, (list, tuple)): + img = obj[0].to(self.device) + else: + raise ValueError(f"Unrecognized object type {type(obj)}") + + # temperature annealing + self.temp = max( + starting_temp * math.exp(-anneal_rate * self.global_step), temp_min + ) + + with autograd.detect_anomaly(): + loss, soft_recons = self.model( + img, return_loss=True, return_recons=True, temp=self.temp + ) + + self.optimizer.zero_grad() + loss.backward() + if grad_clip: + nn.utils.clip_grad_norm_( + self.model.parameters(), max_norm=grad_clip + ) + self.optimizer.step() + + loss = loss.detach().cpu().data + total_loss += loss * img.shape[0] + total_samples += img.shape[0] + + self.lr_scheduler.step() + self.global_step += 1 + + if i % 10 == 0: + grad_norm = compute_grad_norm(self.model) + lr = self.optimizer.param_groups[0]["lr"] + elapsed = time.time() - start + self.log.info( + printer( + self.device, + f"Epoch {epoch} Step {i + 1}/{len(self.train_dataloader)} | Loss {loss:.4f} ({total_loss / total_samples:.4f}) | Grad norm {grad_norm:.3f} | {total_samples / elapsed:4.1f} images/s | lr {lr:5.1e} | Temp {self.temp:.2e}", + ) + ) + + # visualize reconstruction images + if i % 100 == 0 and self.device == 0: + lr = self.optimizer.param_groups[0]["lr"] + k = 4 # num of images saved for visualization + codes = self.model.module.get_codebook_indices(img[:k]) + hard_recons = self.model.module.decode(codes) + + img = img[:k].detach().cpu() + soft_recons = soft_recons[:k].detach().cpu() + codes = codes.flatten(start_dim=1).detach().cpu() + hard_recons = hard_recons.detach().cpu() + + make_vis = partial(make_grid, nrow=int(math.sqrt(k)), normalize=True) + img, soft_recons, hard_recons = map( + make_vis, (img, soft_recons, hard_recons) + ) + + log_info = { + "epoch": epoch, + "train_loss": loss, + "temperature": self.temp, + "learning rate": lr, + "original images": wandb.Image( + img, caption=f"step: {self.global_step}" + ), + "soft reconstruction": wandb.Image( + soft_recons, caption=f"step: {self.global_step}" + ), + "hard reconstruction": wandb.Image( + hard_recons, caption=f"step: {self.global_step}" + ), + "codebook_indices": wandb.Histogram(codes), + } + + wandb.log( + log_info, + step=self.global_step, + ) + + return total_loss, total_samples + + def train( + self, + train_dataloader: DataLoader, + valid_dataloader: DataLoader, + train_cfg: DictConfig, + valid_cfg: DictConfig, + ): + self.train_dataloader = train_dataloader + self.valid_dataloader = valid_dataloader + self.optimizer = instantiate( + train_cfg.optimizer, params=self.model.parameters() + ) + + self.lr_scheduler = instantiate( + train_cfg.lr_scheduler, optimizer=self.optimizer + ) + + if self.snapshot is not None: + self.optimizer.load_state_dict(self.snapshot["OPTIMIZER"]) + self.lr_scheduler.load_state_dict(self.snapshot["LR_SCHEDULER"]) + + best_loss = float("inf") + self.model.train() + self.global_step = 0 + # self.temp = train_cfg.starting_temp + for epoch in range(self.start_epoch, train_cfg.epochs): + train_dataloader.sampler.set_epoch(epoch) + epoch_loss, epoch_samples = self.train_epoch( + epoch, + starting_temp=train_cfg.starting_temp, + anneal_rate=train_cfg.temp_anneal_rate, + temp_min=train_cfg.temp_min, + grad_clip=train_cfg.grad_clip, + ) + + torch.cuda.empty_cache() + + valid_loss, valid_samples = self.valid(valid_cfg) + + # reduce loss to gpu 0 + training_info = torch.tensor( + [epoch_loss, epoch_samples, valid_loss, valid_samples], + device=self.device, + ) + + dist.reduce( + training_info, + dst=0, + op=dist.ReduceOp.SUM, + ) + + if self.device == 0: + grad_norm = compute_grad_norm(self.model) + epoch_loss, epoch_samples, valid_loss, valid_samples = training_info + epoch_loss, valid_loss = ( + float(epoch_loss) / epoch_samples, + float(valid_loss) / valid_samples, + ) + + log_info = { + "train loss (epoch)": epoch_loss, + "valid loss (epoch)": valid_loss, + "train_samples": epoch_samples, + "valid_samples": valid_samples, + "grad_norm": grad_norm, + } + + wandb.log( + log_info, + step=self.global_step, + ) + + if epoch % train_cfg.save_every == 0: + self.save_snapshot(epoch, best_loss) + if valid_loss < best_loss: + self.save_model(epoch) + best_loss = valid_loss + + def valid(self, cfg: DictConfig): + total_samples = 0 + total_loss = 0.0 + + self.model.eval() + for i, obj in enumerate(self.valid_dataloader): + if isinstance(obj, Tensor): + img = obj.to(self.device) + elif isinstance(obj, (list, tuple)): + img = obj[0].to(self.device) + else: + raise ValueError(f"Unrecognized object type {type(obj)}") + + with torch.no_grad(): + loss = self.model( + img, return_loss=True, return_recons=False, temp=self.temp + ) + + loss = loss.detach().cpu().data + total_loss += loss * img.shape[0] + total_samples += img.shape[0] + + if i % 10 == 0: + self.log.info( + printer( + self.device, + f"Valid: Step {i + 1}/{len(self.valid_dataloader)} | Loss {loss:.4f} ({total_loss / total_samples:.4f})", + ) + ) + + return total_loss, total_samples + + def save_model(self, epoch: int): + filename = Path(self.exp_dir) / "model" / f"epoch{epoch}_model.pt" + torch.save(self.model.module.state_dict(), filename) + self.log.info(printer(self.device, f"Saving model to {filename}")) + filename = Path(self.exp_dir) / "model" / f"best.pt" + torch.save(self.model.module.state_dict(), filename) + + def load_model(self, path: Union[str, Path]): + self.model.load_state_dict(torch.load(path, map_location="cpu")) + self.log.info(printer(self.device, f"Loading model from {path}")) + + def save_snapshot(self, epoch: int, best_loss: float): + state_info = { + "EPOCH": epoch + 1, + "STEP": self.global_step, + "OPTIMIZER": self.optimizer.state_dict(), + "LR_SCHEDULER": self.lr_scheduler.state_dict(), + "MODEL": self.model.module.state_dict(), + "LOSS": best_loss, + } + + snapshot_path = Path(self.exp_dir) / "snapshot" / f"epoch{epoch}_snapshot.pt" + torch.save(state_info, snapshot_path) + + self.log.info(printer(self.device, f"Saving snapshot to {snapshot_path}")) + + def load_snapshot(self, path: Path): + self.log.info(printer(self.device, f"Loading snapshot from {path}")) + snapshot = torch.load(path, map_location="cpu") + assert SNAPSHOT_KEYS.issubset(snapshot.keys()) + return snapshot diff --git a/unitable/src/trainer/utils.py b/unitable/src/trainer/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..d09bd5714e4e0860a64f0ad1da807d8aa90c7cd1 --- /dev/null +++ b/unitable/src/trainer/utils.py @@ -0,0 +1,225 @@ +from typing import List, Tuple, Dict +import torch +from torch import Tensor, nn +from torchtext.vocab import Vocab +import tokenizers as tk + +from ..utils import pred_token_within_range, subsequent_mask +from ..vocab import ( + HTML_TOKENS, + TASK_TOKENS, + RESERVED_TOKENS, + BBOX_TOKENS, +) + + +VALID_HTML_TOKEN = [""] + HTML_TOKENS +INVALID_CELL_TOKEN = ( + ["", "", "", ""] + TASK_TOKENS + RESERVED_TOKENS +) +VALID_BBOX_TOKEN = [ + "" +] + BBOX_TOKENS # image size will be addressed after instantiation + + +class Batch: + """Wrap up a batch of training samples with different training targets. + The input is not torch tensor + Shape of the image (src): B, S, E + Shape of the text (tgt): B, N, S, E (M includes 1 table detection, 1 structure, 1 cell, and multiple bbox) + Reshape text to (B * N, S, E) and inflate the image to match the shape of the text + + Args: + ---- + device: gpu id + """ + + def __init__( + self, + device: torch.device, + target: str, + vocab: Vocab, + obj: List, + ) -> None: + self.device = device + self.image = obj[0].to(device) + self.name = obj[1]["filename"] + self.target = target + self.vocab = vocab + self.image_size = self.image.shape[-1] + + if "table" in target: + raise NotImplementedError + + if "html" in target: + self.valid_html_token = [vocab.token_to_id(i) for i in VALID_HTML_TOKEN] + ( + self.html_src, + self.html_tgt, + self.html_casual_mask, + self.html_padding_mask, + ) = self._prepare_transformer_input(obj[1]["html"]) + + if "cell" in target: + self.invalid_cell_token = [vocab.token_to_id(i) for i in INVALID_CELL_TOKEN] + ( + self.cell_src, + self.cell_tgt, + self.cell_casual_mask, + self.cell_padding_mask, + ) = self._prepare_transformer_input(obj[1]["cell"]) + + if "bbox" in target: + ( + self.bbox_src, + self.bbox_tgt, + self.bbox_casual_mask, + self.bbox_padding_mask, + ) = self._prepare_transformer_input(obj[1]["bbox"]) + + def _prepare_transformer_input( + self, seq: List[tk.Encoding] + ) -> Tuple[Tensor, Tensor, Tensor, Tensor]: + tmp = [i.ids for i in seq] + tmp = torch.tensor(tmp, dtype=torch.int32) + src = tmp[:, :-1].to(self.device) + tgt = tmp[:, 1:].type(torch.LongTensor).to(self.device) + casual_mask = subsequent_mask(src.shape[-1]).to(self.device) + tmp = [i.attention_mask[:-1] for i in seq] # padding mask + tmp = torch.tensor(tmp, dtype=torch.bool) + padding_mask = (~tmp).to(self.device) + + return src, tgt, casual_mask, padding_mask + + def _inference_one_task( + self, model, memory, src, casual_mask, padding_mask, use_ddp + ): + if use_ddp: + out = model.module.decode(memory, src, casual_mask, padding_mask) + out = model.module.generator(out) + else: + out = model.decode(memory, src, casual_mask, padding_mask) + out = model.generator(out) + + return out + + def inference( + self, + model: nn.Module, + criterion: nn.Module, + criterion_bbox: nn.Module = None, + loss_weights: dict = None, + use_ddp: bool = True, + ) -> Tuple[Dict, Dict]: + pred = dict() + loss = dict(table=0, html=0, cell=0, bbox=0) + + if use_ddp: + memory = model.module.encode(self.image) + else: + memory = model.encode(self.image) + + # inference + suppress invalid logits + compute loss + if "html" in self.target: + out_html = self._inference_one_task( + model, + memory, + self.html_src, + self.html_casual_mask, + self.html_padding_mask, + use_ddp, + ) + + pred["html"] = pred_token_within_range( + out_html, white_list=self.valid_html_token + ).permute(0, 2, 1) + loss["html"] = criterion(pred["html"], self.html_tgt) + + if "cell" in self.target: + out_cell = self._inference_one_task( + model, + memory, + self.cell_src, + self.cell_casual_mask, + self.cell_padding_mask, + use_ddp, + ) + + pred["cell"] = pred_token_within_range( + out_cell, black_list=self.invalid_cell_token + ).permute(0, 2, 1) + loss["cell"] = criterion(pred["cell"], self.cell_tgt) + + if "bbox" in self.target: + assert criterion_bbox is not None + + out_bbox = self._inference_one_task( + model, + memory, + self.bbox_src, + self.bbox_casual_mask, + self.bbox_padding_mask, + use_ddp, + ) + pred["bbox"] = out_bbox.permute(0, 2, 1) + loss["bbox"] = criterion_bbox(pred["bbox"], self.bbox_tgt) + + total = 0.0 + for k, v in loss_weights.items(): + total += loss[k] * v + loss["total"] = total + + return loss, pred + + +def configure_optimizer_weight_decay( + model: nn.Module, weight_decay: float +) -> List[Dict]: + weight_decay_blacklist = (nn.LayerNorm, nn.BatchNorm2d, nn.Embedding) + + if hasattr(model, "no_weight_decay"): + skip_list = model.no_weight_decay() + decay = set() + no_decay = set() + for mn, m in model.named_modules(): + for pn, p in m.named_parameters(): + fpn = "%s.%s" % (mn, pn) if mn else pn # full param name + if pn.endswith("bias"): + no_decay.add(fpn) + elif pn.endswith("weight") and isinstance(m, weight_decay_blacklist): + no_decay.add(fpn) + elif pn in skip_list: + no_decay.add(fpn) + + param_dict = {pn: p for pn, p in model.named_parameters()} + decay = param_dict.keys() - no_decay + + optim_groups = [ + { + "params": [param_dict[pn] for pn in sorted(list(decay))], + "weight_decay": weight_decay, + }, + { + "params": [param_dict[pn] for pn in sorted(list(no_decay))], + "weight_decay": 0.0, + }, + ] + + return optim_groups + + +def turn_off_beit_grad(model: nn.Module): + "Freeze BEiT pretrained weights." + for param in model.encoder.parameters(): + param.requires_grad = False + + for param in model.backbone.parameters(): + param.requires_grad = False + + for param in model.pos_embed.parameters(): + param.requires_grad = False + + +def turn_on_beit_grad(model: nn.Module): + for param in model.parameters(): + param.requires_grad = True diff --git a/unitable/src/utils/__init__.py b/unitable/src/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c213338e9b5fcbe101d9ecd957406276f3fac5c5 --- /dev/null +++ b/unitable/src/utils/__init__.py @@ -0,0 +1,4 @@ +from .visualization import * +from .data import * +from .mask_generator import * +from .misc import * diff --git a/unitable/src/utils/coco_map.py b/unitable/src/utils/coco_map.py new file mode 100644 index 0000000000000000000000000000000000000000..0151ade2c26c23025990063f7d4e6e33cf6fe5bb --- /dev/null +++ b/unitable/src/utils/coco_map.py @@ -0,0 +1,47 @@ +import torch +from torchmetrics.detection import MeanAveragePrecision +from pprint import pprint + + +def compute_coco_map(file): + coco_pred = list() + coco_gt = list() + for _, obj in file.items(): + tmp_pred = { + "boxes": torch.tensor(obj["pred"], device=0), + "labels": torch.tensor([0] * len(obj["pred"]), device=0), + "scores": torch.tensor([0.999] * len(obj["pred"]), device=0), + } + + tmp_gt = { + "boxes": torch.tensor(obj["gt"], device=0), + "labels": torch.tensor([0] * len(obj["gt"]), device=0), + } + + coco_pred.append(tmp_pred) + coco_gt.append(tmp_gt) + + metric = MeanAveragePrecision( + iou_type="bbox", + max_detection_thresholds=[1, 10, 1000], + backend="faster_coco_eval", + ) + metric.update(coco_pred, coco_gt) + pprint(metric.compute()) + + +if __name__ == "__main__": + import json + import argparse + + parser = argparse.ArgumentParser(description="mAP Computation") + + parser.add_argument("-f", "--file", help="path to html table results in json file") + args = parser.parse_args() + + + results_file = args.file + with open(results_file, "r") as f: + results_json = json.load(f) + + compute_coco_map(results_json) diff --git a/unitable/src/utils/data.py b/unitable/src/utils/data.py new file mode 100644 index 0000000000000000000000000000000000000000..1ccfafbcb8c64bb2e7147070b2a28e8012aff769 --- /dev/null +++ b/unitable/src/utils/data.py @@ -0,0 +1,318 @@ +from typing import List, Tuple +import random +import tokenizers as tk +import torch +from torch import Tensor, nn +import torch.nn.functional as F + +from ..vocab import TASK_TOKENS, CELL_SPECIAL +from ..model.encoderdecoder import EncoderDecoder +from .misc import html_table_template + +__all__ = [ + "subsequent_mask", + "combine_cell_char_seq", + "random_continuous_sequence", + "prepare_html_seq", + "prepare_cell_seq", + "prepare_bbox_seq", + "html_str_to_token_list", + "cell_str_to_token_list", + "bbox_str_to_token_list", + "pred_token_within_range", + "batch_autoregressive_decode", + "greedy_sampling", + "combine_filename_pred_gt", + "build_table_from_html_and_cell" +] + + +def subsequent_mask(size: int, pad: int = 0): + attn_shape = (size, size) + output = torch.triu(torch.ones(attn_shape), diagonal=1).to(torch.bool) + if pad and pad > 0: + output[:pad] = False + return output + + +def combine_cell_char_seq(seq: List[str]) -> str: + """Replace empty token with in vocab. combine characters into a str""" + if seq: + out = "".join(seq) + else: + out = "" + return out + + +def prepare_html_seq(seq: List[str]) -> List[str]: + """Convert html annotations to html training template.""" + out = ["[html]", *seq, ""] + return out + + +def prepare_cell_seq(seq: str) -> List[str]: + """Convert cell sequence to training template.""" + for black in CELL_SPECIAL: + seq = seq.replace(black, "") + out = ["[cell]", seq, ""] + + return out + + +def prepare_bbox_seq(seq: List[dict]): + tmp = [f"bbox-{round(i)}" for i in seq] + out = ["[bbox]"] + tmp + [""] + + return out + + +def random_continuous_sequence(seq: List, N: int, length: int = 10) -> List: + """Randomly sample a continuous sub-sequence from a sequence for N times.""" + start_idx = [random.randrange(len(seq)) for _ in range(N)] + subseq_len = [random.randrange(1, length) for _ in range(N)] + output = [(i, min(i + j, len(seq))) for i, j in zip(start_idx, subseq_len)] + + return output + + +# def prepare_bbox_seq( +# seq: List[dict], +# N: int, +# delimiter: str = "", +# ) -> List[List[str]]: +# """Convert the annotation to bbox input/output sequence.""" +# out = list() +# # bbox_loss_start_idx = list() + +# subseq_idx = random_continuous_sequence(seq, N) + +# for idx in subseq_idx: +# entry = seq[idx[0] : idx[1]] +# tmp = list() +# bbox_seq = list() +# for i in entry: +# if "tokens" in i.keys(): +# # pubtabnet and synthtabnet +# tmp.append(combine_cell_char_seq(i["tokens"])) +# if "bbox" in i.keys(): +# bbox_seq.extend([f"bbox-{round(j)}" for j in i["bbox"]]) +# elif "text" in i.keys(): +# # pubtables and icdar +# tmp.append(i["text"]) +# if "bbox" in i.keys(): +# bbox_seq.extend([f"bbox-{round(j)}" for j in i["bbox"]]) + +# cell_seq = [delimiter] * len(tmp) +# cell_seq = [q for pair in zip(tmp, cell_seq) for q in pair] +# cell_seq = ["[bbox]", f"{len(entry)}-cell(s)", delimiter] + cell_seq + +# bbox_seq.append("") +# # bbox_loss_start_idx.append(len(cell_seq)) +# out.append(cell_seq + bbox_seq) + +# return out + + +def html_str_to_token_list( + seq: str, splitter: tk.pre_tokenizers.PreTokenizer = None +) -> List[str]: + """Convert decode output (str) to a list of tokens for constructing html table code""" + + # works for no + seq = seq.split("")[0] + + token_black_list = ["", "", *TASK_TOKENS] + for i in token_black_list: + seq = seq.replace(i, "") + + if not splitter: + splitter = tk.pre_tokenizers.Split(pattern=" ", behavior="contiguous") + + seq = splitter.pre_tokenize_str(seq) + # only preserve the space for spanning cell tokens + seq = [i[0] for i in seq if len(i[0].strip()) != 0 or i[1][1] - i[1][0] != 1] + + return seq + + +def cell_str_to_token_list(seq: str) -> List[str]: + seq = seq.split("")[0] + + token_black_list = ["", "", *TASK_TOKENS] + for i in token_black_list: + seq = seq.replace(i, "") + + seq = seq.strip() + + return seq + + +def build_table_from_html_and_cell( + structure: List[str], content: List[str] = None + ) -> List[str]: + """Build table from html and cell token list""" + assert structure is not None + html_code = list() + + # deal with empty table + if content is None: + content = ["placeholder"] * len(structure) + + for tag in structure: + if tag in ("[]", ">[]"): + if len(content) == 0: + continue + cell = content.pop(0) + html_code.append(tag.replace("[]", cell)) + else: + html_code.append(tag) + + return html_code + + + +def bbox_str_to_token_list( + seq: str, splitter: tk.pre_tokenizers.PreTokenizer = None +) -> List[List[int]]: + """ + Note the out could be an empty list + + return + [[ymin, xmin, ymax, xmax], + [ymin, xmin, ymax, xmax], + ... + ] + """ + + seq = seq.split("")[0] + + token_black_list = ["", "", *TASK_TOKENS] + for i in token_black_list: + seq = seq.replace(i, "") + + if not splitter: + splitter = tk.pre_tokenizers.Split(pattern=" ", behavior="removed") + + seq = splitter.pre_tokenize_str(seq) + seq = [int(i[0].split("-")[1]) for i in seq] + + rounded_seq_len = len(seq) // 4 * 4 + out = [seq[i : i + 4] for i in range(0, rounded_seq_len, 4)] + return out + + +def pred_token_within_range( + pred: Tensor, + white_list: List[int] = None, + black_list: List[int] = None, +) -> Tensor: + assert white_list is None or black_list is None + if white_list: + total = set([i for i in range(pred.shape[-1])]) + black_list = list(total.difference(set(white_list))) + + pred[..., black_list] = -float("inf") + + return pred + + +def greedy_sampling(logits: Tensor): + """logits should have shape [B, |V|].""" + probs = F.softmax(logits, dim=-1) + next_probs, next_tokens = probs.topk(1) + + return next_probs, next_tokens + + +def batch_autoregressive_decode( + device: int, + model: EncoderDecoder, + batch_data, + prefix: List[int], + max_decode_len: int, + eos_id: int, + valid_token_whitelist: List[int] = None, + valid_token_blacklist: List[int] = None, + sampling: str = "greedy", + use_ddp: bool = True, +) -> Tensor: + """Auto-regressively generate the output.""" + + model.eval() + with torch.no_grad(): + if use_ddp: + memory = model.module.encode(batch_data.image) + else: + memory = model.encode(batch_data.image) + + B = batch_data.image.shape[0] + + context = torch.tensor(prefix, dtype=torch.int32).repeat(B, 1).to(device) + + for _ in range(max_decode_len): + eos_flag = [eos_id in k for k in context] + if all(eos_flag): + break + + # as long as one sample hasn't reached , continue decoding until the max seq len + causal_mask = subsequent_mask(context.shape[1]).to(device) + + with torch.no_grad(): + if use_ddp: + logits = model.module.decode( + memory, context, tgt_mask=causal_mask, tgt_padding_mask=None + ) + logits = model.module.generator(logits)[:, -1, :] + else: + logits = model.decode( + memory, context, tgt_mask=causal_mask, tgt_padding_mask=None + ) + logits = model.generator(logits)[:, -1, :] + + logits = pred_token_within_range( + logits.detach(), + white_list=valid_token_whitelist if valid_token_whitelist else None, + black_list=valid_token_blacklist if valid_token_blacklist else None, + ) + + if sampling == "greedy": + next_probs, next_tokens = greedy_sampling(logits) + else: + raise NotImplementedError + + context = torch.cat([context, next_tokens], dim=1) + + return context + + +def combine_filename_pred_gt( + filename: List[str], pred_id: Tensor, gt_id: Tensor, vocab: tk.Tokenizer, type: str +) -> dict: + out = dict() + + assert len(filename) == len(pred_id) + + pred_id = pred_id.detach().cpu().numpy() + gt_id = gt_id.detach().cpu().numpy() + + pred_token = vocab.decode_batch(pred_id, skip_special_tokens=False) + gt_token = vocab.decode_batch(gt_id, skip_special_tokens=False) + + for idx, name in enumerate(filename): + if type == "html": + pred_token_list = html_str_to_token_list(pred_token[idx]) + gt_token_list = html_str_to_token_list(gt_token[idx]) + elif type == "cell": + pred_token_list = cell_str_to_token_list(pred_token[idx]) + gt_token_list = cell_str_to_token_list(gt_token[idx]) + elif type == "bbox": + pred_token_list = bbox_str_to_token_list(pred_token[idx]) + gt_token_list = bbox_str_to_token_list(gt_token[idx]) + else: + raise ValueError( + f"The supported tasks are html, cell and bbox, while {type} is provided." + ) + + out[name] = dict(pred=pred_token_list, gt=gt_token_list) + + return out diff --git a/unitable/src/utils/engine.py b/unitable/src/utils/engine.py new file mode 100644 index 0000000000000000000000000000000000000000..2bf8a044320fca0e8d1f3ef4baba6a5a52db3858 --- /dev/null +++ b/unitable/src/utils/engine.py @@ -0,0 +1,84 @@ +import os +import json +import argparse +from pathlib import Path +import glob + +from ..utils import build_table_from_html_and_cell, html_table_template + + +def combine_all_json(file_dir: str) -> dict: + total_result = dict() + files = os.listdir(file_dir) + try: + files.remove("final.json") + except ValueError: + pass + for file in files: + with open(os.path.join(file_dir, file), "r") as f: + result = json.load(f) + total_result.update(result) + + print(f"Combined to a json with {len(total_result)} entries.") + + return total_result + + +def json_to_final(file_dir: str, type: str): + if type == "html" or type == "bbox": + result = combine_all_json(file_dir) + elif type == "html+cell": + result_cell = combine_all_json(file_dir) + result_html_file = os.path.join( + Path(file_dir).parent, + Path(file_dir).name.split("-")[0].replace("cell", "html") + "-html", + ) + assert Path(result_html_file).is_dir(), f"{result_html_file} does not exist." + result = combine_all_json(result_html_file) + assert len(result) == len(result_cell) + else: + # assert html and cell json files have the same length + raise NotImplementedError + + out = dict() + + if type == "bbox": + out = result + else: + for filename, obj in result.items(): + if type == "html": + pred_html = "".join(obj["pred"]) + gt_html = "".join(obj["gt"]) + + out[filename] = dict( + pred=html_table_template(pred_html), gt=html_table_template(gt_html) + ) + elif type == "html+cell": + pred_html_cell = build_table_from_html_and_cell( + obj["pred"], result_cell[filename]["pred"] + ) + gt_html_cell = build_table_from_html_and_cell( + obj["gt"], result_cell[filename]["gt"] + ) + out[filename] = dict( + pred=html_table_template(pred_html_cell), + gt=html_table_template(gt_html_cell), + ) + else: + raise NotImplementedError + + # write to file + with open(os.path.join(file_dir, f"final.json"), "w", encoding="utf-8") as f: + json.dump(out, f, indent=4) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="postprecess") + + parser.add_argument( + "-f", "--file", help="path to all json files from difference devices" + ) + parser.add_argument("-t", "--type", help="html, html+cell") + args = parser.parse_args() + + json_to_final(args.file, args.type) diff --git a/unitable/src/utils/mask_generator.py b/unitable/src/utils/mask_generator.py new file mode 100644 index 0000000000000000000000000000000000000000..91c819b11fc370e648fcd67b95e7f8c8c5b36061 --- /dev/null +++ b/unitable/src/utils/mask_generator.py @@ -0,0 +1,96 @@ +import random +import math +from typing import Any +import numpy as np + +""" +Code adapted from beit mask generator: https://github.com/microsoft/unilm/blob/ecff36188001e9b12a90b01bbbaf9058d2b8bda6/beit/masking_generator.py . +""" + +__all__ = ["MaskGenerator"] + + +class MaskGenerator: + def __init__( + self, + input_size: int, + num_mask_patches: int, + min_num_patches: int = 4, + max_num_patches: int = None, + min_aspect: float = 0.3, + max_aspect: float = None, + ) -> None: + if not isinstance(input_size, tuple): + input_size = (input_size,) * 2 + self.height, self.width = input_size + + self.num_patches = self.height * self.width + + self.num_mask_patches = num_mask_patches + + self.min_num_patches = min_num_patches + self.max_num_patches = ( + num_mask_patches if max_num_patches is None else max_num_patches + ) + + max_aspect = max_aspect or 1 / min_aspect + self.log_aspect_ratio = (math.log(min_aspect), math.log(max_aspect)) + + def __repr__(self): + repr_str = "Generator(%d, %d -> [%d ~ %d], max = %d, %.3f ~ %.3f)" % ( + self.height, + self.width, + self.min_num_patches, + self.max_num_patches, + self.num_mask_patches, + self.log_aspect_ratio[0], + self.log_aspect_ratio[1], + ) + return repr_str + + def get_shape(self): + return self.height, self.width + + def _mask(self, mask: np.array, max_mask_patches: int) -> int: + delta = 0 + for _ in range(10): + target_area = random.uniform(self.min_num_patches, max_mask_patches) + aspect_ratio = math.exp(random.uniform(*self.log_aspect_ratio)) + h = int(round(math.sqrt(target_area * aspect_ratio))) + w = int(round(math.sqrt(target_area / aspect_ratio))) + if w < self.width and h < self.height: + top = random.randint(0, self.height - h) + left = random.randint(0, self.width - w) + + num_masked = mask[top : top + h, left : left + w].sum() + if 0 < h * w - num_masked <= max_mask_patches: + for i in range(top, top + h): + for j in range(left, left + w): + if mask[i, j] == 0: + mask[i, j] = 1 + delta += 1 + if delta > 0: + break + return delta + + def __call__(self) -> Any: + mask = np.zeros((self.height, self.width), dtype=np.int32) + mask_count = 0 + while mask_count < self.num_mask_patches: + max_mask_patches = self.num_mask_patches - mask_count + max_mask_patches = min(max_mask_patches, self.max_num_patches) + + delta = self._mask(mask, max_mask_patches) + if delta == 0: + break + else: + mask_count += delta + + return mask + + +if __name__ == "__main__": + mg = MaskGenerator(input_size=14, num_mask_patches=75) + mask = mg() + print(mask) + print(mg, mask.sum()) diff --git a/unitable/src/utils/misc.py b/unitable/src/utils/misc.py new file mode 100644 index 0000000000000000000000000000000000000000..372021cb60aa52a18f0461a6a8343c418912e3bc --- /dev/null +++ b/unitable/src/utils/misc.py @@ -0,0 +1,93 @@ +import math +import jsonlines +from pathlib import Path +from typing import Dict, Tuple, List, Union +from torch import Tensor, nn + +__all__ = [ + "cosine_schedule_with_warmup", + "load_json_annotations", + "bbox_augmentation_resize", + "count_total_parameters", + "compute_grad_norm", + "printer", + "html_table_template", +] + +printer = lambda device, output: f"[GPU {device}] " + output + +html_table_template = ( + lambda table: f""" + + + + + {table} +
""" +) + + +# adpated from https://github.com/huggingface/transformers/blob/v4.33.0/src/transformers/optimization.py +def cosine_schedule_with_warmup( + step: int, + *, + warmup: int, + min_ratio: float, + total_step: int, + cycle: float = 0.5, +): + if step < warmup: + if step == 0: + step = 1 + return float(step) / float(max(1, warmup)) + + if step >= total_step: + step = total_step + progress = float(step - warmup) / float(max(1, total_step - warmup)) + return max( + min_ratio, 0.5 * (1.0 + math.cos(math.pi * float(cycle) * 2.0 * progress)) + ) + + +def load_json_annotations(json_file_dir: Path, split: str): + """Preprocess jsonl in dataset.""" + image_label_pair = list() + with jsonlines.open(json_file_dir) as f: + for obj in f: + if obj["split"] == split: + image_label_pair.append((obj["filename"], obj["html"])) + + return image_label_pair + + +def bbox_augmentation_resize( + bbox: List[int], image_size: List[int], target_size: int +) -> List[int]: + """Modify the bbox coordinates according to the image resizing.""" + # Assuming the bbox is [xmin, ymin, xmax, ymax] + assert len(image_size) == 2 + ratio = [target_size / i for i in image_size] + ratio = ratio * 2 + bbox = [int(round(i * j)) for i, j in zip(bbox, ratio)] + return bbox + + +def count_total_parameters(model: nn.Module) -> int: + """Count total parameters that need training.""" + total_parameters = sum(p.numel() for p in model.parameters() if p.requires_grad) + return total_parameters + + +def compute_grad_norm(model: nn.Module) -> float: + total_norm = 0.0 + for p in model.parameters(): + if p.grad is not None and p.requires_grad: + param_norm = p.grad.detach().data.norm(2) + total_norm += param_norm.item() ** 2 + total_norm = total_norm**0.5 + return total_norm diff --git a/unitable/src/utils/teds.py b/unitable/src/utils/teds.py new file mode 100644 index 0000000000000000000000000000000000000000..211272863447f336848c4a1e4605ce501d52741e --- /dev/null +++ b/unitable/src/utils/teds.py @@ -0,0 +1,268 @@ +# code adapted from https://github.com/ibm-aur-nlp/PubTabNet/blob/master/src/metric.py +# tree edit distance video explanation: https://www.youtube.com/watch?v=6Ur8B35xCj8 +import apted +import distance +from collections import deque +from lxml import etree, html +from tqdm import tqdm +from concurrent.futures import ProcessPoolExecutor, as_completed +from typing import Tuple + + +class TableTree(apted.helpers.Tree): + def __init__(self, tag, colspan=None, rowspan=None, content=None, *children): + self.tag = tag + self.colspan = colspan + self.rowspan = rowspan + self.content = content + self.children = list(children) + + def bracket(self): + """Show tree using brackets notation.""" + if self.tag == "td": + result = '"tag": %s, "colspan": %d, "rowspan": %d, "text": %s' % ( + self.tag, + self.colspan, + self.rowspan, + self.content, + ) + else: + result = '"tag": %s' % self.tag + for child in self.children: + result += child.bracket() + return "{{{}}}".format(result) + + +class CustomConfig(apted.Config): + @staticmethod + def maximum(*sequences): + """Get maximum possible value.""" + return max(map(len, sequences)) + + def normalized_distance(self, *sequences): + """Get distance from 0 to 1.""" + return float(distance.levenshtein(*sequences)) / self.maximum(*sequences) + + def rename(self, node1, node2): + """Compares attributes of trees""" + if ( + (node1.tag != node2.tag) + or (node1.colspan != node2.colspan) + or (node1.rowspan != node2.rowspan) + ): + return 1.0 + if node1.tag == "td": + if node1.content or node2.content: + return self.normalized_distance(node1.content, node2.content) + return 0.0 + + +class TEDS(object): + """Tree Edit Distance basead Similarity""" + + def __init__(self, structure_only=False, n_jobs=1, ignore_nodes=None): + assert isinstance(n_jobs, int) and ( + n_jobs >= 1 + ), "n_jobs must be an integer greather than 1" + self.structure_only = structure_only + self.n_jobs = n_jobs + self.ignore_nodes = ignore_nodes + self.__tokens__ = [] + + def tokenize(self, node): + """Tokenizes table cells""" + self.__tokens__.append("<%s>" % node.tag) + if node.text is not None: + self.__tokens__ += list(node.text) + for n in node.getchildren(): + self.tokenize(n) + if node.tag != "unk": + self.__tokens__.append("" % node.tag) + if node.tag != "td" and node.tail is not None: + self.__tokens__ += list(node.tail) + + def load_html_tree(self, node, parent=None): + """Converts HTML tree to the format required by apted""" + global __tokens__ + if node.tag == "td": + if self.structure_only: + cell = [] + else: + self.__tokens__ = [] + self.tokenize(node) + cell = self.__tokens__[1:-1].copy() + new_node = TableTree( + node.tag, + int(node.attrib.get("colspan", "1")), + int(node.attrib.get("rowspan", "1")), + cell, + *deque(), + ) + else: + new_node = TableTree(node.tag, None, None, None, *deque()) + if parent is not None: + parent.children.append(new_node) + if node.tag != "td": + for n in node.getchildren(): + self.load_html_tree(n, new_node) + if parent is None: + return new_node + + def evaluate(self, pred, true): + """Computes TEDS score between the prediction and the ground truth of a + given sample + """ + if (not pred) or (not true): + return 0.0 + parser = html.HTMLParser(remove_comments=True, encoding="utf-8") + pred = html.fromstring(pred, parser=parser) + true = html.fromstring(true, parser=parser) + if pred.xpath("body/table") and true.xpath("body/table"): + pred = pred.xpath("body/table")[0] + true = true.xpath("body/table")[0] + if self.ignore_nodes: + etree.strip_tags(pred, *self.ignore_nodes) + etree.strip_tags(true, *self.ignore_nodes) + n_nodes_pred = len(pred.xpath(".//*")) + n_nodes_true = len(true.xpath(".//*")) + n_nodes = max(n_nodes_pred, n_nodes_true) + tree_pred = self.load_html_tree(pred) + tree_true = self.load_html_tree(true) + distance = apted.APTED( + tree_pred, tree_true, CustomConfig() + ).compute_edit_distance() + return 1.0 - (float(distance) / n_nodes) + else: + return 0.0 + + def batch_evaluate(self, results_json): + """Computes TEDS score between the prediction and the ground truth of + a batch of samples + @params pred_json: {'FILENAME': 'HTML CODE', ...} + @params true_json: {'FILENAME': {'html': 'HTML CODE'}, ...} + @output: {'FILENAME': 'TEDS SCORE', ...} + """ + samples = results_json.keys() + print(f"Total samples: {len(samples)}") + if self.n_jobs == 1: + scores = [ + self.evaluate( + results_json[filename]["pred"], + results_json[filename]["gt"], + ) + for filename in tqdm(samples) + ] + else: + inputs = [ + { + "pred": results_json[filename]["pred"], + "true": results_json[filename]["gt"], + } + for filename in samples + ] + scores = parallel_process( + inputs, self.evaluate, use_kwargs=True, n_jobs=self.n_jobs, front_num=1 + ) + output = dict() + for i, j in zip(samples, scores): + if "span" in results_json[i]["gt"]: + output[i] = dict(scores=j, type="complex") + else: + output[i] = dict(scores=j, type="simple") + # scores = dict(zip(samples, scores)) + return output + + +def parallel_process(array, function, n_jobs=16, use_kwargs=False, front_num=0): + """ + A parallel version of the map function with a progress bar. + + Args: + array (array-like): An array to iterate over. + function (function): A python function to apply to the elements of array + n_jobs (int, default=16): The number of cores to use + use_kwargs (boolean, default=False): Whether to consider the elements of array as dictionaries of + keyword arguments to function + front_num (int, default=3): The number of iterations to run serially before kicking off the parallel job. + Useful for catching bugs + Returns: + [function(array[0]), function(array[1]), ...] + """ + # We run the first few iterations serially to catch bugs + if front_num > 0: + front = [ + function(**a) if use_kwargs else function(a) for a in array[:front_num] + ] + else: + front = [] + # If we set n_jobs to 1, just run a list comprehension. This is useful for benchmarking and debugging. + if n_jobs == 1: + return front + [ + function(**a) if use_kwargs else function(a) + for a in tqdm(array[front_num:]) + ] + # Assemble the workers + with ProcessPoolExecutor(max_workers=n_jobs) as pool: + # Pass the elements of array into function + if use_kwargs: + futures = [pool.submit(function, **a) for a in array[front_num:]] + else: + futures = [pool.submit(function, a) for a in array[front_num:]] + kwargs = { + "total": len(futures), + "unit": "it", + "unit_scale": True, + "leave": True, + } + # Print out the progress as tasks complete + for f in tqdm(as_completed(futures), **kwargs): + pass + out = [] + # Get the results from the futures. + for i, future in tqdm(enumerate(futures)): + try: + out.append(future.result()) + except Exception as e: + out.append(e) + return front + out + + +if __name__ == "__main__": + import json + import pprint + import numpy as np + import argparse + + parser = argparse.ArgumentParser(description="TEDS Computation") + + parser.add_argument("-f", "--file", help="path to html table results in json file") + parser.add_argument("-t", "--type", help="html, html+cell") + parser.add_argument("-n", "--njob", default=200, help="number of jobs in parallel") + args = parser.parse_args() + + results_file = args.file + with open(results_file, "r") as f: + results_json = json.load(f) + + if args.type == "html": + s_only = True + else: + s_only = False + teds = TEDS(structure_only=s_only, n_jobs=args.njob) + scores = teds.batch_evaluate(results_json) + pp = pprint.PrettyPrinter() + pp.pprint(scores) + + # compute teds for simple and complex tables + total, simple, complex = list(), list(), list() + for _, obj in scores.items(): + if obj["type"] == "simple": + simple.append(obj["scores"]) + elif obj["type"] == "complex": + complex.append(obj["scores"]) + total.append(obj["scores"]) + + total, simple, complex = np.array(total), np.array(simple), np.array(complex) + print( + f"Simple: {np.mean(simple)} \nComplex: {np.mean(complex)} \nTotal: {np.mean(total)}" + ) diff --git a/unitable/src/utils/visualization.py b/unitable/src/utils/visualization.py new file mode 100644 index 0000000000000000000000000000000000000000..89f4d8caaa25502edff00e7882da9efd808df9fe --- /dev/null +++ b/unitable/src/utils/visualization.py @@ -0,0 +1,13 @@ +from torchvision import transforms +import numpy as np + + +def normalize_image_for_visualization(mean: float, std: float): + invNormalization = transforms.Compose( + [ + transforms.Normalize(mean=[0.0] * 3, std=1.0 / np.array(std)), + transforms.Normalize(mean=-1.0 * np.array(mean), std=[1.0] * 3), + ] + ) + + return invNormalization diff --git a/unitable/src/vocab/__init__.py b/unitable/src/vocab/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0001f87373ec871dd042c2fce06f8e55706cfd77 --- /dev/null +++ b/unitable/src/vocab/__init__.py @@ -0,0 +1 @@ +from .constant import * diff --git a/unitable/src/vocab/constant.py b/unitable/src/vocab/constant.py new file mode 100644 index 0000000000000000000000000000000000000000..25f82fb183adbd299c8b14b9bffc8a4f13014c54 --- /dev/null +++ b/unitable/src/vocab/constant.py @@ -0,0 +1,60 @@ +SPECIAL_TOKENS = ["", "", "", "", "", ""] +TASK_TOKENS = ["[table]", "[html]", "[cell]", "[bbox]", "[cell+bbox]"] +RESERVED_TOKENS = [ + f"reserved {i+1}" for i in range(20 - len(SPECIAL_TOKENS) - len(TASK_TOKENS)) +] +CELL_NUM_TOKENS = [f"{i+1}-cell(s)" for i in range(100)] +BBOX_TOKENS = [f"bbox-{i}" for i in range(880)] + +HTML_TOKENS = [ + "", + "[]", + "", + ">[]", + "", + "", + "", + "", + "", + "", + ' rowspan="2"', + ' rowspan="3"', + ' rowspan="4"', + ' rowspan="5"', + ' rowspan="6"', + ' rowspan="7"', + ' rowspan="8"', + ' rowspan="9"', + ' rowspan="10"', + ' rowspan="11"', + ' rowspan="12"', + ' rowspan="13"', + ' rowspan="14"', + ' rowspan="15"', + ' rowspan="16"', + ' rowspan="17"', + ' rowspan="18"', + ' rowspan="19"', + ' colspan="2"', + ' colspan="3"', + ' colspan="4"', + ' colspan="5"', + ' colspan="6"', + ' colspan="7"', + ' colspan="8"', + ' colspan="9"', + ' colspan="10"', + ' colspan="11"', + ' colspan="12"', + ' colspan="13"', + ' colspan="14"', + ' colspan="15"', + ' colspan="16"', + ' colspan="17"', + ' colspan="18"', + ' colspan="19"', + ' colspan="25"', +] + +CELL_SPECIAL = ["", "", "", "", "", "", "", ""] diff --git a/unitable/unitable_full.py b/unitable/unitable_full.py new file mode 100644 index 0000000000000000000000000000000000000000..69912dc145b372e759c50fdcaae40ecec56e3172 --- /dev/null +++ b/unitable/unitable_full.py @@ -0,0 +1,425 @@ +from typing import Tuple, List, Sequence, Optional, Union +from pathlib import Path +import re +import torch +import tokenizers as tk +from PIL import Image +from matplotlib import pyplot as plt +from matplotlib import patches +from torchvision import transforms +from torch import nn, Tensor +from functools import partial +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] +import warnings +import time +import argparse +from bs4 import BeautifulSoup as bs + +from .src.model import EncoderDecoder, ImgLinearBackbone, Encoder, Decoder + +from .src.utils import subsequent_mask, pred_token_within_range, greedy_sampling, bbox_str_to_token_list, html_str_to_token_list,cell_str_to_token_list, build_table_from_html_and_cell, html_table_template +from .src.trainer.utils import VALID_HTML_TOKEN, VALID_BBOX_TOKEN, INVALID_CELL_TOKEN + +""" + ImgLinearBackbone, Encoder, Decoder are in components.py + EncoderDecoder is in encoderdecoder.py + +""" + +warnings.filterwarnings('ignore') + + +class UnitableFullPredictor(): + def __init__(self): + pass + + def load_vocab_and_model( + self, + backbone, + encoder, + decoder, + vocab_path: Union[str, Path], + max_seq_len: int, + model_weights: Union[str, Path], + ) -> Tuple[tk.Tokenizer, EncoderDecoder]: + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + vocab = tk.Tokenizer.from_file(vocab_path) + d_model = 768 + dropout = 0.2 + model = EncoderDecoder( + backbone= backbone, + encoder= encoder, + decoder= decoder, + vocab_size= vocab.get_vocab_size(), + d_model= d_model, + padding_idx= vocab.token_to_id(""), + max_seq_len=max_seq_len, + dropout=dropout, + norm_layer=partial(nn.LayerNorm, eps=1e-6) + ) + # it loads weights onto the CPU first and then moves the model to the desired device + model.load_state_dict(torch.load(model_weights, map_location="cpu")) + model = model.to(device) + + return vocab, model + + + def autoregressive_decode( + self, + model: EncoderDecoder, + image: Tensor, + prefix: Sequence[int], + max_decode_len: int, + eos_id: int, + token_whitelist: Optional[Sequence[int]] = None, + token_blacklist: Optional[Sequence[int]] = None, + ) -> Tensor: + model.eval() + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + with torch.no_grad(): + """ + The encoder takes the input data (in this case, an image) and transforms it into a high-dimensional feature representation. + This feature representation, or memory tensor, captures the essential information from the input data needed to generate the output sequence. + """ + memory = model.encode(image) + """ + Creates a context tensor from the prefix and repeats it to match the batch size of the image, moving it to the appropriate device. + """ + context = torch.tensor(prefix, dtype=torch.int32).repeat(image.shape[0], 1).to(device) + + for _ in range(max_decode_len): + eos_flag = [eos_id in k for k in context] + if all(eos_flag): + break + + with torch.no_grad(): + causal_mask = subsequent_mask(context.shape[1]).to(device) + logits = model.decode( + memory, context, tgt_mask=causal_mask, tgt_padding_mask=None + ) + logits = model.generator(logits)[:, -1, :] + + logits = pred_token_within_range( + logits.detach(), + white_list=token_whitelist, + black_list=token_blacklist, + ) + + next_probs, next_tokens = greedy_sampling(logits) + context = torch.cat([context, next_tokens], dim=1) + return context + + + @staticmethod + def image_to_tensor(image: Image, size: Tuple[int, int]) -> Tensor: + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + T = transforms.Compose([ + transforms.Resize(size), + transforms.ToTensor(), + transforms.Normalize(mean=[0.86597056,0.88463002,0.87491087], std = [0.20686628,0.18201602,0.18485524]) + ]) + image_tensor = T(image) + image_tensor = image_tensor.to(device).unsqueeze(0) + + return image_tensor + + def rescale_bbox( + self, + bbox: Sequence[Sequence[float]], + src: Tuple[int, int], + tgt: Tuple[int, int] + ) -> Sequence[Sequence[float]]: + assert len(src) == len(tgt) == 2 + ratio = [tgt[0] / src[0], tgt[1] / src[1]] * 2 + print(ratio) + bbox = [[int(round(i * j)) for i, j in zip(entry, ratio)] for entry in bbox] + return bbox + + + def predict(self, images:List[Image.Image],debugfolder_filename_page_name:str): + MODEL_FILE_NAME = ["unitable_large_structure.pt", "unitable_large_bbox.pt", "unitable_large_content.pt"] + MODEL_DIR = Path("./unitable/experiments/unitable_weights") + # UniTable large model + d_model = 768 + patch_size = 16 + nhead = 12 + dropout = 0.2 + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + backbone= ImgLinearBackbone(d_model=d_model, patch_size=patch_size) + encoder= Encoder( + d_model=d_model, + nhead=nhead, + dropout=dropout, + activation="gelu", + norm_first=True, + nlayer=12, + ff_ratio=4, + ) + decoder= Decoder( + d_model=d_model, + nhead=nhead, + dropout=dropout, + activation="gelu", + norm_first=True, + nlayer=4, + ff_ratio=4, + ) + + print("Running table transformer + Unitable Full Model") + """ + Step 1 Load Table Structure Model + """ + + start1 = time.time() + # Table structure extraction + vocabS, modelS = self.load_vocab_and_model( + backbone=backbone, + encoder=encoder, + decoder=decoder, + vocab_path="./unitable/vocab/vocab_html.json", + max_seq_len=784, + model_weights=MODEL_DIR / MODEL_FILE_NAME[0] + ) + + end1 = time.time() + print("time to load table structure model ",end1-start1,"seconds") + + """ + Step 2 prepare images to tensor + """ + image_tensors = [] + for i in range(len(images)): + image_size = images[i].size + # Image transformation + image_tensor = self.image_to_tensor(images[i], (448, 448)) + image_tensors.append(image_tensor) + print("Check if image_tensors is what i want it to be ") + print(type(image_tensors)) + + + # This will be list of arrays(pred_html), which is again list of array + pred_htmls = [] + for i in range(len(image_tensors)): + #print(image_tensor) + print("Processing table "+str(i)) + start2 = time.time() + # Inference + pred_html = self.autoregressive_decode( + model= modelS, + image= image_tensors[i], + prefix=[vocabS.token_to_id("[html]")], + max_decode_len=512, + eos_id=vocabS.token_to_id(""), + token_whitelist=[vocabS.token_to_id(i) for i in VALID_HTML_TOKEN], + token_blacklist = None + ) + + end2 = time.time() + + print("time for inference table structure ",end2-start2,"seconds") + pred_html = pred_html.detach().cpu().numpy()[0] + pred_html = vocabS.decode(pred_html, skip_special_tokens=False) + + pred_html = html_str_to_token_list(pred_html) + pred_htmls.append(pred_html) + print(pred_html) + """ + Step 3 Load Table Cell detection + """ + + + start3 = time.time() + # Table cell bbox detection + vocabB, modelB = self.load_vocab_and_model( + backbone=backbone, + encoder=encoder, + decoder=decoder, + vocab_path="./unitable/vocab/vocab_bbox.json", + max_seq_len=1024, + model_weights=MODEL_DIR / MODEL_FILE_NAME[1], + ) + end3 = time.time() + print("time to load cell bbox detection model ",end3-start3,"seconds") + """ + Step 4 do the pred_bboxes detection + """ + + pred_bboxs =[] + for i in range(len(image_tensors)): + start4 = time.time() + # Inference + pred_bbox = self.autoregressive_decode( + model=modelB, + image=image_tensors[i], + prefix=[vocabB.token_to_id("[bbox]")], + max_decode_len=1024, + eos_id=vocabB.token_to_id(""), + token_whitelist=[vocabB.token_to_id(i) for i in VALID_BBOX_TOKEN[: 449]], + token_blacklist = None + ) + end4 = time.time() + print("Processing table "+str(i)) + print("time to do inference for table cell bbox detection model ",end4-start4,"seconds") + # Convert token id to token text + pred_bbox = pred_bbox.detach().cpu().numpy()[0] + pred_bbox = vocabB.decode(pred_bbox, skip_special_tokens=False) + pred_bbox = bbox_str_to_token_list(pred_bbox) + pred_bbox = self.rescale_bbox(pred_bbox, src=(448, 448), tgt=images[i].size) + print(pred_bbox) + + print("Size of the image ") + #(1498, 971) + print(images[i].size) + print("Number of bounding boxes ") + print(len(pred_bbox)) + countcells = 0 + for elem in pred_htmls[i] : + if elem == '[]' or elem == '>[]': + countcells+=1 + + #275 + print("number of countcells") + print(countcells) + if countcells > 256: + #TODO Extra processing for big tables + + #Find the last incomplete row and its ymax coordinate + + # Last bbox's ymax gives us coordinate of where the cutted off row starts + #IMPORTANT : pred_bbox is xmin, ymin, xmax, ymax + cut_off = pred_bbox[-1][1] + + #This will be used to distinguish how many cells are already detected in that row. + + last_cells_redudant = 0 + for cell in reversed(pred_bbox): + if cut_off-5 < cell[1] "), + token_whitelist=[vocabB.token_to_id(i) for i in VALID_BBOX_TOKEN[: 449]], + token_blacklist = None + ) + # Convert token id to token text + pred_bbox_extra = pred_bbox_extra.detach().cpu().numpy()[0] + pred_bbox_extra = vocabB.decode(pred_bbox_extra, skip_special_tokens=False) + pred_bbox_extra = bbox_str_to_token_list(pred_bbox_extra) + + pred_bbox_extra = pred_bbox_extra[last_cells_redudant-1:] + + pred_bbox_extra = self.rescale_bbox(pred_bbox_extra, src=(448, 448), tgt=cropped_image.size) + pred_bbox_extra = [[i[0], i[1]+cut_off, i[2], i[3]+cut_off] for i in pred_bbox_extra] + + pred_bbox = pred_bbox + pred_bbox_extra + + print("extra boxes:") + print(pred_bbox_extra) + print(len(pred_bbox_extra)) + + pred_bboxs.append(pred_bbox) + fig, ax = plt.subplots(figsize=(12, 10)) + for j in pred_bbox: + #i is xmin, ymin, xmax, ymax based on the function usage + rect = patches.Rectangle(j[:2], j[2] - j[0], j[3] - j[1], linewidth=1, edgecolor='r', facecolor='none') + ax.add_patch(rect) + ax.set_axis_off() + ax.imshow(images[i]) + fig.savefig(debugfolder_filename_page_name+str(i)+".png", bbox_inches='tight', dpi=300) + + + """ + Step 5 : Load table cell recognition contents + """ + + start4 = time.time() + # Table cell bbox detection + vocabC, modelC = self.load_vocab_and_model( + backbone=backbone, + encoder=encoder, + decoder=decoder, + vocab_path="./unitable/vocab/vocab_cell_6k.json", + max_seq_len=200, + model_weights=MODEL_DIR / MODEL_FILE_NAME[2], + ) + end4 = time.time() + print("time to load cell recognition model ",end4-start4,"seconds") + + pred_cells = [] + """ + Step 6 : Decode for all tables + """ + for i in range(len(images)): + + cell_image_tensors_for_img =[] + for bbox in pred_bboxs[i]: + cropped_img = images[i].crop(bbox) + if cropped_img.size[0] >0: + cell_image_tensors_for_img.append(self.image_to_tensor(cropped_img, size=(112, 448))) + + cell_image_tensors_for_img = torch.cat(cell_image_tensors_for_img, dim=0).to(device) + #print("size of tensor") + #print(image_tensor.size()) + + start4 = time.time() + # Inference + pred_cell = self.autoregressive_decode( + model=modelC, + image=cell_image_tensors_for_img, + prefix=[vocabC.token_to_id("[cell]")], + max_decode_len=200, + eos_id=vocabC.token_to_id(""), + token_whitelist=None, + token_blacklist = [vocabC.token_to_id(i) for i in INVALID_CELL_TOKEN] + ) + + # Convert token id to token text + pred_cell = pred_cell.detach().cpu().numpy() + pred_cell = vocabC.decode_batch(pred_cell, skip_special_tokens=False) + + end4 = time.time() + print("Processing table "+str(i)) + print("time to do cell recognition ",end4-start4,"seconds") + + pred_cell = [cell_str_to_token_list(i) for i in pred_cell] + #The code finds instances in each string of pred_cell where there is a digit followed by any character and then whitespace followed by another digit. + #It replaces these instances with the first digit, followed by a period, followed by the second digit, effectively removing the whitespace and any character between the digits and replacing it with a period. + pred_cell = [re.sub(r'(\d).\s+(\d)', r'\1.\2', i) for i in pred_cell] + + print(pred_cell) + pred_cells.append(pred_cell) + print(type(pred_cells)) + + table_codes =[] + for pred_html, pred_cell in zip(pred_htmls, pred_cells): + # Combine the table structure and cell content + pred_code = build_table_from_html_and_cell(pred_html, pred_cell) + pred_code = "".join(pred_code) + pred_code = html_table_template(pred_code) + + # Display the HTML table + soup = bs(pred_code) + table_code = soup.prettify() + print(table_code) + table_codes.append(table_code) + return table_codes + + diff --git a/unitable/unitable_full_singleimage.py b/unitable/unitable_full_singleimage.py new file mode 100644 index 0000000000000000000000000000000000000000..e223f47709efb2a26c762eaec01fe40dae089b64 --- /dev/null +++ b/unitable/unitable_full_singleimage.py @@ -0,0 +1,555 @@ +from typing import Tuple, List, Sequence, Optional, Union +from pathlib import Path +import re +import torch +import tokenizers as tk +from PIL import Image +from matplotlib import pyplot as plt +from matplotlib import patches +from torchvision import transforms +from torch import nn, Tensor +from functools import partial +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] +import warnings +import time +import argparse +from bs4 import BeautifulSoup as bs + +from .src.model import EncoderDecoder, ImgLinearBackbone, Encoder, Decoder +from .src.utils import subsequent_mask, pred_token_within_range, greedy_sampling, bbox_str_to_token_list, html_str_to_token_list,cell_str_to_token_list, build_table_from_html_and_cell, html_table_template +from .src.trainer.utils import VALID_HTML_TOKEN, VALID_BBOX_TOKEN, INVALID_CELL_TOKEN + +warnings.filterwarnings('ignore') + + +class UnitableFullSinglePredictor(): + def __init__(self): + MODEL_FILE_NAME = ["unitable_large_structure.pt", "unitable_large_bbox.pt", "unitable_large_content.pt"] + MODEL_DIR = Path("unitable/experiments/unitable_weights") + # UniTable large model + self.d_model = 768 + self.patch_size = 16 + self.nhead = 12 + self.dropout = 0.2 + + self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + self.backbone= ImgLinearBackbone(d_model=self.d_model, patch_size=self.patch_size) + self.encoder= Encoder( + d_model=self.d_model, + nhead=self.nhead, + dropout=self.dropout, + activation="gelu", + norm_first=True, + nlayer=12, + ff_ratio=4, + ) + self.decoder= Decoder( + d_model=self.d_model, + nhead=self.nhead, + dropout=self.dropout, + activation="gelu", + norm_first=True, + nlayer=4, + ff_ratio=4, + ) + """ + start1 = time.time() + # Table structure extraction + self.vocabS, self.modelS = self.load_vocab_and_model( + backbone= ImgLinearBackbone(d_model=self.d_model, patch_size=self.patch_size), + encoder= Encoder( + d_model=self.d_model, + nhead=self.nhead, + dropout=self.dropout, + activation="gelu", + norm_first=True, + nlayer=12, + ff_ratio=4, + ), + decoder= Decoder( + d_model=self.d_model, + nhead=self.nhead, + dropout=self.dropout, + activation="gelu", + norm_first=True, + nlayer=4, + ff_ratio=4, + ), + d_model= self.d_model, + dropout= self.dropout, + vocab_path="unitable/vocab/vocab_html.json", + max_seq_len=784, + model_weights=MODEL_DIR / MODEL_FILE_NAME[0] + ) + end1 = time.time() + print("time to load table structure model ",end1-start1,"seconds") + + start3 = time.time() + # Table cell bbox detection + self.vocabB, self.modelB = self.load_vocab_and_model( + backbone = ImgLinearBackbone(d_model=self.d_model, patch_size=self.patch_size), + encoder = Encoder( + d_model= self.d_model, + nhead= self.nhead, + dropout = self.dropout, + activation="gelu", + norm_first=True, + nlayer=12, + ff_ratio=4, + ), + decoder = Decoder( + d_model= self.d_model, + nhead= self.nhead, + dropout = self.dropout, + activation="gelu", + norm_first=True, + nlayer=4, + ff_ratio=4, + ), + d_model= self.d_model, + dropout= self.dropout, + vocab_path="unitable/vocab/vocab_bbox.json", + max_seq_len=1024, + model_weights=MODEL_DIR / MODEL_FILE_NAME[1], + ) + end3 = time.time() + print("time to load cell bbox detection model ",end3-start3,"seconds") + + start4 = time.time() + # Table cell bbox detection + self.vocabC, self.modelC = self.load_vocab_and_model( + backbone = ImgLinearBackbone(d_model=self.d_model, patch_size=self.patch_size), + encoder = Encoder( + d_model= self.d_model, + nhead= self.nhead, + dropout = self.dropout, + activation="gelu", + norm_first=True, + nlayer=12, + ff_ratio=4, + ), + decoder = Decoder( + d_model= self.d_model, + nhead= self.nhead, + dropout = self.dropout, + activation="gelu", + norm_first=True, + nlayer=4, + ff_ratio=4, + ), + d_model= self.d_model, + dropout= self.dropout, + vocab_path="unitable/vocab/vocab_cell_6k.json", + max_seq_len=200, + #Using the content recognition model i guess + model_weights=MODEL_DIR / MODEL_FILE_NAME[2], + ) + end4 = time.time() + print("time to load cell recognition model ",end4-start4,"seconds") + """ + + + def load_vocab_and_model( + self, + vocab_path: Union[str, Path], + max_seq_len: int, + model_weights: Union[str, Path], + ) -> Tuple[tk.Tokenizer, EncoderDecoder]: + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + vocab = tk.Tokenizer.from_file(vocab_path) + + model = EncoderDecoder( + backbone= self.backbone, + encoder= self.encoder, + decoder= self.decoder, + vocab_size= vocab.get_vocab_size(), + d_model= self.d_model, + padding_idx= vocab.token_to_id(""), + max_seq_len=max_seq_len, + dropout=self.dropout, + norm_layer=partial(nn.LayerNorm, eps=1e-6) + ) + # it loads weights onto the CPU first and then moves the model to the desired device + model.load_state_dict(torch.load(model_weights, map_location="cpu")) + model = model.to(device) + + return vocab, model + + + def autoregressive_decode( + self, + model: EncoderDecoder, + image: Tensor, + prefix: Sequence[int], + max_decode_len: int, + eos_id: int, + token_whitelist: Optional[Sequence[int]] = None, + token_blacklist: Optional[Sequence[int]] = None, + ) -> Tensor: + model.eval() + with torch.no_grad(): + memory = model.encode(image) + context = torch.tensor(prefix, dtype=torch.int32).repeat(image.shape[0], 1).to(self.device) + + for _ in range(max_decode_len): + eos_flag = [eos_id in k for k in context] + if all(eos_flag): + break + + with torch.no_grad(): + causal_mask = subsequent_mask(context.shape[1]).to(self.device) + logits = model.decode( + memory, context, tgt_mask=causal_mask, tgt_padding_mask=None + ) + logits = model.generator(logits)[:, -1, :] + + logits = pred_token_within_range( + logits.detach(), + white_list=token_whitelist, + black_list=token_blacklist, + ) + + next_probs, next_tokens = greedy_sampling(logits) + context = torch.cat([context, next_tokens], dim=1) + return context + + + @staticmethod + def image_to_tensor(image: Image, size: Tuple[int, int]) -> Tensor: + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + # Resize the image with padding + #resized_image = UnitableFullPredictor.resize_with_padding(image, size) + T = transforms.Compose([ + transforms.Resize(size), + transforms.ToTensor(), + transforms.Normalize(mean=[0.86597056,0.88463002,0.87491087], std = [0.20686628,0.18201602,0.18485524]) + ]) + image_tensor = T(image) + image_tensor = image_tensor.to(device).unsqueeze(0) + + return image_tensor + + """ + + @staticmethod + def resize_with_padding(image: Image, target_size: Tuple[int, int]) -> Image: + + #Resize the image to fit within the target size while preserving aspect ratio, + #then add padding to match the target size. + + original_width, original_height = image.size + target_width, target_height = target_size + + # Calculate the new size preserving aspect ratio + aspect_ratio = original_width / original_height + if target_width / target_height > aspect_ratio: + new_height = target_height + new_width = int(new_height * aspect_ratio) + else: + new_width = target_width + new_height = int(new_width / aspect_ratio) + + # Resize the image to the new size + resized_image = image.resize((new_width, new_height),Image.LANCZOS) + + # Create a new image with white background + new_image = Image.new("RGB", (target_width, target_height), (255, 255, 255)) + + # Paste the resized image onto the white background + paste_position = ((target_width - new_width) // 2, (target_height - new_height) // 2) + new_image.paste(resized_image, paste_position) + new_image.save("../res/table_resize_with_padding.png") + + return new_image + """ + + def rescale_bbox( + self, + bbox: Sequence[Sequence[float]], + src: Tuple[int, int], + tgt: Tuple[int, int] + ) -> Sequence[Sequence[float]]: + assert len(src) == len(tgt) == 2 + ratio = [tgt[0] / src[0], tgt[1] / src[1]] * 2 + print(ratio) + bbox = [[int(round(i * j)) for i, j in zip(entry, ratio)] for entry in bbox] + return bbox + """ + @staticmethod + def rescale_bbox( + bbox: Sequence[Sequence[float]], + src: Tuple[int, int], + tgt: Tuple[int, int] + ) -> Sequence[Sequence[float]]: + + #Rescale bounding boxes according to the transformation applied in resize_with_padding. + + src_width, src_height = src + tgt_width, tgt_height = tgt + + # Calculate the new size preserving aspect ratio + aspect_ratio = src_width / src_height + if tgt_width / tgt_height > aspect_ratio: + new_height = tgt_height + new_width = int(new_height * aspect_ratio) + else: + new_width = tgt_width + new_height = int(new_width / aspect_ratio) + + # Calculate the scale factors + #THIS *2 factor was done in their code - why ? i have no clue + scale_x = (new_width / src_width ) * 2 + scale_y = (new_height / src_height) *2 + + # Calculate the padding + pad_x = (tgt_width - new_width) // 2 + pad_y = (tgt_height - new_height) // 2 + + # Rescale and adjust the bounding boxes + rescaled_bbox = [] + for entry in bbox: + x_min = int(round(entry[0] * scale_x -pad_x)) + y_min = int(round(entry[1] * scale_y - pad_y)) + x_max = int(round(entry[2] * scale_x - pad_x)) + y_max = int(round(entry[3] * scale_y - pad_y)) + rescaled_bbox.append([x_min, y_min, x_max, y_max]) + + return rescaled_bbox + """ + + def predict(self, image:ImageType): + MODEL_FILE_NAME = ["unitable_large_structure.pt", "unitable_large_bbox.pt", "unitable_large_content.pt"] + MODEL_DIR = Path("unitable/experiments/unitable_weights") + image_size = image.size + + print("RUNING SINGLE IMAGE UNITABLE FOR DEBUGGGING ") + # Image transformation + image_tensor = self.image_to_tensor(image, (448, 448)) + #print(image_tensor) + + """ + Step 1 Table Structure recognition + """ + + + start1 = time.time() + # Table structure extraction + vocabS, modelS = self.load_vocab_and_model( + vocab_path="unitable/vocab/vocab_html.json", + max_seq_len=784, + model_weights=MODEL_DIR / MODEL_FILE_NAME[0] + ) + end1 = time.time() + print("time to load table structure model ",end1-start1,"seconds") + + + start2 = time.time() + # Inference + pred_html = self.autoregressive_decode( + model= modelS, + image= image_tensor, + prefix=[vocabS.token_to_id("[html]")], + max_decode_len=512, + eos_id=vocabS.token_to_id(""), + token_whitelist=[vocabS.token_to_id(i) for i in VALID_HTML_TOKEN], + token_blacklist = None + ) + end2 = time.time() + print("time for inference table structure ",end2-start2,"seconds") + + # Convert token id to token text + pred_html = pred_html.detach().cpu().numpy()[0] + pred_html = vocabS.decode(pred_html, skip_special_tokens=False) + #print(pred_html) + pred_html = html_str_to_token_list(pred_html) + + print(pred_html) + + + """ + Step 2 Table Cell detection + """ + + + start3 = time.time() + # Table cell bbox detection + vocabB, modelB = self.load_vocab_and_model( + vocab_path="unitable/vocab/vocab_bbox.json", + max_seq_len=1024, + model_weights=MODEL_DIR / MODEL_FILE_NAME[1], + ) + end3 = time.time() + print("time to load cell bbox detection model ",end3-start3,"seconds") + + + start4 = time.time() + # Inference + pred_bbox = self.autoregressive_decode( + model=modelB, + image=image_tensor, + prefix=[vocabB.token_to_id("[bbox]")], + max_decode_len=1024, + eos_id=vocabB.token_to_id(""), + token_whitelist=[vocabB.token_to_id(i) for i in VALID_BBOX_TOKEN[: 449]], + token_blacklist = None + ) + end4 = time.time() + print("time to do inference for table cell bbox detection model ",end4-start4,"seconds") + + # Convert token id to token text + pred_bbox = pred_bbox.detach().cpu().numpy()[0] + pred_bbox = vocabB.decode(pred_bbox, skip_special_tokens=False) + pred_bbox = bbox_str_to_token_list(pred_bbox) + pred_bbox = self.rescale_bbox(pred_bbox, src=(448, 448), tgt=image.size) + + + + print(pred_bbox) + + print("Size of the image ") + #(1498, 971) + print(image.size) + print("Number of bounding boxes ") + print(len(pred_bbox)) + + + countcells = 0 + #startBody = False + #startFirstRow = True + #numElemInRow = 0 + for elem in pred_html : + #if elem == '': + # startBody = True + #elif startBody ==True and elem == '': + # startFirstRow = True + #elif startFirstRow == True and elem == '[]': + # numElemInRow +=1 + #elif startBody ==True and elem == '': + # startFirstRow = False + # startBody = False + if elem == '[]': + countcells+=1 + + + + #275 + print(countcells) + if countcells > len(pred_bbox): + #TODO Extra processing for big tables + + #Find the last incomplete row and its ymax coordinate + + # Last bbox's ymax gives us coordinate of where the cutted off row starts + #IMPORTANT : pred_bbox is xmin, ymax, xmax, ymin + cut_off = pred_bbox[-1][1] + + width = image.size[0] + height = image.size[1] + #bbox = (0, cut_off, width, height) + #IMPORTANT : crop takes in (xmin, ymax, xmax, ymin) coordintes !!! + bbox = (0, cut_off, width, height) + # Crop the image to the specified bounding box + cropped_image = image.crop(bbox) + cropped_image.save("./res/cropped_image_for_extra_bbox_det.png") + image_tensor = self.image_to_tensor(cropped_image, (448, 448)) + pred_bbox_extra = self.autoregressive_decode( + model=modelB, + image=image_tensor, + prefix=[vocabB.token_to_id("[bbox]")], + max_decode_len=1024, + eos_id=vocabB.token_to_id(""), + token_whitelist=[vocabB.token_to_id(i) for i in VALID_BBOX_TOKEN[: 449]], + token_blacklist = None + ) + # Convert token id to token text + pred_bbox_extra = pred_bbox_extra.detach().cpu().numpy()[0] + pred_bbox_extra = vocabB.decode(pred_bbox_extra, skip_special_tokens=False) + pred_bbox_extra = bbox_str_to_token_list(pred_bbox_extra) + numberOrCellsToAdd = countcells-len(pred_bbox) + pred_bbox_extra = pred_bbox_extra[-numberOrCellsToAdd:] + pred_bbox_extra = self.rescale_bbox(pred_bbox_extra, src=(448, 448), tgt=cropped_image.size) + #This resulted in table_bbox_test_extra_3.png + #pred_bbox_extra = [[i[0], i[1]+cut_off, i[2], i[3]+cut_off] for i in pred_bbox_extra] + pred_bbox_extra = [[i[0], i[1]+cut_off, i[2], i[3]+cut_off] for i in pred_bbox_extra] + + pred_bbox = pred_bbox + pred_bbox_extra + + #[[25, 63, 152, 86], [227, 63, 292, 86], [326, 63, 373, 86], [413, 63, 460, 86], [562, 63, 609, 86], [708, 63, 758, 86], [848, 63, 895, 86], [935, 63, 982, 86], [1025, 63, 1075, 86], [1119, 63, 1165, 86], [1280, 63, 1327, 86]] + print(pred_bbox_extra) + #11 + print(len(pred_bbox_extra)) + + + fig, ax = plt.subplots(figsize=(12, 10)) + for i in pred_bbox: + #i is xmin, ymin, xmax, ymax based on the function usage + rect = patches.Rectangle(i[:2], i[2] - i[0], i[3] - i[1], linewidth=1, edgecolor='r', facecolor='none') + ax.add_patch(rect) + ax.set_axis_off() + ax.imshow(image) + fig.savefig('./res/table_debug3/singleimageres.png', bbox_inches='tight', dpi=300) + + """ + Step 3 : Table cell content recognition + """ + + start4 = time.time() + # Table cell bbox detection + vocabC, modelC = self.load_vocab_and_model( + vocab_path="unitable/vocab/vocab_cell_6k.json", + max_seq_len=200, + model_weights=MODEL_DIR / MODEL_FILE_NAME[2], + ) + end4 = time.time() + print("time to load cell recognition model ",end4-start4,"seconds") + + # Cell image cropping and transformation + """ + images = [image.crop(bbox) for bbox in pred_bbox] + for idx, img in enumerate(images): + img.save("res/debug/cell_{}.png".format(idx)) + """ + #Cropping boundaries are fine + image_tensor = [self.image_to_tensor(image.crop(bbox), size=(112, 448)) for bbox in pred_bbox] + image_tensor = torch.cat(image_tensor, dim=0) + #print("size of tensor") + #print(image_tensor.size()) + + start4 = time.time() + # Inference + pred_cell = self.autoregressive_decode( + model=modelC, + image=image_tensor, + prefix=[vocabC.token_to_id("[cell]")], + max_decode_len=200, + eos_id=vocabC.token_to_id(""), + token_whitelist=None, + token_blacklist = [vocabC.token_to_id(i) for i in INVALID_CELL_TOKEN] + ) + + # Convert token id to token text + pred_cell = pred_cell.detach().cpu().numpy() + pred_cell = vocabC.decode_batch(pred_cell, skip_special_tokens=False) + + end4 = time.time() + print("time to do cell recognition ",end4-start4,"seconds") + + pred_cell = [cell_str_to_token_list(i) for i in pred_cell] + pred_cell = [re.sub(r'(\d).\s+(\d)', r'\1.\2', i) for i in pred_cell] + + print(pred_cell) + + # Combine the table structure and cell content + pred_code = build_table_from_html_and_cell(pred_html, pred_cell) + pred_code = "".join(pred_code) + pred_code = html_table_template(pred_code) + + # Display the HTML table + soup = bs(pred_code) + table_code = soup.prettify() + print(table_code) + + diff --git a/unitable/unitable_predictor.py b/unitable/unitable_predictor.py new file mode 100644 index 0000000000000000000000000000000000000000..7c48d0218a4060f42656349ed45d89f797a2cf8a --- /dev/null +++ b/unitable/unitable_predictor.py @@ -0,0 +1,343 @@ +from typing import Tuple, List, Sequence, Optional, Union +from pathlib import Path +import re +import torch +import tokenizers as tk +from PIL import Image +from matplotlib import pyplot as plt +from matplotlib import patches +from torchvision import transforms +from torch import nn, Tensor +from functools import partial +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] +import warnings +import time +import argparse + +from .src.model import EncoderDecoder, ImgLinearBackbone, Encoder, Decoder +from .src.utils import subsequent_mask, pred_token_within_range, greedy_sampling, bbox_str_to_token_list, html_str_to_token_list +from .src.trainer.utils import VALID_HTML_TOKEN, VALID_BBOX_TOKEN, INVALID_CELL_TOKEN + +warnings.filterwarnings('ignore') +device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") + +class UnitablePredictor(): + def __init__(self): + pass + + def load_vocab_and_model( + self, + backbone, + encoder, + decoder, + vocab_path: Union[str, Path], + max_seq_len: int, + model_weights: Union[str, Path], + ) -> Tuple[tk.Tokenizer, EncoderDecoder]: + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + vocab = tk.Tokenizer.from_file(vocab_path) + d_model = 768 + dropout = 0.2 + model = EncoderDecoder( + backbone= backbone, + encoder= encoder, + decoder= decoder, + vocab_size= vocab.get_vocab_size(), + d_model= d_model, + padding_idx= vocab.token_to_id(""), + max_seq_len=max_seq_len, + dropout=dropout, + norm_layer=partial(nn.LayerNorm, eps=1e-6) + ) + # it loads weights onto the CPU first and then moves the model to the desired device + model.load_state_dict(torch.load(model_weights, map_location="cpu")) + model = model.to(device) + + return vocab, model + + + def autoregressive_decode( + self, + model: EncoderDecoder, + image: Tensor, + prefix: Sequence[int], + max_decode_len: int, + eos_id: int, + token_whitelist: Optional[Sequence[int]] = None, + token_blacklist: Optional[Sequence[int]] = None, + ) -> Tensor: + model.eval() + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + with torch.no_grad(): + """ + The encoder takes the input data (in this case, an image) and transforms it into a high-dimensional feature representation. + This feature representation, or memory tensor, captures the essential information from the input data needed to generate the output sequence. + """ + memory = model.encode(image) + """ + Creates a context tensor from the prefix and repeats it to match the batch size of the image, moving it to the appropriate device. + """ + context = torch.tensor(prefix, dtype=torch.int32).repeat(image.shape[0], 1).to(device) + + for _ in range(max_decode_len): + eos_flag = [eos_id in k for k in context] + if all(eos_flag): + break + + with torch.no_grad(): + causal_mask = subsequent_mask(context.shape[1]).to(device) + logits = model.decode( + memory, context, tgt_mask=causal_mask, tgt_padding_mask=None + ) + logits = model.generator(logits)[:, -1, :] + + logits = pred_token_within_range( + logits.detach(), + white_list=token_whitelist, + black_list=token_blacklist, + ) + + next_probs, next_tokens = greedy_sampling(logits) + context = torch.cat([context, next_tokens], dim=1) + return context + + + @staticmethod + def image_to_tensor(image: Image, size: Tuple[int, int]) -> Tensor: + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + T = transforms.Compose([ + transforms.Resize(size), + transforms.ToTensor(), + transforms.Normalize(mean=[0.86597056,0.88463002,0.87491087], std = [0.20686628,0.18201602,0.18485524]) + ]) + + image_tensor = T(image) + image_tensor = image_tensor.to(device).unsqueeze(0) + + return image_tensor + + def rescale_bbox( + self, + bbox: Sequence[Sequence[float]], + src: Tuple[int, int], + tgt: Tuple[int, int] + ) -> Sequence[Sequence[float]]: + assert len(src) == len(tgt) == 2 + ratio = [tgt[0] / src[0], tgt[1] / src[1]] * 2 + print(ratio) + bbox = [[int(round(i * j)) for i, j in zip(entry, ratio)] for entry in bbox] + return bbox + + + def predict(self, images:List[Image.Image],debugfolder_filename_page_name:str): + MODEL_FILE_NAME = ["unitable_large_structure.pt", "unitable_large_bbox.pt", "unitable_large_content.pt"] + MODEL_DIR = Path("./unitable/experiments/unitable_weights") + # UniTable large model + d_model = 768 + patch_size = 16 + nhead = 12 + dropout = 0.2 + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + backbone= ImgLinearBackbone(d_model=d_model, patch_size=patch_size) + encoder= Encoder( + d_model=d_model, + nhead=nhead, + dropout=dropout, + activation="gelu", + norm_first=True, + nlayer=12, + ff_ratio=4, + ) + decoder= Decoder( + d_model=d_model, + nhead=nhead, + dropout=dropout, + activation="gelu", + norm_first=True, + nlayer=4, + ff_ratio=4, + ) + + + """ + Step 1 Load Table Structure Model + """ + + start1 = time.time() + # Table structure extraction + vocabS, modelS = self.load_vocab_and_model( + backbone=backbone, + encoder=encoder, + decoder=decoder, + vocab_path="./unitable/vocab/vocab_html.json", + max_seq_len=784, + model_weights=MODEL_DIR / MODEL_FILE_NAME[0] + ) + + end1 = time.time() + print("time to load table structure model ",end1-start1,"seconds") + + """ + Step 2 prepare images to tensor + """ + image_tensors = [] + for i in range(len(images)): + image_size = images[i].size + # Image transformation + image_tensor = self.image_to_tensor(images[i], (448, 448)) + image_tensors.append(image_tensor) + + + + # This will be list of arrays(pred_html), which is again list of array + pred_htmls = [] + for i in range(len(image_tensors)): + #print(image_tensor) + print("Processing table "+str(i)) + start2 = time.time() + # Inference + pred_html = self.autoregressive_decode( + model= modelS, + image= image_tensors[i], + prefix=[vocabS.token_to_id("[html]")], + max_decode_len=512, + eos_id=vocabS.token_to_id(""), + token_whitelist=[vocabS.token_to_id(i) for i in VALID_HTML_TOKEN], + token_blacklist = None + ) + + end2 = time.time() + + print("time for inference table structure ",end2-start2,"seconds") + pred_html = pred_html.detach().cpu().numpy()[0] + pred_html = vocabS.decode(pred_html, skip_special_tokens=False) + + pred_html = html_str_to_token_list(pred_html) + pred_htmls.append(pred_html) + print(pred_html) + """ + Step 3 Load Table Cell detection + """ + + + start3 = time.time() + # Table cell bbox detection + vocabB, modelB = self.load_vocab_and_model( + backbone=backbone, + encoder=encoder, + decoder=decoder, + vocab_path="./unitable/vocab/vocab_bbox.json", + max_seq_len=1024, + model_weights=MODEL_DIR / MODEL_FILE_NAME[1], + ) + end3 = time.time() + print("time to load cell bbox detection model ",end3-start3,"seconds") + """ + Step 4 do the pred_bboxes detection + """ + + pred_bboxs =[] + for i in range(len(image_tensors)): + start4 = time.time() + # Inference + pred_bbox = self.autoregressive_decode( + model=modelB, + image=image_tensors[i], + prefix=[vocabB.token_to_id("[bbox]")], + max_decode_len=1024, + eos_id=vocabB.token_to_id(""), + token_whitelist=[vocabB.token_to_id(i) for i in VALID_BBOX_TOKEN[: 449]], + token_blacklist = None + ) + end4 = time.time() + print("Processing table "+str(i)) + print("time to do inference for table cell bbox detection model ",end4-start4,"seconds") + # Convert token id to token text + pred_bbox = pred_bbox.detach().cpu().numpy()[0] + pred_bbox = vocabB.decode(pred_bbox, skip_special_tokens=False) + pred_bbox = bbox_str_to_token_list(pred_bbox) + pred_bbox = self.rescale_bbox(pred_bbox, src=(448, 448), tgt=images[i].size) + print(pred_bbox) + + print("Size of the image ") + #(1498, 971) + print(images[i].size) + print("Number of bounding boxes ") + print(len(pred_bbox)) + countcells = 0 + for elem in pred_htmls[i] : + if elem == '[]' or elem == '>[]': + countcells+=1 + + #275 + print("number of countcells") + print(countcells) + if countcells > 256: + #TODO Extra processing for big tables + + #Find the last incomplete row and its ymax coordinate + + # Last bbox's ymax gives us coordinate of where the cutted off row starts + #IMPORTANT : pred_bbox is xmin, ymin, xmax, ymax + cut_off = pred_bbox[-1][1] + + #This will be used to distinguish how many cells are already detected in that row. + + last_cells_redudant = 0 + for cell in reversed(pred_bbox): + if cut_off-5 < cell[1] "), + token_whitelist=[vocabB.token_to_id(i) for i in VALID_BBOX_TOKEN[: 449]], + token_blacklist = None + ) + # Convert token id to token text + pred_bbox_extra = pred_bbox_extra.detach().cpu().numpy()[0] + pred_bbox_extra = vocabB.decode(pred_bbox_extra, skip_special_tokens=False) + pred_bbox_extra = bbox_str_to_token_list(pred_bbox_extra) + + pred_bbox_extra = pred_bbox_extra[last_cells_redudant:] + pred_bbox_extra = self.rescale_bbox(pred_bbox_extra, src=(448, 448), tgt=cropped_image.size) + pred_bbox_extra = [[i[0], i[1]+cut_off, i[2], i[3]+cut_off] for i in pred_bbox_extra] + + pred_bbox = pred_bbox + pred_bbox_extra + + print("extra boxes:") + print(pred_bbox_extra) + print("length of extra boxes") + print(len(pred_bbox_extra)) + + pred_bboxs.append(pred_bbox) + fig, ax = plt.subplots(figsize=(12, 10)) + for j in pred_bbox: + #i is xmin, ymin, xmax, ymax based on the function usage + rect = patches.Rectangle(j[:2], j[2] - j[0], j[3] - j[1], linewidth=1, edgecolor='r', facecolor='none') + ax.add_patch(rect) + ax.set_axis_off() + ax.imshow(images[i]) + fig.savefig(debugfolder_filename_page_name+str(i)+".png", bbox_inches='tight', dpi=300) + + + return pred_htmls,pred_bboxs + diff --git a/unitable/unitable_run_double_check.py b/unitable/unitable_run_double_check.py new file mode 100644 index 0000000000000000000000000000000000000000..e63426272161b79920549f57c1b696e134b2133c --- /dev/null +++ b/unitable/unitable_run_double_check.py @@ -0,0 +1,287 @@ +# -*- coding: utf-8 -*- +"""Unitable_run_double_check.ipynb + +Automatically generated by Colab. + +Original file is located at + https://colab.research.google.com/drive/1oaXgLoIaNY8SJwUQB_vMyiXPNZGKOIpb +""" + + +from typing import Tuple, List, Sequence, Optional, Union +from pathlib import Path +import re +import torch +import tokenizers as tk +from PIL import Image +from matplotlib import pyplot as plt +from matplotlib import patches +from torchvision import transforms +from torch import nn, Tensor +from functools import partial +from bs4 import BeautifulSoup as bs +import warnings +import time +from src.model import EncoderDecoder, ImgLinearBackbone, Encoder, Decoder +from src.utils import subsequent_mask, pred_token_within_range, greedy_sampling, bbox_str_to_token_list, cell_str_to_token_list, html_str_to_token_list, build_table_from_html_and_cell, html_table_template +from src.trainer.utils import VALID_HTML_TOKEN, VALID_BBOX_TOKEN, INVALID_CELL_TOKEN + +warnings.filterwarnings('ignore') +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + +# Check all model weights have been downloaded to experiments/unitable_weights +MODEL_FILE_NAME = ["unitable_large_structure.pt", "unitable_large_bbox.pt", "unitable_large_content.pt"] +MODEL_DIR = Path("./experiments/unitable_weights") + +assert all([(MODEL_DIR / name).is_file() for name in MODEL_FILE_NAME]), f"Please download model weights from HuggingFace: https://huggingface.co/poloclub/UniTable/tree/main" + +# Load tabular image + +image_path = "../TestingFilesImages/table_Test1.png" +image = Image.open(image_path).convert("RGB") +image_size = image.size + +fig, ax = plt.subplots(figsize=(12, 10)) +ax.imshow(image) + +# UniTable large model +d_model = 768 +patch_size = 16 +nhead = 12 +dropout = 0.2 + +start= time.time() +backbone = ImgLinearBackbone(d_model=d_model, patch_size=patch_size) +encoder = Encoder( + d_model=d_model, + nhead=nhead, + dropout = dropout, + activation="gelu", + norm_first=True, + nlayer=12, + ff_ratio=4, +) +decoder = Decoder( + d_model=d_model, + nhead=nhead, + dropout = dropout, + activation="gelu", + norm_first=True, + nlayer=4, + ff_ratio=4, +) +end= time.time() +time1 = end-start +print("time to load" + str(time1)) + +def autoregressive_decode( + model: EncoderDecoder, + image: Tensor, + prefix: Sequence[int], + max_decode_len: int, + eos_id: int, + token_whitelist: Optional[Sequence[int]] = None, + token_blacklist: Optional[Sequence[int]] = None, +) -> Tensor: + model.eval() + with torch.no_grad(): + memory = model.encode(image) + context = torch.tensor(prefix, dtype=torch.int32).repeat(image.shape[0], 1).to(device) + + for _ in range(max_decode_len): + eos_flag = [eos_id in k for k in context] + if all(eos_flag): + break + + with torch.no_grad(): + causal_mask = subsequent_mask(context.shape[1]).to(device) + logits = model.decode( + memory, context, tgt_mask=causal_mask, tgt_padding_mask=None + ) + logits = model.generator(logits)[:, -1, :] + + logits = pred_token_within_range( + logits.detach(), + white_list=token_whitelist, + black_list=token_blacklist, + ) + + next_probs, next_tokens = greedy_sampling(logits) + context = torch.cat([context, next_tokens], dim=1) + return context + +def load_vocab_and_model( + vocab_path: Union[str, Path], + max_seq_len: int, + model_weights: Union[str, Path], +) -> Tuple[tk.Tokenizer, EncoderDecoder]: + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + vocab = tk.Tokenizer.from_file(vocab_path) + model = EncoderDecoder( + backbone=backbone, + encoder=encoder, + decoder=decoder, + vocab_size=vocab.get_vocab_size(), + d_model=d_model, + padding_idx=vocab.token_to_id(""), + max_seq_len=max_seq_len, + dropout=dropout, + norm_layer=partial(nn.LayerNorm, eps=1e-6) + ) + + model.load_state_dict(torch.load(model_weights, map_location=device)) + model = model.to(device) + return vocab, model + +def image_to_tensor(image: Image, size: Tuple[int, int]) -> Tensor: + T = transforms.Compose([ + transforms.Resize(size), + transforms.ToTensor(), + transforms.Normalize(mean=[0.86597056,0.88463002,0.87491087], std = [0.20686628,0.18201602,0.18485524]) + ]) + image_tensor = T(image) + image_tensor = image_tensor.to(device).unsqueeze(0) + + return image_tensor + +def rescale_bbox( + bbox: Sequence[Sequence[float]], + src: Tuple[int, int], + tgt: Tuple[int, int] +) -> Sequence[Sequence[float]]: + assert len(src) == len(tgt) == 2 + ratio = [tgt[0] / src[0], tgt[1] / src[1]] * 2 + bbox = [[int(round(i * j)) for i, j in zip(entry, ratio)] for entry in bbox] + return bbox + +# Table structure extraction +import time +start= time.time() +vocab, model = load_vocab_and_model( + vocab_path="./vocab/vocab_html.json", + max_seq_len=784, + model_weights=MODEL_DIR / MODEL_FILE_NAME[0], +) +end= time.time() +time1 = end-start +print("time to load structure model " + str(time1)) +# Image transformation +image_tensor = image_to_tensor(image, size=(448, 448)) + +# Inference +start= time.time() +pred_html = autoregressive_decode( + model=model, + image=image_tensor, + prefix=[vocab.token_to_id("[html]")], + max_decode_len=512, + eos_id=vocab.token_to_id(""), + token_whitelist=[vocab.token_to_id(i) for i in VALID_HTML_TOKEN], + token_blacklist = None +) +end= time.time() +time1 = end-start +print("time to do structure inference" + str(time1)) + +# Convert token id to token text +pred_html = pred_html.detach().cpu().numpy()[0] +pred_html = vocab.decode(pred_html, skip_special_tokens=False) +pred_html = html_str_to_token_list(pred_html) + +# print(pred_html) + +# Table cell bbox detection +start= time.time() +vocab, model = load_vocab_and_model( + vocab_path="./vocab/vocab_bbox.json", + max_seq_len=1024, + model_weights=MODEL_DIR / MODEL_FILE_NAME[1], +) + +end= time.time() +time1 = end-start +print("time to load cell bbox detection " + str(time1)) +# Image transformation +image_tensor = image_to_tensor(image, size=(448, 448)) + +# Inference +start= time.time() +pred_bbox = autoregressive_decode( + model=model, + image=image_tensor, + prefix=[vocab.token_to_id("[bbox]")], + max_decode_len=1024, + eos_id=vocab.token_to_id(""), + token_whitelist=[vocab.token_to_id(i) for i in VALID_BBOX_TOKEN[: 449]], + token_blacklist = None +) +end= time.time() +time1 = end-start +print("time to do cell bbox detection " + str(time1)) + +# Convert token id to token text +pred_bbox = pred_bbox.detach().cpu().numpy()[0] +pred_bbox = vocab.decode(pred_bbox, skip_special_tokens=False) + +# print(pred_bbox) + +# Visualize detected bbox +pred_bbox = bbox_str_to_token_list(pred_bbox) +pred_bbox = rescale_bbox(pred_bbox, src=(448, 448), tgt=image_size) + +fig, ax = plt.subplots(figsize=(12, 10)) +for i in pred_bbox: + rect = patches.Rectangle(i[:2], i[2] - i[0], i[3] - i[1], linewidth=1, edgecolor='r', facecolor='none') + ax.add_patch(rect) +ax.set_axis_off() +ax.imshow(image) + +# Table cell content recognition +start= time.time() +vocab, model = load_vocab_and_model( + vocab_path="./vocab/vocab_cell_6k.json", + max_seq_len=200, + model_weights=MODEL_DIR / MODEL_FILE_NAME[2], +) +end= time.time() +time1 = end-start +print("time to load cell content " + str(time1)) + +# Cell image cropping and transformation +image_tensor = [image_to_tensor(image.crop(bbox), size=(112, 448)) for bbox in pred_bbox] +image_tensor = torch.cat(image_tensor, dim=0) + +start= time.time() +# Inference +pred_cell = autoregressive_decode( + model=model, + image=image_tensor, + prefix=[vocab.token_to_id("[cell]")], + max_decode_len=200, + eos_id=vocab.token_to_id(""), + token_whitelist=None, + token_blacklist = [vocab.token_to_id(i) for i in INVALID_CELL_TOKEN] +) +end= time.time() +time1 = end-start +print("time to do cell content " + str(time1)) +# Convert token id to token text +pred_cell = pred_cell.detach().cpu().numpy() +pred_cell = vocab.decode_batch(pred_cell, skip_special_tokens=False) +pred_cell = [cell_str_to_token_list(i) for i in pred_cell] +pred_cell = [re.sub(r'(\d).\s+(\d)', r'\1.\2', i) for i in pred_cell] + +# print(pred_cell) + +# Combine the table structure and cell content +pred_code = build_table_from_html_and_cell(pred_html, pred_cell) +pred_code = "".join(pred_code) +pred_code = html_table_template(pred_code) + +# Display the HTML table +soup = bs(pred_code) +table_code = soup.prettify() + +# Raw HTML table code +print(table_code) \ No newline at end of file diff --git a/unitable/vocab/vocab_bbox.json b/unitable/vocab/vocab_bbox.json new file mode 100644 index 0000000000000000000000000000000000000000..186c6e6ea4c64dce8f0ce8d078a65b97f237a86d --- /dev/null +++ b/unitable/vocab/vocab_bbox.json @@ -0,0 +1,8960 @@ +{ + "version": "1.0", + "truncation": null, + "padding": { + "strategy": "BatchLongest", + "direction": "Right", + "pad_to_multiple_of": null, + "pad_id": 2, + "pad_type_id": 0, + "pad_token": "" + }, + "added_tokens": [ + { + "id": 0, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 1, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 2, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 3, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 4, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 5, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 6, + "content": "[table]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 7, + "content": "[html]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 8, + "content": "[cell]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 9, + "content": "[bbox]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 10, + "content": "[cell+bbox]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 11, + "content": "bbox-0", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 12, + "content": "bbox-1", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 13, + "content": "bbox-2", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 14, + "content": "bbox-3", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 15, + "content": "bbox-4", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 16, + "content": "bbox-5", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 17, + "content": "bbox-6", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 18, + "content": "bbox-7", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 19, + "content": "bbox-8", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 20, + "content": "bbox-9", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 21, + "content": "bbox-10", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 22, + "content": "bbox-11", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 23, + "content": "bbox-12", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 24, + "content": "bbox-13", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 25, + "content": "bbox-14", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 26, + "content": "bbox-15", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 27, + "content": "bbox-16", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 28, + "content": "bbox-17", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 29, + "content": "bbox-18", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 30, + "content": "bbox-19", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 31, + "content": "bbox-20", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 32, + "content": "bbox-21", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 33, + "content": "bbox-22", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 34, + "content": "bbox-23", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 35, + "content": "bbox-24", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 36, + "content": "bbox-25", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 37, + "content": "bbox-26", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 38, + "content": "bbox-27", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 39, + "content": "bbox-28", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 40, + "content": "bbox-29", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 41, + "content": "bbox-30", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 42, + "content": "bbox-31", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 43, + "content": "bbox-32", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 44, + "content": "bbox-33", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 45, + "content": "bbox-34", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 46, + "content": "bbox-35", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 47, + "content": "bbox-36", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 48, + "content": "bbox-37", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 49, + "content": "bbox-38", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 50, + "content": "bbox-39", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 51, + "content": "bbox-40", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 52, + "content": "bbox-41", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 53, + "content": "bbox-42", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 54, + "content": "bbox-43", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 55, + "content": "bbox-44", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 56, + "content": "bbox-45", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 57, + "content": "bbox-46", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 58, + "content": "bbox-47", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 59, + "content": "bbox-48", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 60, + "content": "bbox-49", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 61, + "content": "bbox-50", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 62, + "content": "bbox-51", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 63, + "content": "bbox-52", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 64, + "content": "bbox-53", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 65, + "content": "bbox-54", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 66, + "content": "bbox-55", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 67, + "content": "bbox-56", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 68, + "content": "bbox-57", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 69, + "content": "bbox-58", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 70, + "content": "bbox-59", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 71, + "content": "bbox-60", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 72, + "content": "bbox-61", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 73, + "content": "bbox-62", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 74, + "content": "bbox-63", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 75, + "content": "bbox-64", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 76, + "content": "bbox-65", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 77, + "content": "bbox-66", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 78, + "content": "bbox-67", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 79, + "content": "bbox-68", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 80, + "content": "bbox-69", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 81, + "content": "bbox-70", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 82, + "content": "bbox-71", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 83, + "content": "bbox-72", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 84, + "content": "bbox-73", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 85, + "content": "bbox-74", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 86, + "content": "bbox-75", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 87, + "content": "bbox-76", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 88, + "content": "bbox-77", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 89, + "content": "bbox-78", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 90, + "content": "bbox-79", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 91, + "content": "bbox-80", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 92, + "content": "bbox-81", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 93, + "content": "bbox-82", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 94, + "content": "bbox-83", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 95, + "content": "bbox-84", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 96, + "content": "bbox-85", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 97, + "content": "bbox-86", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 98, + "content": "bbox-87", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 99, + "content": "bbox-88", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 100, + "content": "bbox-89", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 101, + "content": "bbox-90", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 102, + "content": "bbox-91", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 103, + "content": "bbox-92", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 104, + "content": "bbox-93", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 105, + "content": "bbox-94", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 106, + "content": "bbox-95", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 107, + "content": "bbox-96", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 108, + "content": "bbox-97", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 109, + "content": "bbox-98", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 110, + "content": "bbox-99", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 111, + "content": "bbox-100", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 112, + "content": "bbox-101", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 113, + "content": "bbox-102", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 114, + "content": "bbox-103", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 115, + "content": "bbox-104", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 116, + "content": "bbox-105", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 117, + "content": "bbox-106", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 118, + "content": "bbox-107", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 119, + "content": "bbox-108", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 120, + "content": "bbox-109", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 121, + "content": "bbox-110", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 122, + "content": "bbox-111", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 123, + "content": "bbox-112", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 124, + "content": "bbox-113", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 125, + "content": "bbox-114", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 126, + "content": "bbox-115", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 127, + "content": "bbox-116", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 128, + "content": "bbox-117", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 129, + "content": "bbox-118", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 130, + "content": "bbox-119", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 131, + "content": "bbox-120", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 132, + "content": "bbox-121", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 133, + "content": "bbox-122", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 134, + "content": "bbox-123", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 135, + "content": "bbox-124", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 136, + "content": "bbox-125", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 137, + "content": "bbox-126", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 138, + "content": "bbox-127", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 139, + "content": "bbox-128", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 140, + "content": "bbox-129", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 141, + "content": "bbox-130", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 142, + "content": "bbox-131", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 143, + "content": "bbox-132", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 144, + "content": "bbox-133", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 145, + "content": "bbox-134", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 146, + "content": "bbox-135", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 147, + "content": "bbox-136", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 148, + "content": "bbox-137", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 149, + "content": "bbox-138", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 150, + "content": "bbox-139", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 151, + "content": "bbox-140", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 152, + "content": "bbox-141", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 153, + "content": "bbox-142", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 154, + "content": "bbox-143", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 155, + "content": "bbox-144", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 156, + "content": "bbox-145", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 157, + "content": "bbox-146", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 158, + "content": "bbox-147", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 159, + "content": "bbox-148", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 160, + "content": "bbox-149", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 161, + "content": "bbox-150", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 162, + "content": "bbox-151", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 163, + "content": "bbox-152", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 164, + "content": "bbox-153", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 165, + "content": "bbox-154", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 166, + "content": "bbox-155", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 167, + "content": "bbox-156", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 168, + "content": "bbox-157", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 169, + "content": "bbox-158", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 170, + "content": "bbox-159", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 171, + "content": "bbox-160", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 172, + "content": "bbox-161", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 173, + "content": "bbox-162", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 174, + "content": "bbox-163", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 175, + "content": "bbox-164", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 176, + "content": "bbox-165", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 177, + "content": "bbox-166", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 178, + "content": "bbox-167", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 179, + "content": "bbox-168", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 180, + "content": "bbox-169", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 181, + "content": "bbox-170", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 182, + "content": "bbox-171", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 183, + "content": "bbox-172", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 184, + "content": "bbox-173", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 185, + "content": "bbox-174", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 186, + "content": "bbox-175", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 187, + "content": "bbox-176", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 188, + "content": "bbox-177", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 189, + "content": "bbox-178", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 190, + "content": "bbox-179", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 191, + "content": "bbox-180", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 192, + "content": "bbox-181", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 193, + "content": "bbox-182", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 194, + "content": "bbox-183", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 195, + "content": "bbox-184", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 196, + "content": "bbox-185", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 197, + "content": "bbox-186", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 198, + "content": "bbox-187", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 199, + "content": "bbox-188", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 200, + "content": "bbox-189", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 201, + "content": "bbox-190", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 202, + "content": "bbox-191", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 203, + "content": "bbox-192", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 204, + "content": "bbox-193", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 205, + "content": "bbox-194", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 206, + "content": "bbox-195", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 207, + "content": "bbox-196", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 208, + "content": "bbox-197", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 209, + "content": "bbox-198", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 210, + "content": "bbox-199", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 211, + "content": "bbox-200", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 212, + "content": "bbox-201", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 213, + "content": "bbox-202", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 214, + "content": "bbox-203", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 215, + "content": "bbox-204", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 216, + "content": "bbox-205", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 217, + "content": "bbox-206", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 218, + "content": "bbox-207", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 219, + "content": "bbox-208", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 220, + "content": "bbox-209", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 221, + "content": "bbox-210", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 222, + "content": "bbox-211", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 223, + "content": "bbox-212", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 224, + "content": "bbox-213", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 225, + "content": "bbox-214", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 226, + "content": "bbox-215", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 227, + "content": "bbox-216", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 228, + "content": "bbox-217", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 229, + "content": "bbox-218", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 230, + "content": "bbox-219", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 231, + "content": "bbox-220", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 232, + "content": "bbox-221", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 233, + "content": "bbox-222", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 234, + "content": "bbox-223", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 235, + "content": "bbox-224", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 236, + "content": "bbox-225", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 237, + "content": "bbox-226", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 238, + "content": "bbox-227", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 239, + "content": "bbox-228", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 240, + "content": "bbox-229", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 241, + "content": "bbox-230", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 242, + "content": "bbox-231", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 243, + "content": "bbox-232", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 244, + "content": "bbox-233", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 245, + "content": "bbox-234", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 246, + "content": "bbox-235", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 247, + "content": "bbox-236", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 248, + "content": "bbox-237", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 249, + "content": "bbox-238", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 250, + "content": "bbox-239", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 251, + "content": "bbox-240", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 252, + "content": "bbox-241", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 253, + "content": "bbox-242", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 254, + "content": "bbox-243", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 255, + "content": "bbox-244", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 256, + "content": "bbox-245", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 257, + "content": "bbox-246", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 258, + "content": "bbox-247", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 259, + "content": "bbox-248", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 260, + "content": "bbox-249", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 261, + "content": "bbox-250", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 262, + "content": "bbox-251", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 263, + "content": "bbox-252", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 264, + "content": "bbox-253", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 265, + "content": "bbox-254", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 266, + "content": "bbox-255", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 267, + "content": "bbox-256", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 268, + "content": "bbox-257", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 269, + "content": "bbox-258", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 270, + "content": "bbox-259", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 271, + "content": "bbox-260", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 272, + "content": "bbox-261", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 273, + "content": "bbox-262", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 274, + "content": "bbox-263", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 275, + "content": "bbox-264", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 276, + "content": "bbox-265", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 277, + "content": "bbox-266", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 278, + "content": "bbox-267", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 279, + "content": "bbox-268", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 280, + "content": "bbox-269", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 281, + "content": "bbox-270", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 282, + "content": "bbox-271", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 283, + "content": "bbox-272", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 284, + "content": "bbox-273", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 285, + "content": "bbox-274", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 286, + "content": "bbox-275", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 287, + "content": "bbox-276", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 288, + "content": "bbox-277", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 289, + "content": "bbox-278", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 290, + "content": "bbox-279", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 291, + "content": "bbox-280", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 292, + "content": "bbox-281", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 293, + "content": "bbox-282", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 294, + "content": "bbox-283", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 295, + "content": "bbox-284", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 296, + "content": "bbox-285", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 297, + "content": "bbox-286", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 298, + "content": "bbox-287", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 299, + "content": "bbox-288", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 300, + "content": "bbox-289", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 301, + "content": "bbox-290", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 302, + "content": "bbox-291", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 303, + "content": "bbox-292", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 304, + "content": "bbox-293", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 305, + "content": "bbox-294", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 306, + "content": "bbox-295", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 307, + "content": "bbox-296", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 308, + "content": "bbox-297", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 309, + "content": "bbox-298", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 310, + "content": "bbox-299", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 311, + "content": "bbox-300", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 312, + "content": "bbox-301", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 313, + "content": "bbox-302", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 314, + "content": "bbox-303", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 315, + "content": "bbox-304", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 316, + "content": "bbox-305", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 317, + "content": "bbox-306", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 318, + "content": "bbox-307", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 319, + "content": "bbox-308", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 320, + "content": "bbox-309", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 321, + "content": "bbox-310", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 322, + "content": "bbox-311", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 323, + "content": "bbox-312", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 324, + "content": "bbox-313", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 325, + "content": "bbox-314", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 326, + "content": "bbox-315", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 327, + "content": "bbox-316", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 328, + "content": "bbox-317", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 329, + "content": "bbox-318", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 330, + "content": "bbox-319", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 331, + "content": "bbox-320", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 332, + "content": "bbox-321", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 333, + "content": "bbox-322", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 334, + "content": "bbox-323", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 335, + "content": "bbox-324", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 336, + "content": "bbox-325", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 337, + "content": "bbox-326", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 338, + "content": "bbox-327", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 339, + "content": "bbox-328", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 340, + "content": "bbox-329", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 341, + "content": "bbox-330", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 342, + "content": "bbox-331", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 343, + "content": "bbox-332", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 344, + "content": "bbox-333", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 345, + "content": "bbox-334", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 346, + "content": "bbox-335", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 347, + "content": "bbox-336", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 348, + "content": "bbox-337", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 349, + "content": "bbox-338", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 350, + "content": "bbox-339", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 351, + "content": "bbox-340", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 352, + "content": "bbox-341", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 353, + "content": "bbox-342", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 354, + "content": "bbox-343", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 355, + "content": "bbox-344", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 356, + "content": "bbox-345", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 357, + "content": "bbox-346", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 358, + "content": "bbox-347", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 359, + "content": "bbox-348", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 360, + "content": "bbox-349", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 361, + "content": "bbox-350", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 362, + "content": "bbox-351", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 363, + "content": "bbox-352", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 364, + "content": "bbox-353", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 365, + "content": "bbox-354", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 366, + "content": "bbox-355", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 367, + "content": "bbox-356", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 368, + "content": "bbox-357", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 369, + "content": "bbox-358", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 370, + "content": "bbox-359", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 371, + "content": "bbox-360", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 372, + "content": "bbox-361", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 373, + "content": "bbox-362", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 374, + "content": "bbox-363", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 375, + "content": "bbox-364", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 376, + "content": "bbox-365", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 377, + "content": "bbox-366", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 378, + "content": "bbox-367", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 379, + "content": "bbox-368", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 380, + "content": "bbox-369", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 381, + "content": "bbox-370", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 382, + "content": "bbox-371", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 383, + "content": "bbox-372", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 384, + "content": "bbox-373", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 385, + "content": "bbox-374", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 386, + "content": "bbox-375", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 387, + "content": "bbox-376", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 388, + "content": "bbox-377", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 389, + "content": "bbox-378", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 390, + "content": "bbox-379", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 391, + "content": "bbox-380", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 392, + "content": "bbox-381", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 393, + "content": "bbox-382", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 394, + "content": "bbox-383", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 395, + "content": "bbox-384", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 396, + "content": "bbox-385", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 397, + "content": "bbox-386", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 398, + "content": "bbox-387", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 399, + "content": "bbox-388", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 400, + "content": "bbox-389", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 401, + "content": "bbox-390", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 402, + "content": "bbox-391", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 403, + "content": "bbox-392", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 404, + "content": "bbox-393", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 405, + "content": "bbox-394", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 406, + "content": "bbox-395", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 407, + "content": "bbox-396", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 408, + "content": "bbox-397", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 409, + "content": "bbox-398", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 410, + "content": "bbox-399", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 411, + "content": "bbox-400", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 412, + "content": "bbox-401", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 413, + "content": "bbox-402", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 414, + "content": "bbox-403", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 415, + "content": "bbox-404", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 416, + "content": "bbox-405", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 417, + "content": "bbox-406", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 418, + "content": "bbox-407", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 419, + "content": "bbox-408", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 420, + "content": "bbox-409", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 421, + "content": "bbox-410", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 422, + "content": "bbox-411", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 423, + "content": "bbox-412", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 424, + "content": "bbox-413", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 425, + "content": "bbox-414", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 426, + "content": "bbox-415", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 427, + "content": "bbox-416", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 428, + "content": "bbox-417", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 429, + "content": "bbox-418", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 430, + "content": "bbox-419", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 431, + "content": "bbox-420", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 432, + "content": "bbox-421", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 433, + "content": "bbox-422", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 434, + "content": "bbox-423", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 435, + "content": "bbox-424", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 436, + "content": "bbox-425", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 437, + "content": "bbox-426", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 438, + "content": "bbox-427", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 439, + "content": "bbox-428", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 440, + "content": "bbox-429", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 441, + "content": "bbox-430", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 442, + "content": "bbox-431", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 443, + "content": "bbox-432", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 444, + "content": "bbox-433", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 445, + "content": "bbox-434", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 446, + "content": "bbox-435", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 447, + "content": "bbox-436", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 448, + "content": "bbox-437", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 449, + "content": "bbox-438", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 450, + "content": "bbox-439", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 451, + "content": "bbox-440", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 452, + "content": "bbox-441", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 453, + "content": "bbox-442", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 454, + "content": "bbox-443", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 455, + "content": "bbox-444", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 456, + "content": "bbox-445", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 457, + "content": "bbox-446", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 458, + "content": "bbox-447", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 459, + "content": "bbox-448", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 460, + "content": "bbox-449", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 461, + "content": "bbox-450", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 462, + "content": "bbox-451", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 463, + "content": "bbox-452", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 464, + "content": "bbox-453", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 465, + "content": "bbox-454", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 466, + "content": "bbox-455", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 467, + "content": "bbox-456", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 468, + "content": "bbox-457", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 469, + "content": "bbox-458", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 470, + "content": "bbox-459", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 471, + "content": "bbox-460", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 472, + "content": "bbox-461", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 473, + "content": "bbox-462", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 474, + "content": "bbox-463", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 475, + "content": "bbox-464", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 476, + "content": "bbox-465", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 477, + "content": "bbox-466", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 478, + "content": "bbox-467", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 479, + "content": "bbox-468", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 480, + "content": "bbox-469", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 481, + "content": "bbox-470", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 482, + "content": "bbox-471", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 483, + "content": "bbox-472", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 484, + "content": "bbox-473", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 485, + "content": "bbox-474", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 486, + "content": "bbox-475", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 487, + "content": "bbox-476", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 488, + "content": "bbox-477", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 489, + "content": "bbox-478", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 490, + "content": "bbox-479", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 491, + "content": "bbox-480", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 492, + "content": "bbox-481", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 493, + "content": "bbox-482", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 494, + "content": "bbox-483", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 495, + "content": "bbox-484", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 496, + "content": "bbox-485", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 497, + "content": "bbox-486", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 498, + "content": "bbox-487", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 499, + "content": "bbox-488", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 500, + "content": "bbox-489", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 501, + "content": "bbox-490", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 502, + "content": "bbox-491", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 503, + "content": "bbox-492", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 504, + "content": "bbox-493", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 505, + "content": "bbox-494", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 506, + "content": "bbox-495", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 507, + "content": "bbox-496", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 508, + "content": "bbox-497", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 509, + "content": "bbox-498", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 510, + "content": "bbox-499", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 511, + "content": "bbox-500", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 512, + "content": "bbox-501", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 513, + "content": "bbox-502", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 514, + "content": "bbox-503", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 515, + "content": "bbox-504", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 516, + "content": "bbox-505", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 517, + "content": "bbox-506", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 518, + "content": "bbox-507", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 519, + "content": "bbox-508", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 520, + "content": "bbox-509", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 521, + "content": "bbox-510", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 522, + "content": "bbox-511", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 523, + "content": "bbox-512", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 524, + "content": "bbox-513", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 525, + "content": "bbox-514", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 526, + "content": "bbox-515", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 527, + "content": "bbox-516", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 528, + "content": "bbox-517", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 529, + "content": "bbox-518", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 530, + "content": "bbox-519", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 531, + "content": "bbox-520", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 532, + "content": "bbox-521", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 533, + "content": "bbox-522", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 534, + "content": "bbox-523", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 535, + "content": "bbox-524", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 536, + "content": "bbox-525", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 537, + "content": "bbox-526", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 538, + "content": "bbox-527", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 539, + "content": "bbox-528", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 540, + "content": "bbox-529", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 541, + "content": "bbox-530", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 542, + "content": "bbox-531", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 543, + "content": "bbox-532", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 544, + "content": "bbox-533", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 545, + "content": "bbox-534", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 546, + "content": "bbox-535", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 547, + "content": "bbox-536", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 548, + "content": "bbox-537", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 549, + "content": "bbox-538", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 550, + "content": "bbox-539", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 551, + "content": "bbox-540", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 552, + "content": "bbox-541", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 553, + "content": "bbox-542", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 554, + "content": "bbox-543", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 555, + "content": "bbox-544", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 556, + "content": "bbox-545", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 557, + "content": "bbox-546", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 558, + "content": "bbox-547", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 559, + "content": "bbox-548", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 560, + "content": "bbox-549", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 561, + "content": "bbox-550", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 562, + "content": "bbox-551", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 563, + "content": "bbox-552", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 564, + "content": "bbox-553", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 565, + "content": "bbox-554", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 566, + "content": "bbox-555", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 567, + "content": "bbox-556", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 568, + "content": "bbox-557", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 569, + "content": "bbox-558", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 570, + "content": "bbox-559", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 571, + "content": "bbox-560", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 572, + "content": "bbox-561", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 573, + "content": "bbox-562", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 574, + "content": "bbox-563", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 575, + "content": "bbox-564", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 576, + "content": "bbox-565", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 577, + "content": "bbox-566", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 578, + "content": "bbox-567", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 579, + "content": "bbox-568", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 580, + "content": "bbox-569", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 581, + "content": "bbox-570", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 582, + "content": "bbox-571", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 583, + "content": "bbox-572", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 584, + "content": "bbox-573", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 585, + "content": "bbox-574", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 586, + "content": "bbox-575", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 587, + "content": "bbox-576", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 588, + "content": "bbox-577", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 589, + "content": "bbox-578", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 590, + "content": "bbox-579", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 591, + "content": "bbox-580", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 592, + "content": "bbox-581", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 593, + "content": "bbox-582", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 594, + "content": "bbox-583", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 595, + "content": "bbox-584", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 596, + "content": "bbox-585", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 597, + "content": "bbox-586", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 598, + "content": "bbox-587", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 599, + "content": "bbox-588", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 600, + "content": "bbox-589", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 601, + "content": "bbox-590", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 602, + "content": "bbox-591", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 603, + "content": "bbox-592", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 604, + "content": "bbox-593", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 605, + "content": "bbox-594", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 606, + "content": "bbox-595", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 607, + "content": "bbox-596", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 608, + "content": "bbox-597", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 609, + "content": "bbox-598", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 610, + "content": "bbox-599", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 611, + "content": "bbox-600", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 612, + "content": "bbox-601", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 613, + "content": "bbox-602", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 614, + "content": "bbox-603", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 615, + "content": "bbox-604", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 616, + "content": "bbox-605", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 617, + "content": "bbox-606", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 618, + "content": "bbox-607", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 619, + "content": "bbox-608", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 620, + "content": "bbox-609", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 621, + "content": "bbox-610", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 622, + "content": "bbox-611", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 623, + "content": "bbox-612", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 624, + "content": "bbox-613", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 625, + "content": "bbox-614", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 626, + "content": "bbox-615", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 627, + "content": "bbox-616", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 628, + "content": "bbox-617", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 629, + "content": "bbox-618", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 630, + "content": "bbox-619", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 631, + "content": "bbox-620", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 632, + "content": "bbox-621", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 633, + "content": "bbox-622", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 634, + "content": "bbox-623", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 635, + "content": "bbox-624", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 636, + "content": "bbox-625", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 637, + "content": "bbox-626", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 638, + "content": "bbox-627", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 639, + "content": "bbox-628", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 640, + "content": "bbox-629", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 641, + "content": "bbox-630", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 642, + "content": "bbox-631", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 643, + "content": "bbox-632", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 644, + "content": "bbox-633", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 645, + "content": "bbox-634", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 646, + "content": "bbox-635", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 647, + "content": "bbox-636", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 648, + "content": "bbox-637", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 649, + "content": "bbox-638", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 650, + "content": "bbox-639", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 651, + "content": "bbox-640", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 652, + "content": "bbox-641", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 653, + "content": "bbox-642", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 654, + "content": "bbox-643", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 655, + "content": "bbox-644", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 656, + "content": "bbox-645", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 657, + "content": "bbox-646", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 658, + "content": "bbox-647", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 659, + "content": "bbox-648", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 660, + "content": "bbox-649", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 661, + "content": "bbox-650", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 662, + "content": "bbox-651", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 663, + "content": "bbox-652", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 664, + "content": "bbox-653", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 665, + "content": "bbox-654", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 666, + "content": "bbox-655", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 667, + "content": "bbox-656", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 668, + "content": "bbox-657", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 669, + "content": "bbox-658", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 670, + "content": "bbox-659", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 671, + "content": "bbox-660", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 672, + "content": "bbox-661", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 673, + "content": "bbox-662", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 674, + "content": "bbox-663", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 675, + "content": "bbox-664", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 676, + "content": "bbox-665", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 677, + "content": "bbox-666", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 678, + "content": "bbox-667", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 679, + "content": "bbox-668", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 680, + "content": "bbox-669", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 681, + "content": "bbox-670", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 682, + "content": "bbox-671", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 683, + "content": "bbox-672", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 684, + "content": "bbox-673", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 685, + "content": "bbox-674", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 686, + "content": "bbox-675", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 687, + "content": "bbox-676", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 688, + "content": "bbox-677", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 689, + "content": "bbox-678", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 690, + "content": "bbox-679", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 691, + "content": "bbox-680", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 692, + "content": "bbox-681", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 693, + "content": "bbox-682", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 694, + "content": "bbox-683", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 695, + "content": "bbox-684", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 696, + "content": "bbox-685", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 697, + "content": "bbox-686", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 698, + "content": "bbox-687", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 699, + "content": "bbox-688", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 700, + "content": "bbox-689", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 701, + "content": "bbox-690", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 702, + "content": "bbox-691", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 703, + "content": "bbox-692", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 704, + "content": "bbox-693", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 705, + "content": "bbox-694", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 706, + "content": "bbox-695", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 707, + "content": "bbox-696", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 708, + "content": "bbox-697", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 709, + "content": "bbox-698", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 710, + "content": "bbox-699", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 711, + "content": "bbox-700", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 712, + "content": "bbox-701", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 713, + "content": "bbox-702", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 714, + "content": "bbox-703", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 715, + "content": "bbox-704", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 716, + "content": "bbox-705", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 717, + "content": "bbox-706", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 718, + "content": "bbox-707", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 719, + "content": "bbox-708", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 720, + "content": "bbox-709", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 721, + "content": "bbox-710", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 722, + "content": "bbox-711", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 723, + "content": "bbox-712", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 724, + "content": "bbox-713", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 725, + "content": "bbox-714", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 726, + "content": "bbox-715", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 727, + "content": "bbox-716", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 728, + "content": "bbox-717", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 729, + "content": "bbox-718", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 730, + "content": "bbox-719", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 731, + "content": "bbox-720", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 732, + "content": "bbox-721", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 733, + "content": "bbox-722", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 734, + "content": "bbox-723", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 735, + "content": "bbox-724", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 736, + "content": "bbox-725", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 737, + "content": "bbox-726", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 738, + "content": "bbox-727", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 739, + "content": "bbox-728", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 740, + "content": "bbox-729", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 741, + "content": "bbox-730", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 742, + "content": "bbox-731", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 743, + "content": "bbox-732", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 744, + "content": "bbox-733", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 745, + "content": "bbox-734", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 746, + "content": "bbox-735", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 747, + "content": "bbox-736", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 748, + "content": "bbox-737", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 749, + "content": "bbox-738", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 750, + "content": "bbox-739", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 751, + "content": "bbox-740", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 752, + "content": "bbox-741", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 753, + "content": "bbox-742", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 754, + "content": "bbox-743", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 755, + "content": "bbox-744", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 756, + "content": "bbox-745", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 757, + "content": "bbox-746", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 758, + "content": "bbox-747", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 759, + "content": "bbox-748", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 760, + "content": "bbox-749", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 761, + "content": "bbox-750", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 762, + "content": "bbox-751", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 763, + "content": "bbox-752", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 764, + "content": "bbox-753", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 765, + "content": "bbox-754", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 766, + "content": "bbox-755", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 767, + "content": "bbox-756", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 768, + "content": "bbox-757", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 769, + "content": "bbox-758", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 770, + "content": "bbox-759", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 771, + "content": "bbox-760", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 772, + "content": "bbox-761", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 773, + "content": "bbox-762", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 774, + "content": "bbox-763", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 775, + "content": "bbox-764", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 776, + "content": "bbox-765", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 777, + "content": "bbox-766", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 778, + "content": "bbox-767", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 779, + "content": "bbox-768", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 780, + "content": "bbox-769", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 781, + "content": "bbox-770", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 782, + "content": "bbox-771", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 783, + "content": "bbox-772", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 784, + "content": "bbox-773", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 785, + "content": "bbox-774", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 786, + "content": "bbox-775", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 787, + "content": "bbox-776", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 788, + "content": "bbox-777", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 789, + "content": "bbox-778", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 790, + "content": "bbox-779", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 791, + "content": "bbox-780", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 792, + "content": "bbox-781", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 793, + "content": "bbox-782", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 794, + "content": "bbox-783", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 795, + "content": "bbox-784", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 796, + "content": "bbox-785", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 797, + "content": "bbox-786", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 798, + "content": "bbox-787", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 799, + "content": "bbox-788", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 800, + "content": "bbox-789", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 801, + "content": "bbox-790", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 802, + "content": "bbox-791", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 803, + "content": "bbox-792", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 804, + "content": "bbox-793", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 805, + "content": "bbox-794", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 806, + "content": "bbox-795", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 807, + "content": "bbox-796", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 808, + "content": "bbox-797", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 809, + "content": "bbox-798", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 810, + "content": "bbox-799", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 811, + "content": "bbox-800", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 812, + "content": "bbox-801", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 813, + "content": "bbox-802", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 814, + "content": "bbox-803", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 815, + "content": "bbox-804", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 816, + "content": "bbox-805", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 817, + "content": "bbox-806", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 818, + "content": "bbox-807", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 819, + "content": "bbox-808", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 820, + "content": "bbox-809", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 821, + "content": "bbox-810", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 822, + "content": "bbox-811", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 823, + "content": "bbox-812", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 824, + "content": "bbox-813", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 825, + "content": "bbox-814", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 826, + "content": "bbox-815", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 827, + "content": "bbox-816", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 828, + "content": "bbox-817", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 829, + "content": "bbox-818", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 830, + "content": "bbox-819", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 831, + "content": "bbox-820", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 832, + "content": "bbox-821", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 833, + "content": "bbox-822", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 834, + "content": "bbox-823", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 835, + "content": "bbox-824", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 836, + "content": "bbox-825", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 837, + "content": "bbox-826", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 838, + "content": "bbox-827", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 839, + "content": "bbox-828", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 840, + "content": "bbox-829", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 841, + "content": "bbox-830", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 842, + "content": "bbox-831", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 843, + "content": "bbox-832", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 844, + "content": "bbox-833", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 845, + "content": "bbox-834", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 846, + "content": "bbox-835", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 847, + "content": "bbox-836", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 848, + "content": "bbox-837", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 849, + "content": "bbox-838", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 850, + "content": "bbox-839", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 851, + "content": "bbox-840", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 852, + "content": "bbox-841", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 853, + "content": "bbox-842", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 854, + "content": "bbox-843", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 855, + "content": "bbox-844", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 856, + "content": "bbox-845", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 857, + "content": "bbox-846", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 858, + "content": "bbox-847", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 859, + "content": "bbox-848", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 860, + "content": "bbox-849", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 861, + "content": "bbox-850", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 862, + "content": "bbox-851", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 863, + "content": "bbox-852", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 864, + "content": "bbox-853", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 865, + "content": "bbox-854", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 866, + "content": "bbox-855", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 867, + "content": "bbox-856", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 868, + "content": "bbox-857", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 869, + "content": "bbox-858", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 870, + "content": "bbox-859", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 871, + "content": "bbox-860", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 872, + "content": "bbox-861", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 873, + "content": "bbox-862", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 874, + "content": "bbox-863", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 875, + "content": "bbox-864", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 876, + "content": "bbox-865", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 877, + "content": "bbox-866", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 878, + "content": "bbox-867", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 879, + "content": "bbox-868", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 880, + "content": "bbox-869", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 881, + "content": "bbox-870", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 882, + "content": "bbox-871", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 883, + "content": "bbox-872", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 884, + "content": "bbox-873", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 885, + "content": "bbox-874", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 886, + "content": "bbox-875", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 887, + "content": "bbox-876", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 888, + "content": "bbox-877", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 889, + "content": "bbox-878", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 890, + "content": "bbox-879", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + } + ], + "normalizer": { + "type": "Sequence", + "normalizers": [ + { + "type": "NFD" + }, + { + "type": "Lowercase" + }, + { + "type": "StripAccents" + }, + { + "type": "Strip", + "strip_left": true, + "strip_right": true + } + ] + }, + "pre_tokenizer": { + "type": "Whitespace" + }, + "post_processor": null, + "decoder": { + "type": "WordPiece", + "prefix": "##", + "cleanup": true + }, + "model": { + "type": "WordPiece", + "unk_token": "", + "continuing_subword_prefix": "##", + "max_input_chars_per_word": 100, + "vocab": { + "": 0, + "": 1, + "": 2, + "": 3, + "": 4, + "": 5, + "[table]": 6, + "[html]": 7, + "[cell]": 8, + "[bbox]": 9, + "[cell+bbox]": 10, + "bbox-0": 11, + "bbox-1": 12, + "bbox-2": 13, + "bbox-3": 14, + "bbox-4": 15, + "bbox-5": 16, + "bbox-6": 17, + "bbox-7": 18, + "bbox-8": 19, + "bbox-9": 20, + "bbox-10": 21, + "bbox-11": 22, + "bbox-12": 23, + "bbox-13": 24, + "bbox-14": 25, + "bbox-15": 26, + "bbox-16": 27, + "bbox-17": 28, + "bbox-18": 29, + "bbox-19": 30, + "bbox-20": 31, + "bbox-21": 32, + "bbox-22": 33, + "bbox-23": 34, + "bbox-24": 35, + "bbox-25": 36, + "bbox-26": 37, + "bbox-27": 38, + "bbox-28": 39, + "bbox-29": 40, + "bbox-30": 41, + "bbox-31": 42, + "bbox-32": 43, + "bbox-33": 44, + "bbox-34": 45, + "bbox-35": 46, + "bbox-36": 47, + "bbox-37": 48, + "bbox-38": 49, + "bbox-39": 50, + "bbox-40": 51, + "bbox-41": 52, + "bbox-42": 53, + "bbox-43": 54, + "bbox-44": 55, + "bbox-45": 56, + "bbox-46": 57, + "bbox-47": 58, + "bbox-48": 59, + "bbox-49": 60, + "bbox-50": 61, + "bbox-51": 62, + "bbox-52": 63, + "bbox-53": 64, + "bbox-54": 65, + "bbox-55": 66, + "bbox-56": 67, + "bbox-57": 68, + "bbox-58": 69, + "bbox-59": 70, + "bbox-60": 71, + "bbox-61": 72, + "bbox-62": 73, + "bbox-63": 74, + "bbox-64": 75, + "bbox-65": 76, + "bbox-66": 77, + "bbox-67": 78, + "bbox-68": 79, + "bbox-69": 80, + "bbox-70": 81, + "bbox-71": 82, + "bbox-72": 83, + "bbox-73": 84, + "bbox-74": 85, + "bbox-75": 86, + "bbox-76": 87, + "bbox-77": 88, + "bbox-78": 89, + "bbox-79": 90, + "bbox-80": 91, + "bbox-81": 92, + "bbox-82": 93, + "bbox-83": 94, + "bbox-84": 95, + "bbox-85": 96, + "bbox-86": 97, + "bbox-87": 98, + "bbox-88": 99, + "bbox-89": 100, + "bbox-90": 101, + "bbox-91": 102, + "bbox-92": 103, + "bbox-93": 104, + "bbox-94": 105, + "bbox-95": 106, + "bbox-96": 107, + "bbox-97": 108, + "bbox-98": 109, + "bbox-99": 110, + "bbox-100": 111, + "bbox-101": 112, + "bbox-102": 113, + "bbox-103": 114, + "bbox-104": 115, + "bbox-105": 116, + "bbox-106": 117, + "bbox-107": 118, + "bbox-108": 119, + "bbox-109": 120, + "bbox-110": 121, + "bbox-111": 122, + "bbox-112": 123, + "bbox-113": 124, + "bbox-114": 125, + "bbox-115": 126, + "bbox-116": 127, + "bbox-117": 128, + "bbox-118": 129, + "bbox-119": 130, + "bbox-120": 131, + "bbox-121": 132, + "bbox-122": 133, + "bbox-123": 134, + "bbox-124": 135, + "bbox-125": 136, + "bbox-126": 137, + "bbox-127": 138, + "bbox-128": 139, + "bbox-129": 140, + "bbox-130": 141, + "bbox-131": 142, + "bbox-132": 143, + "bbox-133": 144, + "bbox-134": 145, + "bbox-135": 146, + "bbox-136": 147, + "bbox-137": 148, + "bbox-138": 149, + "bbox-139": 150, + "bbox-140": 151, + "bbox-141": 152, + "bbox-142": 153, + "bbox-143": 154, + "bbox-144": 155, + "bbox-145": 156, + "bbox-146": 157, + "bbox-147": 158, + "bbox-148": 159, + "bbox-149": 160, + "bbox-150": 161, + "bbox-151": 162, + "bbox-152": 163, + "bbox-153": 164, + "bbox-154": 165, + "bbox-155": 166, + "bbox-156": 167, + "bbox-157": 168, + "bbox-158": 169, + "bbox-159": 170, + "bbox-160": 171, + "bbox-161": 172, + "bbox-162": 173, + "bbox-163": 174, + "bbox-164": 175, + "bbox-165": 176, + "bbox-166": 177, + "bbox-167": 178, + "bbox-168": 179, + "bbox-169": 180, + "bbox-170": 181, + "bbox-171": 182, + "bbox-172": 183, + "bbox-173": 184, + "bbox-174": 185, + "bbox-175": 186, + "bbox-176": 187, + "bbox-177": 188, + "bbox-178": 189, + "bbox-179": 190, + "bbox-180": 191, + "bbox-181": 192, + "bbox-182": 193, + "bbox-183": 194, + "bbox-184": 195, + "bbox-185": 196, + "bbox-186": 197, + "bbox-187": 198, + "bbox-188": 199, + "bbox-189": 200, + "bbox-190": 201, + "bbox-191": 202, + "bbox-192": 203, + "bbox-193": 204, + "bbox-194": 205, + "bbox-195": 206, + "bbox-196": 207, + "bbox-197": 208, + "bbox-198": 209, + "bbox-199": 210, + "bbox-200": 211, + "bbox-201": 212, + "bbox-202": 213, + "bbox-203": 214, + "bbox-204": 215, + "bbox-205": 216, + "bbox-206": 217, + "bbox-207": 218, + "bbox-208": 219, + "bbox-209": 220, + "bbox-210": 221, + "bbox-211": 222, + "bbox-212": 223, + "bbox-213": 224, + "bbox-214": 225, + "bbox-215": 226, + "bbox-216": 227, + "bbox-217": 228, + "bbox-218": 229, + "bbox-219": 230, + "bbox-220": 231, + "bbox-221": 232, + "bbox-222": 233, + "bbox-223": 234, + "bbox-224": 235, + "bbox-225": 236, + "bbox-226": 237, + "bbox-227": 238, + "bbox-228": 239, + "bbox-229": 240, + "bbox-230": 241, + "bbox-231": 242, + "bbox-232": 243, + "bbox-233": 244, + "bbox-234": 245, + "bbox-235": 246, + "bbox-236": 247, + "bbox-237": 248, + "bbox-238": 249, + "bbox-239": 250, + "bbox-240": 251, + "bbox-241": 252, + "bbox-242": 253, + "bbox-243": 254, + "bbox-244": 255, + "bbox-245": 256, + "bbox-246": 257, + "bbox-247": 258, + "bbox-248": 259, + "bbox-249": 260, + "bbox-250": 261, + "bbox-251": 262, + "bbox-252": 263, + "bbox-253": 264, + "bbox-254": 265, + "bbox-255": 266, + "bbox-256": 267, + "bbox-257": 268, + "bbox-258": 269, + "bbox-259": 270, + "bbox-260": 271, + "bbox-261": 272, + "bbox-262": 273, + "bbox-263": 274, + "bbox-264": 275, + "bbox-265": 276, + "bbox-266": 277, + "bbox-267": 278, + "bbox-268": 279, + "bbox-269": 280, + "bbox-270": 281, + "bbox-271": 282, + "bbox-272": 283, + "bbox-273": 284, + "bbox-274": 285, + "bbox-275": 286, + "bbox-276": 287, + "bbox-277": 288, + "bbox-278": 289, + "bbox-279": 290, + "bbox-280": 291, + "bbox-281": 292, + "bbox-282": 293, + "bbox-283": 294, + "bbox-284": 295, + "bbox-285": 296, + "bbox-286": 297, + "bbox-287": 298, + "bbox-288": 299, + "bbox-289": 300, + "bbox-290": 301, + "bbox-291": 302, + "bbox-292": 303, + "bbox-293": 304, + "bbox-294": 305, + "bbox-295": 306, + "bbox-296": 307, + "bbox-297": 308, + "bbox-298": 309, + "bbox-299": 310, + "bbox-300": 311, + "bbox-301": 312, + "bbox-302": 313, + "bbox-303": 314, + "bbox-304": 315, + "bbox-305": 316, + "bbox-306": 317, + "bbox-307": 318, + "bbox-308": 319, + "bbox-309": 320, + "bbox-310": 321, + "bbox-311": 322, + "bbox-312": 323, + "bbox-313": 324, + "bbox-314": 325, + "bbox-315": 326, + "bbox-316": 327, + "bbox-317": 328, + "bbox-318": 329, + "bbox-319": 330, + "bbox-320": 331, + "bbox-321": 332, + "bbox-322": 333, + "bbox-323": 334, + "bbox-324": 335, + "bbox-325": 336, + "bbox-326": 337, + "bbox-327": 338, + "bbox-328": 339, + "bbox-329": 340, + "bbox-330": 341, + "bbox-331": 342, + "bbox-332": 343, + "bbox-333": 344, + "bbox-334": 345, + "bbox-335": 346, + "bbox-336": 347, + "bbox-337": 348, + "bbox-338": 349, + "bbox-339": 350, + "bbox-340": 351, + "bbox-341": 352, + "bbox-342": 353, + "bbox-343": 354, + "bbox-344": 355, + "bbox-345": 356, + "bbox-346": 357, + "bbox-347": 358, + "bbox-348": 359, + "bbox-349": 360, + "bbox-350": 361, + "bbox-351": 362, + "bbox-352": 363, + "bbox-353": 364, + "bbox-354": 365, + "bbox-355": 366, + "bbox-356": 367, + "bbox-357": 368, + "bbox-358": 369, + "bbox-359": 370, + "bbox-360": 371, + "bbox-361": 372, + "bbox-362": 373, + "bbox-363": 374, + "bbox-364": 375, + "bbox-365": 376, + "bbox-366": 377, + "bbox-367": 378, + "bbox-368": 379, + "bbox-369": 380, + "bbox-370": 381, + "bbox-371": 382, + "bbox-372": 383, + "bbox-373": 384, + "bbox-374": 385, + "bbox-375": 386, + "bbox-376": 387, + "bbox-377": 388, + "bbox-378": 389, + "bbox-379": 390, + "bbox-380": 391, + "bbox-381": 392, + "bbox-382": 393, + "bbox-383": 394, + "bbox-384": 395, + "bbox-385": 396, + "bbox-386": 397, + "bbox-387": 398, + "bbox-388": 399, + "bbox-389": 400, + "bbox-390": 401, + "bbox-391": 402, + "bbox-392": 403, + "bbox-393": 404, + "bbox-394": 405, + "bbox-395": 406, + "bbox-396": 407, + "bbox-397": 408, + "bbox-398": 409, + "bbox-399": 410, + "bbox-400": 411, + "bbox-401": 412, + "bbox-402": 413, + "bbox-403": 414, + "bbox-404": 415, + "bbox-405": 416, + "bbox-406": 417, + "bbox-407": 418, + "bbox-408": 419, + "bbox-409": 420, + "bbox-410": 421, + "bbox-411": 422, + "bbox-412": 423, + "bbox-413": 424, + "bbox-414": 425, + "bbox-415": 426, + "bbox-416": 427, + "bbox-417": 428, + "bbox-418": 429, + "bbox-419": 430, + "bbox-420": 431, + "bbox-421": 432, + "bbox-422": 433, + "bbox-423": 434, + "bbox-424": 435, + "bbox-425": 436, + "bbox-426": 437, + "bbox-427": 438, + "bbox-428": 439, + "bbox-429": 440, + "bbox-430": 441, + "bbox-431": 442, + "bbox-432": 443, + "bbox-433": 444, + "bbox-434": 445, + "bbox-435": 446, + "bbox-436": 447, + "bbox-437": 448, + "bbox-438": 449, + "bbox-439": 450, + "bbox-440": 451, + "bbox-441": 452, + "bbox-442": 453, + "bbox-443": 454, + "bbox-444": 455, + "bbox-445": 456, + "bbox-446": 457, + "bbox-447": 458, + "bbox-448": 459, + "bbox-449": 460, + "bbox-450": 461, + "bbox-451": 462, + "bbox-452": 463, + "bbox-453": 464, + "bbox-454": 465, + "bbox-455": 466, + "bbox-456": 467, + "bbox-457": 468, + "bbox-458": 469, + "bbox-459": 470, + "bbox-460": 471, + "bbox-461": 472, + "bbox-462": 473, + "bbox-463": 474, + "bbox-464": 475, + "bbox-465": 476, + "bbox-466": 477, + "bbox-467": 478, + "bbox-468": 479, + "bbox-469": 480, + "bbox-470": 481, + "bbox-471": 482, + "bbox-472": 483, + "bbox-473": 484, + "bbox-474": 485, + "bbox-475": 486, + "bbox-476": 487, + "bbox-477": 488, + "bbox-478": 489, + "bbox-479": 490, + "bbox-480": 491, + "bbox-481": 492, + "bbox-482": 493, + "bbox-483": 494, + "bbox-484": 495, + "bbox-485": 496, + "bbox-486": 497, + "bbox-487": 498, + "bbox-488": 499, + "bbox-489": 500, + "bbox-490": 501, + "bbox-491": 502, + "bbox-492": 503, + "bbox-493": 504, + "bbox-494": 505, + "bbox-495": 506, + "bbox-496": 507, + "bbox-497": 508, + "bbox-498": 509, + "bbox-499": 510, + "bbox-500": 511, + "bbox-501": 512, + "bbox-502": 513, + "bbox-503": 514, + "bbox-504": 515, + "bbox-505": 516, + "bbox-506": 517, + "bbox-507": 518, + "bbox-508": 519, + "bbox-509": 520, + "bbox-510": 521, + "bbox-511": 522, + "bbox-512": 523, + "bbox-513": 524, + "bbox-514": 525, + "bbox-515": 526, + "bbox-516": 527, + "bbox-517": 528, + "bbox-518": 529, + "bbox-519": 530, + "bbox-520": 531, + "bbox-521": 532, + "bbox-522": 533, + "bbox-523": 534, + "bbox-524": 535, + "bbox-525": 536, + "bbox-526": 537, + "bbox-527": 538, + "bbox-528": 539, + "bbox-529": 540, + "bbox-530": 541, + "bbox-531": 542, + "bbox-532": 543, + "bbox-533": 544, + "bbox-534": 545, + "bbox-535": 546, + "bbox-536": 547, + "bbox-537": 548, + "bbox-538": 549, + "bbox-539": 550, + "bbox-540": 551, + "bbox-541": 552, + "bbox-542": 553, + "bbox-543": 554, + "bbox-544": 555, + "bbox-545": 556, + "bbox-546": 557, + "bbox-547": 558, + "bbox-548": 559, + "bbox-549": 560, + "bbox-550": 561, + "bbox-551": 562, + "bbox-552": 563, + "bbox-553": 564, + "bbox-554": 565, + "bbox-555": 566, + "bbox-556": 567, + "bbox-557": 568, + "bbox-558": 569, + "bbox-559": 570, + "bbox-560": 571, + "bbox-561": 572, + "bbox-562": 573, + "bbox-563": 574, + "bbox-564": 575, + "bbox-565": 576, + "bbox-566": 577, + "bbox-567": 578, + "bbox-568": 579, + "bbox-569": 580, + "bbox-570": 581, + "bbox-571": 582, + "bbox-572": 583, + "bbox-573": 584, + "bbox-574": 585, + "bbox-575": 586, + "bbox-576": 587, + "bbox-577": 588, + "bbox-578": 589, + "bbox-579": 590, + "bbox-580": 591, + "bbox-581": 592, + "bbox-582": 593, + "bbox-583": 594, + "bbox-584": 595, + "bbox-585": 596, + "bbox-586": 597, + "bbox-587": 598, + "bbox-588": 599, + "bbox-589": 600, + "bbox-590": 601, + "bbox-591": 602, + "bbox-592": 603, + "bbox-593": 604, + "bbox-594": 605, + "bbox-595": 606, + "bbox-596": 607, + "bbox-597": 608, + "bbox-598": 609, + "bbox-599": 610, + "bbox-600": 611, + "bbox-601": 612, + "bbox-602": 613, + "bbox-603": 614, + "bbox-604": 615, + "bbox-605": 616, + "bbox-606": 617, + "bbox-607": 618, + "bbox-608": 619, + "bbox-609": 620, + "bbox-610": 621, + "bbox-611": 622, + "bbox-612": 623, + "bbox-613": 624, + "bbox-614": 625, + "bbox-615": 626, + "bbox-616": 627, + "bbox-617": 628, + "bbox-618": 629, + "bbox-619": 630, + "bbox-620": 631, + "bbox-621": 632, + "bbox-622": 633, + "bbox-623": 634, + "bbox-624": 635, + "bbox-625": 636, + "bbox-626": 637, + "bbox-627": 638, + "bbox-628": 639, + "bbox-629": 640, + "bbox-630": 641, + "bbox-631": 642, + "bbox-632": 643, + "bbox-633": 644, + "bbox-634": 645, + "bbox-635": 646, + "bbox-636": 647, + "bbox-637": 648, + "bbox-638": 649, + "bbox-639": 650, + "bbox-640": 651, + "bbox-641": 652, + "bbox-642": 653, + "bbox-643": 654, + "bbox-644": 655, + "bbox-645": 656, + "bbox-646": 657, + "bbox-647": 658, + "bbox-648": 659, + "bbox-649": 660, + "bbox-650": 661, + "bbox-651": 662, + "bbox-652": 663, + "bbox-653": 664, + "bbox-654": 665, + "bbox-655": 666, + "bbox-656": 667, + "bbox-657": 668, + "bbox-658": 669, + "bbox-659": 670, + "bbox-660": 671, + "bbox-661": 672, + "bbox-662": 673, + "bbox-663": 674, + "bbox-664": 675, + "bbox-665": 676, + "bbox-666": 677, + "bbox-667": 678, + "bbox-668": 679, + "bbox-669": 680, + "bbox-670": 681, + "bbox-671": 682, + "bbox-672": 683, + "bbox-673": 684, + "bbox-674": 685, + "bbox-675": 686, + "bbox-676": 687, + "bbox-677": 688, + "bbox-678": 689, + "bbox-679": 690, + "bbox-680": 691, + "bbox-681": 692, + "bbox-682": 693, + "bbox-683": 694, + "bbox-684": 695, + "bbox-685": 696, + "bbox-686": 697, + "bbox-687": 698, + "bbox-688": 699, + "bbox-689": 700, + "bbox-690": 701, + "bbox-691": 702, + "bbox-692": 703, + "bbox-693": 704, + "bbox-694": 705, + "bbox-695": 706, + "bbox-696": 707, + "bbox-697": 708, + "bbox-698": 709, + "bbox-699": 710, + "bbox-700": 711, + "bbox-701": 712, + "bbox-702": 713, + "bbox-703": 714, + "bbox-704": 715, + "bbox-705": 716, + "bbox-706": 717, + "bbox-707": 718, + "bbox-708": 719, + "bbox-709": 720, + "bbox-710": 721, + "bbox-711": 722, + "bbox-712": 723, + "bbox-713": 724, + "bbox-714": 725, + "bbox-715": 726, + "bbox-716": 727, + "bbox-717": 728, + "bbox-718": 729, + "bbox-719": 730, + "bbox-720": 731, + "bbox-721": 732, + "bbox-722": 733, + "bbox-723": 734, + "bbox-724": 735, + "bbox-725": 736, + "bbox-726": 737, + "bbox-727": 738, + "bbox-728": 739, + "bbox-729": 740, + "bbox-730": 741, + "bbox-731": 742, + "bbox-732": 743, + "bbox-733": 744, + "bbox-734": 745, + "bbox-735": 746, + "bbox-736": 747, + "bbox-737": 748, + "bbox-738": 749, + "bbox-739": 750, + "bbox-740": 751, + "bbox-741": 752, + "bbox-742": 753, + "bbox-743": 754, + "bbox-744": 755, + "bbox-745": 756, + "bbox-746": 757, + "bbox-747": 758, + "bbox-748": 759, + "bbox-749": 760, + "bbox-750": 761, + "bbox-751": 762, + "bbox-752": 763, + "bbox-753": 764, + "bbox-754": 765, + "bbox-755": 766, + "bbox-756": 767, + "bbox-757": 768, + "bbox-758": 769, + "bbox-759": 770, + "bbox-760": 771, + "bbox-761": 772, + "bbox-762": 773, + "bbox-763": 774, + "bbox-764": 775, + "bbox-765": 776, + "bbox-766": 777, + "bbox-767": 778, + "bbox-768": 779, + "bbox-769": 780, + "bbox-770": 781, + "bbox-771": 782, + "bbox-772": 783, + "bbox-773": 784, + "bbox-774": 785, + "bbox-775": 786, + "bbox-776": 787, + "bbox-777": 788, + "bbox-778": 789, + "bbox-779": 790, + "bbox-780": 791, + "bbox-781": 792, + "bbox-782": 793, + "bbox-783": 794, + "bbox-784": 795, + "bbox-785": 796, + "bbox-786": 797, + "bbox-787": 798, + "bbox-788": 799, + "bbox-789": 800, + "bbox-790": 801, + "bbox-791": 802, + "bbox-792": 803, + "bbox-793": 804, + "bbox-794": 805, + "bbox-795": 806, + "bbox-796": 807, + "bbox-797": 808, + "bbox-798": 809, + "bbox-799": 810, + "bbox-800": 811, + "bbox-801": 812, + "bbox-802": 813, + "bbox-803": 814, + "bbox-804": 815, + "bbox-805": 816, + "bbox-806": 817, + "bbox-807": 818, + "bbox-808": 819, + "bbox-809": 820, + "bbox-810": 821, + "bbox-811": 822, + "bbox-812": 823, + "bbox-813": 824, + "bbox-814": 825, + "bbox-815": 826, + "bbox-816": 827, + "bbox-817": 828, + "bbox-818": 829, + "bbox-819": 830, + "bbox-820": 831, + "bbox-821": 832, + "bbox-822": 833, + "bbox-823": 834, + "bbox-824": 835, + "bbox-825": 836, + "bbox-826": 837, + "bbox-827": 838, + "bbox-828": 839, + "bbox-829": 840, + "bbox-830": 841, + "bbox-831": 842, + "bbox-832": 843, + "bbox-833": 844, + "bbox-834": 845, + "bbox-835": 846, + "bbox-836": 847, + "bbox-837": 848, + "bbox-838": 849, + "bbox-839": 850, + "bbox-840": 851, + "bbox-841": 852, + "bbox-842": 853, + "bbox-843": 854, + "bbox-844": 855, + "bbox-845": 856, + "bbox-846": 857, + "bbox-847": 858, + "bbox-848": 859, + "bbox-849": 860, + "bbox-850": 861, + "bbox-851": 862, + "bbox-852": 863, + "bbox-853": 864, + "bbox-854": 865, + "bbox-855": 866, + "bbox-856": 867, + "bbox-857": 868, + "bbox-858": 869, + "bbox-859": 870, + "bbox-860": 871, + "bbox-861": 872, + "bbox-862": 873, + "bbox-863": 874, + "bbox-864": 875, + "bbox-865": 876, + "bbox-866": 877, + "bbox-867": 878, + "bbox-868": 879, + "bbox-869": 880, + "bbox-870": 881, + "bbox-871": 882, + "bbox-872": 883, + "bbox-873": 884, + "bbox-874": 885, + "bbox-875": 886, + "bbox-876": 887, + "bbox-877": 888, + "bbox-878": 889, + "bbox-879": 890 + } + } +} \ No newline at end of file diff --git a/unitable/vocab/vocab_cell_6k.json b/unitable/vocab/vocab_cell_6k.json new file mode 100644 index 0000000000000000000000000000000000000000..3e4c33781fa027286187a1c5ea1b38035ad8728f --- /dev/null +++ b/unitable/vocab/vocab_cell_6k.json @@ -0,0 +1,5590 @@ +{ + "version": "1.0", + "truncation": null, + "padding": { + "strategy": "BatchLongest", + "direction": "Right", + "pad_to_multiple_of": null, + "pad_id": 2, + "pad_type_id": 0, + "pad_token": "" + }, + "added_tokens": [ + { + "id": 0, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 1, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 2, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 3, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 4, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 5, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 6, + "content": "[table]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 7, + "content": "[html]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 8, + "content": "[cell]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 9, + "content": "[bbox]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 10, + "content": "[cell+bbox]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 11, + "content": "reserved 1", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 12, + "content": "reserved 2", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 13, + "content": "reserved 3", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 14, + "content": "reserved 4", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 15, + "content": "reserved 5", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 16, + "content": "reserved 6", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 17, + "content": "reserved 7", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 18, + "content": "reserved 8", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 19, + "content": "reserved 9", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + } + ], + "normalizer": { + "type": "Sequence", + "normalizers": [ + { + "type": "NFD" + }, + { + "type": "StripAccents" + }, + { + "type": "Strip", + "strip_left": true, + "strip_right": true + } + ] + }, + "pre_tokenizer": { + "type": "Whitespace" + }, + "post_processor": null, + "decoder": { + "type": "WordPiece", + "prefix": "##", + "cleanup": true + }, + "model": { + "type": "WordPiece", + "unk_token": "", + "continuing_subword_prefix": "##", + "max_input_chars_per_word": 100, + "vocab": { + "": 0, + "": 1, + "": 2, + "": 3, + "": 4, + "": 5, + "[table]": 6, + "[html]": 7, + "[cell]": 8, + "[bbox]": 9, + "[cell+bbox]": 10, + "reserved 1": 11, + "reserved 2": 12, + "reserved 3": 13, + "reserved 4": 14, + "reserved 5": 15, + "reserved 6": 16, + "reserved 7": 17, + "reserved 8": 18, + "reserved 9": 19, + "\u0001": 20, + "\u0003": 21, + "\u0007": 22, + "\b": 23, + "\u0013": 24, + "\u0014": 25, + "\u0016": 26, + "\u0018": 27, + "!": 28, + "\"": 29, + "#": 30, + "$": 31, + "%": 32, + "&": 33, + "'": 34, + "(": 35, + ")": 36, + "*": 37, + "+": 38, + ",": 39, + "-": 40, + ".": 41, + "/": 42, + "0": 43, + "1": 44, + "2": 45, + "3": 46, + "4": 47, + "5": 48, + "6": 49, + "7": 50, + "8": 51, + "9": 52, + ":": 53, + ";": 54, + "<": 55, + "=": 56, + ">": 57, + "?": 58, + "@": 59, + "A": 60, + "B": 61, + "C": 62, + "D": 63, + "E": 64, + "F": 65, + "G": 66, + "H": 67, + "I": 68, + "J": 69, + "K": 70, + "L": 71, + "M": 72, + "N": 73, + "O": 74, + "P": 75, + "Q": 76, + "R": 77, + "S": 78, + "T": 79, + "U": 80, + "V": 81, + "W": 82, + "X": 83, + "Y": 84, + "Z": 85, + "[": 86, + "\\": 87, + "]": 88, + "^": 89, + "_": 90, + "`": 91, + "a": 92, + "b": 93, + "c": 94, + "d": 95, + "e": 96, + "f": 97, + "g": 98, + "h": 99, + "i": 100, + "j": 101, + "k": 102, + "l": 103, + "m": 104, + "n": 105, + "o": 106, + "p": 107, + "q": 108, + "r": 109, + "s": 110, + "t": 111, + "u": 112, + "v": 113, + "w": 114, + "x": 115, + "y": 116, + "z": 117, + "{": 118, + "|": 119, + "}": 120, + "~": 121, + "†": 122, + "‡": 123, + "Œ": 124, + "": 125, + "Ž": 126, + "": 127, + "’": 128, + "¡": 129, + "¢": 130, + "£": 131, + "¤": 132, + "¥": 133, + "¦": 134, + "§": 135, + "¨": 136, + "©": 137, + "ª": 138, + "«": 139, + "¬": 140, + "­": 141, + "®": 142, + "¯": 143, + "°": 144, + "±": 145, + "²": 146, + "³": 147, + "´": 148, + "µ": 149, + "¶": 150, + "·": 151, + "¸": 152, + "¹": 153, + "º": 154, + "»": 155, + "¼": 156, + "½": 157, + "¾": 158, + "¿": 159, + "Æ": 160, + "Ð": 161, + "×": 162, + "Ø": 163, + "Þ": 164, + "ß": 165, + "æ": 166, + "ð": 167, + "÷": 168, + "ø": 169, + "þ": 170, + "Đ": 171, + "đ": 172, + "ħ": 173, + "ı": 174, + "ĸ": 175, + "Ł": 176, + "ł": 177, + "Ŋ": 178, + "ŋ": 179, + "Œ": 180, + "œ": 181, + "Ŧ": 182, + "ŧ": 183, + "Ɔ": 184, + "ƍ": 185, + "Ǝ": 186, + "Ɛ": 187, + "Ƒ": 188, + "ƒ": 189, + "Ɣ": 190, + "Ɩ": 191, + "Ɨ": 192, + "Ƙ": 193, + "ƙ": 194, + "ƚ": 195, + "ƛ": 196, + "Ɯ": 197, + "ƞ": 198, + "Ɵ": 199, + "Ƥ": 200, + "ƥ": 201, + "Ʃ": 202, + "ƪ": 203, + "Ƭ": 204, + "Ʊ": 205, + "Ƴ": 206, + "ƴ": 207, + "Ʒ": 208, + "ǀ": 209, + "ǁ": 210, + "ǂ": 211, + "Ƞ": 212, + "ȣ": 213, + "ȹ": 214, + "ȼ": 215, + "ɀ": 216, + "ɑ": 217, + "ɒ": 218, + "ɓ": 219, + "ɔ": 220, + "ə": 221, + "ɛ": 222, + "ɜ": 223, + "ɠ": 224, + "ɡ": 225, + "ɣ": 226, + "ɤ": 227, + "ɥ": 228, + "ɨ": 229, + "ɪ": 230, + "ɫ": 231, + "ɯ": 232, + "ɱ": 233, + "ɳ": 234, + "ɷ": 235, + "ɸ": 236, + "ɹ": 237, + "ɾ": 238, + "ʁ": 239, + "ʃ": 240, + "ʈ": 241, + "ʉ": 242, + "ʊ": 243, + "ʋ": 244, + "ʌ": 245, + "ʎ": 246, + "ʏ": 247, + "ʒ": 248, + "ʓ": 249, + "ʔ": 250, + "ʗ": 251, + "ʘ": 252, + "ʝ": 253, + "ʞ": 254, + "ʟ": 255, + "ʠ": 256, + "ʡ": 257, + "ʤ": 258, + "ʧ": 259, + "ʰ": 260, + "ʵ": 261, + "ʷ": 262, + "ʹ": 263, + "ʺ": 264, + "ʻ": 265, + "ʼ": 266, + "ʾ": 267, + "˂": 268, + "˃": 269, + "˄": 270, + "˅": 271, + "ˆ": 272, + "ˇ": 273, + "ˈ": 274, + "ˉ": 275, + "ˊ": 276, + "ː": 277, + "ˑ": 278, + "˗": 279, + "˘": 280, + "˙": 281, + "˚": 282, + "˛": 283, + "˜": 284, + "˝": 285, + "˟": 286, + "ˠ": 287, + "ˣ": 288, + "ˤ": 289, + "˦": 290, + "˩": 291, + "ˮ": 292, + "˷": 293, + "ͻ": 294, + "΄": 295, + "Α": 296, + "Β": 297, + "Γ": 298, + "Δ": 299, + "Ε": 300, + "Ζ": 301, + "Η": 302, + "Θ": 303, + "Ι": 304, + "Κ": 305, + "Λ": 306, + "Μ": 307, + "Ν": 308, + "Ξ": 309, + "Ο": 310, + "Π": 311, + "Ρ": 312, + "Σ": 313, + "Τ": 314, + "Υ": 315, + "Φ": 316, + "Χ": 317, + "Ψ": 318, + "Ω": 319, + "α": 320, + "β": 321, + "γ": 322, + "δ": 323, + "ε": 324, + "ζ": 325, + "η": 326, + "θ": 327, + "ι": 328, + "κ": 329, + "λ": 330, + "μ": 331, + "ν": 332, + "ξ": 333, + "ο": 334, + "π": 335, + "ρ": 336, + "ς": 337, + "σ": 338, + "τ": 339, + "υ": 340, + "φ": 341, + "χ": 342, + "ψ": 343, + "ω": 344, + "ϐ": 345, + "ϑ": 346, + "ϒ": 347, + "ϕ": 348, + "ϖ": 349, + "Ϟ": 350, + "Ϫ": 351, + "Ϭ": 352, + "ϭ": 353, + "Ϯ": 354, + "ϯ": 355, + "ϰ": 356, + "ϱ": 357, + "ϴ": 358, + "ϵ": 359, + "Є": 360, + "Ѕ": 361, + "І": 362, + "Ј": 363, + "Џ": 364, + "А": 365, + "Б": 366, + "В": 367, + "Г": 368, + "Д": 369, + "Е": 370, + "Ж": 371, + "З": 372, + "И": 373, + "К": 374, + "Л": 375, + "М": 376, + "Н": 377, + "О": 378, + "П": 379, + "Р": 380, + "С": 381, + "Т": 382, + "Ф": 383, + "Х": 384, + "Ш": 385, + "Я": 386, + "а": 387, + "б": 388, + "в": 389, + "г": 390, + "д": 391, + "е": 392, + "ж": 393, + "з": 394, + "и": 395, + "к": 396, + "л": 397, + "м": 398, + "н": 399, + "о": 400, + "п": 401, + "р": 402, + "с": 403, + "т": 404, + "у": 405, + "ф": 406, + "х": 407, + "ц": 408, + "ч": 409, + "ш": 410, + "щ": 411, + "ы": 412, + "ь": 413, + "ю": 414, + "я": 415, + "і": 416, + "Ѱ": 417, + "ѱ": 418, + "Ѳ": 419, + "҂": 420, + "қ": 421, + "ҝ": 422, + "ҡ": 423, + "Ҩ": 424, + "Ұ": 425, + "Ҳ": 426, + "ә": 427, + "Ө": 428, + "ө": 429, + "Ӽ": 430, + "ӽ": 431, + "Ԑ": 432, + "ԑ": 433, + "ղ": 434, + "ր": 435, + "ց": 436, + "ւ": 437, + "׀": 438, + "ג": 439, + "ד": 440, + "ז": 441, + "׳": 442, + "و": 443, + "٠": 444, + "١": 445, + "٢": 446, + "٣": 447, + "٤": 448, + "٥": 449, + "٦": 450, + "٧": 451, + "٨": 452, + "٩": 453, + "٭": 454, + "۞": 455, + "۰": 456, + "۵": 457, + "۹": 458, + "࣓": 459, + "৹": 460, + "ก": 461, + "ข": 462, + "ค": 463, + "ง": 464, + "จ": 465, + "ช": 466, + "ญ": 467, + "ด": 468, + "ต": 469, + "ท": 470, + "น": 471, + "บ": 472, + "ป": 473, + "ผ": 474, + "พ": 475, + "ภ": 476, + "ม": 477, + "ย": 478, + "ร": 479, + "ล": 480, + "ว": 481, + "ส": 482, + "ห": 483, + "อ": 484, + "ะ": 485, + "า": 486, + "ำ": 487, + "เ": 488, + "แ": 489, + "โ": 490, + "ใ": 491, + "ไ": 492, + "๖": 493, + "ᄀ": 494, + "ᄁ": 495, + "ᄂ": 496, + "ᄃ": 497, + "ᄄ": 498, + "ᄅ": 499, + "ᄆ": 500, + "ᄇ": 501, + "ᄈ": 502, + "ᄉ": 503, + "ᄋ": 504, + "ᄌ": 505, + "ᄍ": 506, + "ᄎ": 507, + "ᄏ": 508, + "ᄐ": 509, + "ᄑ": 510, + "ᄒ": 511, + "ᅟ": 512, + "ᅡ": 513, + "ᅢ": 514, + "ᅣ": 515, + "ᅥ": 516, + "ᅦ": 517, + "ᅧ": 518, + "ᅨ": 519, + "ᅩ": 520, + "ᅪ": 521, + "ᅫ": 522, + "ᅬ": 523, + "ᅮ": 524, + "ᅯ": 525, + "ᅰ": 526, + "ᅱ": 527, + "ᅲ": 528, + "ᅳ": 529, + "ᅵ": 530, + "ᆨ": 531, + "ᆫ": 532, + "ᆭ": 533, + "ᆯ": 534, + "ᆲ": 535, + "ᆵ": 536, + "ᆷ": 537, + "ᆸ": 538, + "ᆺ": 539, + "ᆼ": 540, + "ᆾ": 541, + "ᇁ": 542, + "ᇂ": 543, + "፠": 544, + "ᛎ": 545, + "ᛏ": 546, + "ᴅ": 547, + "ᴋ": 548, + "ᴥ": 549, + "ᴬ": 550, + "ᴮ": 551, + "ᴻ": 552, + "ᵃ": 553, + "ᵇ": 554, + "ᵈ": 555, + "ᵉ": 556, + "ᵏ": 557, + "ᵐ": 558, + "ᵑ": 559, + "ᵓ": 560, + "ᵖ": 561, + "ᵗ": 562, + "ᵘ": 563, + "ᵛ": 564, + "ᵝ": 565, + "ᵟ": 566, + "ᵡ": 567, + "ᵧ": 568, + "ᵵ": 569, + "ᵷ": 570, + "ᵻ": 571, + "ᵼ": 572, + "ᶋ": 573, + "ᶜ": 574, + "ᶟ": 575, + "ᶠ": 576, + "ᶢ": 577, + "ᶤ": 578, + "ᶧ": 579, + "ᶬ": 580, + "ᶲ": 581, + "ᶴ": 582, + "ᶷ": 583, + "ᶽ": 584, + "ᶿ": 585, + "ẞ": 586, + "ẟ": 587, + "῾": 588, + "​": 589, + "‎": 590, + "‏": 591, + "‐": 592, + "‑": 593, + "‒": 594, + "–": 595, + "—": 596, + "―": 597, + "‖": 598, + "‗": 599, + "‘": 600, + "’": 601, + "‚": 602, + "‛": 603, + "“": 604, + "”": 605, + "„": 606, + "‟": 607, + "†": 608, + "‡": 609, + "•": 610, + "․": 611, + "‥": 612, + "…": 613, + "‧": 614, + "‰": 615, + "‱": 616, + "′": 617, + "″": 618, + "‴": 619, + "‵": 620, + "‹": 621, + "›": 622, + "※": 623, + "‾": 624, + "⁄": 625, + "⁎": 626, + "⁑": 627, + "⁡": 628, + "": 629, + "": 630, + "": 631, + "⁰": 632, + "ⁱ": 633, + "⁴": 634, + "⁵": 635, + "⁶": 636, + "⁸": 637, + "⁹": 638, + "⁺": 639, + "⁻": 640, + "₀": 641, + "₁": 642, + "₂": 643, + "₃": 644, + "₄": 645, + "₊": 646, + "₌": 647, + "ₓ": 648, + "₡": 649, + "₣": 650, + "₤": 651, + "₦": 652, + "₩": 653, + "₫": 654, + "€": 655, + "₮": 656, + "₱": 657, + "₸": 658, + "₹": 659, + "℃": 660, + "℅": 661, + "ℊ": 662, + "ℎ": 663, + "ℏ": 664, + "ℑ": 665, + "ℓ": 666, + "№": 667, + "℗": 668, + "ℜ": 669, + "ℝ": 670, + "™": 671, + "℮": 672, + "ℳ": 673, + "ℵ": 674, + "⅓": 675, + "⅔": 676, + "⅛": 677, + "⅝": 678, + "Ⅰ": 679, + "Ⅱ": 680, + "Ⅲ": 681, + "Ⅳ": 682, + "Ⅴ": 683, + "Ⅵ": 684, + "Ⅶ": 685, + "Ⅷ": 686, + "Ⅸ": 687, + "Ⅹ": 688, + "←": 689, + "↑": 690, + "→": 691, + "↓": 692, + "↔": 693, + "↕": 694, + "↗": 695, + "↘": 696, + "↙": 697, + "↨": 698, + "↩": 699, + "↱": 700, + "↳": 701, + "↺": 702, + "⇀": 703, + "⇄": 704, + "⇆": 705, + "⇈": 706, + "⇋": 707, + "⇌": 708, + "⇐": 709, + "⇑": 710, + "⇒": 711, + "⇓": 712, + "⇔": 713, + "⇞": 714, + "⇡": 715, + "⇣": 716, + "⇧": 717, + "⇨": 718, + "⇩": 719, + "∀": 720, + "∂": 721, + "∃": 722, + "∅": 723, + "∆": 724, + "∇": 725, + "∈": 726, + "∊": 727, + "∎": 728, + "∏": 729, + "∑": 730, + "−": 731, + "∓": 732, + "∕": 733, + "∖": 734, + "∗": 735, + "∘": 736, + "∙": 737, + "√": 738, + "∝": 739, + "∞": 740, + "∠": 741, + "∢": 742, + "∣": 743, + "∥": 744, + "∧": 745, + "∨": 746, + "∩": 747, + "∪": 748, + "∫": 749, + "∬": 750, + "∮": 751, + "∴": 752, + "∶": 753, + "∷": 754, + "∼": 755, + "∽": 756, + "≃": 757, + "≅": 758, + "≈": 759, + "≏": 760, + "≑": 761, + "≒": 762, + "≔": 763, + "≙": 764, + "≡": 765, + "≤": 766, + "≥": 767, + "≦": 768, + "≧": 769, + "≨": 770, + "≪": 771, + "≫": 772, + "≲": 773, + "≳": 774, + "≺": 775, + "≻": 776, + "⊂": 777, + "⊃": 778, + "⊆": 779, + "⊑": 780, + "⊓": 781, + "⊕": 782, + "⊖": 783, + "⊗": 784, + "⊘": 785, + "⊙": 786, + "⊚": 787, + "⊛": 788, + "⊝": 789, + "⊞": 790, + "⊠": 791, + "⊢": 792, + "⊣": 793, + "⊤": 794, + "⊥": 795, + "⊲": 796, + "⊿": 797, + "⋀": 798, + "⋃": 799, + "⋄": 800, + "⋅": 801, + "⋆": 802, + "⋇": 803, + "⋍": 804, + "⋕": 805, + "⋙": 806, + "⋮": 807, + "⋯": 808, + "⌀": 809, + "⌂": 810, + "⌃": 811, + "⌄": 812, + "⌈": 813, + "⌉": 814, + "⌊": 815, + "⌋": 816, + "⌐": 817, + "⌘": 818, + "⌠": 819, + "⌴": 820, + "⍛": 821, + "⍶": 822, + "⍺": 823, + "⎕": 824, + "⎛": 825, + "⎝": 826, + "⎞": 827, + "⎠": 828, + "⎡": 829, + "⎣": 830, + "⎤": 831, + "⎥": 832, + "⎦": 833, + "⎩": 834, + "⎪": 835, + "⎯": 836, + "␣": 837, + "①": 838, + "②": 839, + "③": 840, + "④": 841, + "⑤": 842, + "⑥": 843, + "⑦": 844, + "⑧": 845, + "⑨": 846, + "⑩": 847, + "⑪": 848, + "⑫": 849, + "⑬": 850, + "⑭": 851, + "⑮": 852, + "⑯": 853, + "⑴": 854, + "⑵": 855, + "⑶": 856, + "⑷": 857, + "⑸": 858, + "⑹": 859, + "⑺": 860, + "⑻": 861, + "⑼": 862, + "⑽": 863, + "⑾": 864, + "⑿": 865, + "⒀": 866, + "⒁": 867, + "⒂": 868, + "⒃": 869, + "⒄": 870, + "⒅": 871, + "⒆": 872, + "⒇": 873, + "Ⓡ": 874, + "ⓞ": 875, + "⓫": 876, + "⓬": 877, + "─": 878, + "━": 879, + "│": 880, + "┃": 881, + "┊": 882, + "┐": 883, + "└": 884, + "┘": 885, + "├": 886, + "┤": 887, + "┬": 888, + "┴": 889, + "┼": 890, + "┿": 891, + "╋": 892, + "═": 893, + "║": 894, + "╚": 895, + "╞": 896, + "╟": 897, + "╤": 898, + "╥": 899, + "╦": 900, + "╪": 901, + "╫": 902, + "╬": 903, + "╳": 904, + "▀": 905, + "▏": 906, + "░": 907, + "▒": 908, + "▓": 909, + "■": 910, + "□": 911, + "▣": 912, + "▪": 913, + "▫": 914, + "▬": 915, + "▯": 916, + "▲": 917, + "△": 918, + "▴": 919, + "▵": 920, + "▶": 921, + "▷": 922, + "▸": 923, + "►": 924, + "▼": 925, + "▽": 926, + "▾": 927, + "◁": 928, + "◄": 929, + "◆": 930, + "◇": 931, + "◈": 932, + "◉": 933, + "◊": 934, + "○": 935, + "◎": 936, + "●": 937, + "◐": 938, + "◑": 939, + "◖": 940, + "◘": 941, + "◙": 942, + "◦": 943, + "◩": 944, + "◭": 945, + "◮": 946, + "◯": 947, + "◻": 948, + "◽": 949, + "★": 950, + "☆": 951, + "☎": 952, + "☐": 953, + "☑": 954, + "☒": 955, + "☓": 956, + "☞": 957, + "☥": 958, + "☨": 959, + "☯": 960, + "☹": 961, + "☺": 962, + "☼": 963, + "☿": 964, + "♀": 965, + "♂": 966, + "♋": 967, + "♠": 968, + "♢": 969, + "♣": 970, + "♤": 971, + "♥": 972, + "♦": 973, + "♪": 974, + "♭": 975, + "♮": 976, + "♯": 977, + "⚝": 978, + "⚬": 979, + "✉": 980, + "✍": 981, + "✓": 982, + "✔": 983, + "✕": 984, + "✖": 985, + "✗": 986, + "✘": 987, + "✚": 988, + "✜": 989, + "✝": 990, + "✞": 991, + "✠": 992, + "✡": 993, + "✤": 994, + "✦": 995, + "✧": 996, + "✩": 997, + "✪": 998, + "✰": 999, + "✳": 1000, + "✴": 1001, + "✵": 1002, + "✶": 1003, + "✻": 1004, + "✽": 1005, + "❈": 1006, + "❋": 1007, + "❍": 1008, + "❑": 1009, + "❒": 1010, + "❖": 1011, + "❚": 1012, + "❤": 1013, + "❧": 1014, + "❶": 1015, + "❷": 1016, + "❸": 1017, + "❹": 1018, + "❺": 1019, + "❻": 1020, + "❼": 1021, + "❽": 1022, + "❾": 1023, + "❿": 1024, + "➀": 1025, + "➁": 1026, + "➂": 1027, + "➃": 1028, + "➌": 1029, + "➍": 1030, + "➎": 1031, + "➏": 1032, + "➑": 1033, + "➔": 1034, + "➙": 1035, + "➜": 1036, + "➝": 1037, + "➞": 1038, + "➢": 1039, + "➣": 1040, + "➤": 1041, + "⟂": 1042, + "⟡": 1043, + "⟨": 1044, + "⟩": 1045, + "⟳": 1046, + "⟶": 1047, + "⤈": 1048, + "⤉": 1049, + "⤓": 1050, + "⤺": 1051, + "⦸": 1052, + "⨁": 1053, + "⨉": 1054, + "⨕": 1055, + "⩒": 1056, + "⩽": 1057, + "⩾": 1058, + "⪓": 1059, + "⫧": 1060, + "⫮": 1061, + "⬆": 1062, + "⬇": 1063, + "ⱡ": 1064, + "Ⱶ": 1065, + "、": 1066, + "。": 1067, + "々": 1068, + "〇": 1069, + "〈": 1070, + "〉": 1071, + "《": 1072, + "》": 1073, + "『": 1074, + "』": 1075, + "【": 1076, + "】": 1077, + "〔": 1078, + "〕": 1079, + "あ": 1080, + "い": 1081, + "う": 1082, + "え": 1083, + "お": 1084, + "か": 1085, + "き": 1086, + "く": 1087, + "け": 1088, + "こ": 1089, + "さ": 1090, + "し": 1091, + "す": 1092, + "せ": 1093, + "そ": 1094, + "た": 1095, + "ち": 1096, + "っ": 1097, + "つ": 1098, + "て": 1099, + "と": 1100, + "な": 1101, + "に": 1102, + "ぬ": 1103, + "ね": 1104, + "の": 1105, + "は": 1106, + "ひ": 1107, + "ふ": 1108, + "へ": 1109, + "ほ": 1110, + "ま": 1111, + "み": 1112, + "む": 1113, + "め": 1114, + "も": 1115, + "や": 1116, + "ゅ": 1117, + "ゆ": 1118, + "ょ": 1119, + "よ": 1120, + "ら": 1121, + "り": 1122, + "る": 1123, + "れ": 1124, + "ろ": 1125, + "わ": 1126, + "を": 1127, + "ん": 1128, + "ア": 1129, + "イ": 1130, + "ウ": 1131, + "ェ": 1132, + "エ": 1133, + "オ": 1134, + "カ": 1135, + "キ": 1136, + "ク": 1137, + "ケ": 1138, + "コ": 1139, + "サ": 1140, + "シ": 1141, + "ス": 1142, + "セ": 1143, + "ソ": 1144, + "タ": 1145, + "チ": 1146, + "ッ": 1147, + "テ": 1148, + "ト": 1149, + "ナ": 1150, + "ニ": 1151, + "ハ": 1152, + "ヒ": 1153, + "フ": 1154, + "ヘ": 1155, + "ホ": 1156, + "マ": 1157, + "ミ": 1158, + "メ": 1159, + "ュ": 1160, + "ョ": 1161, + "ラ": 1162, + "リ": 1163, + "ル": 1164, + "レ": 1165, + "ロ": 1166, + "ン": 1167, + "・": 1168, + "ー": 1169, + "ㄱ": 1170, + "ㄲ": 1171, + "ㄴ": 1172, + "ㄷ": 1173, + "ㄸ": 1174, + "ㄹ": 1175, + "ㅁ": 1176, + "ㅂ": 1177, + "ㅃ": 1178, + "ㅅ": 1179, + "ㅇ": 1180, + "ㅈ": 1181, + "ㅉ": 1182, + "ㅊ": 1183, + "ㅋ": 1184, + "ㅌ": 1185, + "ㅍ": 1186, + "ㅎ": 1187, + "ㅏ": 1188, + "ㅐ": 1189, + "ㅑ": 1190, + "ㅒ": 1191, + "ㅓ": 1192, + "ㅔ": 1193, + "ㅕ": 1194, + "ㅖ": 1195, + "ㅗ": 1196, + "ㅛ": 1197, + "ㅜ": 1198, + "ㅠ": 1199, + "ㅡ": 1200, + "ㅣ": 1201, + "㎍": 1202, + "㎕": 1203, + "㎖": 1204, + "㎗": 1205, + "㎛": 1206, + "㎝": 1207, + "㎠": 1208, + "㎡": 1209, + "㎣": 1210, + "㎶": 1211, + "一": 1212, + "七": 1213, + "万": 1214, + "三": 1215, + "上": 1216, + "下": 1217, + "不": 1218, + "与": 1219, + "且": 1220, + "世": 1221, + "丘": 1222, + "业": 1223, + "东": 1224, + "丝": 1225, + "両": 1226, + "丢": 1227, + "两": 1228, + "严": 1229, + "並": 1230, + "个": 1231, + "中": 1232, + "丰": 1233, + "临": 1234, + "丸": 1235, + "丹": 1236, + "为": 1237, + "主": 1238, + "久": 1239, + "么": 1240, + "之": 1241, + "乐": 1242, + "九": 1243, + "习": 1244, + "书": 1245, + "乱": 1246, + "乳": 1247, + "了": 1248, + "争": 1249, + "事": 1250, + "二": 1251, + "于": 1252, + "云": 1253, + "五": 1254, + "井": 1255, + "些": 1256, + "亞": 1257, + "交": 1258, + "产": 1259, + "享": 1260, + "京": 1261, + "亮": 1262, + "人": 1263, + "亿": 1264, + "什": 1265, + "仁": 1266, + "介": 1267, + "仍": 1268, + "从": 1269, + "仔": 1270, + "仕": 1271, + "他": 1272, + "付": 1273, + "代": 1274, + "令": 1275, + "以": 1276, + "们": 1277, + "仮": 1278, + "仲": 1279, + "件": 1280, + "任": 1281, + "份": 1282, + "企": 1283, + "伐": 1284, + "休": 1285, + "优": 1286, + "会": 1287, + "传": 1288, + "伤": 1289, + "伯": 1290, + "伸": 1291, + "但": 1292, + "位": 1293, + "低": 1294, + "住": 1295, + "体": 1296, + "何": 1297, + "余": 1298, + "作": 1299, + "你": 1300, + "併": 1301, + "使": 1302, + "來": 1303, + "例": 1304, + "供": 1305, + "侣": 1306, + "侧": 1307, + "便": 1308, + "保": 1309, + "俞": 1310, + "信": 1311, + "個": 1312, + "倒": 1313, + "候": 1314, + "借": 1315, + "値": 1316, + "倦": 1317, + "值": 1318, + "假": 1319, + "做": 1320, + "停": 1321, + "健": 1322, + "偽": 1323, + "傘": 1324, + "備": 1325, + "催": 1326, + "傷": 1327, + "像": 1328, + "僚": 1329, + "僧": 1330, + "億": 1331, + "儿": 1332, + "元": 1333, + "充": 1334, + "光": 1335, + "免": 1336, + "児": 1337, + "兒": 1338, + "党": 1339, + "入": 1340, + "內": 1341, + "全": 1342, + "兩": 1343, + "兪": 1344, + "八": 1345, + "公": 1346, + "六": 1347, + "兰": 1348, + "共": 1349, + "关": 1350, + "兴": 1351, + "其": 1352, + "具": 1353, + "典": 1354, + "内": 1355, + "再": 1356, + "写": 1357, + "冤": 1358, + "冬": 1359, + "冰": 1360, + "决": 1361, + "冷": 1362, + "凍": 1363, + "减": 1364, + "凑": 1365, + "凝": 1366, + "几": 1367, + "凤": 1368, + "凰": 1369, + "凹": 1370, + "出": 1371, + "刀": 1372, + "分": 1373, + "切": 1374, + "列": 1375, + "刘": 1376, + "则": 1377, + "刚": 1378, + "创": 1379, + "判": 1380, + "利": 1381, + "别": 1382, + "到": 1383, + "制": 1384, + "刷": 1385, + "刺": 1386, + "刻": 1387, + "剂": 1388, + "削": 1389, + "前": 1390, + "剤": 1391, + "剥": 1392, + "剩": 1393, + "剪": 1394, + "創": 1395, + "劉": 1396, + "力": 1397, + "劝": 1398, + "功": 1399, + "加": 1400, + "务": 1401, + "动": 1402, + "助": 1403, + "努": 1404, + "励": 1405, + "劲": 1406, + "劳": 1407, + "势": 1408, + "動": 1409, + "務": 1410, + "募": 1411, + "包": 1412, + "化": 1413, + "北": 1414, + "匙": 1415, + "匹": 1416, + "区": 1417, + "医": 1418, + "十": 1419, + "千": 1420, + "半": 1421, + "华": 1422, + "协": 1423, + "卑": 1424, + "卒": 1425, + "单": 1426, + "南": 1427, + "博": 1428, + "卜": 1429, + "卫": 1430, + "危": 1431, + "却": 1432, + "厂": 1433, + "压": 1434, + "厌": 1435, + "厚": 1436, + "原": 1437, + "厭": 1438, + "去": 1439, + "参": 1440, + "參": 1441, + "叉": 1442, + "及": 1443, + "友": 1444, + "双": 1445, + "反": 1446, + "収": 1447, + "发": 1448, + "取": 1449, + "受": 1450, + "变": 1451, + "叠": 1452, + "口": 1453, + "古": 1454, + "只": 1455, + "叫": 1456, + "可": 1457, + "台": 1458, + "史": 1459, + "右": 1460, + "叶": 1461, + "号": 1462, + "司": 1463, + "叹": 1464, + "吃": 1465, + "合": 1466, + "吉": 1467, + "同": 1468, + "名": 1469, + "后": 1470, + "向": 1471, + "吓": 1472, + "君": 1473, + "吞": 1474, + "否": 1475, + "含": 1476, + "吳": 1477, + "吴": 1478, + "吵": 1479, + "吸": 1480, + "吹": 1481, + "吾": 1482, + "呆": 1483, + "呈": 1484, + "告": 1485, + "员": 1486, + "周": 1487, + "味": 1488, + "呵": 1489, + "呼": 1490, + "和": 1491, + "咒": 1492, + "咖": 1493, + "咳": 1494, + "咽": 1495, + "哀": 1496, + "品": 1497, + "員": 1498, + "哪": 1499, + "哭": 1500, + "唇": 1501, + "唤": 1502, + "商": 1503, + "問": 1504, + "啡": 1505, + "啤": 1506, + "善": 1507, + "喜": 1508, + "喝": 1509, + "営": 1510, + "喷": 1511, + "喻": 1512, + "嗽": 1513, + "嘘": 1514, + "嘱": 1515, + "器": 1516, + "嚢": 1517, + "囊": 1518, + "四": 1519, + "回": 1520, + "因": 1521, + "团": 1522, + "団": 1523, + "困": 1524, + "围": 1525, + "固": 1526, + "国": 1527, + "图": 1528, + "國": 1529, + "圓": 1530, + "土": 1531, + "在": 1532, + "地": 1533, + "场": 1534, + "圾": 1535, + "坂": 1536, + "均": 1537, + "坑": 1538, + "块": 1539, + "坚": 1540, + "垂": 1541, + "垃": 1542, + "型": 1543, + "垫": 1544, + "埃": 1545, + "執": 1546, + "基": 1547, + "堂": 1548, + "報": 1549, + "塑": 1550, + "塘": 1551, + "塞": 1552, + "填": 1553, + "增": 1554, + "壁": 1555, + "士": 1556, + "壮": 1557, + "声": 1558, + "売": 1559, + "変": 1560, + "复": 1561, + "夏": 1562, + "外": 1563, + "多": 1564, + "夜": 1565, + "够": 1566, + "大": 1567, + "天": 1568, + "太": 1569, + "夫": 1570, + "失": 1571, + "头": 1572, + "夹": 1573, + "奇": 1574, + "奈": 1575, + "奖": 1576, + "女": 1577, + "她": 1578, + "好": 1579, + "如": 1580, + "妈": 1581, + "妙": 1582, + "妻": 1583, + "姓": 1584, + "委": 1585, + "姜": 1586, + "姫": 1587, + "姿": 1588, + "威": 1589, + "娜": 1590, + "婦": 1591, + "媒": 1592, + "嫌": 1593, + "子": 1594, + "孔": 1595, + "字": 1596, + "存": 1597, + "孚": 1598, + "孟": 1599, + "孢": 1600, + "孤": 1601, + "学": 1602, + "孫": 1603, + "學": 1604, + "宁": 1605, + "它": 1606, + "宅": 1607, + "宇": 1608, + "守": 1609, + "安": 1610, + "宋": 1611, + "完": 1612, + "宏": 1613, + "宙": 1614, + "定": 1615, + "宜": 1616, + "宝": 1617, + "实": 1618, + "実": 1619, + "客": 1620, + "室": 1621, + "宰": 1622, + "害": 1623, + "家": 1624, + "容": 1625, + "寄": 1626, + "密": 1627, + "富": 1628, + "寒": 1629, + "察": 1630, + "寶": 1631, + "对": 1632, + "寺": 1633, + "导": 1634, + "対": 1635, + "寿": 1636, + "封": 1637, + "専": 1638, + "射": 1639, + "将": 1640, + "專": 1641, + "尊": 1642, + "對": 1643, + "小": 1644, + "少": 1645, + "尔": 1646, + "尘": 1647, + "尚": 1648, + "尝": 1649, + "就": 1650, + "尺": 1651, + "局": 1652, + "居": 1653, + "屈": 1654, + "屉": 1655, + "屋": 1656, + "屑": 1657, + "展": 1658, + "属": 1659, + "山": 1660, + "岁": 1661, + "岌": 1662, + "岗": 1663, + "岳": 1664, + "峰": 1665, + "川": 1666, + "州": 1667, + "工": 1668, + "左": 1669, + "巨": 1670, + "差": 1671, + "己": 1672, + "已": 1673, + "巴": 1674, + "巾": 1675, + "市": 1676, + "布": 1677, + "师": 1678, + "希": 1679, + "帘": 1680, + "帜": 1681, + "带": 1682, + "師": 1683, + "帯": 1684, + "帰": 1685, + "常": 1686, + "帽": 1687, + "幫": 1688, + "干": 1689, + "平": 1690, + "年": 1691, + "并": 1692, + "幸": 1693, + "幻": 1694, + "幼": 1695, + "广": 1696, + "庆": 1697, + "床": 1698, + "序": 1699, + "应": 1700, + "底": 1701, + "店": 1702, + "庙": 1703, + "度": 1704, + "座": 1705, + "庫": 1706, + "庭": 1707, + "康": 1708, + "庸": 1709, + "廊": 1710, + "延": 1711, + "建": 1712, + "开": 1713, + "弄": 1714, + "式": 1715, + "引": 1716, + "张": 1717, + "張": 1718, + "强": 1719, + "归": 1720, + "当": 1721, + "形": 1722, + "彭": 1723, + "影": 1724, + "待": 1725, + "很": 1726, + "律": 1727, + "後": 1728, + "徐": 1729, + "徒": 1730, + "従": 1731, + "得": 1732, + "從": 1733, + "御": 1734, + "徴": 1735, + "徽": 1736, + "心": 1737, + "必": 1738, + "忆": 1739, + "志": 1740, + "忘": 1741, + "応": 1742, + "忧": 1743, + "快": 1744, + "忽": 1745, + "态": 1746, + "怎": 1747, + "怒": 1748, + "怜": 1749, + "思": 1750, + "急": 1751, + "性": 1752, + "怨": 1753, + "怯": 1754, + "总": 1755, + "恋": 1756, + "恍": 1757, + "恐": 1758, + "息": 1759, + "恼": 1760, + "悟": 1761, + "悠": 1762, + "患": 1763, + "您": 1764, + "悪": 1765, + "情": 1766, + "惊": 1767, + "惧": 1768, + "想": 1769, + "愉": 1770, + "意": 1771, + "感": 1772, + "愤": 1773, + "愧": 1774, + "態": 1775, + "懷": 1776, + "懼": 1777, + "戈": 1778, + "成": 1779, + "我": 1780, + "或": 1781, + "戟": 1782, + "戦": 1783, + "戳": 1784, + "戴": 1785, + "户": 1786, + "戻": 1787, + "房": 1788, + "所": 1789, + "扁": 1790, + "手": 1791, + "才": 1792, + "打": 1793, + "扣": 1794, + "扫": 1795, + "扰": 1796, + "扶": 1797, + "找": 1798, + "技": 1799, + "把": 1800, + "抑": 1801, + "抗": 1802, + "折": 1803, + "护": 1804, + "报": 1805, + "抱": 1806, + "抹": 1807, + "抽": 1808, + "担": 1809, + "拆": 1810, + "拇": 1811, + "拉": 1812, + "拌": 1813, + "拍": 1814, + "拖": 1815, + "拧": 1816, + "拨": 1817, + "拭": 1818, + "拳": 1819, + "拿": 1820, + "持": 1821, + "挂": 1822, + "指": 1823, + "按": 1824, + "挑": 1825, + "挛": 1826, + "挤": 1827, + "挫": 1828, + "振": 1829, + "捕": 1830, + "捞": 1831, + "捡": 1832, + "换": 1833, + "捣": 1834, + "掉": 1835, + "排": 1836, + "探": 1837, + "控": 1838, + "掩": 1839, + "掰": 1840, + "揉": 1841, + "描": 1842, + "提": 1843, + "插": 1844, + "握": 1845, + "搅": 1846, + "搓": 1847, + "摇": 1848, + "摘": 1849, + "撒": 1850, + "撕": 1851, + "播": 1852, + "擦": 1853, + "擾": 1854, + "攝": 1855, + "收": 1856, + "改": 1857, + "放": 1858, + "政": 1859, + "效": 1860, + "救": 1861, + "敗": 1862, + "教": 1863, + "散": 1864, + "数": 1865, + "整": 1866, + "敷": 1867, + "文": 1868, + "斑": 1869, + "斗": 1870, + "料": 1871, + "斛": 1872, + "斤": 1873, + "斥": 1874, + "断": 1875, + "新": 1876, + "方": 1877, + "於": 1878, + "族": 1879, + "旗": 1880, + "无": 1881, + "日": 1882, + "旦": 1883, + "早": 1884, + "旬": 1885, + "旱": 1886, + "时": 1887, + "旺": 1888, + "昆": 1889, + "昇": 1890, + "昌": 1891, + "明": 1892, + "易": 1893, + "星": 1894, + "是": 1895, + "時": 1896, + "晃": 1897, + "普": 1898, + "景": 1899, + "晰": 1900, + "智": 1901, + "晾": 1902, + "暂": 1903, + "暇": 1904, + "暖": 1905, + "曰": 1906, + "曲": 1907, + "更": 1908, + "書": 1909, + "曹": 1910, + "最": 1911, + "月": 1912, + "有": 1913, + "朋": 1914, + "服": 1915, + "朗": 1916, + "望": 1917, + "朝": 1918, + "期": 1919, + "木": 1920, + "未": 1921, + "本": 1922, + "朮": 1923, + "术": 1924, + "朱": 1925, + "朴": 1926, + "机": 1927, + "李": 1928, + "杏": 1929, + "材": 1930, + "村": 1931, + "杜": 1932, + "杞": 1933, + "条": 1934, + "来": 1935, + "杯": 1936, + "杰": 1937, + "松": 1938, + "板": 1939, + "极": 1940, + "构": 1941, + "析": 1942, + "林": 1943, + "果": 1944, + "枝": 1945, + "枠": 1946, + "枣": 1947, + "枯": 1948, + "枳": 1949, + "架": 1950, + "枸": 1951, + "枹": 1952, + "柃": 1953, + "柏": 1954, + "染": 1955, + "柔": 1956, + "柜": 1957, + "查": 1958, + "柯": 1959, + "柱": 1960, + "柳": 1961, + "柴": 1962, + "査": 1963, + "柿": 1964, + "标": 1965, + "树": 1966, + "栗": 1967, + "校": 1968, + "株": 1969, + "样": 1970, + "核": 1971, + "根": 1972, + "桂": 1973, + "桃": 1974, + "框": 1975, + "案": 1976, + "桌": 1977, + "桐": 1978, + "桔": 1979, + "档": 1980, + "桦": 1981, + "梅": 1982, + "梗": 1983, + "條": 1984, + "梯": 1985, + "械": 1986, + "检": 1987, + "棗": 1988, + "森": 1989, + "椅": 1990, + "検": 1991, + "椿": 1992, + "楂": 1993, + "楝": 1994, + "楠": 1995, + "業": 1996, + "極": 1997, + "楼": 1998, + "楽": 1999, + "概": 2000, + "榔": 2001, + "榕": 2002, + "榴": 2003, + "様": 2004, + "標": 2005, + "樟": 2006, + "模": 2007, + "権": 2008, + "横": 2009, + "樱": 2010, + "樸": 2011, + "橘": 2012, + "機": 2013, + "橡": 2014, + "檳": 2015, + "櫻": 2016, + "欠": 2017, + "次": 2018, + "欢": 2019, + "欧": 2020, + "歡": 2021, + "止": 2022, + "正": 2023, + "此": 2024, + "武": 2025, + "歧": 2026, + "歩": 2027, + "歴": 2028, + "歸": 2029, + "死": 2030, + "残": 2031, + "段": 2032, + "毆": 2033, + "母": 2034, + "毎": 2035, + "每": 2036, + "毒": 2037, + "比": 2038, + "毛": 2039, + "氏": 2040, + "民": 2041, + "氓": 2042, + "气": 2043, + "気": 2044, + "氣": 2045, + "水": 2046, + "氷": 2047, + "汁": 2048, + "求": 2049, + "汉": 2050, + "汗": 2051, + "江": 2052, + "池": 2053, + "汤": 2054, + "決": 2055, + "沈": 2056, + "沌": 2057, + "沖": 2058, + "沟": 2059, + "没": 2060, + "沢": 2061, + "沫": 2062, + "河": 2063, + "沸": 2064, + "油": 2065, + "治": 2066, + "沿": 2067, + "泄": 2068, + "泉": 2069, + "泊": 2070, + "法": 2071, + "泡": 2072, + "波": 2073, + "泥": 2074, + "注": 2075, + "泪": 2076, + "泰": 2077, + "泳": 2078, + "泻": 2079, + "泽": 2080, + "洒": 2081, + "洗": 2082, + "津": 2083, + "洪": 2084, + "洲": 2085, + "活": 2086, + "流": 2087, + "浅": 2088, + "浆": 2089, + "济": 2090, + "浙": 2091, + "浪": 2092, + "浴": 2093, + "海": 2094, + "消": 2095, + "涝": 2096, + "涤": 2097, + "涮": 2098, + "液": 2099, + "淘": 2100, + "淡": 2101, + "淫": 2102, + "深": 2103, + "清": 2104, + "減": 2105, + "游": 2106, + "湖": 2107, + "湯": 2108, + "源": 2109, + "準": 2110, + "溪": 2111, + "溶": 2112, + "滇": 2113, + "滋": 2114, + "滎": 2115, + "满": 2116, + "滴": 2117, + "漓": 2118, + "演": 2119, + "漠": 2120, + "潘": 2121, + "潮": 2122, + "澳": 2123, + "激": 2124, + "濕": 2125, + "瀉": 2126, + "火": 2127, + "灯": 2128, + "灰": 2129, + "灵": 2130, + "灼": 2131, + "灾": 2132, + "炉": 2133, + "炎": 2134, + "炒": 2135, + "炙": 2136, + "炭": 2137, + "炮": 2138, + "点": 2139, + "為": 2140, + "烏": 2141, + "烛": 2142, + "烟": 2143, + "烦": 2144, + "無": 2145, + "焦": 2146, + "然": 2147, + "焼": 2148, + "煅": 2149, + "煤": 2150, + "照": 2151, + "煨": 2152, + "煮": 2153, + "熟": 2154, + "熨": 2155, + "熱": 2156, + "營": 2157, + "爱": 2158, + "父": 2159, + "片": 2160, + "版": 2161, + "牌": 2162, + "牙": 2163, + "牛": 2164, + "牡": 2165, + "物": 2166, + "特": 2167, + "犬": 2168, + "状": 2169, + "狀": 2170, + "独": 2171, + "猪": 2172, + "猫": 2173, + "獨": 2174, + "玄": 2175, + "率": 2176, + "王": 2177, + "玩": 2178, + "现": 2179, + "玻": 2180, + "珍": 2181, + "珠": 2182, + "班": 2183, + "現": 2184, + "球": 2185, + "理": 2186, + "琐": 2187, + "琴": 2188, + "瑞": 2189, + "璃": 2190, + "環": 2191, + "瓜": 2192, + "甘": 2193, + "甙": 2194, + "甚": 2195, + "甜": 2196, + "生": 2197, + "産": 2198, + "用": 2199, + "田": 2200, + "由": 2201, + "甲": 2202, + "电": 2203, + "男": 2204, + "町": 2205, + "画": 2206, + "畏": 2207, + "略": 2208, + "番": 2209, + "畫": 2210, + "異": 2211, + "當": 2212, + "疆": 2213, + "疊": 2214, + "疗": 2215, + "疲": 2216, + "疼": 2217, + "疾": 2218, + "病": 2219, + "症": 2220, + "痛": 2221, + "痩": 2222, + "痰": 2223, + "瘀": 2224, + "療": 2225, + "癌": 2226, + "発": 2227, + "發": 2228, + "白": 2229, + "百": 2230, + "皂": 2231, + "的": 2232, + "皮": 2233, + "益": 2234, + "盔": 2235, + "盖": 2236, + "盘": 2237, + "盛": 2238, + "目": 2239, + "直": 2240, + "相": 2241, + "省": 2242, + "看": 2243, + "真": 2244, + "眠": 2245, + "眨": 2246, + "眼": 2247, + "眾": 2248, + "着": 2249, + "睁": 2250, + "睑": 2251, + "睛": 2252, + "睡": 2253, + "瞒": 2254, + "瞬": 2255, + "瞳": 2256, + "知": 2257, + "石": 2258, + "矽": 2259, + "砂": 2260, + "研": 2261, + "硝": 2262, + "确": 2263, + "碗": 2264, + "磁": 2265, + "社": 2266, + "神": 2267, + "票": 2268, + "祭": 2269, + "福": 2270, + "离": 2271, + "秀": 2272, + "科": 2273, + "秒": 2274, + "积": 2275, + "称": 2276, + "移": 2277, + "程": 2278, + "稚": 2279, + "種": 2280, + "稿": 2281, + "積": 2282, + "穗": 2283, + "究": 2284, + "空": 2285, + "穿": 2286, + "突": 2287, + "窗": 2288, + "立": 2289, + "竖": 2290, + "端": 2291, + "竹": 2292, + "笑": 2293, + "笔": 2294, + "符": 2295, + "第": 2296, + "筆": 2297, + "等": 2298, + "筋": 2299, + "筑": 2300, + "答": 2301, + "策": 2302, + "筝": 2303, + "筷": 2304, + "算": 2305, + "管": 2306, + "箱": 2307, + "篮": 2308, + "米": 2309, + "类": 2310, + "籽": 2311, + "粉": 2312, + "粒": 2313, + "粟": 2314, + "精": 2315, + "糕": 2316, + "糖": 2317, + "糟": 2318, + "系": 2319, + "紅": 2320, + "紊": 2321, + "紙": 2322, + "素": 2323, + "索": 2324, + "紫": 2325, + "細": 2326, + "終": 2327, + "組": 2328, + "絡": 2329, + "給": 2330, + "絲": 2331, + "絶": 2332, + "經": 2333, + "綱": 2334, + "網": 2335, + "緑": 2336, + "縄": 2337, + "縦": 2338, + "红": 2339, + "纤": 2340, + "约": 2341, + "纸": 2342, + "纹": 2343, + "线": 2344, + "练": 2345, + "组": 2346, + "细": 2347, + "终": 2348, + "经": 2349, + "结": 2350, + "络": 2351, + "绝": 2352, + "绩": 2353, + "绪": 2354, + "续": 2355, + "绯": 2356, + "维": 2357, + "综": 2358, + "编": 2359, + "网": 2360, + "罪": 2361, + "羊": 2362, + "美": 2363, + "群": 2364, + "義": 2365, + "翹": 2366, + "考": 2367, + "者": 2368, + "耆": 2369, + "而": 2370, + "耐": 2371, + "耽": 2372, + "职": 2373, + "联": 2374, + "聞": 2375, + "聯": 2376, + "職": 2377, + "肃": 2378, + "肉": 2379, + "肌": 2380, + "肝": 2381, + "肢": 2382, + "肥": 2383, + "肱": 2384, + "育": 2385, + "肺": 2386, + "胃": 2387, + "胆": 2388, + "背": 2389, + "胡": 2390, + "胱": 2391, + "胶": 2392, + "能": 2393, + "脂": 2394, + "脑": 2395, + "脸": 2396, + "脾": 2397, + "腎": 2398, + "腑": 2399, + "腔": 2400, + "腥": 2401, + "腰": 2402, + "腸": 2403, + "腹": 2404, + "腾": 2405, + "腿": 2406, + "膀": 2407, + "膏": 2408, + "膜": 2409, + "膝": 2410, + "膽": 2411, + "臀": 2412, + "臟": 2413, + "臣": 2414, + "臨": 2415, + "自": 2416, + "至": 2417, + "臺": 2418, + "舀": 2419, + "興": 2420, + "舎": 2421, + "航": 2422, + "般": 2423, + "艘": 2424, + "色": 2425, + "艾": 2426, + "节": 2427, + "芋": 2428, + "芍": 2429, + "芎": 2430, + "芒": 2431, + "芩": 2432, + "芪": 2433, + "芭": 2434, + "花": 2435, + "芷": 2436, + "芸": 2437, + "芹": 2438, + "苁": 2439, + "苈": 2440, + "苏": 2441, + "苓": 2442, + "苦": 2443, + "英": 2444, + "苹": 2445, + "茅": 2446, + "茯": 2447, + "茱": 2448, + "茵": 2449, + "茶": 2450, + "草": 2451, + "荔": 2452, + "荣": 2453, + "荧": 2454, + "药": 2455, + "荷": 2456, + "荽": 2457, + "莪": 2458, + "莫": 2459, + "获": 2460, + "莹": 2461, + "菊": 2462, + "菌": 2463, + "菍": 2464, + "菔": 2465, + "菖": 2466, + "菜": 2467, + "菟": 2468, + "華": 2469, + "萄": 2470, + "萝": 2471, + "萧": 2472, + "萸": 2473, + "落": 2474, + "葉": 2475, + "葛": 2476, + "葡": 2477, + "葯": 2478, + "葶": 2479, + "蒋": 2480, + "蒙": 2481, + "蒜": 2482, + "蒲": 2483, + "蒸": 2484, + "蓉": 2485, + "蓝": 2486, + "蓮": 2487, + "蔵": 2488, + "蔻": 2489, + "蕉": 2490, + "薈": 2491, + "薑": 2492, + "薬": 2493, + "藏": 2494, + "藤": 2495, + "藥": 2496, + "藿": 2497, + "蘆": 2498, + "蘇": 2499, + "蘋": 2500, + "蘭": 2501, + "虎": 2502, + "虑": 2503, + "處": 2504, + "虚": 2505, + "虛": 2506, + "虫": 2507, + "蚣": 2508, + "蚪": 2509, + "蚱": 2510, + "蛋": 2511, + "蛎": 2512, + "蛙": 2513, + "蛭": 2514, + "蛸": 2515, + "蜈": 2516, + "蜗": 2517, + "蜜": 2518, + "蜡": 2519, + "蜢": 2520, + "蜥": 2521, + "蜴": 2522, + "蝌": 2523, + "蝥": 2524, + "螃": 2525, + "融": 2526, + "螵": 2527, + "蟹": 2528, + "血": 2529, + "行": 2530, + "衍": 2531, + "術": 2532, + "衛": 2533, + "衣": 2534, + "表": 2535, + "袋": 2536, + "袖": 2537, + "袜": 2538, + "被": 2539, + "装": 2540, + "補": 2541, + "裤": 2542, + "裹": 2543, + "西": 2544, + "要": 2545, + "見": 2546, + "規": 2547, + "視": 2548, + "覚": 2549, + "親": 2550, + "覺": 2551, + "见": 2552, + "观": 2553, + "规": 2554, + "视": 2555, + "觉": 2556, + "角": 2557, + "解": 2558, + "言": 2559, + "訂": 2560, + "計": 2561, + "討": 2562, + "記": 2563, + "許": 2564, + "診": 2565, + "誉": 2566, + "誌": 2567, + "認": 2568, + "誘": 2569, + "語": 2570, + "誤": 2571, + "読": 2572, + "誰": 2573, + "調": 2574, + "談": 2575, + "論": 2576, + "證": 2577, + "議": 2578, + "讀": 2579, + "讓": 2580, + "计": 2581, + "认": 2582, + "讨": 2583, + "训": 2584, + "记": 2585, + "论": 2586, + "评": 2587, + "诅": 2588, + "诊": 2589, + "词": 2590, + "试": 2591, + "诗": 2592, + "话": 2593, + "该": 2594, + "误": 2595, + "诱": 2596, + "说": 2597, + "请": 2598, + "诺": 2599, + "课": 2600, + "调": 2601, + "谈": 2602, + "谢": 2603, + "谨": 2604, + "豁": 2605, + "豆": 2606, + "象": 2607, + "貝": 2608, + "貞": 2609, + "負": 2610, + "責": 2611, + "費": 2612, + "賓": 2613, + "質": 2614, + "贝": 2615, + "贞": 2616, + "贡": 2617, + "责": 2618, + "败": 2619, + "货": 2620, + "贴": 2621, + "贵": 2622, + "费": 2623, + "赔": 2624, + "赢": 2625, + "赤": 2626, + "赭": 2627, + "起": 2628, + "超": 2629, + "趣": 2630, + "足": 2631, + "跟": 2632, + "路": 2633, + "跳": 2634, + "踩": 2635, + "蹲": 2636, + "躍": 2637, + "身": 2638, + "車": 2639, + "転": 2640, + "軽": 2641, + "车": 2642, + "轨": 2643, + "转": 2644, + "轮": 2645, + "辑": 2646, + "输": 2647, + "辛": 2648, + "辨": 2649, + "辯": 2650, + "边": 2651, + "辺": 2652, + "辽": 2653, + "迁": 2654, + "过": 2655, + "运": 2656, + "返": 2657, + "这": 2658, + "进": 2659, + "连": 2660, + "述": 2661, + "追": 2662, + "退": 2663, + "逃": 2664, + "逆": 2665, + "选": 2666, + "透": 2667, + "逐": 2668, + "通": 2669, + "造": 2670, + "連": 2671, + "進": 2672, + "逻": 2673, + "遂": 2674, + "遍": 2675, + "過": 2676, + "道": 2677, + "達": 2678, + "違": 2679, + "遠": 2680, + "適": 2681, + "遮": 2682, + "避": 2683, + "邈": 2684, + "邕": 2685, + "那": 2686, + "邪": 2687, + "邮": 2688, + "郁": 2689, + "郊": 2690, + "郑": 2691, + "部": 2692, + "郭": 2693, + "都": 2694, + "配": 2695, + "酒": 2696, + "酸": 2697, + "醇": 2698, + "醋": 2699, + "醒": 2700, + "醫": 2701, + "里": 2702, + "重": 2703, + "野": 2704, + "量": 2705, + "金": 2706, + "錄": 2707, + "錦": 2708, + "録": 2709, + "鐸": 2710, + "钟": 2711, + "钢": 2712, + "钥": 2713, + "钱": 2714, + "铅": 2715, + "铐": 2716, + "银": 2717, + "链": 2718, + "锁": 2719, + "锥": 2720, + "键": 2721, + "镜": 2722, + "镰": 2723, + "長": 2724, + "长": 2725, + "門": 2726, + "閃": 2727, + "間": 2728, + "閩": 2729, + "閾": 2730, + "關": 2731, + "门": 2732, + "闭": 2733, + "问": 2734, + "闲": 2735, + "间": 2736, + "闷": 2737, + "闸": 2738, + "闻": 2739, + "阈": 2740, + "队": 2741, + "防": 2742, + "阳": 2743, + "阵": 2744, + "阻": 2745, + "附": 2746, + "际": 2747, + "陈": 2748, + "限": 2749, + "陕": 2750, + "陜": 2751, + "院": 2752, + "除": 2753, + "险": 2754, + "陰": 2755, + "陳": 2756, + "陽": 2757, + "階": 2758, + "随": 2759, + "隐": 2760, + "隨": 2761, + "隻": 2762, + "难": 2763, + "雄": 2764, + "集": 2765, + "雙": 2766, + "雜": 2767, + "雨": 2768, + "雪": 2769, + "雲": 2770, + "零": 2771, + "雷": 2772, + "電": 2773, + "需": 2774, + "震": 2775, + "青": 2776, + "静": 2777, + "非": 2778, + "面": 2779, + "鞋": 2780, + "韓": 2781, + "韦": 2782, + "韩": 2783, + "音": 2784, + "項": 2785, + "順": 2786, + "顆": 2787, + "題": 2788, + "願": 2789, + "類": 2790, + "项": 2791, + "须": 2792, + "预": 2793, + "领": 2794, + "频": 2795, + "颗": 2796, + "题": 2797, + "颜": 2798, + "颠": 2799, + "颤": 2800, + "風": 2801, + "风": 2802, + "飛": 2803, + "食": 2804, + "飮": 2805, + "飯": 2806, + "飲": 2807, + "饺": 2808, + "馆": 2809, + "馒": 2810, + "首": 2811, + "香": 2812, + "验": 2813, + "骗": 2814, + "骨": 2815, + "髎": 2816, + "髓": 2817, + "體": 2818, + "高": 2819, + "鬚": 2820, + "鬱": 2821, + "魔": 2822, + "魚": 2823, + "鴻": 2824, + "鸡": 2825, + "鹽": 2826, + "麥": 2827, + "麦": 2828, + "麩": 2829, + "麻": 2830, + "黃": 2831, + "黄": 2832, + "黑": 2833, + "點": 2834, + "鼠": 2835, + "龙": 2836, + "ꜣ": 2837, + "ꜥ": 2838, + "ꞌ": 2839, + "": 2840, + "": 2841, + "": 2842, + "": 2843, + "": 2844, + "": 2845, + "": 2846, + "": 2847, + "": 2848, + "": 2849, + "": 2850, + "": 2851, + "": 2852, + "": 2853, + "": 2854, + "": 2855, + "": 2856, + "": 2857, + "": 2858, + "": 2859, + "": 2860, + "": 2861, + "": 2862, + "": 2863, + "": 2864, + "": 2865, + "": 2866, + "": 2867, + "": 2868, + "": 2869, + "": 2870, + "": 2871, + "": 2872, + "": 2873, + "": 2874, + "": 2875, + "": 2876, + "": 2877, + "": 2878, + "": 2879, + "": 2880, + "": 2881, + "": 2882, + "": 2883, + "": 2884, + "": 2885, + "": 2886, + "": 2887, + "": 2888, + "": 2889, + "": 2890, + "": 2891, + "": 2892, + "": 2893, + "": 2894, + "": 2895, + "": 2896, + "": 2897, + "": 2898, + "": 2899, + "": 2900, + "": 2901, + "": 2902, + "": 2903, + "": 2904, + "": 2905, + "": 2906, + "": 2907, + "": 2908, + "": 2909, + "": 2910, + "": 2911, + "": 2912, + "": 2913, + "": 2914, + "": 2915, + "": 2916, + "": 2917, + "": 2918, + "": 2919, + "": 2920, + "": 2921, + "": 2922, + "": 2923, + "": 2924, + "": 2925, + "": 2926, + "": 2927, + "": 2928, + "": 2929, + "": 2930, + "": 2931, + "": 2932, + "": 2933, + "": 2934, + "": 2935, + "": 2936, + "": 2937, + "": 2938, + "": 2939, + "": 2940, + "": 2941, + "": 2942, + "": 2943, + "": 2944, + "": 2945, + "": 2946, + "": 2947, + "": 2948, + "": 2949, + "": 2950, + "": 2951, + "": 2952, + "": 2953, + "": 2954, + "": 2955, + "": 2956, + "": 2957, + "": 2958, + "": 2959, + "": 2960, + "": 2961, + "": 2962, + "": 2963, + "": 2964, + "": 2965, + "": 2966, + "": 2967, + "": 2968, + "": 2969, + "": 2970, + "": 2971, + "": 2972, + "": 2973, + "": 2974, + "": 2975, + "": 2976, + "": 2977, + "": 2978, + "": 2979, + "": 2980, + "": 2981, + "": 2982, + "": 2983, + "": 2984, + "": 2985, + "": 2986, + "": 2987, + "": 2988, + "": 2989, + "": 2990, + "": 2991, + "": 2992, + "": 2993, + "": 2994, + "": 2995, + "": 2996, + "": 2997, + "": 2998, + "": 2999, + "": 3000, + "": 3001, + "": 3002, + "": 3003, + "ff": 3004, + "fi": 3005, + "fl": 3006, + "ffi": 3007, + "ffl": 3008, + "﹟": 3009, + "﹠": 3010, + "﹡": 3011, + "﹤": 3012, + "﹥": 3013, + "﹪": 3014, + "": 3015, + "%": 3016, + "&": 3017, + "(": 3018, + ")": 3019, + "*": 3020, + "+": 3021, + ",": 3022, + "-": 3023, + ".": 3024, + "/": 3025, + "3": 3026, + ":": 3027, + ";": 3028, + "<": 3029, + ">": 3030, + "?": 3031, + "F": 3032, + "G": 3033, + "H": 3034, + "M": 3035, + "R": 3036, + "~": 3037, + "ア": 3038, + "£": 3039, + "→": 3040, + "�": 3041, + "𝐜": 3042, + "𝐦": 3043, + "𝐩": 3044, + "𝐱": 3045, + "𝐴": 3046, + "𝐵": 3047, + "𝐶": 3048, + "𝐷": 3049, + "𝐸": 3050, + "𝐹": 3051, + "𝐺": 3052, + "𝐻": 3053, + "𝐼": 3054, + "𝐽": 3055, + "𝐾": 3056, + "𝐿": 3057, + "𝑀": 3058, + "𝑁": 3059, + "𝑂": 3060, + "𝑃": 3061, + "𝑄": 3062, + "𝑅": 3063, + "𝑆": 3064, + "𝑇": 3065, + "𝑈": 3066, + "𝑉": 3067, + "𝑊": 3068, + "𝑋": 3069, + "𝑌": 3070, + "𝑎": 3071, + "𝑏": 3072, + "𝑐": 3073, + "𝑑": 3074, + "𝑒": 3075, + "𝑓": 3076, + "𝑔": 3077, + "𝑖": 3078, + "𝑗": 3079, + "𝑘": 3080, + "𝑙": 3081, + "𝑚": 3082, + "𝑛": 3083, + "𝑜": 3084, + "𝑝": 3085, + "𝑞": 3086, + "𝑟": 3087, + "𝑠": 3088, + "𝑡": 3089, + "𝑢": 3090, + "𝑤": 3091, + "𝑥": 3092, + "𝑦": 3093, + "𝑧": 3094, + "𝛼": 3095, + "𝛽": 3096, + "𝛾": 3097, + "𝛿": 3098, + "𝜀": 3099, + "𝜂": 3100, + "𝜃": 3101, + "𝜅": 3102, + "𝜆": 3103, + "𝜇": 3104, + "𝜉": 3105, + "𝜋": 3106, + "𝜌": 3107, + "𝜎": 3108, + "𝜏": 3109, + "𝜑": 3110, + "𝜒": 3111, + "𝜓": 3112, + "𝜔": 3113, + "𝜙": 3114, + "𝜷": 3115, + "𝜼": 3116, + "𝝁": 3117, + "𝝨": 3118, + "𝟎": 3119, + "𝟏": 3120, + "󳨀": 3121, + "󳰀": 3122, + "󸀠": 3123, + "##1": 3124, + "##7": 3125, + "##0": 3126, + "##5": 3127, + "##8": 3128, + "##e": 3129, + "##c": 3130, + "##p": 3131, + "##t": 3132, + "##i": 3133, + "##v": 3134, + "##n": 3135, + "##s": 3136, + "##3": 3137, + "##2": 3138, + "##m": 3139, + "##d": 3140, + "##a": 3141, + "##B": 3142, + "##4": 3143, + "##9": 3144, + "##T": 3145, + "##H": 3146, + "##E": 3147, + "##R": 3148, + "##M": 3149, + "##_": 3150, + "##N": 3151, + "##A": 3152, + "##b": 3153, + "##g": 3154, + "##l": 3155, + "##P": 3156, + "##u": 3157, + "##h": 3158, + "##o": 3159, + "##r": 3160, + "##C": 3161, + "##G": 3162, + "##6": 3163, + "##S": 3164, + "##W": 3165, + "##D": 3166, + "##U": 3167, + "##O": 3168, + "##f": 3169, + "##K": 3170, + "##Q": 3171, + "##F": 3172, + "##L": 3173, + "##y": 3174, + "##I": 3175, + "##x": 3176, + "##w": 3177, + "##k": 3178, + "##Y": 3179, + "##V": 3180, + "##ǂ": 3181, + "##Φ": 3182, + "##j": 3183, + "##X": 3184, + "##q": 3185, + "##J": 3186, + "##z": 3187, + "##龙": 3188, + "##江": 3189, + "##省": 3190, + "##Z": 3191, + "##α": 3192, + "##%": 3193, + "##)": 3194, + "##<": 3195, + "##/": 3196, + "##*": 3197, + "##,": 3198, + "##§": 3199, + "##β": 3200, + "##▲": 3201, + "##■": 3202, + "##δ": 3203, + "##þ": 3204, + "##Δ": 3205, + "##π": 3206, + "###": 3207, + "##†": 3208, + "##ƒ": 3209, + "##+": 3210, + "##‘": 3211, + "##]": 3212, + "##.": 3213, + "##>": 3214, + "##=": 3215, + "##ª": 3216, + "##fl": 3217, + "##□": 3218, + "##○": 3219, + "##ɑ": 3220, + "##[": 3221, + "##‚": 3222, + "##●": 3223, + "##:": 3224, + "##…": 3225, + "##ϕ": 3226, + "##-": 3227, + "##fi": 3228, + "##$": 3229, + "##ˆ": 3230, + "##£": 3231, + "##(": 3232, + "##Β": 3233, + "##!": 3234, + "##ν": 3235, + "##”": 3236, + "##γ": 3237, + "##士": 3238, + "##✞": 3239, + "##♦": 3240, + "##“": 3241, + "##}": 3242, + "##ł": 3243, + "##ı": 3244, + "##ff": 3245, + "##个": 3246, + "##挑": 3247, + "##尔": 3248, + "##達": 3249, + "##電": 3250, + "##¶": 3251, + "##−": 3252, + "##ʹ": 3253, + "##ψ": 3254, + "##•": 3255, + "##≥": 3256, + "##Ο": 3257, + "##給": 3258, + "##𝑐": 3259, + "##ø": 3260, + "##‡": 3261, + "##—": 3262, + "##{": 3263, + "##–": 3264, + "##&": 3265, + "##∗": 3266, + "##В": 3267, + "##С": 3268, + "##ร": 3269, + "##ะ": 3270, + "##ท": 3271, + "##อ": 3272, + "##ม": 3273, + "##|": 3274, + "##ρ": 3275, + "##ο": 3276, + "##σ": 3277, + "##ε": 3278, + "##μ": 3279, + "##η": 3280, + "##'": 3281, + "##;": 3282, + "##√": 3283, + "##\"": 3284, + "##œ": 3285, + "##น": 3286, + "##ก": 3287, + "##ญ": 3288, + "##ช": 3289, + "##า": 3290, + "##θ": 3291, + "##ᶜ": 3292, + "##µ": 3293, + "##˗": 3294, + "##∞": 3295, + "##Þ": 3296, + "##?": 3297, + "##ɛ": 3298, + "##·": 3299, + "##手": 3300, + "##④": 3301, + "##≤": 3302, + "##χ": 3303, + "##え": 3304, + "##е": 3305, + "##О": 3306, + "##Н": 3307, + "##て": 3308, + "##あ": 3309, + "##る": 3310, + "##�": 3311, + "##ω": 3312, + "##º": 3313, + "##’": 3314, + "##°": 3315, + "##λ": 3316, + "##€": 3317, + "##": 3318, + "##⋅": 3319, + "##→": 3320, + "##`": 3321, + "##Θ": 3322, + "##φ": 3323, + "##\\": 3324, + "##↓": 3325, + "##◦": 3326, + "##Ž": 3327, + "##": 3328, + "##⬆": 3329, + "##ffi": 3330, + "##ß": 3331, + "##^": 3332, + "##~": 3333, + "##さ": 3334, + "##し": 3335, + "##く": 3336, + "##な": 3337, + "##い": 3338, + "##ˇ": 3339, + "##ζ": 3340, + "##˚": 3341, + "##▼": 3342, + "##ᵟ": 3343, + "##³": 3344, + "##ƛ": 3345, + "##⑩": 3346, + "##安": 3347, + "##行": 3348, + "##政": 3349, + "##∆": 3350, + "##Æ": 3351, + "##ξ": 3352, + "##ι": 3353, + "##ς": 3354, + "##⑤": 3355, + "##Ф": 3356, + "##×": 3357, + "##♯": 3358, + "##∑": 3359, + "##҂": 3360, + "##υ": 3361, + "##τ": 3362, + "##κ": 3363, + "##Α": 3364, + "##高": 3365, + "##兴": 3366, + "##或": 3367, + "##焦": 3368, + "##◊": 3369, + "##": 3370, + "##∫": 3371, + "##ᶷ": 3372, + "##Ω": 3373, + "##Ψ": 3374, + "##我": 3375, + "##在": 3376, + "##做": 3377, + "##事": 3378, + "##情": 3379, + "##時": 3380, + "##ɓ": 3381, + "##ð": 3382, + "##ꞌ": 3383, + "##↑": 3384, + "##ᵃ": 3385, + "##⇒": 3386, + "##ffl": 3387, + "##𝑃": 3388, + "##‑": 3389, + "##Ϯ": 3390, + "##±": 3391, + "##ᅦ": 3392, + "##ᆸ": 3393, + "##ᄐ": 3394, + "##ᅩ": 3395, + "##ᄉ": 3396, + "##ᅳ": 3397, + "##ᄑ": 3398, + "##ᅵ": 3399, + "##ᄅ": 3400, + "##ᅡ": 3401, + "##ᄌ": 3402, + "##ᆼ": 3403, + "##恋": 3404, + "##令": 3405, + "##片": 3406, + "##昌": 3407, + "##¥": 3408, + "##★": 3409, + "##„": 3410, + "##Ι": 3411, + "##♀": 3412, + "##了": 3413, + "##玩": 3414, + "##得": 3415, + "##愉": 3416, + "##快": 3417, + "##麩": 3418, + "##态": 3419, + "##@": 3420, + "##Ⅲ": 3421, + "##こ": 3422, + "##う": 3423, + "##о": 3424, + "##з": 3425, + "##в": 3426, + "##а": 3427, + "##я": 3428, + "##ᄎ": 3429, + "##ᆷ": 3430, + "##花": 3431, + "##枝": 3432, + "##)": 3433, + "##ᅮ": 3434, + "##Γ": 3435, + "##♂": 3436, + "##∧": 3437, + "##经": 3438, + "##常": 3439, + "##会": 3440, + "##因": 3441, + "##为": 3442, + "##上": 3443, + "##网": 3444, + "##到": 3445, + "##半": 3446, + "##夜": 3447, + "##而": 3448, + "##失": 3449, + "##眠": 3450, + "##么": 3451, + "##↔": 3452, + "##Е": 3453, + "##𝜂": 3454, + "##˜": 3455, + "##地": 3456, + "##黃": 3457, + "##ꜥ": 3458, + "##˘": 3459, + "##鬱": 3460, + "##化": 3461, + "##火": 3462, + "##𝑢": 3463, + "##‐": 3464, + "##胃": 3465, + "##不": 3466, + "##和": 3467, + "##患": 3468, + "##ᶲ": 3469, + "##〕": 3470, + "##𝑁": 3471, + "##邪": 3472, + "##东": 3473, + "##½": 3474, + "##药": 3475, + "##单": 3476, + "##ɸ": 3477, + "##⊝": 3478, + "##д": 3479, + "##р": 3480, + "##и": 3481, + "##南": 3482, + "##‖": 3483, + "##ɒ": 3484, + "##𝜑": 3485, + "##ᄀ": 3486, + "##ᅥ": 3487, + "##ᄂ": 3488, + "##∼": 3489, + "##Ø": 3490, + "##æ": 3491, + "##※": 3492, + "##ᄋ": 3493, + "##′": 3494, + "##Χ": 3495, + "##⑦": 3496, + "##⑧": 3497, + "##⑨": 3498, + "##⑪": 3499, + "##⑯": 3500, + "##": 3501, + "##≧": 3502, + "##ŧ": 3503, + "##画": 3504, + "##∬": 3505, + "##𝜋": 3506, + "##体": 3507, + "##‰": 3508, + "##ᄇ": 3509, + "##ᅱ": 3510, + "##»": 3511, + "##Ⅱ": 3512, + "##ส": 3513, + "##ย": 3514, + "##เ": 3515, + "##ข": 3516, + "##ว": 3517, + "##¼": 3518, + "##Μ": 3519, + "##✰": 3520, + "##々": 3521, + "##に": 3522, + "##前": 3523, + "##進": 3524, + "##ん": 3525, + "##と": 3526, + "##特": 3527, + "##徴": 3528, + "##か": 3529, + "##บ": 3530, + "##แ": 3531, + "##ด": 3532, + "##ง": 3533, + "##ᶿ": 3534, + "##融": 3535, + "##桌": 3536, + "##子": 3537, + "##水": 3538, + "##―": 3539, + "##擾": 3540, + "##+": 3541, + "##△": 3542, + "##≈": 3543, + "##▾": 3544, + "##«": 3545, + "##图": 3546, + "##Σ": 3547, + "##新": 3548, + "##一": 3549, + "##轮": 3550, + "##优": 3551, + "##秀": 3552, + "##人": 3553, + "##评": 3554, + "##比": 3555, + "##活": 3556, + "##动": 3557, + "##中": 3558, + "##Ɨ": 3559, + "##【": 3560, + "##": 3561, + "##Τ": 3562, + "##Ϟ": 3563, + "##ˊ": 3564, + "##¹": 3565, + "##ไ": 3566, + "##祭": 3567, + "##り": 3568, + "##Ⅰ": 3569, + "##开": 3570, + "##钱": 3571, + "##包": 3572, + "##必": 3573, + "##须": 3574, + "##所": 3575, + "##有": 3576, + "##的": 3577, + "##认": 3578, + "##可": 3579, + "##介": 3580, + "##賓": 3581, + "##逻": 3582, + "##辑": 3583, + "##结": 3584, + "##构": 3585, + "##非": 3586, + "##严": 3587, + "##谨": 3588, + "##清": 3589, + "##晰": 3590, + "##經": 3591, + "##素": 3592, + "##問": 3593, + "##積": 3594, + "##腰": 3595, + "##痛": 3596, + "##": 3597, + "##呼": 3598, + "##吸": 3599, + "##综": 3600, + "##合": 3601, + "##症": 3602, + "##息": 3603, + "##全": 3604, + "##血": 3605, + "##藤": 3606, + "##⟨": 3607, + "##布": 3608, + "##覺": 3609, + "##想": 3610, + "##去": 3611, + "##美": 3612, + "##好": 3613, + "##ʻ": 3614, + "##➔": 3615, + "##⩾": 3616, + "##": 3617, + "##\u0013": 3618, + "##疼": 3619, + "##哭": 3620, + "##斑": 3621, + "##蝥": 3622, + "##山": 3623, + "##具": 3624, + "##面": 3625, + "##条": 3626, + "##睑": 3627, + "##张": 3628, + "##被": 3629, + "##智": 3630, + "##属": 3631, + "##于": 3632, + "##以": 3633, + "##下": 3634, + "##哪": 3635, + "##类": 3636, + "##别": 3637, + "##⋇": 3638, + "##⑵": 3639, + "##⑷": 3640, + "##⑸": 3641, + "##⑹": 3642, + "##⑺": 3643, + "##⑻": 3644, + "##⑼": 3645, + "##⑿": 3646, + "##⒆": 3647, + "##®": 3648, + "##¢": 3649, + "##ʼ": 3650, + "##②": 3651, + "##③": 3652, + "##ɪ": 3653, + "##ℓ": 3654, + "##很": 3655, + "##專": 3656, + "##心": 3657, + "##信": 3658, + "##𝑛": 3659, + "##⑶": 3660, + "##⑽": 3661, + "##⑾": 3662, + "##⒀": 3663, + "##⒁": 3664, + "##⒂": 3665, + "##⒃": 3666, + "##𝐿": 3667, + "##Η": 3668, + "##": 3669, + "##险": 3670, + "##沟": 3671, + "##通": 3672, + "##魔": 3673, + "##烦": 3674, + "##с": 3675, + "##л": 3676, + "##т": 3677, + "##∠": 3678, + "##⊤": 3679, + "##ϰ": 3680, + "##˦": 3681, + "##­": 3682, + "##柏": 3683, + "##象": 3684, + "##體": 3685, + "##質": 3686, + "##辨": 3687, + "##證": 3688, + "##苹": 3689, + "##果": 3690, + "##ג": 3691, + "##未": 3692, + "##熟": 3693, + "##児": 3694, + "##網": 3695, + "##膜": 3696, + "##黄": 3697, + "##‒": 3698, + "##①": 3699, + "##碗": 3700, + "##刺": 3701, + "##激": 3702, + "##时": 3703, + "##无": 3704, + "##反": 3705, + "##应": 3706, + "##身": 3707, + "##呈": 3708, + "##肌": 3709, + "##阵": 3710, + "##ə": 3711, + "##道": 3712, + "##у": 3713, + "##穗": 3714, + "##金": 3715, + "##粟": 3716, + "##兰": 3717, + "##ϐ": 3718, + "##ˠ": 3719, + "##見": 3720, + "##⑥": 3721, + "##⊕": 3722, + "##仍": 3723, + "##保": 3724, + "##持": 3725, + "##眼": 3726, + "##闭": 3727, + "##胡": 3728, + "##谈": 3729, + "##𝛽": 3730, + "##藏": 3731, + "##自": 3732, + "##治": 3733, + "##区": 3734, + "##": 3735, + "##": 3736, + "##": 3737, + "##": 3738, + "##": 3739, + "##线": 3740, + "##候": 3741, + "##总": 3742, + "##着": 3743, + "##疆": 3744, + "##维": 3745, + "##吾": 3746, + "##ꜣ": 3747, + "##Π": 3748, + "##ᆯ": 3749, + "##⊣": 3750, + "##∙": 3751, + "##骗": 3752, + "##岁": 3753, + "##急": 3754, + "##ь": 3755, + "##к": 3756, + "##目": 3757, + "##大": 3758, + "##⇧": 3759, + "##◆": 3760, + "##健": 3761, + "##の": 3762, + "##専": 3763, + "##門": 3764, + "##職": 3765, + "##者": 3766, + "##同": 3767, + "##様": 3768, + "##Ŧ": 3769, + "##ᄒ": 3770, + "##ᅧ": 3771, + "##视": 3772, + "##力": 3773, + "##н": 3774, + "##ю": 3775, + "##х": 3776, + "##報": 3777, + "##𝑒": 3778, + "##イ": 3779, + "##ン": 3780, + "##コ": 3781, + "##ー": 3782, + "##ト": 3783, + "##𝑖": 3784, + "##ɨ": 3785, + "##´": 3786, + "##颠": 3787, + "##ϯ": 3788, + "##ч": 3789, + "##": 3790, + "##*": 3791, + "##": 3792, + "##▪": 3793, + "##细": 3794, + "##¡": 3795, + "##ᅟ": 3796, + "##⊥": 3797, + "##▀": 3798, + "##但": 3799, + "##睁": 3800, + "##←": 3801, + "##雪": 3802, + "##™": 3803, + "##箱": 3804, + "##房": 3805, + "##颤": 3806, + "##散": 3807, + "##☆": 3808, + "##∂": 3809, + "##梅": 3810, + "##◇": 3811, + "##ϵ": 3812, + "##⇑": 3813, + "##皮": 3814, + "##Ε": 3815, + "##〉": 3816, + "##生": 3817, + "##能": 3818, + "##Ԑ": 3819, + "##┼": 3820, + "##饺": 3821, + "##西": 3822, + "##普": 3823, + "##ห": 3824, + "##›": 3825, + "##‎": 3826, + "##": 3827, + "##ᅲ": 3828, + "##ᅢ": 3829, + "##炮": 3830, + "##叶": 3831, + "##榕": 3832, + "##ˉ": 3833, + "##定": 3834, + "##位": 3835, + "##": 3836, + "##𝐶": 3837, + "##争": 3838, + "##吵": 3839, + "##ょ": 3840, + "##拌": 3841, + "##咖": 3842, + "##啡": 3843, + "##钥": 3844, + "##匙": 3845, + "##‥": 3846, + "##筑": 3847, + "##⋆": 3848, + "##脑": 3849, + "##⁹": 3850, + "##𝑥": 3851, + "##消": 3852, + "##防": 3853, + "##员": 3854, + "##小": 3855, + "##王": 3856, + "##看": 3857, + "##星": 3858, + "##出": 3859, + "##现": 3860, + "##那": 3861, + "##瞬": 3862, + "##间": 3863, + "##▽": 3864, + "##ʌ": 3865, + "##М": 3866, + "##\u0018": 3867, + "##法": 3868, + "##由": 3869, + "##对": 3870, + "##宇": 3871, + "##宙": 3872, + "##壮": 3873, + "##惊": 3874, + "##叹": 3875, + "##已": 3876, + "##∝": 3877, + "##А": 3878, + "##性": 3879, + "##˝": 3880, + "##问": 3881, + "##": 3882, + "##": 3883, + "##": 3884, + "##菔": 3885, + "##附": 3886, + "##伯": 3887, + "##雄": 3888, + "##∘": 3889, + "##灵": 3890, + "##胶": 3891, + "##囊": 3892, + "##┤": 3893, + "##ゅ": 3894, + "##完": 3895, + "##п": 3896, + "##分": 3897, + "##間": 3898, + "##を": 3899, + "##理": 3900, + "##解": 3901, + "##す": 3902, + "##は": 3903, + "##Λ": 3904, + "##∓": 3905, + "##Ѱ": 3906, + "##∥": 3907, + "##制": 3908, + "##薑": 3909, + "##三": 3910, + "##角": 3911, + "##形": 3912, + "##怎": 3913, + "##样": 3914, + "##志": 3915, + "##″": 3916, + "##⨁": 3917, + "##ᵓ": 3918, + "##わ": 3919, + "##店": 3920, + "##多": 3921, + "##几": 3922, + "##❍": 3923, + "##飛": 3924, + "##І": 3925, + "##蝌": 3926, + "##蚪": 3927, + "##长": 3928, + "##之": 3929, + "##后": 3930, + "##变": 3931, + "##成": 3932, + "##只": 3933, + "##芋": 3934, + "##来": 3935, + "##𝑇": 3936, + "##𝑅": 3937, + "##¤": 3938, + "##☨": 3939, + "##工": 3940, + "##与": 3941, + "##社": 3942, + "##色": 3943, + "##、": 3944, + "##Ν": 3945, + "##博": 3946, + "##拉": 3947, + "##✓": 3948, + "##​": 3949, + "##纸": 3950, + "##ᛏ": 3951, + "##产": 3952, + "##洲": 3953, + "##氣": 3954, + "##營": 3955, + "##队": 3956, + "##ᅪ": 3957, + "##ᆨ": 3958, + "##ᆫ": 3959, + "##觉": 3960, + "##诱": 3961, + "##发": 3962, + "##电": 3963, + "##і": 3964, + "##ː": 3965, + "##ж": 3966, + "##仁": 3967, + "##ป": 3968, + "##ล": 3969, + "##台": 3970, + "##谢": 3971, + "##组": 3972, + "##学": 3973, + "##检": 3974, + "##查": 3975, + "##¨": 3976, + "##ǁ": 3977, + "##щ": 3978, + "##ʧ": 3979, + "##✔": 3980, + "##Υ": 3981, + "##ƙ": 3982, + "##Р": 3983, + "##斤": 3984, + "##导": 3985, + "##决": 3986, + "##策": 3987, + "##物": 3988, + "##乱": 3989, + "##用": 3990, + "##療": 3991, + "##受": 3992, + "##け": 3993, + "##国": 3994, + "##痩": 3995, + "##号": 3996, + "##¾": 3997, + "##ᵇ": 3998, + "##極": 3999, + "##ƚ": 4000, + "##": 4001, + "##⑭": 4002, + "##ˤ": 4003, + "##ʊ": 4004, + "##𝐹": 4005, + "##К": 4006, + "##基": 4007, + "##ᆺ": 4008, + "##": 4009, + "##┴": 4010, + "##₮": 4011, + "##б": 4012, + "##▫": 4013, + "##竖": 4014, + "##起": 4015, + "##拇": 4016, + "##指": 4017, + "##肢": 4018, + "##伸": 4019, + "##直": 4020, + "##◯": 4021, + "##𝑝": 4022, + "##": 4023, + "##需": 4024, + "##要": 4025, + "##努": 4026, + "##才": 4027, + "##₹": 4028, + "##蛭": 4029, + "##⩽": 4030, + "##讓": 4031, + "##從": 4032, + "##許": 4033, + "##フ": 4034, + "##˅": 4035, + "##桦": 4036, + "##": 4037, + "##𝑑": 4038, + "##科": 4039, + "##技": 4040, + "##展": 4041, + "##限": 4042, + "##公": 4043, + "##司": 4044, + "##进": 4045, + "##✩": 4046, + "##相": 4047, + "##班": 4048, + "##悠": 4049, + "##⟩": 4050, + "##。": 4051, + "##稚": 4052, + "##骨": 4053, + "##程": 4054, + "##师": 4055, + "##说": 4056, + "##这": 4057, + "##框": 4058, + "##架": 4059, + "##▴": 4060, + "##煨": 4061, + "##肉": 4062, + "##豆": 4063, + "##蔻": 4064, + "##⤉": 4065, + "##ƪ": 4066, + "##": 4067, + "##医": 4068, + "##院": 4069, + "##就": 4070, + "##诊": 4071, + "##珠": 4072, + "##ϑ": 4073, + "##ш": 4074, + "##ำ": 4075, + "##唇": 4076, + "##膏": 4077, + "##五": 4078, + "##ы": 4079, + "##毛": 4080, + "##巾": 4081, + "##ᶟ": 4082, + "##光": 4083, + "##凝": 4084, + "##术": 4085, + "##⁄": 4086, + "##∀": 4087, + "##│": 4088, + "##𝑦": 4089, + "##𝑙": 4090, + "##∇": 4091, + "##打": 4092, + "##明": 4093, + "##炭": 4094, + "##干": 4095, + "##射": 4096, + "##≡": 4097, + "##": 4098, + "##木": 4099, + "##宁": 4100, + "##病": 4101, + "##方": 4102, + "##論": 4103, + "##,": 4104, + "##∮": 4105, + "##ᶤ": 4106, + "##徒": 4107, + "##Т": 4108, + "##ˣ": 4109, + "##˃": 4110, + "##◉": 4111, + "##𝑗": 4112, + "##²": 4113, + "##思": 4114, + "##≦": 4115, + "##𝛼": 4116, + "##違": 4117, + "##シ": 4118, + "##ア": 4119, + "##黑": 4120, + "##板": 4121, + "##ʞ": 4122, + "##育": 4123, + "##抗": 4124, + "##☹": 4125, + "##ต": 4126, + "##併": 4127, + "##責": 4128, + "##任": 4129, + "##左": 4130, + "##感": 4131, + "##带": 4132, + "##ら": 4133, + "##止": 4134, + "##湯": 4135, + "##柃": 4136, + "##𝑚": 4137, + "##丹": 4138, + "##溪": 4139, + "##货": 4140, + "##ᛎ": 4141, + "##∅": 4142, + "##海": 4143, + "##市": 4144, + "##飮": 4145, + "##": 4146, + "##薈": 4147, + "##リ": 4148, + "##カ": 4149, + "##ハ": 4150, + "##や": 4151, + "##ᵈ": 4152, + "##║": 4153, + "##ɔ": 4154, + "##鞋": 4155, + "##垫": 4156, + "##セ": 4157, + "##芷": 4158, + "##连": 4159, + "##忘": 4160, + "##返": 4161, + "##參": 4162, + "##愧": 4163, + "##状": 4164, + "##軽": 4165, + "##減": 4166, + "##ɫ": 4167, + "##笔": 4168, + "##腿": 4169, + "##": 4170, + "##天": 4171, + "##芩": 4172, + "##対": 4173, + "##零": 4174, + "##度": 4175, + "##飲": 4176, + "##料": 4177, + "##康": 4178, + "##危": 4179, + "##害": 4180, + "##對": 4181, + "##個": 4182, + "##含": 4183, + "##是": 4184, + "##-": 4185, + "##÷": 4186, + "##認": 4187, + "##為": 4188, + "##м": 4189, + "##ʃ": 4190, + "##杞": 4191, + "##ɤ": 4192, + "##寒": 4193, + "##條": 4194, + "##傷": 4195, + "##神": 4196, + "##気": 4197, + "##ル": 4198, + "##╪": 4199, + "##戦": 4200, + "##⇞": 4201, + "##𝜇": 4202, + "##テ": 4203, + "##Ɛ": 4204, + "##ˈ": 4205, + "##牙": 4206, + "##草": 4207, + "##雷": 4208, + "##菌": 4209, + "##口": 4210, + "##服": 4211, + "##溶": 4212, + "##液": 4213, + "##参": 4214, + "##量": 4215, + "##等": 4216, + "##内": 4217, + "##ʔ": 4218, + "##ᅬ": 4219, + "##ᆭ": 4220, + "##◎": 4221, + "##─": 4222, + "##牡": 4223, + "##蛎": 4224, + "##ʎ": 4225, + "##⇓": 4226, + "##醒": 4227, + "##阳": 4228, + "##蜴": 4229, + "##⁑": 4230, + "##Ⅴ": 4231, + "##": 4232, + "##部": 4233, + "##校": 4234, + "##Ш": 4235, + "##肥": 4236, + "##沫": 4237, + "##欢": 4238, + "##罪": 4239, + "##ね": 4240, + "##敗": 4241, + "##落": 4242, + "##胆": 4243, + "##よ": 4244, + "##守": 4245, + "##ᅣ": 4246, + "##年": 4247, + "##葯": 4248, + "##集": 4249, + "##団": 4250, + "##☑": 4251, + "##橘": 4252, + "##": 4253, + "##〈": 4254, + "##": 4255, + "##実": 4256, + "##現": 4257, + "##誌": 4258, + "##业": 4259, + "##余": 4260, + "##爱": 4261, + "##休": 4262, + "##闲": 4263, + "##˙": 4264, + "##ѱ": 4265, + "##⁎": 4266, + "##∈": 4267, + "##ᅨ": 4268, + "##∖": 4269, + "##ᶽ": 4270, + "##咽": 4271, + "##困": 4272, + "##难": 4273, + "##ⱡ": 4274, + "##ᅯ": 4275, + "##ᆵ": 4276, + "##ま": 4277, + "##茱": 4278, + "##萸": 4279, + "##底": 4280, + "##オ": 4281, + "##レ": 4282, + "##造": 4283, + "##影": 4284, + "##℅": 4285, + "##𝜔": 4286, + "##Ɵ": 4287, + "##⋯": 4288, + "##愤": 4289, + "##怒": 4290, + "##绪": 4291, + "##牛": 4292, + "##尘": 4293, + "##": 4294, + "##✝": 4295, + "##⊢": 4296, + "##琴": 4297, + "##ใ": 4298, + "##宜": 4299, + "##膝": 4300, + "##睛": 4301, + "##侧": 4302, + "##瞳": 4303, + "##孔": 4304, + "##放": 4305, + "##固": 4306, + "##˂": 4307, + "##ʈ": 4308, + "##球": 4309, + "##善": 4310, + "##减": 4311, + "##压": 4312, + "##": 4313, + "##紊": 4314, + "##周": 4315, + "##辺": 4316, + "##ᅰ": 4317, + "##ᆲ": 4318, + "##们": 4319, + "##糟": 4320, + "##糕": 4321, + "##拭": 4322, + "##熱": 4323, + "##该": 4324, + "##楝": 4325, + "##机": 4326, + "##控": 4327, + "##⨕": 4328, + "##˩": 4329, + "##脾": 4330, + "##气": 4331, + "##跟": 4332, + "##随": 4333, + "##書": 4334, + "##极": 4335, + "##幸": 4336, + "##福": 4337, + "##決": 4338, + "##⌃": 4339, + "##つ": 4340, + "##き": 4341, + "##➢": 4342, + "##": 4343, + "##׀": 4344, + "##▯": 4345, + "##邮": 4346, + "##费": 4347, + "##変": 4348, + "##✪": 4349, + "##翹": 4350, + "##": 4351, + "##Ҩ": 4352, + "##屈": 4353, + "##曲": 4354, + "##ス": 4355, + "##均": 4356, + "##存": 4357, + "##華": 4358, + "##威": 4359, + "##兩": 4360, + "##虛": 4361, + "##件": 4362, + "##𝜃": 4363, + "##ᅫ": 4364, + "##ᆾ": 4365, + "##苁": 4366, + "##蓉": 4367, + "##段": 4368, + "##⇩": 4369, + "##戟": 4370, + "##传": 4371, + "##播": 4372, + "##记": 4373, + "##忆": 4374, + "##题": 4375, + "##ᵖ": 4376, + "##": 4377, + "##": 4378, + "##": 4379, + "##✦": 4380, + "##式": 4381, + "##<": 4382, + "##十": 4383, + "##荷": 4384, + "##刀": 4385, + "##写": 4386, + "##真": 4387, + "##:": 4388, + "##И": 4389, + "##チ": 4390, + "##正": 4391, + "##Ⓡ": 4392, + "##菜": 4393, + "##母": 4394, + "##た": 4395, + "##ĸ": 4396, + "##Ξ": 4397, + "##ク": 4398, + "##マ": 4399, + "##作": 4400, + "##容": 4401, + "##易": 4402, + "##疲": 4403, + "##倦": 4404, + "##眾": 4405, + "##討": 4406, + "##厭": 4407, + "##疗": 4408, + "##¸": 4409, + "##律": 4410, + "##桂": 4411, + "##♭": 4412, + "##姿": 4413, + "##郁": 4414, + "##夏": 4415, + "##回": 4416, + "##族": 4417, + "##♠": 4418, + "##闻": 4419, + "##联": 4420, + "##胱": 4421, + "##俞": 4422, + "##脸": 4423, + "##救": 4424, + "##¬": 4425, + "##厚": 4426, + "##樸": 4427, + "##𝐻": 4428, + "##⁸": 4429, + "##ᵡ": 4430, + "##計": 4431, + "##畫": 4432, + "##屉": 4433, + "##值": 4434, + "##腑": 4435, + "##▶": 4436, + "##П": 4437, + "##帯": 4438, + "##蓮": 4439, + "##毒": 4440, + "##家": 4441, + "##效": 4442, + "##𝛾": 4443, + "##": 4444, + "##典": 4445, + "##ɣ": 4446, + "##喜": 4447, + "##⎥": 4448, + "##其": 4449, + "##⊖": 4450, + "##ᄍ": 4451, + "##ᄆ": 4452, + "##売": 4453, + "##鼠": 4454, + "##♣": 4455, + "##浴": 4456, + "##元": 4457, + "##白": 4458, + "##话": 4459, + "##โ": 4460, + "##亞": 4461, + "##诺": 4462, + "##贝": 4463, + "##奖": 4464, + "##最": 4465, + "##栗": 4466, + "##磁": 4467, + "##炉": 4468, + "##ソ": 4469, + "##": 4470, + "##お": 4471, + "##⑮": 4472, + "##ふ": 4473, + "##": 4474, + "##⤈": 4475, + "##耽": 4476, + "##误": 4477, + "##ᶴ": 4478, + "##膽": 4479, + "##怯": 4480, + "##▵": 4481, + "##偽": 4482, + "##型": 4483, + "##肺": 4484, + "##炎": 4485, + "##遍": 4486, + "##¿": 4487, + "##岳": 4488, + "##功": 4489, + "##御": 4490, + "##遮": 4491, + "##掩": 4492, + "##𝑘": 4493, + "##共": 4494, + "##Ⅸ": 4495, + "##津": 4496, + "##ʉ": 4497, + "##國": 4498, + "##彭": 4499, + "##泰": 4500, + "##镜": 4501, + "##椿": 4502, + "##ェ": 4503, + "##メ": 4504, + "##声": 4505, + "##课": 4506, + "##本": 4507, + "##项": 4508, + "##链": 4509, + "##排": 4510, + "##斥": 4511, + "##ค": 4512, + "##刻": 4513, + "##池": 4514, + "##塘": 4515, + "##里": 4516, + "##蹲": 4517, + "##文": 4518, + "##": 4519, + "##⁰": 4520, + "##۹": 4521, + "##➍": 4522, + "##藥": 4523, + "##车": 4524, + "##₌": 4525, + "##郭": 4526, + "##月": 4527, + "##∣": 4528, + "##拳": 4529, + "##字": 4530, + "##势": 4531, + "##菖": 4532, + "##蒲": 4533, + "##些": 4534, + "##趣": 4535, + "##Ρ": 4536, + "##振": 4537, + "##获": 4538, + "##绝": 4539, + "##吃": 4540, + "##後": 4541, + "##": 4542, + "##": 4543, + "##ʺ": 4544, + "##✶": 4545, + "##土": 4546, + "##ϒ": 4547, + "##醫": 4548, + "##案": 4549, + "##封": 4550, + "##𝐷": 4551, + "##规": 4552, + "##则": 4553, + "##㎖": 4554, + "##ʤ": 4555, + "##𝐸": 4556, + "##𝐱": 4557, + "##肃": 4558, + "##根": 4559, + "##洗": 4560, + "##衣": 4561, + "##粉": 4562, + "##室": 4563, + "##G": 4564, + "##❷": 4565, + "##枯": 4566, + "##¦": 4567, + "##も": 4568, + "##⑫": 4569, + "##đ": 4570, + "##ᶧ": 4571, + "##首": 4572, + "##烏": 4573, + "##˄": 4574, + "##": 4575, + "##峰": 4576, + "##▓": 4577, + "##二": 4578, + "##纤": 4579, + "##右": 4580, + "##務": 4581, + "##竹": 4582, + "##冬": 4583, + "##叫": 4584, + "##ᶢ": 4585, + "##更": 4586, + "##转": 4587, + "##移": 4588, + "##注": 4589, + "##意": 4590, + "##塑": 4591, + "##述": 4592, + "##虫": 4593, + "##⊂": 4594, + "##朮": 4595, + "##㎣": 4596, + "##": 4597, + "##": 4598, + "##如": 4599, + "##催": 4600, + "##萄": 4601, + "##み": 4602, + "##𝑡": 4603, + "##馒": 4604, + "##头": 4605, + "##พ": 4606, + "##₀": 4607, + "##蒜": 4608, + "##ᄃ": 4609, + "##籽": 4610, + "##野": 4611, + "##桐": 4612, + "##使": 4613, + "##络": 4614, + "##它": 4615, + "##创": 4616, + "##旺": 4617, + "##侣": 4618, + "##∩": 4619, + "##芎": 4620, + "##題": 4621, + "##引": 4622, + "##陽": 4623, + "##動": 4624, + "##態": 4625, + "##除": 4626, + "##外": 4627, + "##他": 4628, + "##原": 4629, + "##杯": 4630, + "##朝": 4631, + "##": 4632, + "##油": 4633, + "##门": 4634, + "##按": 4635, + "##照": 4636, + "##嘱": 4637, + "##れ": 4638, + "##㎍": 4639, + "##": 4640, + "##欠": 4641, + "##☐": 4642, + "##緑": 4643, + "##脂": 4644, + "##嚢": 4645, + "##管": 4646, + "##己": 4647, + "##路": 4648, + "##❖": 4649, + "##⬇": 4650, + "##ө": 4651, + "##寄": 4652, + "##丝": 4653, + "##锥": 4654, + "##轨": 4655, + "##處": 4656, + "##狀": 4657, + "##ф": 4658, + "##↕": 4659, + "##Κ": 4660, + "##窗": 4661, + "##帘": 4662, + "##芹": 4663, + "##⌘": 4664, + "##背": 4665, + "##书": 4666, + "##棗": 4667, + "##風": 4668, + "##": 4669, + "##ʷ": 4670, + "##學": 4671, + "##柱": 4672, + "##妈": 4673, + "##錄": 4674, + "##点": 4675, + "##𝐦": 4676, + "##紙": 4677, + "##助": 4678, + "##₊": 4679, + "##✳": 4680, + "##ŋ": 4681, + "##階": 4682, + "##適": 4683, + "##交": 4684, + "##苏": 4685, + "##华": 4686, + "##企": 4687, + "##纹": 4688, + "##ち": 4689, + "##把": 4690, + "##弄": 4691, + "##泻": 4692, + "##螵": 4693, + "##蛸": 4694, + "##": 4695, + "##论": 4696, + "##¯": 4697, + "##𝑜": 4698, + "##©": 4699, + "##ϭ": 4700, + "##蒙": 4701, + "##古": 4702, + "##ヒ": 4703, + "##林": 4704, + "##户": 4705, + "##ϱ": 4706, + "##拖": 4707, + "##肝": 4708, + "##宝": 4709, + "##仲": 4710, + "##Œ": 4711, + "##✘": 4712, + "##Ɯ": 4713, + "##≅": 4714, + "##凰": 4715, + "##": 4716, + "##呆": 4717, + "##你": 4718, + "##预": 4719, + "##期": 4720, + "##富": 4721, + "##商": 4722, + "##李": 4723, + "##楠": 4724, + "##": 4725, + "##徽": 4726, + "##㎠": 4727, + "##": 4728, + "##米": 4729, + "##◘": 4730, + "##浆": 4731, + "##發": 4732, + "##静": 4733, + "##糖": 4734, + "##品": 4735, + "##逃": 4736, + "##避": 4737, + "##实": 4738, + "##Ө": 4739, + "##貞": 4740, + "##酸": 4741, + "##枣": 4742, + "##扰": 4743, + "##呵": 4744, + "##誉": 4745, + "##₤": 4746, + "##ɾ": 4747, + "##精": 4748, + "##Ⅳ": 4749, + "##场": 4750, + "##研": 4751, + "##究": 4752, + "##樱": 4753, + "##桃": 4754, + "##𝜅": 4755, + "##断": 4756, + "##免": 4757, + "##孤": 4758, + "##独": 4759, + "##再": 4760, + "##耐": 4761, + "##北": 4762, + "##甘": 4763, + "##そ": 4764, + "##辛": 4765, + "##∏": 4766, + "##苓": 4767, + "##►": 4768, + "##媒": 4769, + "##率": 4770, + "##": 4771, + "##考": 4772, + "##透": 4773, + "##г": 4774, + "##ц": 4775, + "##査": 4776, + "##ͻ": 4777, + "##卫": 4778, + "##材": 4779, + "##興": 4780, + "##𝑠": 4781, + "##伐": 4782, + "##帜": 4783, + "##差": 4784, + "##析": 4785, + "##✗": 4786, + "##﹡": 4787, + "##𝜆": 4788, + "##戈": 4789, + "##": 4790, + "##": 4791, + "##察": 4792, + "##ʾ": 4793, + "##吓": 4794, + "##劲": 4795, + "##当": 4796, + "##选": 4797, + "##劳": 4798, + "##模": 4799, + "##牌": 4800, + "##っ": 4801, + "##𝑈": 4802, + "##へ": 4803, + "##第": 4804, + "##尊": 4805, + "##重": 4806, + "##⋕": 4807, + "##腹": 4808, + "##師": 4809, + "##陜": 4810, + "##∪": 4811, + "##死": 4812, + "##𝑂": 4813, + "##染": 4814, + "##疾": 4815, + "##及": 4816, + "##眨": 4817, + "##日": 4818, + "##⌠": 4819, + "##サ": 4820, + "##隨": 4821, + "##筆": 4822, + "##ᄏ": 4823, + "##╦": 4824, + "##励": 4825, + "##莹": 4826, + "##般": 4827, + "##屑": 4828, + "##约": 4829, + "##卜": 4830, + "##ナ": 4831, + "##硝": 4832, + "##入": 4833, + "##ラ": 4834, + "##腎": 4835, + "##芪": 4836, + "##ϴ": 4837, + "##待": 4838, + "##围": 4839, + "##抱": 4840, + "##怨": 4841, + "##您": 4842, + "##复": 4843, + "##𝟎": 4844, + "##𝟏": 4845, + "##名": 4846, + "##妙": 4847, + "##序": 4848, + "##列": 4849, + "##無": 4850, + "##﹟": 4851, + "##": 4852, + "##住": 4853, + "##髓": 4854, + "##袜": 4855, + "##音": 4856, + "##波": 4857, + "##検": 4858, + "##\u0003": 4859, + "##𝑏": 4860, + "##苈": 4861, + "##灾": 4862, + "##楂": 4863, + "##ԑ": 4864, + "##掉": 4865, + "##姜": 4866, + "##ȹ": 4867, + "##味": 4868, + "##亮": 4869, + "##點": 4870, + "##め": 4871, + "##ほ": 4872, + "##蚣": 4873, + "##": 4874, + "##居": 4875, + "##然": 4876, + "##都": 4877, + "##贵": 4878, + "##Х": 4879, + "##嗽": 4880, + "##立": 4881, + "##Ζ": 4882, + "##⎦": 4883, + "##焼": 4884, + "##取": 4885, + "##組": 4886, + "##む": 4887, + "##誰": 4888, + "##孢": 4889, + "##挂": 4890, + "##➞": 4891, + "##璃": 4892, + "##腔": 4893, + "##絲": 4894, + "##银": 4895, + "##柴": 4896, + "##厌": 4897, + "##报": 4898, + "##数": 4899, + "##𝑓": 4900, + "##⁡": 4901, + "##盖": 4902, + "##虑": 4903, + "##☼": 4904, + "##‹": 4905, + "##辯": 4906, + "##少": 4907, + "##言": 4908, + "##Đ": 4909, + "##艘": 4910, + "##儿": 4911, + "##員": 4912, + "##何": 4913, + "##󸀠": 4914, + "##炒": 4915, + "##ケ": 4916, + "##算": 4917, + "##』": 4918, + "##领": 4919, + "##﹪": 4920, + "##济": 4921, + "##民": 4922, + "##扶": 4923, + "##伤": 4924, + "##陰": 4925, + "##河": 4926, + "##車": 4927, + "##ᵐ": 4928, + "##髎": 4929, + "##☥": 4930, + "##晃": 4931, + "##汁": 4932, + "##供": 4933, + "##ᵷ": 4934, + "##℃": 4935, + "##倒": 4936, + "##树": 4937, + "##": 4938, + "##望": 4939, + "##贴": 4940, + "##代": 4941, + "##流": 4942, + "##㎕": 4943, + "##收": 4944, + "##啤": 4945, + "##酒": 4946, + "##逐": 4947, + "##瘀": 4948, + "##汤": 4949, + "##℗": 4950, + "##ʏ": 4951, + "##➤": 4952, + "##关": 4953, + "##": 4954, + "##旦": 4955, + "##烟": 4956, + "##云": 4957, + "##Ѕ": 4958, + "##块": 4959, + "##⒅": 4960, + "##ろ": 4961, + "##见": 4962, + "##": 4963, + "##": 4964, + "##": 4965, + "##": 4966, + "##暇": 4967, + "##楽": 4968, + "##閃": 4969, + "##ᇂ": 4970, + "##𝑎": 4971, + "##業": 4972, + "##提": 4973, + "##臀": 4974, + "##利": 4975, + "##腾": 4976, + "##⊛": 4977, + "##闷": 4978, + "##Ұ": 4979, + "##†": 4980, + "##談": 4981, + "##香": 4982, + "##皂": 4983, + "##☞": 4984, + "##编": 4985, + "##畏": 4986, + "##懼": 4987, + "##芸": 4988, + "##ʠ": 4989, + "##票": 4990, + "##→": 4991, + "##ュ": 4992, + "##қ": 4993, + "##↘": 4994, + "##㎡": 4995, + "##ʵ": 4996, + "##執": 4997, + "##否": 4998, + "##♋": 4999, + "##├": 5000, + "##躍": 5001, + "##⎣": 5002, + "##源": 5003, + "##蟹": 5004, + "##寶": 5005, + "##斗": 5006, + "##歡": 5007, + "##長": 5008, + "##僚": 5009, + "##尝": 5010, + "##试": 5011, + "##隐": 5012, + "##瞒": 5013, + "##际": 5014, + "##筝": 5015, + "##孚": 5016, + "##恼": 5017, + "##责": 5018, + "##足": 5019, + "##找": 5020, + "##梗": 5021, + "##稿": 5022, + "##盔": 5023, + "##≨": 5024, + "##↗": 5025, + "##航": 5026, + "##蜢": 5027, + "##石": 5028, + "##松": 5029, + "##ז": 5030, + "##Л": 5031, + "##せ": 5032, + "##泳": 5033, + "##残": 5034, + "##却": 5035, + "##败": 5036, + "##告": 5037, + "##烛": 5038, + "##闸": 5039, + "##準": 5040, + "##備": 5041, + "##兪": 5042, + "##菍": 5043, + "##▬": 5044, + "##⑬": 5045, + "##验": 5046, + "##乐": 5047, + "##歸": 5048, + "##鬚": 5049, + "##君": 5050, + "##寿": 5051, + "##堂": 5052, + "##计": 5053, + "##ₓ": 5054, + "##屋": 5055, + "##涤": 5056, + "##氏": 5057, + "##训": 5058, + "##希": 5059, + "##調": 5060, + "##整": 5061, + "##榴": 5062, + "##項": 5063, + "##劝": 5064, + "##朋": 5065, + "##友": 5066, + "##郊": 5067, + "##游": 5068, + "##♥": 5069, + "##床": 5070, + "##✵": 5071, + "##\u0007": 5072, + "##耆": 5073, + "##裹": 5074, + "##氓": 5075, + "##⊿": 5076, + "##红": 5077, + "##州": 5078, + "##◽": 5079, + "##泉": 5080, + "##╤": 5081, + "##益": 5082, + "##节": 5083, + "##ᵉ": 5084, + "##次": 5085, + "##≒": 5086, + "##‾": 5087, + "##℮": 5088, + "##": 5089, + "##聞": 5090, + "##像": 5091, + "##榔": 5092, + "##": 5093, + "##": 5094, + "##景": 5095, + "##㎝": 5096, + "##๖": 5097, + "##∴": 5098, + "##器": 5099, + "##術": 5100, + "##負": 5101, + "##˛": 5102, + "##ロ": 5103, + "##符": 5104, + "##座": 5105, + "##╬": 5106, + "##抑": 5107, + "##悟": 5108, + "##过": 5109, + "##%": 5110, + "##鸡": 5111, + "##蛋": 5112, + "##": 5113, + "##团": 5114, + "##欧": 5115, + "##ᴥ": 5116, + "##圾": 5117, + "##腸": 5118, + "##ˑ": 5119, + "##朴": 5120, + "##钟": 5121, + "##ɳ": 5122, + "##ᇁ": 5123, + "##停": 5124, + "##泊": 5125, + "##❶": 5126, + "##乳": 5127, + "##癌": 5128, + "##Ɣ": 5129, + "##早": 5130, + "##順": 5131, + "##沿": 5132, + "##荽": 5133, + "##颜": 5134, + "##笑": 5135, + "##ᶠ": 5136, + "##◻": 5137, + "##㎶": 5138, + "##権": 5139, + "##縄": 5140, + "##ℎ": 5141, + "##𝑀": 5142, + "##姫": 5143, + "##": 5144, + "##垃": 5145, + "##٭": 5146, + "##ⓞ": 5147, + "##ᵑ": 5148, + "##菊": 5149, + "##甙": 5150, + "##終": 5151, + "##恍": 5152, + "##綱": 5153, + "##∕": 5154, + "##确": 5155, + "##匹": 5156, + "##配": 5157, + "##Ʒ": 5158, + "##芍": 5159, + "##ᴬ": 5160, + "##ᴮ": 5161, + "##庆": 5162, + "##调": 5163, + "##邈": 5164, + "##追": 5165, + "##求": 5166, + "##切": 5167, + "##𝑌": 5168, + "##建": 5169, + "##奈": 5170, + "##𝜏": 5171, + "##毆": 5172, + "##茶": 5173, + "##∽": 5174, + "##袖": 5175, + "##於": 5176, + "##逆": 5177, + "##転": 5178, + "##ʘ": 5179, + "##版": 5180, + "##語": 5181, + "##尺": 5182, + "##𝜓": 5183, + "##記": 5184, + "##録": 5185, + "##充": 5186, + "##Ł": 5187, + "##ョ": 5188, + "##標": 5189, + "##΄": 5190, + "##𝑤": 5191, + "##𝑟": 5192, + "##盘": 5193, + "##樟": 5194, + "##≏": 5195, + "##京": 5196, + "##局": 5197, + "##将": 5198, + "##临": 5199, + "##恐": 5200, + "##惧": 5201, + "##岌": 5202, + "##₦": 5203, + "##雙": 5204, + "##ผ": 5205, + "##铐": 5206, + "##鐸": 5207, + "##增": 5208, + "##󳰀": 5209, + "##⊙": 5210, + "##震": 5211, + "##帽": 5212, + "##尚": 5213, + "##ᵘ": 5214, + "##深": 5215, + "##応": 5216, + "##群": 5217, + "##厂": 5218, + "##ッ": 5219, + "##唤": 5220, + "##舎": 5221, + "##沌": 5222, + "##捕": 5223, + "##食": 5224, + "##昆": 5225, + "##筋": 5226, + "##ᶬ": 5227, + "##Я": 5228, + "##蕉": 5229, + "##ʁ": 5230, + "##ぬ": 5231, + "##铅": 5232, + "##并": 5233, + "##‱": 5234, + "##従": 5235, + "##": 5236, + "##": 5237, + "##频": 5238, + "##械": 5239, + "##內": 5240, + "##": 5241, + "##⚝": 5242, + "##ᄁ": 5243, + "##ᄈ": 5244, + "##忽": 5245, + "##略": 5246, + "##务": 5247, + "##宅": 5248, + "##且": 5249, + "##視": 5250, + "##醇": 5251, + "##剩": 5252, + "##義": 5253, + "##茅": 5254, + "##虚": 5255, + "##此": 5256, + "##剂": 5257, + "##超": 5258, + "##】": 5259, + "##赢": 5260, + "##份": 5261, + "##跳": 5262, + "##絡": 5263, + "##描": 5264, + "##贞": 5265, + "##萝": 5266, + "##蜜": 5267, + "##莪": 5268, + "##ℵ": 5269, + "##戻": 5270, + "##百": 5271, + "##阻": 5272, + "##塞": 5273, + "##赭": 5274, + "##㎗": 5275, + "##臣": 5276, + "##≃": 5277, + "##衍": 5278, + "##知": 5279, + "##◖": 5280, + "##": 5281, + "##坚": 5282, + "##砂": 5283, + "##瓜": 5284, + "##⎪": 5285, + "##歴": 5286, + "##史": 5287, + "##刷": 5288, + "##จ": 5289, + "##ニ": 5290, + "##ƥ": 5291, + "##够": 5292, + "##値": 5293, + "##卑": 5294, + "##❸": 5295, + "##宏": 5296, + "##タ": 5297, + "##ホ": 5298, + "##ミ": 5299, + "##♮": 5300, + "##什": 5301, + "##从": 5302, + "##ℊ": 5303, + "##索": 5304, + "##担": 5305, + "##忧": 5306, + "##蛙": 5307, + "##筷": 5308, + "##蔵": 5309, + "##庫": 5310, + "##斛": 5311, + "##颗": 5312, + "##粒": 5313, + "##來": 5314, + "##蘇": 5315, + "##档": 5316, + "##肱": 5317, + "##ℳ": 5318, + "##满": 5319, + "##": 5320, + "##ゆ": 5321, + "##┃": 5322, + "##朗": 5323, + "##羊": 5324, + "##藿": 5325, + "##機": 5326, + "##腥": 5327, + "##昇": 5328, + "##四": 5329, + "##☺": 5330, + "##覚": 5331, + "##誘": 5332, + "##発": 5333, + "##边": 5334, + "##向": 5335, + "##客": 5336, + "##ʰ": 5337, + "##扣": 5338, + "##川": 5339, + "##": 5340, + "##离": 5341, + "##煤": 5342, + "##加": 5343, + "##▷": 5344, + "##Џ": 5345, + "##荧": 5346, + "##漠": 5347, + "##咒": 5348, + "##曹": 5349, + "##柿": 5350, + "##杰": 5351, + "##戳": 5352, + "##汉": 5353, + "##协": 5354, + "##\u0001": 5355, + "##表": 5356, + "##插": 5357, + "##庙": 5358, + "##键": 5359, + "##词": 5360, + "##➝": 5361, + "##娜": 5362 + } + } +} \ No newline at end of file diff --git a/unitable/vocab/vocab_html.json b/unitable/vocab/vocab_html.json new file mode 100644 index 0000000000000000000000000000000000000000..c107e946260984cffb2ced31bfa1d992a24eb2ae --- /dev/null +++ b/unitable/vocab/vocab_html.json @@ -0,0 +1,640 @@ +{ + "version": "1.0", + "truncation": null, + "padding": { + "strategy": "BatchLongest", + "direction": "Right", + "pad_to_multiple_of": null, + "pad_id": 2, + "pad_type_id": 0, + "pad_token": "" + }, + "added_tokens": [ + { + "id": 0, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 1, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 2, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 3, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 4, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 5, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 6, + "content": "[table]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 7, + "content": "[html]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 8, + "content": "[cell]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 9, + "content": "[bbox]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 10, + "content": "[cell+bbox]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 11, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 12, + "content": "[]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 13, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 15, + "content": ">[]", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 16, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 17, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 18, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 19, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 20, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 21, + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 22, + "content": " rowspan=\"2\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 23, + "content": " rowspan=\"3\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 24, + "content": " rowspan=\"4\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 25, + "content": " rowspan=\"5\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 26, + "content": " rowspan=\"6\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 27, + "content": " rowspan=\"7\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 28, + "content": " rowspan=\"8\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 29, + "content": " rowspan=\"9\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 30, + "content": " rowspan=\"10\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 31, + "content": " rowspan=\"11\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 32, + "content": " rowspan=\"12\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 33, + "content": " rowspan=\"13\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 34, + "content": " rowspan=\"14\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 35, + "content": " rowspan=\"15\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 36, + "content": " rowspan=\"16\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 37, + "content": " rowspan=\"17\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 38, + "content": " rowspan=\"18\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 39, + "content": " rowspan=\"19\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 40, + "content": " colspan=\"2\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 41, + "content": " colspan=\"3\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 42, + "content": " colspan=\"4\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 43, + "content": " colspan=\"5\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 44, + "content": " colspan=\"6\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 45, + "content": " colspan=\"7\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 46, + "content": " colspan=\"8\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 47, + "content": " colspan=\"9\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 48, + "content": " colspan=\"10\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 49, + "content": " colspan=\"11\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 50, + "content": " colspan=\"12\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 51, + "content": " colspan=\"13\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 52, + "content": " colspan=\"14\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 53, + "content": " colspan=\"15\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 54, + "content": " colspan=\"16\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 55, + "content": " colspan=\"17\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 56, + "content": " colspan=\"18\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 57, + "content": " colspan=\"19\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + { + "id": 58, + "content": " colspan=\"25\"", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + } + ], + "normalizer": { + "type": "Sequence", + "normalizers": [ + { + "type": "NFD" + }, + { + "type": "Lowercase" + }, + { + "type": "StripAccents" + }, + { + "type": "Strip", + "strip_left": true, + "strip_right": true + } + ] + }, + "pre_tokenizer": { + "type": "Whitespace" + }, + "post_processor": null, + "decoder": { + "type": "WordPiece", + "prefix": "##", + "cleanup": true + }, + "model": { + "type": "WordPiece", + "unk_token": "", + "continuing_subword_prefix": "##", + "max_input_chars_per_word": 100, + "vocab": { + "": 0, + "": 1, + "": 2, + "": 3, + "": 4, + "": 5, + "[table]": 6, + "[html]": 7, + "[cell]": 8, + "[bbox]": 9, + "[cell+bbox]": 10, + "": 11, + "[]": 12, + "": 14, + ">[]": 15, + "": 16, + "": 17, + "": 18, + "": 19, + "": 20, + "": 21, + " rowspan=\"2\"": 22, + " rowspan=\"3\"": 23, + " rowspan=\"4\"": 24, + " rowspan=\"5\"": 25, + " rowspan=\"6\"": 26, + " rowspan=\"7\"": 27, + " rowspan=\"8\"": 28, + " rowspan=\"9\"": 29, + " rowspan=\"10\"": 30, + " rowspan=\"11\"": 31, + " rowspan=\"12\"": 32, + " rowspan=\"13\"": 33, + " rowspan=\"14\"": 34, + " rowspan=\"15\"": 35, + " rowspan=\"16\"": 36, + " rowspan=\"17\"": 37, + " rowspan=\"18\"": 38, + " rowspan=\"19\"": 39, + " colspan=\"2\"": 40, + " colspan=\"3\"": 41, + " colspan=\"4\"": 42, + " colspan=\"5\"": 43, + " colspan=\"6\"": 44, + " colspan=\"7\"": 45, + " colspan=\"8\"": 46, + " colspan=\"9\"": 47, + " colspan=\"10\"": 48, + " colspan=\"11\"": 49, + " colspan=\"12\"": 50, + " colspan=\"13\"": 51, + " colspan=\"14\"": 52, + " colspan=\"15\"": 53, + " colspan=\"16\"": 54, + " colspan=\"17\"": 55, + " colspan=\"18\"": 56, + " colspan=\"19\"": 57, + " colspan=\"25\"": 58 + } + } +} \ No newline at end of file diff --git a/unitable/website/unitable-demo.gif b/unitable/website/unitable-demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2cd043f465363d177c5c76327398bc5a49f638f --- /dev/null +++ b/unitable/website/unitable-demo.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c9c54e876fd3dae24df51d69937bab1916bc3b8d3f89b2c2531dbf8a0586cb4 +size 5219577 diff --git a/unitable/website/unitable-demo.mp4 b/unitable/website/unitable-demo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..10e0527569b071887ff7408825def512ec4f895d --- /dev/null +++ b/unitable/website/unitable-demo.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:229c8b0ed13b1f40f442d0f1e10db620d54cd0028e1364cca118b99ea0e1aaae +size 14337695 diff --git a/unitable/website/wandb_screenshot.png b/unitable/website/wandb_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9174d5426b14fe791231faccf94e7e267f8093c8 --- /dev/null +++ b/unitable/website/wandb_screenshot.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9a67622be780272632d80437e810c0d7ca9bf23503da29fc3821b7724782df4 +size 2038109 diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d8e4a79e03839f0c598fc0054253b7d7486dd1da --- /dev/null +++ b/utils/__init__.py @@ -0,0 +1,24 @@ + + +from .cropping_boxes_to_images import get_rotate_crop_image ,cropImages,cropImageExtraMargin,crop_an_Image,get_new_coord +from .viz import draw_box, draw_only_box, draw_box_with_text, get_color_map_list +from .annotation import LineAnnotation,WordAnnotation,Annotation +from .logger import getlogger +from .preprocessing import denoisingAndSharpening +from .sorting import group_words_into_lines + +__all__ = [ "cropImageExtraMargin", + "getlogger", + "Annotation", + "LineAnnotation", + "WordAnnotation", + "get_rotate_crop_image", + "cropImages", + "draw_box", + "draw_only_box", + "draw_box_with_text", + "get_color_map_list", + "crop_an_Image", + "get_new_coord", + "group_words_into_lines"] + diff --git a/utils/annotation.py b/utils/annotation.py new file mode 100644 index 0000000000000000000000000000000000000000..df39ddfd375c2ceff1747bb019e2d7592dc9fce2 --- /dev/null +++ b/utils/annotation.py @@ -0,0 +1,51 @@ +from typing import Optional, List +import uuid +from abc import ABC, abstractmethod + +class Annotation(ABC): + box: Optional[List[float]] = None + index: uuid.UUID = None + + def __init__(self, box: Optional[List[float]] = None): + self.box = box + self.index = uuid.uuid4() + +class WordAnnotation(Annotation): + + # Class attributes since all classes should have it + box:Optional[List[float]] =None, + score:Optional[float]=None, + text:str = None, + index: uuid.UUID =None + + def __init__(self, + box:Optional[List[float]], + text:str=None): + self.box =box if box is not None else None + self.text = text if text is not None else None + self.index = uuid.uuid4() + +class LineAnnotation(Annotation): + """ + Detection results of all OCR Components + `pdf_id` : id or name of pdf so that it can be get from database + `page`: pdf page number + `box`: [xmin, ymin, xmax, ymax] + + `index`: same as index for bounding boxes, just the results is wrapped around in this class + `score`: prediction score + `line` : Parent line + `text`: text string. + """ + # Class attributes since all classes should have it + box:Optional[List[float]] =None, + words:Optional[List[WordAnnotation]] =None, + index: uuid.UUID =None + + def __init__(self, + box:Optional[List[float]], + words:List[WordAnnotation]=None): + self.box = box if box is not None else None + self.words = words if words is not None else [] + self.index = uuid.uuid4() + diff --git a/utils/cropping_boxes_to_images.py b/utils/cropping_boxes_to_images.py new file mode 100644 index 0000000000000000000000000000000000000000..0eaeca9535442a05aed93d948da6c66c17b6c314 --- /dev/null +++ b/utils/cropping_boxes_to_images.py @@ -0,0 +1,221 @@ +import numpy as np +from typing import List +from PIL import Image +import cv2 +import numpy.typing as npt +from numpy import uint8 +ImageType = npt.NDArray[uint8] +from numpy.typing import NDArray + +# not used actually +def get_rotate_crop_image(img: ImageType, points:NDArray[np.float32])-> ImageType: + + """ + Points should be ordered in this order :left_lower, right_lower, right_upper, left_upper + each point has 2 coordinate + So entire thing is np array of size 4 times 2 with float32 numbers + takes an image and a set of four points defining a quadrilateral region within the image. + It extracts and crops this region, corrects its orientation using a perspective transform, + and rotates it if necessary. + """ + + assert len(points) == 4 + # Check the shape and dtype of points + assert points.shape == (4, 2), f"Points array must be of shape (4, 2), but got {points.shape}" + assert points.dtype == np.float32, f"Points array must be of dtype float32, but got {points.dtype}" + + # Calculating Crop Dimensions + img_crop_width = int( + max( + np.linalg.norm(points[0] - points[1]), + np.linalg.norm(points[2] - points[3]))) + img_crop_height = int( + max( + np.linalg.norm(points[0] - points[3]), + np.linalg.norm(points[1] - points[2]))) + + + #A set of standard points pts_std is defined to represent the corners of the cropped image in a straightened, upright rectangle. + pts_std = np.float32([[0, 0], [img_crop_width, 0], + [img_crop_width, img_crop_height], + [0, img_crop_height]]) + # perspective transformation matrix M that maps the four points to the standard rectangle. + M = cv2.getPerspectiveTransform(points, pts_std) + #applies the perspective transformation to the image, using the transformation matrix M + dst_img = cv2.warpPerspective( + img, + M, (img_crop_width, img_crop_height), + borderMode=cv2.BORDER_REPLICATE, + flags=cv2.INTER_CUBIC) + dst_img_height, dst_img_width = dst_img.shape[0:2] + + if dst_img_height * 1.0 / dst_img_width >= 1.5: + #rotating counter clock wise + dst_img = np.rot90(dst_img) + #correct would be k=3 + #st_img = np.rot90(dst_img,k=3) + + return dst_img + + +def get_crop_image(img: ImageType, points:NDArray[np.float32],straight=False)-> ImageType: + + """ + Points should be ordered in this order :left_lower, right_lower, right_upper, left_upper + each point has 2 coordinate + So entire thing is np array of size 4 times 2 with float32 numbers + takes an image and a set of four points defining a quadrilateral region within the image. + It extracts and crops this region. No perspective transformation is applied + """ + + assert len(points) == 4 # xmin, ymin, xmax, ymax + # Check the shape and dtype of points + assert points.shape == (4, 2), f"Points array must be of shape (4, 2), but got {points.shape}" + assert points.dtype == np.float32, f"Points array must be of dtype float32, but got {points.dtype}" + + if not straight : + img_crop_width = int( + max( + np.linalg.norm(points[0] - points[1]), + np.linalg.norm(points[2] - points[3]))) + img_crop_height = int( + max( + np.linalg.norm(points[0] - points[3]), + np.linalg.norm(points[1] - points[2]))) + # bottom left corner + xmin = int(points[0][0]) + ymin = int(points[0][1]) + + # Ensure the crop area is within the bounds of the image + xmax = min(xmin + img_crop_width, img.shape[1]) + ymax = min(ymin + img_crop_height, img.shape[0]) + else: + xmin = int(points[0][0]) + ymin = int(points[0][1]) + xmax = int(points[2][0]) + ymax = int(points[2][1]) + + # Crop the image + dst_img = img[ymin:ymax, xmin:xmax] + + + return dst_img + + + +def cropImages(bxs:List[NDArray[np.float32]], img:Image.Image,straight=False) -> List[ImageType] : + images_to_recognizer = [] + for bnum in range(len(bxs)): + left_lower, right_lower, right_upper, left_upper = bxs[bnum] + box = np.array([left_lower, right_lower, right_upper, left_upper ]) + cropped_img = get_crop_image(np.array(img), box, straight) + images_to_recognizer.append(cropped_img) + # return list of np arrays + return images_to_recognizer + +def crop_an_Image(box:NDArray[np.float32], img:Image.Image) -> ImageType : + #box should be 4x2 array + left_lower, right_lower, right_upper, left_upper = box + b = np.array([left_lower, right_lower, right_upper, left_upper ]) + cropped_img = get_crop_image(np.array(img), b) + return cropped_img + +def get_new_coord(maxx:int,maxy:int,points:NDArray[np.float32]) -> list[int]: + #points = 4x2 array + img_crop_width = int( + max( + np.linalg.norm(points[0] - points[1]), + np.linalg.norm(points[2] - points[3]))) + img_crop_height = int( + max( + np.linalg.norm(points[0] - points[3]), + np.linalg.norm(points[1] - points[2]))) + # bottom left corner + bottom_left_x = int(points[0][0]) + bottom_left_y = int(points[0][1]) + + # Ensure the crop area is within the bounds of the image + top_right_x = min(bottom_left_x + img_crop_width, maxx) + top_right_y = min(bottom_left_y + img_crop_height, maxy) + + # Crop the image + # 4x1 array of xmin, ymin, xmax, ymax + return [bottom_left_x, bottom_left_y, top_right_x, top_right_y] + +MARGIN_FACTOR = 1.4 +def get_crop_image_with_extra_margin(img: ImageType, points:NDArray[np.float32],straight=False, marginfactor = MARGIN_FACTOR)-> ImageType: + + """ + Points should be ordered in this order :left_lower, right_lower, right_upper, left_upper + each point has 2 coordinate + So entire thing is np array of size 4 times 2 with float32 numbers + takes an image and a set of four points defining a quadrilateral region within the image. + It extracts and crops this region, corrects its orientation using a perspective transform, + and rotates it if necessary. + """ + + + assert len(points) == 4 + # Calculating Crop Dimensions + if not straight : + img_crop_width = int( + max( + np.linalg.norm(points[0] - points[1]), + np.linalg.norm(points[2] - points[3]))) + img_crop_height = int( + max( + np.linalg.norm(points[0] - points[3]), + np.linalg.norm(points[1] - points[2]))) + # bottom left corner + xmin = int(points[0][0]) + ymin = int(points[0][1]) + + # Ensure the crop area is within the bounds of the image + xmax = min(xmin + img_crop_width, img.shape[1]) + ymax = min(ymin + img_crop_height, img.shape[0]) + else: + xmin = int(points[0][0]) + ymin = int(points[0][1]) + xmax = int(points[2][0]) + ymax = int(points[2][1]) + #print("points are "+str(points)) + #print("xmin, ymin, xmax,ymax are "+ str(xmin)+" "+ str(ymin)+" "+ str(xmax)+" "+str(ymax)) + # Crop the image + dst_img = img[ymin:ymax, xmin:xmax] + + #print(dst_img.shape[:2]) + height, width = dst_img.shape[:2] + + if width/height<1.6: + bigger = max(height,width) + new_height = int(bigger *3) + new_width = int(bigger*3) + else: + bigger = max(height,width) + new_height = int(bigger *MARGIN_FACTOR) + new_width = int(bigger*MARGIN_FACTOR) + + # Create a new image with a white background + new_img = np.full((new_height, new_width, 3), fill_value=255, dtype=np.uint8) # RGB white background + # Calculate the position to center the image on the new white background + y_offset = (new_height - height) // 2 + x_offset = (new_width - width) // 2 + #print("offsets are " + str(x_offset)+" " +str(y_offset)) + + # Place the warped image on the new white background + new_img[y_offset:y_offset + height, x_offset:x_offset+width] = dst_img + + return new_img + + +def cropImageExtraMargin(bxs:List[NDArray[np.float32]], img:Image.Image,straight=False, margin = MARGIN_FACTOR ) -> List[ImageType] : + images_to_recognizer = [] + for bnum in range(len(bxs)): + left_lower, right_lower, right_upper, left_upper = bxs[bnum] + box = np.array([left_lower, right_lower, right_upper, left_upper ]) + #print("newbox is") + #print(box) + cropped_img = get_crop_image_with_extra_margin(np.array(img), box,straight,margin) + images_to_recognizer.append(cropped_img) + # return list of np arrays + return images_to_recognizer \ No newline at end of file diff --git a/utils/logger.py b/utils/logger.py new file mode 100644 index 0000000000000000000000000000000000000000..4a9d2b7b8044e64dff0d15c1ca6fd87d01431119 --- /dev/null +++ b/utils/logger.py @@ -0,0 +1,22 @@ + +import logging + +def getlogger(name:str): + # create logger + logger = logging.getLogger(name) + logger.setLevel(logging.DEBUG) + + # create console handler and set level to debug + ch = logging.StreamHandler() + ch.setLevel(logging.DEBUG) + + # create formatter + #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + + # add formatter to ch + #ch.setFormatter(formatter) + + # add ch to logger + logger.propagate = False + logger.addHandler(ch) + return logger diff --git a/utils/preprocessing.py b/utils/preprocessing.py new file mode 100644 index 0000000000000000000000000000000000000000..37459d879333dfe0844056844ee805760a9b9d90 --- /dev/null +++ b/utils/preprocessing.py @@ -0,0 +1,36 @@ +import numpy.typing as npt +from numpy import uint8 +import numpy as np +ImageType = npt.NDArray[uint8] +from typing import Tuple, List, Sequence, Optional, Union +import cv2 +from PIL import Image +from PIL import ImageEnhance + +def denoisingAndSharpening(images:List[ImageType]): + + new_images = [] + for img in images: + # Apply fastNlMeansDenoisingColored + # Parameters: + # - img: The input 8-bit 3-channel image. + # - None: The output image (in-place if None is passed). + # - h: Parameter regulating filter strength for luminance component. Higher h value removes noise better but also removes image details (10 is a good default value). + # - hForColorComponents: The same as h but for color images only. For most images, 10 will be a good value. + # - templateWindowSize: Size in pixels of the template patch that is used to compute weights. Should be odd. Recommended value is 7. + # - searchWindowSize: Size in pixels of the window that is used to compute a weighted average for the given pixel. Should be odd. Recommended value is 21. + h = 10 + hForColorComponents = 10 + templateWindowSize = 7 + searchWindowSize = 21 + + img = cv2.fastNlMeansDenoisingColored(np.array(img), None, h, hForColorComponents, templateWindowSize, searchWindowSize) + + + #cv2.imwrite(debug_folder+"denoisedAndHigherContrast.png",img) + img = Image.fromarray(img).convert('RGB') + enhancer = ImageEnhance.Contrast(img) + img = enhancer.enhance(2) # Increase contrast by a factor of 2 + + new_images.append(img) + return new_images \ No newline at end of file diff --git a/utils/sorting.py b/utils/sorting.py new file mode 100644 index 0000000000000000000000000000000000000000..803358e58148a0e4b07ee7de475516f05161824e --- /dev/null +++ b/utils/sorting.py @@ -0,0 +1,68 @@ + +from typing import Any, List, Literal, Mapping, Optional, Tuple, Union, Dict, Type, Sequence + +@staticmethod +#Based on deepdoctection +def group_words_into_lines( + word_boxes: List[List[int]], image_id: Optional[str] = None +) -> List[Tuple[int, int, str]]: + + """ + Arranging words into horizontal text lines and sorting text lines vertically in order to give + an enumeration of words that is used for establishing the reading order. + Using this reading order arragement + + Input:is numpy array of shape (n,5) where n is number of words and 5 is size of each element(array) with coordinate(xmin,ymin,xmax,ymax) + score + """ + """ + reading_lines: List to store tuples of the form (row_index, bbox). + rows: List to store dictionaries representing rows, with keys "upper" and "lower" representing the y-coordinates of the upper and lower bounds of the rows. + """ + reading_lines = [] + rows: List[Dict[str,float]] = [] + for bbox in word_boxes: + #For each word annotation, get the bounding box using word.get_bounding_box(image_id). + row_found = False + for row_idx, row in enumerate(rows): + row_cy = (row["upper"] + row["lower"]) / 2 + ymin =bbox[1] + ymax =bbox[3] + bbox_cy = (ymin+ ymax) / 2 + # word belongs to row if center lies within the upper and lower bounds of the row or if the center y + # coordinate lies within the upper and lower bounds of the word bounding boxes. + + #if (row["upper"] < bounding_box.cy < row["lower"]) or (bounding_box.uly < row_cy < bounding_box.lry): + if (row["upper"] < bbox_cy < row["lower"]) or (ymin < row_cy < ymax): + reading_lines.append((row_idx,bbox)) + row_found = True + break + + # If word belongs to bound we do not update any row bounds. Thus, row bound are determined by the + # first word that defines the row + if not row_found: + rows.append({"upper": bbox[1] , "lower": bbox[3]}) + reading_lines.append((len(rows) - 1, bbox)) + + """ + Create a dictionary rows_dict where keys are row indices and values are the original row indices, sorted by the upper bound of the rows. + Reassign row indices in reading_lines according to the vertical sort order defined in rows_dict. + """ + rows_dict = {k: rows[k] for k in range(len(rows))} + rows_dict = { + idx: key[0] # type:ignore + for idx, key in enumerate(sorted(rows_dict.items(), key=lambda it: it[1]["upper"])) + } + """ + Sort reading_lines by the row index (mapped through rows_dict) and then by the word’s xmin coordinate. + """ + reading_lines.sort(key=lambda x: (rows_dict[x[0]], x[1][0])) + + number_rows = len(rows_dict) + #print("group_words_into_lines : number of rows : " + str(number_rows)) + #print("group_words_into_lines : reading lines" + str(reading_lines)) + #print("group_words_into_lines : rows_dict" + str(rows_dict)) + + onlywords = [ aTuple[1] for aTuple in reading_lines] + + return onlywords + diff --git a/utils/viz.py b/utils/viz.py new file mode 100644 index 0000000000000000000000000000000000000000..3bf0a07efca19f7ae3f4c71354064971799af91b --- /dev/null +++ b/utils/viz.py @@ -0,0 +1,119 @@ + +import os +from typing import List +import logging +import PIL +from PIL import Image +from PIL import ImageDraw +from .annotation import Annotation + + +def draw_box(im:Image.Image, result, lables, threshold=0.5): + im = im.copy() + draw_thickness = min(im.size) // 320 + draw = ImageDraw.Draw(im) + color_list = get_color_map_list(len(lables)) + clsid2color = {n.lower():color_list[i] for i,n in enumerate(lables)} + result = [r for r in result if r["score"] >= threshold] + + for dt in result: + color = tuple(clsid2color[dt["type"]]) + xmin, ymin, xmax, ymax = dt["bbox"] + + #Draws a line forming a rectangle around the detected object. + + draw.line( + [(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin), + (xmin, ymin)], + width=draw_thickness, + fill=color) + + #Prepares the text for the label (class type and score). + + + # draw label + text = "{} {:.4f}".format(dt["type"], dt["score"]) + #Computes the size of the text using imagedraw_textsize_c. + tw, th = imagedraw_textsize_c(draw, text) + #Draws a filled rectangle for the text background. + draw.rectangle( + [(xmin + 1, ymin - th), (xmin + tw + 1, ymin)], fill=color) + #Draws the text on top of the rectangle. + draw.text((xmin + 1, ymin - th), text, fill=(255, 255, 255)) + return im + +def draw_only_box(im:Image.Image, result): + im = im.copy() + draw_thickness = min(im.size) // 400 + draw = ImageDraw.Draw(im) + result = [r for r in result] + + for dt in result: + xmin, ymin, xmax, ymax = dt + xmin = int(xmin) + ymin = int(ymin) + xmax = int(xmax) + ymax = int(ymax) + + draw.line( + [(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin), + (xmin, ymin)], + width=draw_thickness, + fill="red") + + return im + +def draw_box_with_text(im:Image.Image, result:List[Annotation], threshold=0.5): + im = im.copy() + draw_thickness = min(im.size) // 320 + draw = ImageDraw.Draw(im) + + result = [r for r in result if r.score >= threshold] + + for dt in result: + + xmin, ymin, xmax, ymax = dt.box + draw.line( + [(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin), + (xmin, ymin)], + width=draw_thickness, + fill="red") + + # draw label + text = "{:.4f}".format(dt.score) + tw, th = imagedraw_textsize_c(draw, text) + draw.rectangle( + [(xmin + 1, ymin - th), (xmin + tw + 1, ymin)], fill="green") + draw.text((xmin + 1, ymin - th), text, fill=(255, 255, 255)) + + return im + +def get_color_map_list(num_classes): + """ + Args: + num_classes (int): number of class + Returns: + color_map (list): RGB color list + """ + color_map = num_classes * [0, 0, 0] + for i in range(0, num_classes): + j = 0 + lab = i + while lab: + color_map[i * 3] |= (((lab >> 0) & 1) << (7 - j)) + color_map[i * 3 + 1] |= (((lab >> 1) & 1) << (7 - j)) + color_map[i * 3 + 2] |= (((lab >> 2) & 1) << (7 - j)) + j += 1 + lab >>= 3 + color_map = [color_map[i:i + 3] for i in range(0, len(color_map), 3)] + return color_map + + +def imagedraw_textsize_c(draw, text): + if int(PIL.__version__.split('.')[0]) < 10: + tw, th = draw.textsize(text) + else: + left, top, right, bottom = draw.textbbox((0, 0), text) + tw, th = right - left, bottom - top + + return tw, th