diff --git "a/MakingGraphsAccessible.ipynb" "b/MakingGraphsAccessible.ipynb"
new file mode 100644--- /dev/null
+++ "b/MakingGraphsAccessible.ipynb"
@@ -0,0 +1,26331 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "6c8f222f",
+ "metadata": {},
+ "source": [
+ "## [Description](#Description_)\n",
+ "## [Todo](#Todo_)\n",
+ "## [Research](#Research_)\n",
+ "## [Setup](#Setup_)\n",
+ "### - [Requirements](#Requirements_)\n",
+ "### - [Imports](#Imports_)\n",
+ "### - [Globals](#Globals_)\n",
+ "## [Data](#Data_)\n",
+ "### - [Annotation structure](#Annotation_structure_)\n",
+ "### - [Data exploration](#Data_exploration_)\n",
+ "### - [Data splits](#Data_splits_)\n",
+ "### - [Expected model output format](#Expected_model_output_format_)\n",
+ "### - [Dataset](#Dataset_)\n",
+ "## [Model](#Model_)\n",
+ "### - [Add task specific tokens](#Add_task_specific_tokens_)\n",
+ "### - [Add dataset specific tokens](#Add_dataset_specific_tokens_)\n",
+ "### - [Dataloader](#Dataloader_)\n",
+ "### - [Lightning module](#Lightning_module_)\n",
+ "### - [Metrics](#Metrics_)\n",
+ "## [Training](#Training_)\n",
+ "### - [Callbacks](#Callbacks_)\n",
+ "## [Results](#Results_)\n",
+ "### - [Predicting](#Predicting_)\n",
+ "### - [Interface](#Interface_)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3b03d3cc",
+ "metadata": {},
+ "source": [
+ "## Description "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "64776daa",
+ "metadata": {},
+ "source": [
+ "Trying my hand at this kaggle challenge:\n",
+ "\n",
+ "https://www.kaggle.com/competitions/benetech-making-graphs-accessible"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "82bdf04d",
+ "metadata": {},
+ "source": [
+ "## Todo "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "965d48df",
+ "metadata": {},
+ "source": [
+ "- Check out dataset https://chartinfo.github.io/toolsanddata.html\n",
+ "- Try segmentation -> classification -> parsing pipeline\n",
+ "- For inference, check out https://pytorch.org/serve/"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "49fece33",
+ "metadata": {},
+ "source": [
+ "## Research "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0940fdc8",
+ "metadata": {},
+ "source": [
+ "[Donut](https://arxiv.org/pdf/2111.15664.pdf) - document understanding transformer without the intermediate optical character recognition step.\n",
+ "[Example notebook one](https://github.com/NielsRogge/Transformers-Tutorials/blob/master/Donut/CORD/Fine_tune_Donut_on_a_custom_dataset_(CORD)_with_PyTorch_Lightning.ipynb),\n",
+ "[example notebook two](https://www.kaggle.com/code/nbroad/donut-train-benetech)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d9064993",
+ "metadata": {},
+ "source": [
+ "## Setup "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "94236632",
+ "metadata": {},
+ "source": [
+ "### Requirements \n",
+ "\n",
+ "\n",
+ " Python requirements
\n",
+ "\n",
+ "```\n",
+ "absl-py==1.4.0\n",
+ "aenum==3.1.11\n",
+ "aiofiles==23.1.0\n",
+ "aiohttp==3.8.4\n",
+ "aiosignal==1.3.1\n",
+ "altair==4.2.2\n",
+ "antlr4-python3-runtime==4.9.3\n",
+ "anyio==3.6.2\n",
+ "appdirs==1.4.4\n",
+ "appnope==0.1.3\n",
+ "argon2-cffi==21.3.0\n",
+ "argon2-cffi-bindings==21.2.0\n",
+ "arrow==1.2.3\n",
+ "astroid==2.15.0\n",
+ "asttokens==2.2.1\n",
+ "async-timeout==4.0.2\n",
+ "attrs==22.2.0\n",
+ "auto-sklearn==0.15.0\n",
+ "backcall==0.2.0\n",
+ "beautifulsoup4==4.12.0\n",
+ "black==23.1.0\n",
+ "bleach==6.0.0\n",
+ "blis==0.7.9\n",
+ "botocore==1.29.100\n",
+ "cachetools==5.3.0\n",
+ "catalogue==2.0.8\n",
+ "catboost==1.1.1\n",
+ "certifi==2022.12.7\n",
+ "cffi==1.15.1\n",
+ "charset-normalizer==3.1.0\n",
+ "click==8.1.3\n",
+ "cloudpickle==2.2.1\n",
+ "cmake==3.26.0\n",
+ "colorama==0.4.6\n",
+ "comm==0.1.2\n",
+ "ConfigSpace==0.4.21\n",
+ "contourpy==1.0.7\n",
+ "cycler==0.11.0\n",
+ "cymem==2.0.7\n",
+ "Cython==0.29.33\n",
+ "dask==2023.3.2\n",
+ "datasets==2.11.0\n",
+ "debugpy==1.6.6\n",
+ "decorator==5.1.1\n",
+ "defusedxml==0.7.1\n",
+ "Deprecated==1.2.13\n",
+ "dill==0.3.6\n",
+ "distlib==0.3.6\n",
+ "distributed==2023.3.2\n",
+ "distro==1.8.0\n",
+ "docker-pycreds==0.4.0\n",
+ "einops==0.6.0\n",
+ "emcee==3.1.4\n",
+ "entrypoints==0.4\n",
+ "exceptiongroup==1.1.1\n",
+ "executing==1.2.0\n",
+ "fastapi==0.95.1\n",
+ "fastcore==1.5.28\n",
+ "fastdownload==0.0.7\n",
+ "fastjsonschema==2.16.3\n",
+ "fastprogress==1.0.3\n",
+ "ffmpy==0.3.0\n",
+ "filelock==3.10.0\n",
+ "flaky==3.7.0\n",
+ "fonttools==4.39.2\n",
+ "fqdn==1.5.1\n",
+ "frozenlist==1.3.3\n",
+ "fsspec==2023.3.0\n",
+ "future==0.18.3\n",
+ "gitdb==4.0.10\n",
+ "GitPython==3.1.31\n",
+ "google-auth==2.16.3\n",
+ "google-auth-oauthlib==0.4.6\n",
+ "gradio==3.27.0\n",
+ "gradio_client==0.1.3\n",
+ "graphviz==0.20.1\n",
+ "grpcio==1.53.0\n",
+ "h11==0.14.0\n",
+ "HeapDict==1.0.1\n",
+ "httpcore==0.17.0\n",
+ "httpx==0.24.0\n",
+ "huggingface-hub==0.13.3\n",
+ "idna==3.4\n",
+ "imageio==2.27.0\n",
+ "imgaug==0.4.0\n",
+ "importlib-metadata==6.1.0\n",
+ "iniconfig==2.0.0\n",
+ "ipykernel==6.21.3\n",
+ "ipython==8.11.0\n",
+ "ipython-genutils==0.2.0\n",
+ "ipywidgets==8.0.4\n",
+ "isoduration==20.11.0\n",
+ "isort==5.12.0\n",
+ "jedi==0.17.2\n",
+ "Jinja2==3.1.2\n",
+ "jmespath==1.0.1\n",
+ "joblib==1.2.0\n",
+ "jsonpointer==2.3\n",
+ "jsonschema==4.17.3\n",
+ "jupyter==1.0.0\n",
+ "jupyter-console==6.6.3\n",
+ "jupyter-contrib-core==0.4.2\n",
+ "jupyter-events==0.6.3\n",
+ "jupyter-highlight-selected-word==0.2.0\n",
+ "jupyter-latex-envs==1.4.6\n",
+ "jupyter-tabnine==1.2.3\n",
+ "jupyter_client==8.0.3\n",
+ "jupyter_core==5.3.0\n",
+ "jupyter_server==2.5.0\n",
+ "jupyter_server_terminals==0.4.4\n",
+ "jupyterlab-pygments==0.2.2\n",
+ "jupyterlab-widgets==3.0.5\n",
+ "kaggle==1.5.13\n",
+ "kiwisolver==1.4.4\n",
+ "langcodes==3.3.0\n",
+ "lazy-object-proxy==1.9.0\n",
+ "lazy_loader==0.2\n",
+ "liac-arff==2.5.0\n",
+ "lightgbm==3.3.5\n",
+ "lightning-utilities==0.8.0\n",
+ "linkify-it-py==2.0.0\n",
+ "lit==16.0.0\n",
+ "llvmlite==0.39.1\n",
+ "locket==1.0.0\n",
+ "lockfile==0.12.2\n",
+ "lxml==4.9.2\n",
+ "Markdown==3.4.3\n",
+ "markdown-it-py==2.2.0\n",
+ "MarkupSafe==2.1.2\n",
+ "matplotlib==3.7.1\n",
+ "matplotlib-inline==0.1.6\n",
+ "mccabe==0.7.0\n",
+ "mdit-py-plugins==0.3.3\n",
+ "mdurl==0.1.2\n",
+ "mistune==2.0.5\n",
+ "model-index==0.1.11\n",
+ "more-itertools==9.1.0\n",
+ "mpmath==1.3.0\n",
+ "msgpack==1.0.5\n",
+ "multidict==6.0.4\n",
+ "multiprocess==0.70.14\n",
+ "murmurhash==1.0.9\n",
+ "mypy-extensions==1.0.0\n",
+ "nb-black==1.0.7\n",
+ "nbclassic==0.5.3\n",
+ "nbclient==0.7.2\n",
+ "nbconvert==7.2.10\n",
+ "nbformat==5.7.3\n",
+ "nest-asyncio==1.5.6\n",
+ "networkx==2.8.8\n",
+ "nltk==3.8.1\n",
+ "notebook==6.5.3\n",
+ "notebook_shim==0.2.2\n",
+ "nptyping==2.4.1\n",
+ "numba==0.56.4\n",
+ "numpy==1.23.5\n",
+ "nvidia-cublas-cu11==11.10.3.66\n",
+ "nvidia-cuda-cupti-cu11==11.7.101\n",
+ "nvidia-cuda-nvrtc-cu11==11.7.99\n",
+ "nvidia-cuda-runtime-cu11==11.7.99\n",
+ "nvidia-cudnn-cu11==8.5.0.96\n",
+ "nvidia-cufft-cu11==10.9.0.58\n",
+ "nvidia-curand-cu11==10.2.10.91\n",
+ "nvidia-cusolver-cu11==11.4.0.1\n",
+ "nvidia-cusparse-cu11==11.7.4.91\n",
+ "nvidia-nccl-cu11==2.14.3\n",
+ "nvidia-nvtx-cu11==11.7.91\n",
+ "oauthlib==3.2.2\n",
+ "omegaconf==2.2.3\n",
+ "opencv-python==4.7.0.72\n",
+ "ordered-set==4.1.0\n",
+ "orjson==3.8.10\n",
+ "packaging==23.0\n",
+ "pandas==1.5.3\n",
+ "pandocfilters==1.5.0\n",
+ "parso==0.7.1\n",
+ "partd==1.3.0\n",
+ "pathspec==0.11.1\n",
+ "pathtools==0.1.2\n",
+ "pathy==0.10.1\n",
+ "patsy==0.5.3\n",
+ "pexpect==4.8.0\n",
+ "pickleshare==0.7.5\n",
+ "Pillow==9.4.0\n",
+ "platformdirs==3.1.1\n",
+ "plotly==5.13.1\n",
+ "pluggy==1.0.0\n",
+ "preshed==3.0.8\n",
+ "prometheus-client==0.16.0\n",
+ "prompt-toolkit==3.0.38\n",
+ "protobuf==3.20.3\n",
+ "psutil==5.9.4\n",
+ "ptyprocess==0.7.0\n",
+ "pure-eval==0.2.2\n",
+ "py4j==0.10.9.7\n",
+ "pyarrow==11.0.0\n",
+ "pyasn1==0.4.8\n",
+ "pyasn1-modules==0.2.8\n",
+ "pycparser==2.21\n",
+ "pydantic==1.10.7\n",
+ "pyDeprecate==0.3.2\n",
+ "pydub==0.25.1\n",
+ "Pygments==2.14.0\n",
+ "pylint==2.17.0\n",
+ "pynisher==0.6.4\n",
+ "pyparsing==3.0.9\n",
+ "pyrfr==0.8.3\n",
+ "pyrsistent==0.19.3\n",
+ "PySocks==1.7.1\n",
+ "pytesseract==0.3.10\n",
+ "pytest==7.2.2\n",
+ "python-dateutil==2.8.2\n",
+ "python-json-logger==2.0.7\n",
+ "python-jsonrpc-server==0.4.0\n",
+ "python-language-server==0.36.2\n",
+ "python-multipart==0.0.6\n",
+ "python-slugify==8.0.1\n",
+ "pytorch-lightning==2.0.0\n",
+ "pytz==2022.7.1\n",
+ "PyWavelets==1.4.1\n",
+ "PyYAML==6.0\n",
+ "pyzmq==25.0.2\n",
+ "qtconsole==5.4.1\n",
+ "QtPy==2.3.0\n",
+ "ray==2.2.0\n",
+ "regex==2023.3.23\n",
+ "requests==2.28.2\n",
+ "requests-oauthlib==1.3.1\n",
+ "requests-unixsocket==0.3.0\n",
+ "responses==0.18.0\n",
+ "rfc3339-validator==0.1.4\n",
+ "rfc3986-validator==0.1.1\n",
+ "rsa==4.9\n",
+ "scikit-image==0.20.0\n",
+ "scikit-learn==0.24.2\n",
+ "scipy==1.10.1\n",
+ "semantic-version==2.10.0\n",
+ "Send2Trash==1.8.0\n",
+ "sentencepiece==0.1.97\n",
+ "sentry-sdk==1.17.0\n",
+ "setproctitle==1.3.2\n",
+ "shapely==2.0.1\n",
+ "six==1.16.0\n",
+ "smac==1.2\n",
+ "smart-open==6.3.0\n",
+ "smmap==5.0.0\n",
+ "sniffio==1.3.0\n",
+ "sortedcontainers==2.4.0\n",
+ "soupsieve==2.4\n",
+ "spacy-legacy==3.0.12\n",
+ "spacy-loggers==1.0.4\n",
+ "srsly==2.4.6\n",
+ "stack-data==0.6.2\n",
+ "starlette==0.26.1\n",
+ "sympy==1.11.1\n",
+ "tabulate==0.9.0\n",
+ "tblib==1.7.0\n",
+ "tenacity==8.2.2\n",
+ "tensorboard==2.12.0\n",
+ "tensorboard-data-server==0.7.0\n",
+ "tensorboard-plugin-wit==1.8.1\n",
+ "tensorboardX==2.6\n",
+ "termcolor==2.2.0\n",
+ "terminado==0.17.1\n",
+ "testpath==0.6.0\n",
+ "text-unidecode==1.3\n",
+ "threadpoolctl==3.1.0\n",
+ "tifffile==2023.3.21\n",
+ "tinycss2==1.2.1\n",
+ "tokenizers==0.13.2\n",
+ "tomli==2.0.1\n",
+ "tomlkit==0.11.6\n",
+ "toolz==0.12.0\n",
+ "torch==2.0.0\n",
+ "torchdata==0.6.0\n",
+ "torchmetrics==0.11.4\n",
+ "torchtext==0.15.1\n",
+ "torchvision==0.15.1\n",
+ "tornado==6.2\n",
+ "tqdm==4.65.0\n",
+ "traitlets==5.9.0\n",
+ "transformers==4.26.1\n",
+ "trash-cli==0.23.2.13.2\n",
+ "triton==2.0.0\n",
+ "typer==0.7.0\n",
+ "typing==3.7.4.3\n",
+ "typing_extensions==4.5.0\n",
+ "uc-micro-py==1.0.1\n",
+ "ujson==5.7.0\n",
+ "uri-template==1.2.0\n",
+ "urllib3==1.26.15\n",
+ "uvicorn==0.21.1\n",
+ "virtualenv==20.21.0\n",
+ "wandb==0.14.2\n",
+ "wasabi==1.1.1\n",
+ "wcwidth==0.2.6\n",
+ "webcolors==1.12\n",
+ "webencodings==0.5.1\n",
+ "websocket-client==1.5.1\n",
+ "websockets==11.0.1\n",
+ "Werkzeug==2.2.3\n",
+ "widgetsnbextension==4.0.5\n",
+ "wrapt==1.15.0\n",
+ "xgboost==1.7.4\n",
+ "xxhash==3.2.0\n",
+ "yarl==1.8.2\n",
+ "zict==2.2.0\n",
+ "zipp==3.15.0\n",
+ "```\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "47af4f6b",
+ "metadata": {},
+ "source": [
+ "### Imports "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 254,
+ "id": "8ccdc3b0",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The nb_black extension is already loaded. To reload it, use:\n",
+ " %reload_ext nb_black\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 254;\n",
+ " var nbb_unformatted_code = \"%load_ext nb_black\\n%matplotlib inline\\n\\n\\nimport collections\\nimport dataclasses\\nimport datasets\\nimport einops\\nimport enum\\nimport gradio\\nimport glob\\nimport IPython\\nimport imageio\\nimport json\\nimport functools\\nimport matplotlib.animation\\nimport matplotlib.pyplot as plt\\nimport numpy as np\\nimport os\\nimport PIL\\nimport pandas as pd\\nimport pprint\\nimport pytorch_lightning as pl\\nimport re\\nimport reprlib\\nimport torch\\nimport torchvision\\nimport tqdm.autonotebook\\nimport transformers\\nimport types\\nfrom typing import Literal\\nimport wandb\";\n",
+ " var nbb_formatted_code = \"%load_ext nb_black\\n%matplotlib inline\\n\\n\\nimport collections\\nimport dataclasses\\nimport datasets\\nimport einops\\nimport enum\\nimport gradio\\nimport glob\\nimport IPython\\nimport imageio\\nimport json\\nimport functools\\nimport matplotlib.animation\\nimport matplotlib.pyplot as plt\\nimport numpy as np\\nimport os\\nimport PIL\\nimport pandas as pd\\nimport pprint\\nimport pytorch_lightning as pl\\nimport re\\nimport reprlib\\nimport torch\\nimport torchvision\\nimport tqdm.autonotebook\\nimport transformers\\nimport types\\nfrom typing import Literal\\nimport wandb\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%load_ext nb_black\n",
+ "%matplotlib inline\n",
+ "\n",
+ "\n",
+ "import collections\n",
+ "import dataclasses\n",
+ "import datasets\n",
+ "import einops\n",
+ "import enum\n",
+ "import gradio\n",
+ "import glob\n",
+ "import IPython\n",
+ "import imageio\n",
+ "import json\n",
+ "import functools\n",
+ "import matplotlib.animation\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import os\n",
+ "import PIL\n",
+ "import pandas as pd\n",
+ "import pprint\n",
+ "import pytorch_lightning as pl\n",
+ "import re\n",
+ "import reprlib\n",
+ "import torch\n",
+ "import torchvision\n",
+ "import tqdm.autonotebook\n",
+ "import transformers\n",
+ "import types\n",
+ "from typing import Literal\n",
+ "import wandb"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "77b39d61",
+ "metadata": {},
+ "source": [
+ "### Globals "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "db1722f2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 3;\n",
+ " var nbb_unformatted_code = \"COMPETITION = \\\"benetech-making-graphs-accessible\\\"\\nDEBUG: bool = True\\nDATA = types.SimpleNamespace()\\nTOKEN = types.SimpleNamespace()\\nCONFIG = types.SimpleNamespace()\\nMODEL = types.SimpleNamespace()\\nTRAINING = types.SimpleNamespace()\";\n",
+ " var nbb_formatted_code = \"COMPETITION = \\\"benetech-making-graphs-accessible\\\"\\nDEBUG: bool = True\\nDATA = types.SimpleNamespace()\\nTOKEN = types.SimpleNamespace()\\nCONFIG = types.SimpleNamespace()\\nMODEL = types.SimpleNamespace()\\nTRAINING = types.SimpleNamespace()\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "COMPETITION = \"benetech-making-graphs-accessible\"\n",
+ "DEBUG: bool = True\n",
+ "DATA = types.SimpleNamespace()\n",
+ "TOKEN = types.SimpleNamespace()\n",
+ "CONFIG = types.SimpleNamespace()\n",
+ "MODEL = types.SimpleNamespace()\n",
+ "TRAINING = types.SimpleNamespace()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "52ea33de",
+ "metadata": {},
+ "source": [
+ "### Markdown"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "c2aefef2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 4;\n",
+ " var nbb_unformatted_code = \"def make_new_markdown_section_with_link(section, header=\\\"##\\\", do_print=True):\\n section_id = section.replace(\\\" \\\", \\\"_\\\") + \\\"_\\\"\\n section_link = f\\\"{header} [{section}](#{section_id})\\\"\\n section_header = f\\\"{header} {section} \\\"\\n if do_print:\\n print(section_link + \\\"\\\\n\\\" + section_header)\\n return section_link, section_header\\n\\n\\ndef make_several_sections(\\n section_names=(\\n \\\"Description\\\",\\n \\\"Imports\\\",\\n \\\"Globals\\\",\\n \\\"Setup\\\",\\n \\\"Data\\\",\\n \\\"Data exploration\\\",\\n \\\"Model\\\",\\n \\\"Training\\\",\\n \\\"Results\\\",\\n )\\n):\\n links, headers = zip(\\n *[\\n make_new_markdown_section_with_link(sn, do_print=False)\\n for sn in section_names\\n ]\\n )\\n print(\\\"\\\\n\\\".join(links + (\\\"\\\",) + headers))\";\n",
+ " var nbb_formatted_code = \"def make_new_markdown_section_with_link(section, header=\\\"##\\\", do_print=True):\\n section_id = section.replace(\\\" \\\", \\\"_\\\") + \\\"_\\\"\\n section_link = f\\\"{header} [{section}](#{section_id})\\\"\\n section_header = f\\\"{header} {section} \\\"\\n if do_print:\\n print(section_link + \\\"\\\\n\\\" + section_header)\\n return section_link, section_header\\n\\n\\ndef make_several_sections(\\n section_names=(\\n \\\"Description\\\",\\n \\\"Imports\\\",\\n \\\"Globals\\\",\\n \\\"Setup\\\",\\n \\\"Data\\\",\\n \\\"Data exploration\\\",\\n \\\"Model\\\",\\n \\\"Training\\\",\\n \\\"Results\\\",\\n )\\n):\\n links, headers = zip(\\n *[\\n make_new_markdown_section_with_link(sn, do_print=False)\\n for sn in section_names\\n ]\\n )\\n print(\\\"\\\\n\\\".join(links + (\\\"\\\",) + headers))\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def make_new_markdown_section_with_link(section, header=\"##\", do_print=True):\n",
+ " section_id = section.replace(\" \", \"_\") + \"_\"\n",
+ " section_link = f\"{header} [{section}](#{section_id})\"\n",
+ " section_header = f\"{header} {section} \"\n",
+ " if do_print:\n",
+ " print(section_link + \"\\n\" + section_header)\n",
+ " return section_link, section_header\n",
+ "\n",
+ "\n",
+ "def make_several_sections(\n",
+ " section_names=(\n",
+ " \"Description\",\n",
+ " \"Imports\",\n",
+ " \"Globals\",\n",
+ " \"Setup\",\n",
+ " \"Data\",\n",
+ " \"Data exploration\",\n",
+ " \"Model\",\n",
+ " \"Training\",\n",
+ " \"Results\",\n",
+ " )\n",
+ "):\n",
+ " links, headers = zip(\n",
+ " *[\n",
+ " make_new_markdown_section_with_link(sn, do_print=False)\n",
+ " for sn in section_names\n",
+ " ]\n",
+ " )\n",
+ " print(\"\\n\".join(links + (\"\",) + headers))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bf4ed747",
+ "metadata": {},
+ "source": [
+ "### Terminal"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "1e7c72a6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 5;\n",
+ " var nbb_unformatted_code = \"def mkdir(path, error_if_exists=False):\\n !mkdir {\\\"-p\\\" if not error_if_exists else \\\"\\\"} {path}\\n\\n\\ndef unzip(zip_path, save_path=None, delete_zip=False):\\n !unzip {zip_path} {\\\"-d \\\"+ save_path if save_path else \\\"\\\"}\\n if delete_zip:\\n for path in glob.glob(zip_path):\\n if path.endswith(\\\".zip\\\"):\\n !trash {path}\\n\\n\\ndef unzip_to_data_and_delete():\\n unzip(\\\"data/*\\\", \\\"data\\\", delete_zip=True)\";\n",
+ " var nbb_formatted_code = \"def mkdir(path, error_if_exists=False):\\n !mkdir {\\\"-p\\\" if not error_if_exists else \\\"\\\"} {path}\\n\\n\\ndef unzip(zip_path, save_path=None, delete_zip=False):\\n !unzip {zip_path} {\\\"-d \\\"+ save_path if save_path else \\\"\\\"}\\n if delete_zip:\\n for path in glob.glob(zip_path):\\n if path.endswith(\\\".zip\\\"):\\n !trash {path}\\n\\n\\ndef unzip_to_data_and_delete():\\n unzip(\\\"data/*\\\", \\\"data\\\", delete_zip=True)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def mkdir(path, error_if_exists=False):\n",
+ " !mkdir {\"-p\" if not error_if_exists else \"\"} {path}\n",
+ "\n",
+ "\n",
+ "def unzip(zip_path, save_path=None, delete_zip=False):\n",
+ " !unzip {zip_path} {\"-d \"+ save_path if save_path else \"\"}\n",
+ " if delete_zip:\n",
+ " for path in glob.glob(zip_path):\n",
+ " if path.endswith(\".zip\"):\n",
+ " !trash {path}\n",
+ "\n",
+ "\n",
+ "def unzip_to_data_and_delete():\n",
+ " unzip(\"data/*\", \"data\", delete_zip=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0fb17c9d",
+ "metadata": {},
+ "source": [
+ "### Kaggle"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "aae473b0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 6;\n",
+ " var nbb_unformatted_code = \"def kaggle_competitions_search(search_term):\\n !kaggle competitions list -s {search_term}\\n\\n\\ndef kaggle_competitions_files(competition):\\n !kaggle competitions files {competition}\\n\\n\\ndef kaggle_competitions_download(competition, save_path=\\\"data\\\", filename=None):\\n mkdir(save_path)\\n !kaggle competitions download -p {save_path} {\\\"-f \\\" + filename if filename else \\\"\\\"} {competition}\\n\\n\\ndef kaggle_competitions_submit(competition, filename, message=\\\"submit\\\"):\\n !kaggle competitions submit -f {filename} -m {message} {competition}\\n\\n\\ndef kaggle_competitions_submissions(competition):\\n !kaggle competitions submissions {competition}\";\n",
+ " var nbb_formatted_code = \"def kaggle_competitions_search(search_term):\\n !kaggle competitions list -s {search_term}\\n\\n\\ndef kaggle_competitions_files(competition):\\n !kaggle competitions files {competition}\\n\\n\\ndef kaggle_competitions_download(competition, save_path=\\\"data\\\", filename=None):\\n mkdir(save_path)\\n !kaggle competitions download -p {save_path} {\\\"-f \\\" + filename if filename else \\\"\\\"} {competition}\\n\\n\\ndef kaggle_competitions_submit(competition, filename, message=\\\"submit\\\"):\\n !kaggle competitions submit -f {filename} -m {message} {competition}\\n\\n\\ndef kaggle_competitions_submissions(competition):\\n !kaggle competitions submissions {competition}\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def kaggle_competitions_search(search_term):\n",
+ " !kaggle competitions list -s {search_term}\n",
+ "\n",
+ "\n",
+ "def kaggle_competitions_files(competition):\n",
+ " !kaggle competitions files {competition}\n",
+ "\n",
+ "\n",
+ "def kaggle_competitions_download(competition, save_path=\"data\", filename=None):\n",
+ " mkdir(save_path)\n",
+ " !kaggle competitions download -p {save_path} {\"-f \" + filename if filename else \"\"} {competition}\n",
+ "\n",
+ "\n",
+ "def kaggle_competitions_submit(competition, filename, message=\"submit\"):\n",
+ " !kaggle competitions submit -f {filename} -m {message} {competition}\n",
+ "\n",
+ "\n",
+ "def kaggle_competitions_submissions(competition):\n",
+ " !kaggle competitions submissions {competition}"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "04f5009a",
+ "metadata": {},
+ "source": [
+ "### Environment variables "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "18964650",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 7;\n",
+ " var nbb_unformatted_code = \"def set_tokenizers_parallelism(enable: bool):\\n os.environ[\\\"TOKENIZERS_PARALLELISM\\\"] = \\\"true\\\" if enable else \\\"false\\\"\\n\\n\\ndef set_torch_device_order_pci_bus():\\n os.environ[\\\"CUDA_DEVICE_ORDER\\\"] = \\\"PCI_BUS_ID\\\"\\n\\n\\nset_tokenizers_parallelism(False)\\nset_torch_device_order_pci_bus()\";\n",
+ " var nbb_formatted_code = \"def set_tokenizers_parallelism(enable: bool):\\n os.environ[\\\"TOKENIZERS_PARALLELISM\\\"] = \\\"true\\\" if enable else \\\"false\\\"\\n\\n\\ndef set_torch_device_order_pci_bus():\\n os.environ[\\\"CUDA_DEVICE_ORDER\\\"] = \\\"PCI_BUS_ID\\\"\\n\\n\\nset_tokenizers_parallelism(False)\\nset_torch_device_order_pci_bus()\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def set_tokenizers_parallelism(enable: bool):\n",
+ " os.environ[\"TOKENIZERS_PARALLELISM\"] = \"true\" if enable else \"false\"\n",
+ "\n",
+ "\n",
+ "def set_torch_device_order_pci_bus():\n",
+ " os.environ[\"CUDA_DEVICE_ORDER\"] = \"PCI_BUS_ID\"\n",
+ "\n",
+ "\n",
+ "set_tokenizers_parallelism(False)\n",
+ "set_torch_device_order_pci_bus()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cdf2b470",
+ "metadata": {},
+ "source": [
+ "## Data "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "098e77ae",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 8;\n",
+ " var nbb_unformatted_code = \"if not os.path.exists(\\\"data\\\"):\\n kaggle_competitions_download(COMPETITION)\\n unzip_to_data_and_delete()\";\n",
+ " var nbb_formatted_code = \"if not os.path.exists(\\\"data\\\"):\\n kaggle_competitions_download(COMPETITION)\\n unzip_to_data_and_delete()\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "if not os.path.exists(\"data\"):\n",
+ " kaggle_competitions_download(COMPETITION)\n",
+ " unzip_to_data_and_delete()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "011094f0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 9;\n",
+ " var nbb_unformatted_code = \"def path_to_dict(path, print_only_last_dirname=False):\\n dirpath, dirnames, filenames = next(os.walk(path))\\n path_contents = filenames\\n\\n for dirname in dirnames:\\n full_dirname = os.path.join(path, dirname)\\n path_contents.append(path_to_dict(full_dirname, print_only_last_dirname=True))\\n\\n if print_only_last_dirname:\\n path = os.path.split(path)[-1]\\n\\n return {path: path_contents}\\n\\n\\ndef pprint_path_contents(path):\\n path_dict = path_to_dict(path)\\n short_path_repr = reprlib.repr(path_dict)\\n short_path_dict = eval(short_path_repr)\\n string = pprint.pformat(short_path_dict).replace(\\\"Ellipsis\\\", \\\"...\\\")\\n print(string)\";\n",
+ " var nbb_formatted_code = \"def path_to_dict(path, print_only_last_dirname=False):\\n dirpath, dirnames, filenames = next(os.walk(path))\\n path_contents = filenames\\n\\n for dirname in dirnames:\\n full_dirname = os.path.join(path, dirname)\\n path_contents.append(path_to_dict(full_dirname, print_only_last_dirname=True))\\n\\n if print_only_last_dirname:\\n path = os.path.split(path)[-1]\\n\\n return {path: path_contents}\\n\\n\\ndef pprint_path_contents(path):\\n path_dict = path_to_dict(path)\\n short_path_repr = reprlib.repr(path_dict)\\n short_path_dict = eval(short_path_repr)\\n string = pprint.pformat(short_path_dict).replace(\\\"Ellipsis\\\", \\\"...\\\")\\n print(string)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def path_to_dict(path, print_only_last_dirname=False):\n",
+ " dirpath, dirnames, filenames = next(os.walk(path))\n",
+ " path_contents = filenames\n",
+ "\n",
+ " for dirname in dirnames:\n",
+ " full_dirname = os.path.join(path, dirname)\n",
+ " path_contents.append(path_to_dict(full_dirname, print_only_last_dirname=True))\n",
+ "\n",
+ " if print_only_last_dirname:\n",
+ " path = os.path.split(path)[-1]\n",
+ "\n",
+ " return {path: path_contents}\n",
+ "\n",
+ "\n",
+ "def pprint_path_contents(path):\n",
+ " path_dict = path_to_dict(path)\n",
+ " short_path_repr = reprlib.repr(path_dict)\n",
+ " short_path_dict = eval(short_path_repr)\n",
+ " string = pprint.pformat(short_path_dict).replace(\"Ellipsis\", \"...\")\n",
+ " print(string)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "1c7232a4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'data': ['sample_submission.csv',\n",
+ " {'train': [{'images': ['52ecbd029a07.jpg',\n",
+ " 'fd7e3f0e4d43.jpg',\n",
+ " 'f0122da6cbe1.jpg',\n",
+ " '2a186a0fa1ae.jpg',\n",
+ " '6559c7a7d153.jpg',\n",
+ " '5fd880333d07.jpg',\n",
+ " ...]},\n",
+ " {'annotations': ['0f4f52fc3f4b.json',\n",
+ " '35f0ec146509.json',\n",
+ " '2e374a37e404.json',\n",
+ " '96578b79c571.json',\n",
+ " 'dfbd6e21c301.json',\n",
+ " '0893be463049.json',\n",
+ " ...]}]},\n",
+ " {'test': [{'images': ['000b92c3b098.jpg',\n",
+ " '01b45b831589.jpg',\n",
+ " '00dcf883a459.jpg',\n",
+ " '007a18eb4e09.jpg',\n",
+ " '00f5404753cf.jpg']}]}]}\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 10;\n",
+ " var nbb_unformatted_code = \"pprint_path_contents(\\\"data\\\")\";\n",
+ " var nbb_formatted_code = \"pprint_path_contents(\\\"data\\\")\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pprint_path_contents(\"data\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "c0a85e8a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 11;\n",
+ " var nbb_unformatted_code = \"@functools.cache\\ndef load_train_image_ids() -> list[str]:\\n train_image_ids = [i.replace(\\\".jpg\\\", \\\"\\\") for i in os.listdir(\\\"data/train/images\\\")]\\n return train_image_ids[: 1000 if DEBUG else None]\\n\\n\\n@functools.cache\\ndef load_test_image_ids() -> list[str]:\\n return [i.replace(\\\".jpg\\\", \\\"\\\") for i in os.listdir(\\\"data/test/images\\\")]\\n\\n\\ndef load_image_annotation(image_id: str) -> dict:\\n return json.load(open(f\\\"data/train/annotations/{image_id}.json\\\"))\\n\\n\\ndef load_image(image_id: str) -> np.ndarray:\\n return imageio.v3.imread(open(f\\\"data/train/images/{image_id}.jpg\\\", \\\"rb\\\"))\";\n",
+ " var nbb_formatted_code = \"@functools.cache\\ndef load_train_image_ids() -> list[str]:\\n train_image_ids = [i.replace(\\\".jpg\\\", \\\"\\\") for i in os.listdir(\\\"data/train/images\\\")]\\n return train_image_ids[: 1000 if DEBUG else None]\\n\\n\\n@functools.cache\\ndef load_test_image_ids() -> list[str]:\\n return [i.replace(\\\".jpg\\\", \\\"\\\") for i in os.listdir(\\\"data/test/images\\\")]\\n\\n\\ndef load_image_annotation(image_id: str) -> dict:\\n return json.load(open(f\\\"data/train/annotations/{image_id}.json\\\"))\\n\\n\\ndef load_image(image_id: str) -> np.ndarray:\\n return imageio.v3.imread(open(f\\\"data/train/images/{image_id}.jpg\\\", \\\"rb\\\"))\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "@functools.cache\n",
+ "def load_train_image_ids() -> list[str]:\n",
+ " train_image_ids = [i.replace(\".jpg\", \"\") for i in os.listdir(\"data/train/images\")]\n",
+ " return train_image_ids[: 1000 if DEBUG else None]\n",
+ "\n",
+ "\n",
+ "@functools.cache\n",
+ "def load_test_image_ids() -> list[str]:\n",
+ " return [i.replace(\".jpg\", \"\") for i in os.listdir(\"data/test/images\")]\n",
+ "\n",
+ "\n",
+ "def load_image_annotation(image_id: str) -> dict:\n",
+ " return json.load(open(f\"data/train/annotations/{image_id}.json\"))\n",
+ "\n",
+ "\n",
+ "def load_image(image_id: str) -> np.ndarray:\n",
+ " return imageio.v3.imread(open(f\"data/train/images/{image_id}.jpg\", \"rb\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e6e7d333",
+ "metadata": {},
+ "source": [
+ "### Annotation structure "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "1e98517b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 12;\n",
+ " var nbb_unformatted_code = \"class Source(enum.Enum):\\n generated = \\\"generated\\\"\\n extracted = \\\"extracted\\\"\\n\\n\\nclass ChartType(enum.Enum):\\n dot = \\\"dot\\\"\\n horizontal_bar = \\\"horizontal_bar\\\"\\n vertical_bar = \\\"vertical_bar\\\"\\n line = \\\"line\\\"\\n scatter = \\\"scatter\\\"\\n\\n\\n@dataclasses.dataclass\\nclass PlotBoundingBox:\\n height: int\\n width: int\\n x0: int\\n y0: int\\n\\n def get_bounds(self):\\n xs = [self.x0, self.x0 + self.width, self.x0 + self.width, self.x0, self.x0]\\n ys = [self.y0, self.y0, self.y0 + self.height, self.y0 + self.height, self.y0]\\n return xs, ys\\n\\n\\n@dataclasses.dataclass\\nclass DataPoint:\\n x: float or str\\n y: float or str\\n\\n\\nclass TextRole(enum.Enum):\\n axis_title = \\\"axis_title\\\"\\n chart_title = \\\"chart_title\\\"\\n legend_label = \\\"legend_label\\\"\\n tick_grouping = \\\"tick_grouping\\\"\\n tick_label = \\\"tick_label\\\"\\n other = \\\"other\\\"\\n\\n\\n@dataclasses.dataclass\\nclass Polygon:\\n x0: int\\n x1: int\\n x2: int\\n x3: int\\n y0: int\\n y1: int\\n y2: int\\n y3: int\\n\\n def get_bounds(self):\\n xs = [\\n self.x0,\\n self.x1,\\n self.x2,\\n self.x3,\\n self.x0,\\n ]\\n ys = [\\n self.y0,\\n self.y1,\\n self.y2,\\n self.y3,\\n self.y0,\\n ]\\n return xs, ys\\n\\n\\n@dataclasses.dataclass\\nclass Text:\\n id: int\\n polygon: Polygon\\n role: TextRole\\n text: str\\n\\n def __post_init__(self):\\n self.polygon = Polygon(**self.polygon)\\n self.role = TextRole(self.role)\\n\\n\\nclass ValuesType(enum.Enum):\\n categorical = \\\"categorical\\\"\\n numerical = \\\"numerical\\\"\\n\\n\\n@dataclasses.dataclass\\nclass Tick:\\n id: int\\n x: int\\n y: int\\n\\n\\nclass TickType(enum.Enum):\\n markers = \\\"markers\\\"\\n separators = \\\"separators\\\"\\n\\n\\n@dataclasses.dataclass\\nclass Axis:\\n values_type: ValuesType\\n tick_type: TickType\\n ticks: list[Tick]\\n\\n def __post_init__(self):\\n self.values_type = ValuesType(self.values_type)\\n self.tick_type = TickType(self.tick_type)\\n self.ticks = [\\n Tick(id=kw[\\\"id\\\"], x=kw[\\\"tick_pt\\\"][\\\"x\\\"], y=kw[\\\"tick_pt\\\"][\\\"y\\\"])\\n for kw in self.ticks\\n ]\\n\\n def get_bounds(self):\\n min_x = min(tick.x for tick in self.ticks)\\n max_x = max(tick.x for tick in self.ticks)\\n min_y = min(tick.y for tick in self.ticks)\\n max_y = max(tick.y for tick in self.ticks)\\n xs = [min_x, max_x, max_x, min_x, min_x]\\n ys = [min_y, min_y, max_y, max_y, min_y]\\n return xs, ys\\n\\n\\ndef convert_dashes_to_underscores_in_key_names(dictionary):\\n return {k.replace(\\\"-\\\", \\\"_\\\"): v for k, v in dictionary.items()}\\n\\n\\n@dataclasses.dataclass\\nclass Axes:\\n x_axis: Axis\\n y_axis: Axis\\n\\n def __post_init__(self):\\n self.x_axis = Axis(**convert_dashes_to_underscores_in_key_names(self.x_axis))\\n self.y_axis = Axis(**convert_dashes_to_underscores_in_key_names(self.y_axis))\\n\\n\\ndef preprocess_numerical_value(value):\\n value = float(value)\\n value = 0 if np.isnan(value) else value\\n return value\\n\\n\\ndef preprocess_value(value, value_type: ValuesType):\\n if value_type == ValuesType.numerical:\\n return preprocess_numerical_value(value)\\n else:\\n return str(value)\\n\\n\\n@dataclasses.dataclass\\nclass Annotation:\\n source: Source\\n chart_type: ChartType\\n plot_bb: PlotBoundingBox\\n text: list[Text]\\n axes: Axes\\n data_series: list[DataPoint]\\n\\n def __post_init__(self):\\n self.source = Source(self.source)\\n self.chart_type = ChartType(self.chart_type)\\n self.plot_bb = PlotBoundingBox(**self.plot_bb)\\n self.text = [Text(**kw) for kw in self.text]\\n self.axes = Axes(**convert_dashes_to_underscores_in_key_names(self.axes))\\n self.data_series = [DataPoint(**kw) for kw in self.data_series]\\n\\n for i in range(len(self.data_series)):\\n self.data_series[i].x = preprocess_value(\\n self.data_series[i].x, self.axes.x_axis.values_type\\n )\\n self.data_series[i].y = preprocess_value(\\n self.data_series[i].y, self.axes.y_axis.values_type\\n )\\n\\n @staticmethod\\n def from_dict_with_dashes(kwargs):\\n return Annotation(**convert_dashes_to_underscores_in_key_names(kwargs))\\n\\n def get_text_by_role(self, text_role: TextRole) -> list[Text]:\\n return [t for t in self.text if t.role == text_role]\\n\\n\\n@dataclasses.dataclass\\nclass AnnotatedImage:\\n id: str\\n image: np.ndarray\\n annotation: Annotation\";\n",
+ " var nbb_formatted_code = \"class Source(enum.Enum):\\n generated = \\\"generated\\\"\\n extracted = \\\"extracted\\\"\\n\\n\\nclass ChartType(enum.Enum):\\n dot = \\\"dot\\\"\\n horizontal_bar = \\\"horizontal_bar\\\"\\n vertical_bar = \\\"vertical_bar\\\"\\n line = \\\"line\\\"\\n scatter = \\\"scatter\\\"\\n\\n\\n@dataclasses.dataclass\\nclass PlotBoundingBox:\\n height: int\\n width: int\\n x0: int\\n y0: int\\n\\n def get_bounds(self):\\n xs = [self.x0, self.x0 + self.width, self.x0 + self.width, self.x0, self.x0]\\n ys = [self.y0, self.y0, self.y0 + self.height, self.y0 + self.height, self.y0]\\n return xs, ys\\n\\n\\n@dataclasses.dataclass\\nclass DataPoint:\\n x: float or str\\n y: float or str\\n\\n\\nclass TextRole(enum.Enum):\\n axis_title = \\\"axis_title\\\"\\n chart_title = \\\"chart_title\\\"\\n legend_label = \\\"legend_label\\\"\\n tick_grouping = \\\"tick_grouping\\\"\\n tick_label = \\\"tick_label\\\"\\n other = \\\"other\\\"\\n\\n\\n@dataclasses.dataclass\\nclass Polygon:\\n x0: int\\n x1: int\\n x2: int\\n x3: int\\n y0: int\\n y1: int\\n y2: int\\n y3: int\\n\\n def get_bounds(self):\\n xs = [\\n self.x0,\\n self.x1,\\n self.x2,\\n self.x3,\\n self.x0,\\n ]\\n ys = [\\n self.y0,\\n self.y1,\\n self.y2,\\n self.y3,\\n self.y0,\\n ]\\n return xs, ys\\n\\n\\n@dataclasses.dataclass\\nclass Text:\\n id: int\\n polygon: Polygon\\n role: TextRole\\n text: str\\n\\n def __post_init__(self):\\n self.polygon = Polygon(**self.polygon)\\n self.role = TextRole(self.role)\\n\\n\\nclass ValuesType(enum.Enum):\\n categorical = \\\"categorical\\\"\\n numerical = \\\"numerical\\\"\\n\\n\\n@dataclasses.dataclass\\nclass Tick:\\n id: int\\n x: int\\n y: int\\n\\n\\nclass TickType(enum.Enum):\\n markers = \\\"markers\\\"\\n separators = \\\"separators\\\"\\n\\n\\n@dataclasses.dataclass\\nclass Axis:\\n values_type: ValuesType\\n tick_type: TickType\\n ticks: list[Tick]\\n\\n def __post_init__(self):\\n self.values_type = ValuesType(self.values_type)\\n self.tick_type = TickType(self.tick_type)\\n self.ticks = [\\n Tick(id=kw[\\\"id\\\"], x=kw[\\\"tick_pt\\\"][\\\"x\\\"], y=kw[\\\"tick_pt\\\"][\\\"y\\\"])\\n for kw in self.ticks\\n ]\\n\\n def get_bounds(self):\\n min_x = min(tick.x for tick in self.ticks)\\n max_x = max(tick.x for tick in self.ticks)\\n min_y = min(tick.y for tick in self.ticks)\\n max_y = max(tick.y for tick in self.ticks)\\n xs = [min_x, max_x, max_x, min_x, min_x]\\n ys = [min_y, min_y, max_y, max_y, min_y]\\n return xs, ys\\n\\n\\ndef convert_dashes_to_underscores_in_key_names(dictionary):\\n return {k.replace(\\\"-\\\", \\\"_\\\"): v for k, v in dictionary.items()}\\n\\n\\n@dataclasses.dataclass\\nclass Axes:\\n x_axis: Axis\\n y_axis: Axis\\n\\n def __post_init__(self):\\n self.x_axis = Axis(**convert_dashes_to_underscores_in_key_names(self.x_axis))\\n self.y_axis = Axis(**convert_dashes_to_underscores_in_key_names(self.y_axis))\\n\\n\\ndef preprocess_numerical_value(value):\\n value = float(value)\\n value = 0 if np.isnan(value) else value\\n return value\\n\\n\\ndef preprocess_value(value, value_type: ValuesType):\\n if value_type == ValuesType.numerical:\\n return preprocess_numerical_value(value)\\n else:\\n return str(value)\\n\\n\\n@dataclasses.dataclass\\nclass Annotation:\\n source: Source\\n chart_type: ChartType\\n plot_bb: PlotBoundingBox\\n text: list[Text]\\n axes: Axes\\n data_series: list[DataPoint]\\n\\n def __post_init__(self):\\n self.source = Source(self.source)\\n self.chart_type = ChartType(self.chart_type)\\n self.plot_bb = PlotBoundingBox(**self.plot_bb)\\n self.text = [Text(**kw) for kw in self.text]\\n self.axes = Axes(**convert_dashes_to_underscores_in_key_names(self.axes))\\n self.data_series = [DataPoint(**kw) for kw in self.data_series]\\n\\n for i in range(len(self.data_series)):\\n self.data_series[i].x = preprocess_value(\\n self.data_series[i].x, self.axes.x_axis.values_type\\n )\\n self.data_series[i].y = preprocess_value(\\n self.data_series[i].y, self.axes.y_axis.values_type\\n )\\n\\n @staticmethod\\n def from_dict_with_dashes(kwargs):\\n return Annotation(**convert_dashes_to_underscores_in_key_names(kwargs))\\n\\n def get_text_by_role(self, text_role: TextRole) -> list[Text]:\\n return [t for t in self.text if t.role == text_role]\\n\\n\\n@dataclasses.dataclass\\nclass AnnotatedImage:\\n id: str\\n image: np.ndarray\\n annotation: Annotation\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "class Source(enum.Enum):\n",
+ " generated = \"generated\"\n",
+ " extracted = \"extracted\"\n",
+ "\n",
+ "\n",
+ "class ChartType(enum.Enum):\n",
+ " dot = \"dot\"\n",
+ " horizontal_bar = \"horizontal_bar\"\n",
+ " vertical_bar = \"vertical_bar\"\n",
+ " line = \"line\"\n",
+ " scatter = \"scatter\"\n",
+ "\n",
+ "\n",
+ "@dataclasses.dataclass\n",
+ "class PlotBoundingBox:\n",
+ " height: int\n",
+ " width: int\n",
+ " x0: int\n",
+ " y0: int\n",
+ "\n",
+ " def get_bounds(self):\n",
+ " xs = [self.x0, self.x0 + self.width, self.x0 + self.width, self.x0, self.x0]\n",
+ " ys = [self.y0, self.y0, self.y0 + self.height, self.y0 + self.height, self.y0]\n",
+ " return xs, ys\n",
+ "\n",
+ "\n",
+ "@dataclasses.dataclass\n",
+ "class DataPoint:\n",
+ " x: float or str\n",
+ " y: float or str\n",
+ "\n",
+ "\n",
+ "class TextRole(enum.Enum):\n",
+ " axis_title = \"axis_title\"\n",
+ " chart_title = \"chart_title\"\n",
+ " legend_label = \"legend_label\"\n",
+ " tick_grouping = \"tick_grouping\"\n",
+ " tick_label = \"tick_label\"\n",
+ " other = \"other\"\n",
+ "\n",
+ "\n",
+ "@dataclasses.dataclass\n",
+ "class Polygon:\n",
+ " x0: int\n",
+ " x1: int\n",
+ " x2: int\n",
+ " x3: int\n",
+ " y0: int\n",
+ " y1: int\n",
+ " y2: int\n",
+ " y3: int\n",
+ "\n",
+ " def get_bounds(self):\n",
+ " xs = [\n",
+ " self.x0,\n",
+ " self.x1,\n",
+ " self.x2,\n",
+ " self.x3,\n",
+ " self.x0,\n",
+ " ]\n",
+ " ys = [\n",
+ " self.y0,\n",
+ " self.y1,\n",
+ " self.y2,\n",
+ " self.y3,\n",
+ " self.y0,\n",
+ " ]\n",
+ " return xs, ys\n",
+ "\n",
+ "\n",
+ "@dataclasses.dataclass\n",
+ "class Text:\n",
+ " id: int\n",
+ " polygon: Polygon\n",
+ " role: TextRole\n",
+ " text: str\n",
+ "\n",
+ " def __post_init__(self):\n",
+ " self.polygon = Polygon(**self.polygon)\n",
+ " self.role = TextRole(self.role)\n",
+ "\n",
+ "\n",
+ "class ValuesType(enum.Enum):\n",
+ " categorical = \"categorical\"\n",
+ " numerical = \"numerical\"\n",
+ "\n",
+ "\n",
+ "@dataclasses.dataclass\n",
+ "class Tick:\n",
+ " id: int\n",
+ " x: int\n",
+ " y: int\n",
+ "\n",
+ "\n",
+ "class TickType(enum.Enum):\n",
+ " markers = \"markers\"\n",
+ " separators = \"separators\"\n",
+ "\n",
+ "\n",
+ "@dataclasses.dataclass\n",
+ "class Axis:\n",
+ " values_type: ValuesType\n",
+ " tick_type: TickType\n",
+ " ticks: list[Tick]\n",
+ "\n",
+ " def __post_init__(self):\n",
+ " self.values_type = ValuesType(self.values_type)\n",
+ " self.tick_type = TickType(self.tick_type)\n",
+ " self.ticks = [\n",
+ " Tick(id=kw[\"id\"], x=kw[\"tick_pt\"][\"x\"], y=kw[\"tick_pt\"][\"y\"])\n",
+ " for kw in self.ticks\n",
+ " ]\n",
+ "\n",
+ " def get_bounds(self):\n",
+ " min_x = min(tick.x for tick in self.ticks)\n",
+ " max_x = max(tick.x for tick in self.ticks)\n",
+ " min_y = min(tick.y for tick in self.ticks)\n",
+ " max_y = max(tick.y for tick in self.ticks)\n",
+ " xs = [min_x, max_x, max_x, min_x, min_x]\n",
+ " ys = [min_y, min_y, max_y, max_y, min_y]\n",
+ " return xs, ys\n",
+ "\n",
+ "\n",
+ "def convert_dashes_to_underscores_in_key_names(dictionary):\n",
+ " return {k.replace(\"-\", \"_\"): v for k, v in dictionary.items()}\n",
+ "\n",
+ "\n",
+ "@dataclasses.dataclass\n",
+ "class Axes:\n",
+ " x_axis: Axis\n",
+ " y_axis: Axis\n",
+ "\n",
+ " def __post_init__(self):\n",
+ " self.x_axis = Axis(**convert_dashes_to_underscores_in_key_names(self.x_axis))\n",
+ " self.y_axis = Axis(**convert_dashes_to_underscores_in_key_names(self.y_axis))\n",
+ "\n",
+ "\n",
+ "def preprocess_numerical_value(value):\n",
+ " value = float(value)\n",
+ " value = 0 if np.isnan(value) else value\n",
+ " return value\n",
+ "\n",
+ "\n",
+ "def preprocess_value(value, value_type: ValuesType):\n",
+ " if value_type == ValuesType.numerical:\n",
+ " return preprocess_numerical_value(value)\n",
+ " else:\n",
+ " return str(value)\n",
+ "\n",
+ "\n",
+ "@dataclasses.dataclass\n",
+ "class Annotation:\n",
+ " source: Source\n",
+ " chart_type: ChartType\n",
+ " plot_bb: PlotBoundingBox\n",
+ " text: list[Text]\n",
+ " axes: Axes\n",
+ " data_series: list[DataPoint]\n",
+ "\n",
+ " def __post_init__(self):\n",
+ " self.source = Source(self.source)\n",
+ " self.chart_type = ChartType(self.chart_type)\n",
+ " self.plot_bb = PlotBoundingBox(**self.plot_bb)\n",
+ " self.text = [Text(**kw) for kw in self.text]\n",
+ " self.axes = Axes(**convert_dashes_to_underscores_in_key_names(self.axes))\n",
+ " self.data_series = [DataPoint(**kw) for kw in self.data_series]\n",
+ "\n",
+ " for i in range(len(self.data_series)):\n",
+ " self.data_series[i].x = preprocess_value(\n",
+ " self.data_series[i].x, self.axes.x_axis.values_type\n",
+ " )\n",
+ " self.data_series[i].y = preprocess_value(\n",
+ " self.data_series[i].y, self.axes.y_axis.values_type\n",
+ " )\n",
+ "\n",
+ " @staticmethod\n",
+ " def from_dict_with_dashes(kwargs):\n",
+ " return Annotation(**convert_dashes_to_underscores_in_key_names(kwargs))\n",
+ "\n",
+ " def get_text_by_role(self, text_role: TextRole) -> list[Text]:\n",
+ " return [t for t in self.text if t.role == text_role]\n",
+ "\n",
+ "\n",
+ "@dataclasses.dataclass\n",
+ "class AnnotatedImage:\n",
+ " id: str\n",
+ " image: np.ndarray\n",
+ " annotation: Annotation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "bd47811f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 13;\n",
+ " var nbb_unformatted_code = \"def load_annotated_images(image_ids):\\n annotated_images = []\\n for image_id in tqdm.autonotebook.tqdm(\\n image_ids, desc=\\\"Loading images and annotations\\\"\\n ):\\n annotated_images.append(\\n AnnotatedImage(\\n id=image_id,\\n image=load_image(image_id),\\n annotation=Annotation.from_dict_with_dashes(\\n load_image_annotation(image_id)\\n ),\\n )\\n )\\n return annotated_images\";\n",
+ " var nbb_formatted_code = \"def load_annotated_images(image_ids):\\n annotated_images = []\\n for image_id in tqdm.autonotebook.tqdm(\\n image_ids, desc=\\\"Loading images and annotations\\\"\\n ):\\n annotated_images.append(\\n AnnotatedImage(\\n id=image_id,\\n image=load_image(image_id),\\n annotation=Annotation.from_dict_with_dashes(\\n load_image_annotation(image_id)\\n ),\\n )\\n )\\n return annotated_images\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def load_annotated_images(image_ids):\n",
+ " annotated_images = []\n",
+ " for image_id in tqdm.autonotebook.tqdm(\n",
+ " image_ids, desc=\"Loading images and annotations\"\n",
+ " ):\n",
+ " annotated_images.append(\n",
+ " AnnotatedImage(\n",
+ " id=image_id,\n",
+ " image=load_image(image_id),\n",
+ " annotation=Annotation.from_dict_with_dashes(\n",
+ " load_image_annotation(image_id)\n",
+ " ),\n",
+ " )\n",
+ " )\n",
+ " return annotated_images"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "6ef5dc1b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "e7a82f0bc0a04be6af05921510b1acfa",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Loading images and annotations: 0%| | 0/1000 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 14;\n",
+ " var nbb_unformatted_code = \"DATA.annotated_images = load_annotated_images(load_train_image_ids())\";\n",
+ " var nbb_formatted_code = \"DATA.annotated_images = load_annotated_images(load_train_image_ids())\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "DATA.annotated_images = load_annotated_images(load_train_image_ids())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dad819b2",
+ "metadata": {},
+ "source": [
+ "### Data exploration "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "f165119d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 15;\n",
+ " var nbb_unformatted_code = \"def are_there_nan_values_in_axis_data():\\n for annotated_image in DATA.annotated_images:\\n for datapoint in annotated_image.annotation.data_series:\\n for value in [datapoint.x, datapoint.y]:\\n if not isinstance(value, str) and np.isnan(value):\\n return True\\n return False\";\n",
+ " var nbb_formatted_code = \"def are_there_nan_values_in_axis_data():\\n for annotated_image in DATA.annotated_images:\\n for datapoint in annotated_image.annotation.data_series:\\n for value in [datapoint.x, datapoint.y]:\\n if not isinstance(value, str) and np.isnan(value):\\n return True\\n return False\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def are_there_nan_values_in_axis_data():\n",
+ " for annotated_image in DATA.annotated_images:\n",
+ " for datapoint in annotated_image.annotation.data_series:\n",
+ " for value in [datapoint.x, datapoint.y]:\n",
+ " if not isinstance(value, str) and np.isnan(value):\n",
+ " return True\n",
+ " return False"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "3ff0494b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "False\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 16;\n",
+ " var nbb_unformatted_code = \"print(are_there_nan_values_in_axis_data())\";\n",
+ " var nbb_formatted_code = \"print(are_there_nan_values_in_axis_data())\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "print(are_there_nan_values_in_axis_data())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "21b4baa0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 17;\n",
+ " var nbb_unformatted_code = \"def get_image(image_index: int) -> np.ndarray:\\n return DATA.annotated_images[image_index].image\\n\\n\\ndef build_random_image_animation(n_images=100, fps=1, figsize=(6, 4)):\\n image_indices = np.random.permutation(len(DATA.annotated_images))[:n_images]\\n first_image = get_image(image_indices[0])\\n\\n fig, ax = plt.subplots(figsize=figsize)\\n frame = plt.imshow(first_image)\\n plt.axis(\\\"off\\\")\\n plt.close()\\n\\n def animate(frame_index):\\n image_index = image_indices[frame_index]\\n image = get_image(image_index)\\n frame.set_data(image)\\n\\n return matplotlib.animation.FuncAnimation(\\n fig=fig,\\n func=animate,\\n frames=len(image_indices),\\n interval=int(1000 / fps),\\n )\";\n",
+ " var nbb_formatted_code = \"def get_image(image_index: int) -> np.ndarray:\\n return DATA.annotated_images[image_index].image\\n\\n\\ndef build_random_image_animation(n_images=100, fps=1, figsize=(6, 4)):\\n image_indices = np.random.permutation(len(DATA.annotated_images))[:n_images]\\n first_image = get_image(image_indices[0])\\n\\n fig, ax = plt.subplots(figsize=figsize)\\n frame = plt.imshow(first_image)\\n plt.axis(\\\"off\\\")\\n plt.close()\\n\\n def animate(frame_index):\\n image_index = image_indices[frame_index]\\n image = get_image(image_index)\\n frame.set_data(image)\\n\\n return matplotlib.animation.FuncAnimation(\\n fig=fig,\\n func=animate,\\n frames=len(image_indices),\\n interval=int(1000 / fps),\\n )\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def get_image(image_index: int) -> np.ndarray:\n",
+ " return DATA.annotated_images[image_index].image\n",
+ "\n",
+ "\n",
+ "def build_random_image_animation(n_images=100, fps=1, figsize=(6, 4)):\n",
+ " image_indices = np.random.permutation(len(DATA.annotated_images))[:n_images]\n",
+ " first_image = get_image(image_indices[0])\n",
+ "\n",
+ " fig, ax = plt.subplots(figsize=figsize)\n",
+ " frame = plt.imshow(first_image)\n",
+ " plt.axis(\"off\")\n",
+ " plt.close()\n",
+ "\n",
+ " def animate(frame_index):\n",
+ " image_index = image_indices[frame_index]\n",
+ " image = get_image(image_index)\n",
+ " frame.set_data(image)\n",
+ "\n",
+ " return matplotlib.animation.FuncAnimation(\n",
+ " fig=fig,\n",
+ " func=animate,\n",
+ " frames=len(image_indices),\n",
+ " interval=int(1000 / fps),\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "0d592d35",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 18;\n",
+ " var nbb_unformatted_code = \"IPython.display.HTML(build_random_image_animation().to_html5_video())\";\n",
+ " var nbb_formatted_code = \"IPython.display.HTML(build_random_image_animation().to_html5_video())\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "IPython.display.HTML(build_random_image_animation().to_html5_video())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "edf90004",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " width | \n",
+ " height | \n",
+ " channel | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " count | \n",
+ " 1000.000000 | \n",
+ " 1000.000000 | \n",
+ " 1000.0 | \n",
+ "
\n",
+ " \n",
+ " mean | \n",
+ " 509.395000 | \n",
+ " 320.922000 | \n",
+ " 3.0 | \n",
+ "
\n",
+ " \n",
+ " std | \n",
+ " 88.527352 | \n",
+ " 82.217003 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " min | \n",
+ " 433.000000 | \n",
+ " 211.000000 | \n",
+ " 3.0 | \n",
+ "
\n",
+ " \n",
+ " 25% | \n",
+ " 470.000000 | \n",
+ " 278.000000 | \n",
+ " 3.0 | \n",
+ "
\n",
+ " \n",
+ " 50% | \n",
+ " 489.500000 | \n",
+ " 293.000000 | \n",
+ " 3.0 | \n",
+ "
\n",
+ " \n",
+ " 75% | \n",
+ " 506.000000 | \n",
+ " 326.250000 | \n",
+ " 3.0 | \n",
+ "
\n",
+ " \n",
+ " max | \n",
+ " 1280.000000 | \n",
+ " 880.000000 | \n",
+ " 3.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " width height channel\n",
+ "count 1000.000000 1000.000000 1000.0\n",
+ "mean 509.395000 320.922000 3.0\n",
+ "std 88.527352 82.217003 0.0\n",
+ "min 433.000000 211.000000 3.0\n",
+ "25% 470.000000 278.000000 3.0\n",
+ "50% 489.500000 293.000000 3.0\n",
+ "75% 506.000000 326.250000 3.0\n",
+ "max 1280.000000 880.000000 3.0"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAMWCAYAAAAgRDUeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACuxElEQVR4nOzdeXzU1b3/8ffMZJZMkklIyMomCLJoFAsaolQtQsJSq5Vfq5YqLlerBavSotLrwqJiua1rUWvrBXsLtbWtVpEiERWqhIBUlEURBQWBLCRkncz+/f1BM2VMwADJTDK8no+bR2bO93y/33Pmk3KPnznfc0yGYRgCAAAAAAAAosgc6wYAAAAAAADg5ENSCgAAAAAAAFFHUgoAAAAAAABRR1IKAAAAAAAAUUdSCgAAAAAAAFFHUgoAAAAAAABRR1IKAAAAAAAAUUdSCgAAAAAAAFFHUgoAAAAAAABRR1IKADrI7NmzZTKZdODAgVg3BQAA4IS9/fbbMplMevvtt7+27kUXXaSLLrqoXde96KKLdMYZZ5xY4wDEBZJSAE7Y4sWLZTKZ9N5778W6KQAAAPi3P//5zzKZTHrppZdaHTvrrLNkMpn01ltvtTrWt29fnXfeeSd073379mn27NnatGnTCV0HQHwjKQUAAAAAcWj06NGSpHfeeSeivL6+Xlu2bFFCQoLefffdiGN79uzRnj17NHr0aF1wwQVqbm7WBRdccMz33rdvn+bMmUNSCsBRJcS6AQAAAACAjpeXl6f+/fu3SkqVlpbKMAx973vfa3Ws5f3o0aNlNpvlcDii1l4AJx9mSgHoFNdee62Sk5O1e/duffvb31ZycrJ69eqlhQsXSpI2b96sMWPGKCkpSf369dPSpUsjzq+pqdHPfvYz5efnKzk5WS6XSxMmTNAHH3zQ6l5ffPGFvvOd7ygpKUlZWVm644479Prrr7e5BkJZWZnGjx+v1NRUOZ1OXXjhha2+ITySJ598UqeffrqcTqd69OihkSNHtmq3JNXW1uraa69VWlqaUlNTdd1118ntdkfUWbRokcaMGaOsrCzZ7XYNGzZMTz/9dKtrnXLKKfr2t7+tlStXavjw4XI4HBo2bJj+9re/tXnf22+/XX369JHdbtfAgQP1i1/8QqFQKKLeCy+8oBEjRiglJUUul0v5+fl6/PHH2/UZAACA7mX06NF6//331dzcHC579913dfrpp2vChAlat25dxFjh3Xfflclk0vnnn3/ENaWeffZZnXrqqUpMTNS5556rf/7znxHH3377bZ1zzjmSpOuuu04mk0kmk0mLFy+OqLdt2zZ961vfktPpVK9evbRgwYKO7TyALo+kFIBOEwwGNWHCBPXp00cLFizQKaecounTp2vx4sUaP368Ro4cqV/84hdKSUnRNddco127doXP3blzp15++WV9+9vf1iOPPKKZM2dq8+bNuvDCC7Vv375wvaamJo0ZM0ZvvPGGfvKTn+i///u/tXbtWt11112t2vPmm2/qggsuUH19ve6//3499NBDqq2t1ZgxY7R+/fqj9uW3v/2tfvKTn2jYsGF67LHHNGfOHA0fPlxlZWWt6n7/+99XQ0OD5s+fr+9///tavHix5syZE1Hn6aefVr9+/fTzn/9cv/rVr9SnTx/9+Mc/DiftDrdjxw5dccUVmjBhgubPn6+EhAR973vfU0lJSbiO2+3WhRdeqD/84Q+65ppr9MQTT+j888/XrFmzNGPGjHC9kpISXXXVVerRo4d+8Ytf6OGHH9ZFF13U7sQcAADoXkaPHi2/3x8xZnn33Xd13nnn6bzzzlNdXZ22bNkScWzIkCHKyMho83rPPfecfvSjHyknJ0cLFizQ+eefr+985zvas2dPuM7QoUM1d+5cSdJNN92k//u//9P//d//RTwGePDgQY0fP15nnXWWfvWrX2nIkCG666679I9//KOjPwIAXZkBACdo0aJFhiRjw4YN4bKpU6cakoyHHnooXHbw4EEjMTHRMJlMxgsvvBAu//jjjw1Jxv333x8u83g8RjAYjLjPrl27DLvdbsydOzdc9qtf/cqQZLz88svhsubmZmPIkCGGJOOtt94yDMMwQqGQMWjQIKO4uNgIhULhum632+jfv78xbty4o/bx0ksvNU4//fSj1rn//vsNScb1118fUf7d737XyMjIiChzu92tzi8uLjYGDBgQUdavXz9DkvHXv/41XFZXV2fk5uYaZ599drhs3rx5RlJSkvHJJ59EnH/33XcbFovF2L17t2EYhnHbbbcZLpfLCAQCR+0LAACID1u3bjUkGfPmzTMMwzD8fr+RlJRkPP/884ZhGEZ2draxcOFCwzAMo76+3rBYLMaNN95oGIZhvPXWWxHjKZ/PZ2RlZRnDhw83vF5v+B7PPvusIcm48MILw2UbNmwwJBmLFi1q1aYLL7zQkGT8/ve/D5d5vV4jJyfHmDx5ckd2H0AXx0wpAJ3qv/7rv8Kv09LSNHjwYCUlJen73/9+uHzw4MFKS0vTzp07w2V2u11m86F/ooLBoKqrq5WcnKzBgwfrX//6V7jeihUr1KtXL33nO98JlzkcDt14440R7di0aZN27NihH/zgB6qurtaBAwd04MABNTU16eKLL9aaNWtaPeZ2uLS0NH355ZfasGHD1/b55ptvjnj/zW9+U9XV1aqvrw+XJSYmhl/X1dXpwIEDuvDCC7Vz507V1dVFnJ+Xl6fvfve74fcul0vXXHON3n//fZWXl0uSXnzxRX3zm99Ujx49wn07cOCAxo4dq2AwqDVr1oT70dTUFDHLCgAAxK+hQ4cqIyMjvFbUBx98oKampvDueuedd154xnRpaamCwWB4gfSveu+991RZWambb75ZNpstXH7ttdcqNTX1mNqVnJysH/7wh+H3NptN5557bsR4EED8Y6FzAJ3G4XAoMzMzoiw1NVW9e/eWyWRqVX7w4MHw+1AopMcff1xPPfWUdu3apWAwGD52+HTyL774Qqeeemqr6w0cODDi/Y4dOyRJU6dOPWJ76+rq1KNHjzaP3XXXXXrjjTd07rnnauDAgSoqKtIPfvADnX/++a3q9u3bN+J9yzUPHjwol8sl6dDU+Pvvv1+lpaWt1puqq6uLGNgNHDiwVf9OO+00SdLnn3+unJwc7dixQx9++GGrz7tFZWWlJOnHP/6x/vznP2vChAnq1auXioqK9P3vf1/jx48/4ucCAAC6L5PJpPPOOy/8Bdy7776rrKys8FjpvPPO069//WtJCienjpSU+uKLLyRJgwYNiii3Wq0aMGDAMbWrrfFgjx499OGHHx7TdQB0bySlAHQai8VyTOWGYYRfP/TQQ7r33nt1/fXXa968eUpPT5fZbNbtt99+1BlNR9Jyzv/8z/9o+PDhbdZJTk4+4vlDhw7V9u3btWzZMq1YsUJ//etf9dRTT+m+++5rtV7U1/Xvs88+08UXX6whQ4bokUceUZ8+fWSz2bR8+XI9+uijx92/cePG6c4772zzeEsSKysrS5s2bdLrr7+uf/zjH/rHP/6hRYsW6ZprrtHzzz9/zPcFAABd3+jRo/Xqq69q8+bN4fWkWpx33nmaOXOm9u7dq3feeUd5eXnHnGA6Hu0ZDwKIfySlAHRJf/nLX/Stb31Lzz33XER5bW2tevbsGX7fr18/bdu2TYZhRHzb9umnn0acd+qpp0o69Ojb2LFjj6tNSUlJuuKKK3TFFVfI5/Pp8ssv14MPPqhZs2Yd03bJr776qrxer1555ZWIWVVvvfVWm/U//fTTVv375JNPJB3anU861L/GxsZ29c1ms+mSSy7RJZdcolAopB//+Mf6zW9+o3vvvbfVDDMAAND9tcx8euedd/Tuu+/q9ttvDx8bMWKE7Ha73n77bZWVlWnixIlHvE6/fv0kHZqBPmbMmHC53+/Xrl27dNZZZ4XLvjoLCgDawppSALoki8XS6puyF198UXv37o0oKy4u1t69e/XKK6+Eyzwej377299G1BsxYoROPfVU/fKXv1RjY2Or+1VVVR21PdXV1RHvbTabhg0bJsMw5Pf729WnFi3fDB7ev7q6Oi1atKjN+vv27dNLL70Ufl9fX6/f//73Gj58uHJyciQd2vGvtLRUr7/+eqvza2trFQgE2uyH2WzWmWeeKUnyer3H1A8AANA9jBw5Ug6HQ0uWLNHevXsjZkrZ7XZ94xvf0MKFC9XU1HTER/darpOZmalnnnlGPp8vXL548WLV1tZG1E1KSpKkVuUAcDhmSgHokr797W9r7ty5uu6663Teeedp8+bNWrJkSavp5D/60Y/061//WldddZVuu+025ebmasmSJeGZSy3f0pnNZv3ud7/ThAkTdPrpp+u6665Tr169tHfvXr311ltyuVx69dVXj9ieoqIi5eTk6Pzzz1d2drY++ugj/frXv9akSZOUkpJyTH0rKioKz1b60Y9+pMbGRv32t79VVlaW9u/f36r+aaedphtuuEEbNmxQdna2/vd//1cVFRURSayZM2fqlVde0be//W1de+21GjFihJqamrR582b95S9/0eeff66ePXvqv/7rv1RTU6MxY8aod+/e+uKLL/Tkk09q+PDhGjp06DH1AwAAdA82m03nnHOO/vnPf8put2vEiBERx8877zz96le/knTk9aSkQ2tHPfDAA/rRj36kMWPG6IorrtCuXbu0aNGiVmO0U089VWlpaXrmmWeUkpKipKQkFRQUqH///h3fQQDdFjOlAHRJP//5z/XTn/5Ur7/+um677Tb961//0muvvaY+ffpE1EtOTtabb76pMWPG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2dqyZYueeeYZTZ06tdPuO2vWLM2YMSP8vr6+Xn369FFRUZFcLpekQ994lpSUaNy4cbJarZ3WFnQu4hgfiGN8II7xgTi2rWXWNQAAANovpkmp3NxcDRs2LKJs6NCh+utf/ypJysnJkSRVVFQoNzc3XKeiokLDhw8P16msrIy4RiAQUE1NTfj8r7Lb7bLb7a3KrVZrqwF2W2XofohjfCCO8YE4xgfiGInPAgAA4NjFdPe9888/X9u3b48o++STT9SvXz9JhxY9z8nJ0apVq8LH6+vrVVZWpsLCQklSYWGhamtrtXHjxnCdN998U6FQSAUFBVHoRXzy+IOqafLJ4w/GuikAAAAAACAOHVdSau7cuW2undDc3Ky5c+e2+zp33HGH1q1bp4ceekiffvqpli5dqmeffVbTpk2TJJlMJt1+++164IEH9Morr2jz5s265pprlJeXp8suu0zSoZlV48eP14033qj169fr3Xff1fTp03XllVey895x2lvbrOWb92vZB/u0fPN+7a1tjnWTAAAAAABAnDmupNScOXPU2NjYqtztdre5gPiRnHPOOXrppZf0xz/+UWeccYbmzZunxx57TFOmTAnXufPOO3Xrrbfqpptu0jnnnKPGxkatWLFCDocjXGfJkiUaMmSILr74Yk2cOFGjR4/Ws88+ezxdO+l5/EGV7axWnduv9CSb6tx+le2sZsYUAAAAAADoUMe1ppRhGDKZTK3KP/jgA6Wnpx/Ttb797W/r29/+9hGPm0wmzZ0796gzsNLT07V06dJjui/a5vYF1egJKDPFLofVoswUu2qafGr2BeWwWmLdPAAAAAAAECeOKSnVo0cPmUwmmUwmnXbaaRGJqWAwqMbGRt18880d3khEj9NmUbIjQVUNXmWm2FXV4FWq06pEGwkpAAAAAADQcY4pKfXYY4/JMAxdf/31mjNnjlJTU8PHbDabTjnllPAC5OieHFaLCgZkqGxntWqafEp1WlUwIINZUgAAAAAAoEMdU1Jq6tSpkg7tinfeeeex/XGc6pWWqIn5uWr2BZVos5CQAgAAAAAAHe641pS68MILFQqF9Mknn6iyslKhUCji+AUXXNAhjUPsOKwkowAAAAAAQOc5rqTUunXr9IMf/EBffPGFDMOIOGYymRQMslMbAAAAAAAAjuy4klI333yzRo4cqddee025ublt7sQHAAAA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Oaandkc6O+m2j5qhongBc4t4OZFhPUgM05JLSYCIjgOzfn/043ucwGFAWMPA8/l4zAPWZ33Wd73Xm6V+ffH5ri87EqEUsMO6/fbb071796xdu7Yytnr16lRXV2fYsGHN5q4Po/r27ZvFixenR48erT7P5MmTc8QRR2ylqgEAAHYOQilghzV8+PCsXr06zz77bGXsF7/4Rerq6jJ37ty8/fbblfHHHnssAwYMyAEHHJC6urpUVVW1RckAAAA7DaEUsMM64IAD0rdv38yaNasyNmvWrHzyk5/MoEGD8tRTTzUbHz58+EY/vjd16tQMGDAgXbt2zemnn57XX3+92b4pU6bkV7/6VaqqqlJVVZWpU6dW9v/lL3/J6aefnq5du2a//fbLvffeuy0vGQAAoN0QSgE7tOHDh+exxx6rbD/22GMZNmxYjj/++Mr4W2+9lblz52b48OEbHD937tycf/75mTBhQubNm5fhw4fnhhtuqOw/88wzc9lll+Xggw/O4sWLs3jx4px55pmV/VOmTMmnPvWpPP/88znllFMyduzYLF++fBteMQAAQPsglAJ2aMOHD89//ud/Zu3atXnjjTfyy1/+Mscff3yOO+64ygqqOXPmpKGhYaOh1De+8Y2cdNJJufzyy7P//vvnC1/4QkaNGlXZ36VLl3Tr1i2dOnVKXV1d6urq0qVLl8r+8847L2effXYGDx6cm266KatXr87TTz+9za8bAABgeyeUAnZow4YNy5tvvplnnnkmv/jFL7L//vtnjz32yPHHH195rtSsWbOyzz77ZMCAARsc/9vf/jZDhw5tNlZfX9/q8x922GGV3++6666pra3NsmXLtvyCAAAAdhCd2roAgG1p8ODB2WuvvfLYY4/lr3/9a44//vgkSb9+/dK/f/88+eSTeeyxx/Lxj398m5y/urq62XZVVVWampq2ybkAAADaEyulgB3e+geYz5o1K8OGDauMH3fccXnggQfy9NNPb/Sje0ly4IEHZu7cuc3G3v2A9CTp3Llz1q1bt9XrBgAA2JEJpYAd3vDhw/PEE09k3rx5lZVSSXL88cfnf/7P/5l33nnnPUOpL3zhC5kxY0a+9rWv5cUXX8z/+B//IzNmzGg2Z++9986iRYsyb968/OUvf0lDQ8M2vR4AAIAdgVAK2OENHz48b731VgYPHpw+ffpUxo8//vi88cYbOeCAA9K3b9+NHnvsscfmu9/9br7xjW/k8MMPz0MPPZSvfOUrzeaMGTMmJ510UoYPH5499tgjP/zhD7fp9QAAAOwIqoqiKNq6CAAAAAB2LlZKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRTAezjvvPOy9957b/Gx3bp127oFAQAA7ECEUkC7N3Xq1FRVVeXZZ5/d6P5hw4blkEMOKbmq1lmzZk0mT56cWbNmtXUpAAAAperU1gUAbK+++93vpqmpaZueY82aNZkyZUqSv4VnAAAAOwuhFMB7qK6ubusSAAAAdlg+vgfslH7wgx/kqKOOSpcuXdKrV6+cddZZefXVV5vN2dgzpV5//fWcc845qa2tTc+ePXPuuefmV7/6VaqqqjJ16tQNzvOnP/0pp512Wrp165Y99tgjX/ziF7Nu3bokycsvv5w99tgjSTJlypRUVVWlqqoqkydP3haXDAAAsF2xUgrYYaxcuTJ/+ctfNhhvbGxstn3jjTfm6quvzqc+9an84z/+Y/785z/nW9/6Vo477rj88pe/TM+ePTf6+k1NTTn11FPz9NNPZ9y4cRkyZEh+9rOf5dxzz93o/HXr1mXUqFEZOnRovva1r+Xhhx/OP//zP2fffffNuHHjsscee+S2227LuHHjcvrpp+eMM85Ikhx22GHvrxEAAADtgFAK2GGMGDHiPfcdfPDBSZI//OEPufbaa3PDDTfkqquuquw/44wzcuSRR+bb3/52s/F3u+eeezJnzpx8/etfz8UXX5wkGTduXE488cSNzn/77bdz5pln5uqrr06SXHTRRfngBz+Y733vexk3blx23XXX/Jf/8l8ybty4HHbYYfnMZz6zRdcNAADQHgmlgB3Grbfemv3333+D8csuu6zykbm77rorTU1N+dSnPtVsVVVdXV3222+/PPbYY+8ZSs2YMSPV1dW54IILKmMdOnTI+PHj8+ijj270mIsuuqjZ9sc+9rH8+7//+2ZfGwAAwI5GKAXsMI455pgcffTRG4x/4AMfqARQL774YoqiyH777bfR12jp4eZ/+MMf0rdv33Tt2rXZ+ODBgzc6f5dddqk8M+rdtfz1r39t8ToAAAB2BkIpYKfS1NSUqqqqPPDAA+nYseMG+7t167bVzrWx1wcAAOBvhFLATmXfffdNURQZNGjQRj/q15KBAwfmsccey5o1a5qtllq4cOEW11NVVbXFxwIAALRnHdq6AIAynXHGGenYsWOmTJmSoiia7SuKIq+//vp7Hjtq1Kg0Njbmu9/9bmWsqakpt9566xbXsz7cWrFixRa/BgAAQHtkpRSwU9l3331zww03ZNKkSXn55Zdz2mmnpXv37lm0aFHuvvvuXHjhhfniF7+40WNPO+20HHPMMbnsssuycOHCDBkyJPfee2+WL1+eZMtWPXXp0iUHHXRQfvzjH2f//fdPr169csghh+SQQw55X9cJAACwvbNSCtjpXHnllfk//+f/pEOHDpkyZUq++MUv5t57783IkSPziU984j2P69ixY+67776ceeaZ+f73v58vf/nL6devX2Wl1C677LJF9fzbv/1b9txzz1x66aU5++yz8x//8R9b9DoAAADtSVXx959fAWCz3HPPPTn99NPzxBNP5CMf+UhblwMAANAuCKUANsNbb72VLl26VLbXrVuXkSNH5tlnn82SJUua7QMAAOC9eaYUwGb4/Oc/n7feeiv19fVpaGjIXXfdlSeffDI33XSTQAoAAGAzWCkFsBmmTZuWf/7nf87ChQvz9ttvZ/DgwRk3blwmTJjQ1qUBAAC0K0IpAAAAAErn2/cAAAAAKJ1QCgAAAIDSCaUAAAAAKJ1v30vS1NSU1157Ld27d09VVVVblwMAtDNFUeSNN95Iv3790qGDv/MDAGgNoVSS1157Lf3792/rMgCAdu7VV1/NXnvt1dZlAAC0C0KpJN27d0/ytzeStbW1m318Y2NjHnrooYwcOTLV1dVbu7x2T39apj+bpkct05+W6U/L9GfTWtOjVatWpX///pX3FAAAbJpQKql8ZK+2tnaLQ6muXbumtrbWG/qN0J+W6c+m6VHL9Kdl+tMy/dm0zemRxwAAALSehx4AAAAAUDqhFAAAAAClE0oBAAAAUDqhFAAAAAClE0oBAAAAUDqhFAAAAAClE0oBAAAAUDqhFAAAAAClE0oBAAAAUDqhFAAAAAClE0oBAAAAUDqhFAAAAACl69TWBdA+7H3lfa2a9/Ito7dxJQAAAMCOwEopAAAAAEonlAIAAACgdEIpAAAAAErXpqHUzTffnA996EPp3r17evfundNOOy0LFixoNmfYsGGpqqpq9nPRRRc1m/PKK69k9OjR6dq1a3r37p0vfelLWbt2bZmXAgAAAMBmaNMHnc+ePTvjx4/Phz70oaxduzZXXXVVRo4cmd/85jfZddddK/MuuOCCXHfddZXtrl27Vn6/bt26jB49OnV1dXnyySezePHi/MM//EOqq6tz0003lXo9AAAAALROm4ZSM2bMaLY9derU9O7dO88991yOO+64ynjXrl1TV1e30dd46KGH8pvf/CYPP/xw+vTpkyOOOCLXX399rrjiikyePDmdO3feptcAAAAAwOZr01Dq761cuTJJ0qtXr2bjd955Z37wgx+krq4up556aq6++urKaqk5c+bk0EMPTZ8+fSrzR40alXHjxuWFF17IkUceucF5Ghoa0tDQUNletWpVkqSxsTGNjY2bXff6Y7bk2PaipmPRqnkb68HO0J/3Q382TY9apj8t05+W6c+mtaZH+gcAsPmqiqJoXdqwjTU1NeUTn/hEVqxYkSeeeKIy/p3vfCcDBw5Mv3798vzzz+eKK67IMccck7vuuitJcuGFF+YPf/hDHnzwwcoxa9asya677pr7778/J5988gbnmjx5cqZMmbLB+LRp05p9NBAAoDXWrFmTT3/601m5cmVqa2vbuhwAgHZhu1kpNX78+MyfP79ZIJX8LXRa79BDD03fvn1zwgkn5KWXXsq+++67ReeaNGlSJk6cWNletWpV+vfvn5EjR27RG8nGxsbMnDkzJ554Yqqrq7eopu3dIZMf3PSkJPMnj9pgbGfoz/uhP5umRy3Tn5bpT8v0Z9Na06P1q64BAGi97SKUmjBhQqZPn57HH388e+21V4tzhw4dmiRZuHBh9t1339TV1eXpp59uNmfp0qVJ8p7PoaqpqUlNTc0G49XV1e/rDfn7PX571rCuqlXzWrr+Hbk/W4P+bJoetUx/WqY/LdOfTWupR3oHALD5OrTlyYuiyIQJE3L33Xfn0UcfzaBBgzZ5zLx585Ikffv2TZLU19fn17/+dZYtW1aZM3PmzNTW1uaggw7aJnUDAAAA8P606Uqp8ePHZ9q0afnZz36W7t27Z8mSJUmSHj16pEuXLnnppZcybdq0nHLKKdltt93y/PPP59JLL81xxx2Xww47LEkycuTIHHTQQTnnnHPy1a9+NUuWLMlXvvKVjB8/fqOroQAAAABoe226Uuq2227LypUrM2zYsPTt27fy8+Mf/zhJ0rlz5zz88MMZOXJkhgwZkssuuyxjxozJz3/+88prdOzYMdOnT0/Hjh1TX1+fz3zmM/mHf/iHXHfddW11WQAAAABsQpuulNrUF//1798/s2fP3uTrDBw4MPfff//WKgsAAACAbaxNV0oBAAAAsHMSSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQujYNpW6++eZ86EMfSvfu3dO7d++cdtppWbBgQbM5b7/9dsaPH5/ddtst3bp1y5gxY7J06dJmc1555ZWMHj06Xbt2Te/evfOlL30pa9euLfNSAAAAANgMbRpKzZ49O+PHj89TTz2VmTNnprGxMSNHjsybb75ZmXPppZfm5z//eX76059m9uzZee2113LGGWdU9q9bty6jR4/OO++8kyeffDLf//73M3Xq1FxzzTVtcUkAAAAAtEKntjz5jBkzmm1PnTo1vXv3znPPPZfjjjsuK1euzPe+971MmzYtH//4x5Mkd9xxRw488MA89dRTOfbYY/PQQw/lN7/5TR5++OH06dMnRxxxRK6//vpcccUVmTx5cjp37twWlwYAAABAC7arZ0qtXLkySdKrV68kyXPPPZfGxsaMGDGiMmfIkCEZMGBA5syZkySZM2dODj300PTp06cyZ9SoUVm1alVeeOGFEqsHAAAAoLXadKXUuzU1NeWSSy7JRz7ykRxyyCFJkiVLlqRz587p2bNns7l9+vTJkiVLKnPeHUit379+38Y0NDSkoaGhsr1q1aokSWNjYxobGze79vXHbMmx7UVNx6JV8zbWg52hP++H/myaHrVMf1qmPy3Tn01rTY/0DwBg8203odT48eMzf/78PPHEE9v8XDfffHOmTJmywfhDDz2Url27bvHrzpw58/2UtV376jGtm3f//fe/574duT9bg/5smh61TH9apj8t059Na6lHa9asKbESAIAdw3YRSk2YMCHTp0/P448/nr322qsyXldXl3feeScrVqxotlpq6dKlqaurq8x5+umnm73e+m/nWz/n702aNCkTJ06sbK9atSr9+/fPyJEjU1tbu9n1NzY2ZubMmTnxxBNTXV292ce3B4dMfrBV8+ZPHrXB2M7Qn/dDfzZNj1qmPy3Tn5bpz6a1pkfrV10DANB6bRpKFUWRz3/+87n77rsza9asDBo0qNn+o446KtXV1XnkkUcyZsyYJMmCBQvyyiuvpL6+PklSX1+fG2+8McuWLUvv3r2T/O1vMmtra3PQQQdt9Lw1NTWpqanZYLy6uvp9vSF/v8dvzxrWVbVqXkvXvyP3Z2vQn03To5bpT8v0p2X6s2kt9UjvAAA2X5uGUuPHj8+0adPys5/9LN27d688A6pHjx7p0qVLevTokfPPPz8TJ05Mr169Ultbm89//vOpr6/PsccemyQZOXJkDjrooJxzzjn56le/miVLluQrX/lKxo8fv9HgCQAAAIC216ah1G233ZYkGTZsWLPxO+64I+edd16S5F//9V/ToUOHjBkzJg0NDRk1alS+/e1vV+Z27Ngx06dPz7hx41JfX59dd9015557bq677rqyLgMAAACAzdTmH9/blF122SW33nprbr311vecM3DgwBYfsA0AAADA9qVDWxcAAAAAwM5HKAUAAABA6YRSAAAAAJROKAUAAABA6YRSAAAAAJROKAUAAABA6YRSAAAAAJROKAUAAABA6YRSAAAAAJSuU1sXQNva+8r72roEAAAAYCdkpRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApevU1gWwY9n7yvs2GKvpWOSrxySHTH4wDeuq8vIto9ugMgAAAGB7YqUUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKUTSgEAAABQOqEUAAAAAKVr01Dq8ccfz6mnnpp+/fqlqqoq99xzT7P95513Xqqqqpr9nHTSSc3mLF++PGPHjk1tbW169uyZ888/P6tXry7xKgAAAADYXG0aSr355ps5/PDDc+utt77nnJNOOimLFy+u/Pzwhz9stn/s2LF54YUXMnPmzEyfPj2PP/54Lrzwwm1dOgAAAADvQ6e2PPnJJ5+ck08+ucU5NTU1qaur2+i+3/72t5kxY0aeeeaZHH300UmSb33rWznllFPyta99Lf369dvqNQMAAADw/rVpKNUas2bNSu/evfOBD3wgH//4x3PDDTdkt912S5LMmTMnPXv2rARSSTJixIh06NAhc+fOzemnn77R12xoaEhDQ0Nle9WqVUmSxsbGNDY2bnaN64/ZkmPbWk3HYtufo0PR7Nf22KdtqT3fP2XRo5bpT8v0p2X6s2mt6ZH+AQBsvqqiKLZ9KtEKVVVVufvuu3PaaadVxn70ox+la9euGTRoUF566aVcddVV6datW+bMmZOOHTvmpptuyve///0sWLCg2Wv17t07U6ZMybhx4zZ6rsmTJ2fKlCkbjE+bNi1du3bdqtcFAOz41qxZk09/+tNZuXJlamtr27ocAIB2YbteKXXWWWdVfn/ooYfmsMMOy7777ptZs2blhBNO2OLXnTRpUiZOnFjZXrVqVfr375+RI0du0RvJxsbGzJw5MyeeeGKqq6u3uK62cMjkB7f5OWo6FLn+6KZc/WyHNDRVZf7kUdv8nO1Je75/yqJHLdOflulPy/Rn01rTo/WrrgEAaL3tOpT6e/vss0923333LFy4MCeccELq6uqybNmyZnPWrl2b5cuXv+dzqJK/PaeqpqZmg/Hq6ur39Yb8/R7fFhrWVZV3rqaqNKyranc9Kkt7vH/Kpkct05+W6U/L9GfTWuqR3gEAbL42/fa9zfXHP/4xr7/+evr27Zskqa+vz4oVK/Lcc89V5jz66KNpamrK0KFD26pMAAAAADahTVdKrV69OgsXLqxsL1q0KPPmzUuvXr3Sq1evTJkyJWPGjEldXV1eeumlXH755Rk8eHBGjfrbx78OPPDAnHTSSbngggty++23p7GxMRMmTMhZZ53lm/cAAAAAtmNtulLq2WefzZFHHpkjjzwySTJx4sQceeSRueaaa9KxY8c8//zz+cQnPpH9998/559/fo466qj84he/aPbRuzvvvDNDhgzJCSeckFNOOSUf/ehH853vfKetLgkAAACAVmjTlVLDhg1LS1/+9+CDm34Id69evTJt2rStWRYAAAAA21i7eqYUAAAAADsGoRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFA6oRQAAAAApRNKAQAAAFC6Ng2lHn/88Zx66qnp169fqqqqcs899zTbXxRFrrnmmvTt2zddunTJiBEj8uKLLzabs3z58owdOza1tbXp2bNnzj///KxevbrEqwAAAABgc7VpKPXmm2/m8MMPz6233rrR/V/96lfzzW9+M7fffnvmzp2bXXfdNaNGjcrbb79dmTN27Ni88MILmTlzZqZPn57HH388F154YVmXAAAAAMAW6NSWJz/55JNz8sknb3RfURT5+te/nq985Sv55Cc/mST53//7f6dPnz655557ctZZZ+W3v/1tZsyYkWeeeSZHH310kuRb3/pWTjnllHzta19Lv379SrsWAAAAAFqvTUOplixatChLlizJiBEj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yJo1TenU2CHrmqraupztzhFfvitfObIpR3z5rjS00J+5k07Yauds7f04+Is/2XrnfD/H/t091Nq62qJnr7/++lY759CbH2nVvCe+eNwm/x20M9vYv6Pb4s9ze9Wa/4Zt77b1n2drevTGG28kSYqi2KJzAADsjKqKdv7u6bXXXsuee+6ZJ598MvX19ZXxyy+/PLNnz87cuXM3OGby5MmZMmVKmWUCADuBV199NXvttVdblwEA0C60+5VSW2LSpEmZOHFiZbupqSnLly/PbrvtlqqqzV/Js2rVqvTv3z+vvvpqamtrt2apOwT9aZn+bJoetUx/WqY/LdOfTWtNj4qiyBtvvJF+/fqVXB0AQPvV7kOp3XffPR07dszSpUubjS9dujR1dXUbPaampiY1NTXNxnr27Pm+a6mtrfWGvgX60zL92TQ9apn+tEx/WqY/m7apHvXo0aPEagAA2r8ObV3A+9W5c+ccddRReeSR//fslaampjzyyCPNPs4HAAAAwPaj3a+USpKJEyfm3HPPzdFHH51jjjkmX//61/Pmm29Wvo0PAAAAgO3LDhFKnXnmmfnzn/+ca665JkuWLMkRRxyRGTNmpE+fPqWcv6amJtdee+0GHwnkb/SnZfqzaXrUMv1pmf60TH82TY8AALaNdv/tewAAAAC0P+3+mVIAAAAAtD9CKQAAAABKJ5QCAAAAoHRCKQAAAABKJ5R6DzfffHM+9KEPpXv37undu3dOO+20LFiwoNmct99+O+PHj89uu+2Wbt26ZcyYMVm6dGmzOa+88kpGjx6drl27pnfv3vnSl76UtWvXlnkp28Rtt92Www47LLW1tamtrU19fX0eeOCByv6duTcbc8stt6SqqiqXXHJJZWxn79HkyZNTVVXV7GfIkCGV/Tt7f5LkT3/6Uz7zmc9kt912S5cuXXLooYfm2WefrewviiLXXHNN+vbtmy5dumTEiBF58cUXm73G8uXLM3bs2NTW1qZnz545//zzs3r16rIvZavbe++9N7h/qqqqMn78+CTun3Xr1uXqq6/OoEGD0qVLl+y77765/vrr8+7vNtmZ758keeONN3LJJZdk4MCB6dKlSz784Q/nmWeeqezf2fsDAFCKgo0aNWpUcccddxTz588v5s2bV5xyyinFgAEDitWrV1fmXHTRRUX//v2LRx55pHj22WeLY489tvjwhz9c2b927drikEMOKUaMGFH88pe/LO6///5i9913LyZNmtQWl7RV3XvvvcV9991X/O53vysWLFhQXHXVVUV1dXUxf/78oih27t78vaeffrrYe++9i8MOO6y4+OKLK+M7e4+uvfba4uCDDy4WL15c+fnzn/9c2b+z92f58uXFwIEDi/POO6+YO3du8fvf/7548MEHi4ULF1bm3HLLLUWPHj2Ke+65p/jVr35VfOITnygGDRpUvPXWW5U5J510UnH44YcXTz31VPGLX/yiGDx4cHH22We3xSVtVcuWLWt278ycObNIUjz22GNFUbh/brzxxmK33XYrpk+fXixatKj46U9/WnTr1q34xje+UZmzM98/RVEUn/rUp4qDDjqomD17dvHiiy8W1157bVFbW1v88Y9/LIpCfwAAyiCUaqVly5YVSYrZs2cXRVEUK1asKKqrq4uf/vSnlTm//e1viyTFnDlziqIoivvvv7/o0KFDsWTJksqc2267raitrS0aGhrKvYASfOADHyj+7d/+TW/e5Y033ij222+/YubMmcXxxx9fCaX06G+h1OGHH77RffpTFFdccUXx0Y9+9D33NzU1FXV1dcU//dM/VcZWrFhR1NTUFD/84Q+LoiiK3/zmN0WS4plnnqnMeeCBB4qqqqriT3/607Yrvg1cfPHFxb777ls0NTW5f4qiGD16dPG5z32u2dgZZ5xRjB07tigK98+aNWuKjh07FtOnT282/sEPfrD48pe/vNP3BwCgLD6+10orV65MkvTq1StJ8txzz6WxsTEjRoyozBkyZEgGDBiQOXPmJEnmzJmTQw89NH369KnMGTVqVFatWpUXXnihxOq3rXXr1uVHP/pR3nzzzdTX1+vNu4wfPz6jR49u1ovE/bPeiy++mH79+mWfffbJ2LFj88orryTRnyS59957c/TRR+e//tf/mt69e+fII4/Md7/73cr+RYsWZcmSJc161KNHjwwdOrRZj3r27Jmjjz66MmfEiBHp0KFD5s6dW97FbGPvvPNOfvCDH+Rzn/tcqqqq3D9JPvzhD+eRRx7J7373uyTJr371qzzxxBM5+eSTk7h/1q5dm3Xr1mWXXXZpNt6lS5c88cQTO31/AADK0qmtC2gPmpqacskll+QjH/lIDjnkkCTJkiVL0rlz5/Ts2bPZ3D59+mTJkiWVOe/+H571+9fva+9+/etfp76+Pm+//Xa6deuWu+++OwcddFDmzZu30/cmSX70ox/l//7f/9vsGSXruX+SoUOHZurUqTnggAOyePHiTJkyJR/72Mcyf/58/Uny+9//PrfddlsmTpyYq666Ks8880y+8IUvpHPnzjn33HMr17ixHry7R7179262v1OnTunVq9cO0aP17rnnnqxYsSLnnXdeEv98JcmVV16ZVatWZciQIenYsWPWrVuXG2+8MWPHjk2Snf7+6d69e+rr63P99dfnwAMPTJ8+ffLDH/4wc+bMyeDBg3f6/gAAlEUo1Qrjx4/P/Pnz88QTT7R1KduVAw44IPPmzcvKlSvzH//xHzn33HMze/bsti5ru/Dqq6/m4osvzsyZMzf4m3j+Zv2KjSQ57LDDMnTo0AwcODA/+clP0qVLlzasbPvQ1NSUo48+OjfddFOS5Mgjj8z8+fNz++2359xzz23j6rYv3/ve93LyySenX79+bV3KduMnP/lJ7rzzzkybNi0HH3xw5s2bl0suuST9+vVz//z//v3f/z2f+9znsueee6Zjx4754Ac/mLPPPjvPPfdcW5cGALDT8PG9TZgwYUKmT5+exx57LHvttVdlvK6uLu+8805WrFjRbP7SpUtTV1dXmfP33/a0fnv9nPasc+fOGTx4cI466qjcfPPNOfzww/ONb3xDb/K3j58tW7YsH/zgB9OpU6d06tQps2fPzje/+c106tQpffr02el79Pd69uyZ/fffPwsXLnQPJenbt28OOuigZmMHHnhg5SOO669xYz14d4+WLVvWbP/atWuzfPnyHaJHSfKHP/whDz/8cP7xH/+xMub+Sb70pS/lyiuvzFlnnZVDDz0055xzTi699NLcfPPNSdw/SbLvvvtm9uzZWb16dV599dU8/fTTaWxszD777KM/AAAlEUq9h6IoMmHChNx999159NFHM2jQoGb7jzrqqFRXV+eRRx6pjC1YsCCvvPJK6uvrkyT19fX59a9/3exN68yZM1NbW7vB/2zuCJqamtLQ0KA3SU444YT8+te/zrx58yo/Rx99dMaOHVv5/c7eo7+3evXqvPTSS+nbt697KMlHPvKRLFiwoNnY7373uwwcODBJMmjQoNTV1TXr0apVqzJ37txmPVqxYkWzlR+PPvpompqaMnTo0BKuYtu744470rt374wePboy5v5J1qxZkw4dmv8nvmPHjmlqakri/nm3XXfdNX379s1f//rXPPjgg/nkJz+pPwAAZWnrJ61vr8aNG1f06NGjmDVrVrOvHV+zZk1lzkUXXVQMGDCgePTRR4tnn322qK+vL+rr6yv713/l+MiRI4t58+YVM2bMKPbYY48d4ivHr7zyymL27NnFokWLiueff7648sori6qqquKhhx4qimLn7s17efe37xWFHl122WXFrFmzikWLFhX/+Z//WYwYMaLYfffdi2XLlhVFoT9PP/100alTp+LGG28sXnzxxeLOO+8sunbtWvzgBz+ozLnllluKnj17Fj/72c+K559/vvjkJz+50a+sP/LII4u5c+cWTzzxRLHffvvtMF9Zv27dumLAgAHFFVdcscG+nf3+Offcc4s999yzmD59erFo0aLirrvuKnbffffi8ssvr8zZ2e+fGTNmFA888EDx+9//vnjooYeKww8/vBg6dGjxzjvvFEWhPwAAZRBKvYckG/254447KnPeeuut4r/9t/9WfOADHyi6du1anH766cXixYubvc7LL79cnHzyyUWXLl2K3XffvbjsssuKxsbGkq9m6/vc5z5XDBw4sOjcuXOxxx57FCeccEIlkCqKnbs37+XvQ6mdvUdnnnlm0bdv36Jz587FnnvuWZx55pnFwoULK/t39v4URVH8/Oc/Lw455JCipqamGDJkSPGd73yn2f6mpqbi6quvLvr06VPU1NQUJ5xwQrFgwYJmc15//fXi7LPPLrp161bU1tYWn/3sZ4s33nijzMvYZh588MEiyQbXXBTun1WrVhUXX3xxMWDAgGKXXXYp9tlnn+LLX/5y0dDQUJmzs98/P/7xj4t99tmn6Ny5c1FXV1eMHz++WLFiRWX/zt4fAIAyVBVFUbThQi0AAAAAdkKeKQUAAABA6YRSAAAAAJROKAUAAABA6YRSAAAAAJROKAUAAABA6YRSAAAAAJROKAUAAABA6YRSAAAAAJROKAUAAABA6YRSAAAAAJROKAUAAABA6YRSAAAAAJTu/wMpoWxkEBKzbgAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 19;\n",
+ " var nbb_unformatted_code = \"def visualize_image_stats(figsize=(12, 8)):\\n image_shapes = [ai.image.shape for ai in DATA.annotated_images]\\n\\n fig, axes = plt.subplots(nrows=2, ncols=2, figsize=figsize)\\n\\n height, width, channel = zip(*image_shapes)\\n\\n IPython.display.display(\\n pd.DataFrame(dict(width=width, height=height, channel=channel)).describe()\\n )\\n\\n plt.sca(axes[0][0])\\n plt.title(\\\"Image shapes\\\")\\n plt.xlabel(\\\"Width\\\")\\n plt.ylabel(\\\"Height\\\")\\n plt.scatter(\\n width,\\n height,\\n marker=\\\".\\\",\\n alpha=0.3,\\n )\\n plt.grid()\\n\\n plt.sca(axes[0][1])\\n plt.title(\\\"Width\\\")\\n plt.hist(width, bins=50)\\n plt.grid()\\n\\n plt.sca(axes[1][0])\\n plt.title(\\\"Height\\\")\\n plt.hist(height, bins=50)\\n plt.grid()\\n\\n plt.sca(axes[1][1])\\n plt.axis(\\\"off\\\")\\n\\n plt.tight_layout()\\n\\n\\nvisualize_image_stats()\";\n",
+ " var nbb_formatted_code = \"def visualize_image_stats(figsize=(12, 8)):\\n image_shapes = [ai.image.shape for ai in DATA.annotated_images]\\n\\n fig, axes = plt.subplots(nrows=2, ncols=2, figsize=figsize)\\n\\n height, width, channel = zip(*image_shapes)\\n\\n IPython.display.display(\\n pd.DataFrame(dict(width=width, height=height, channel=channel)).describe()\\n )\\n\\n plt.sca(axes[0][0])\\n plt.title(\\\"Image shapes\\\")\\n plt.xlabel(\\\"Width\\\")\\n plt.ylabel(\\\"Height\\\")\\n plt.scatter(\\n width,\\n height,\\n marker=\\\".\\\",\\n alpha=0.3,\\n )\\n plt.grid()\\n\\n plt.sca(axes[0][1])\\n plt.title(\\\"Width\\\")\\n plt.hist(width, bins=50)\\n plt.grid()\\n\\n plt.sca(axes[1][0])\\n plt.title(\\\"Height\\\")\\n plt.hist(height, bins=50)\\n plt.grid()\\n\\n plt.sca(axes[1][1])\\n plt.axis(\\\"off\\\")\\n\\n plt.tight_layout()\\n\\n\\nvisualize_image_stats()\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def visualize_image_stats(figsize=(12, 8)):\n",
+ " image_shapes = [ai.image.shape for ai in DATA.annotated_images]\n",
+ "\n",
+ " fig, axes = plt.subplots(nrows=2, ncols=2, figsize=figsize)\n",
+ "\n",
+ " height, width, channel = zip(*image_shapes)\n",
+ "\n",
+ " IPython.display.display(\n",
+ " pd.DataFrame(dict(width=width, height=height, channel=channel)).describe()\n",
+ " )\n",
+ "\n",
+ " plt.sca(axes[0][0])\n",
+ " plt.title(\"Image shapes\")\n",
+ " plt.xlabel(\"Width\")\n",
+ " plt.ylabel(\"Height\")\n",
+ " plt.scatter(\n",
+ " width,\n",
+ " height,\n",
+ " marker=\".\",\n",
+ " alpha=0.3,\n",
+ " )\n",
+ " plt.grid()\n",
+ "\n",
+ " plt.sca(axes[0][1])\n",
+ " plt.title(\"Width\")\n",
+ " plt.hist(width, bins=50)\n",
+ " plt.grid()\n",
+ "\n",
+ " plt.sca(axes[1][0])\n",
+ " plt.title(\"Height\")\n",
+ " plt.hist(height, bins=50)\n",
+ " plt.grid()\n",
+ "\n",
+ " plt.sca(axes[1][1])\n",
+ " plt.axis(\"off\")\n",
+ "\n",
+ " plt.tight_layout()\n",
+ "\n",
+ "\n",
+ "visualize_image_stats()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "c068b2ac",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 20;\n",
+ " var nbb_unformatted_code = \"CONFIG.image_width = 720\\nCONFIG.image_height = 512\";\n",
+ " var nbb_formatted_code = \"CONFIG.image_width = 720\\nCONFIG.image_height = 512\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "CONFIG.image_width = 720\n",
+ "CONFIG.image_height = 512"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "24f7f000",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 21;\n",
+ " var nbb_unformatted_code = \"def plot_image_with_annotations(image_index, show_categorical_data=True):\\n annotated_image = DATA.annotated_images[image_index]\\n annotation = annotated_image.annotation\\n image = annotated_image.image\\n plt.subplots(figsize=(8, 6))\\n plt.imshow(image)\\n\\n if show_categorical_data:\\n IPython.display.display(\\n pd.Series(\\n dict(\\n source=annotation.source.value,\\n chart_type=annotation.chart_type.value,\\n x_values_type=annotation.axes.x_axis.values_type.value,\\n y_values_type=annotation.axes.y_axis.values_type.value,\\n x_tick_type=annotation.axes.x_axis.tick_type.value,\\n y_tick_type=annotation.axes.y_axis.tick_type.value,\\n )\\n )\\n )\\n\\n plt.plot(*annotation.plot_bb.get_bounds(), c=\\\"red\\\", label=\\\"bounding_box\\\")\\n\\n plt.scatter(\\n *list(zip(*[[tick.x, tick.y] for tick in annotation.axes.x_axis.ticks])),\\n label=\\\"x_ticks\\\"\\n )\\n plt.scatter(\\n *list(zip(*[[tick.x, tick.y] for tick in annotation.axes.y_axis.ticks])),\\n label=\\\"y_ticks\\\"\\n )\\n\\n text_role_colors = dict(zip(TextRole, plt.cm.Accent.colors))\\n seen_roles = set()\\n for i, text in enumerate(annotation.text):\\n xs = [\\n text.polygon.x0,\\n text.polygon.x1,\\n text.polygon.x2,\\n text.polygon.x3,\\n text.polygon.x0,\\n ]\\n ys = [\\n text.polygon.y0,\\n text.polygon.y1,\\n text.polygon.y2,\\n text.polygon.y3,\\n text.polygon.y0,\\n ]\\n plt.plot(\\n xs,\\n ys,\\n c=text_role_colors[text.role],\\n label=text.role.value if text.role not in seen_roles else None,\\n )\\n seen_roles.add(text.role)\\n\\n plt.legend(bbox_to_anchor=(1.04, 1), loc=\\\"upper left\\\")\";\n",
+ " var nbb_formatted_code = \"def plot_image_with_annotations(image_index, show_categorical_data=True):\\n annotated_image = DATA.annotated_images[image_index]\\n annotation = annotated_image.annotation\\n image = annotated_image.image\\n plt.subplots(figsize=(8, 6))\\n plt.imshow(image)\\n\\n if show_categorical_data:\\n IPython.display.display(\\n pd.Series(\\n dict(\\n source=annotation.source.value,\\n chart_type=annotation.chart_type.value,\\n x_values_type=annotation.axes.x_axis.values_type.value,\\n y_values_type=annotation.axes.y_axis.values_type.value,\\n x_tick_type=annotation.axes.x_axis.tick_type.value,\\n y_tick_type=annotation.axes.y_axis.tick_type.value,\\n )\\n )\\n )\\n\\n plt.plot(*annotation.plot_bb.get_bounds(), c=\\\"red\\\", label=\\\"bounding_box\\\")\\n\\n plt.scatter(\\n *list(zip(*[[tick.x, tick.y] for tick in annotation.axes.x_axis.ticks])),\\n label=\\\"x_ticks\\\"\\n )\\n plt.scatter(\\n *list(zip(*[[tick.x, tick.y] for tick in annotation.axes.y_axis.ticks])),\\n label=\\\"y_ticks\\\"\\n )\\n\\n text_role_colors = dict(zip(TextRole, plt.cm.Accent.colors))\\n seen_roles = set()\\n for i, text in enumerate(annotation.text):\\n xs = [\\n text.polygon.x0,\\n text.polygon.x1,\\n text.polygon.x2,\\n text.polygon.x3,\\n text.polygon.x0,\\n ]\\n ys = [\\n text.polygon.y0,\\n text.polygon.y1,\\n text.polygon.y2,\\n text.polygon.y3,\\n text.polygon.y0,\\n ]\\n plt.plot(\\n xs,\\n ys,\\n c=text_role_colors[text.role],\\n label=text.role.value if text.role not in seen_roles else None,\\n )\\n seen_roles.add(text.role)\\n\\n plt.legend(bbox_to_anchor=(1.04, 1), loc=\\\"upper left\\\")\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def plot_image_with_annotations(image_index, show_categorical_data=True):\n",
+ " annotated_image = DATA.annotated_images[image_index]\n",
+ " annotation = annotated_image.annotation\n",
+ " image = annotated_image.image\n",
+ " plt.subplots(figsize=(8, 6))\n",
+ " plt.imshow(image)\n",
+ "\n",
+ " if show_categorical_data:\n",
+ " IPython.display.display(\n",
+ " pd.Series(\n",
+ " dict(\n",
+ " source=annotation.source.value,\n",
+ " chart_type=annotation.chart_type.value,\n",
+ " x_values_type=annotation.axes.x_axis.values_type.value,\n",
+ " y_values_type=annotation.axes.y_axis.values_type.value,\n",
+ " x_tick_type=annotation.axes.x_axis.tick_type.value,\n",
+ " y_tick_type=annotation.axes.y_axis.tick_type.value,\n",
+ " )\n",
+ " )\n",
+ " )\n",
+ "\n",
+ " plt.plot(*annotation.plot_bb.get_bounds(), c=\"red\", label=\"bounding_box\")\n",
+ "\n",
+ " plt.scatter(\n",
+ " *list(zip(*[[tick.x, tick.y] for tick in annotation.axes.x_axis.ticks])),\n",
+ " label=\"x_ticks\"\n",
+ " )\n",
+ " plt.scatter(\n",
+ " *list(zip(*[[tick.x, tick.y] for tick in annotation.axes.y_axis.ticks])),\n",
+ " label=\"y_ticks\"\n",
+ " )\n",
+ "\n",
+ " text_role_colors = dict(zip(TextRole, plt.cm.Accent.colors))\n",
+ " seen_roles = set()\n",
+ " for i, text in enumerate(annotation.text):\n",
+ " xs = [\n",
+ " text.polygon.x0,\n",
+ " text.polygon.x1,\n",
+ " text.polygon.x2,\n",
+ " text.polygon.x3,\n",
+ " text.polygon.x0,\n",
+ " ]\n",
+ " ys = [\n",
+ " text.polygon.y0,\n",
+ " text.polygon.y1,\n",
+ " text.polygon.y2,\n",
+ " text.polygon.y3,\n",
+ " text.polygon.y0,\n",
+ " ]\n",
+ " plt.plot(\n",
+ " xs,\n",
+ " ys,\n",
+ " c=text_role_colors[text.role],\n",
+ " label=text.role.value if text.role not in seen_roles else None,\n",
+ " )\n",
+ " seen_roles.add(text.role)\n",
+ "\n",
+ " plt.legend(bbox_to_anchor=(1.04, 1), loc=\"upper left\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "a54cc20e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "source generated\n",
+ "chart_type vertical_bar\n",
+ "x_values_type categorical\n",
+ "y_values_type numerical\n",
+ "x_tick_type markers\n",
+ "y_tick_type markers\n",
+ "dtype: object"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 22;\n",
+ " var nbb_unformatted_code = \"plot_image_with_annotations(np.random.choice(len(DATA.annotated_images)))\";\n",
+ " var nbb_formatted_code = \"plot_image_with_annotations(np.random.choice(len(DATA.annotated_images)))\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_image_with_annotations(np.random.choice(len(DATA.annotated_images)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "88ae66a0",
+ "metadata": {},
+ "source": [
+ "### Data splits "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 303,
+ "id": "7b2e2e49",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 303;\n",
+ " var nbb_unformatted_code = \"def split_train_indices_by_source():\\n extracted_image_indices = []\\n generated_image_indices = []\\n for i, annotated_image in enumerate(DATA.annotated_images):\\n if annotated_image.annotation.source == Source.extracted:\\n extracted_image_indices.append(i)\\n else:\\n generated_image_indices.append(i)\\n return extracted_image_indices, generated_image_indices\\n\\ndef get_train_val_split_indices(val_fraction=0.1, seed=42):\\n np.random.seed(42)\\n val_size = int(len(load_train_image_ids()) * val_fraction)\\n\\n extracted_image_indices, generated_image_indices = split_train_indices_by_source()\\n extracted_image_indices = np.random.permutation(extracted_image_indices)\\n generated_image_indices = np.random.permutation(generated_image_indices)\\n\\n val_indices = extracted_image_indices[:val_size]\\n n_generated_images_in_val = val_size - len(val_indices)\\n val_indices = np.concatenate(\\n [val_indices, generated_image_indices[:n_generated_images_in_val]]\\n )\\n\\n train_indices = generated_image_indices[n_generated_images_in_val:]\\n\\n assert len(set(train_indices) | set(val_indices)) == len(load_train_image_ids())\\n assert len(val_indices) == val_size\\n assert len(set(train_indices) & set(val_indices)) == 0\\n\\n return train_indices, val_indices\";\n",
+ " var nbb_formatted_code = \"def split_train_indices_by_source():\\n extracted_image_indices = []\\n generated_image_indices = []\\n for i, annotated_image in enumerate(DATA.annotated_images):\\n if annotated_image.annotation.source == Source.extracted:\\n extracted_image_indices.append(i)\\n else:\\n generated_image_indices.append(i)\\n return extracted_image_indices, generated_image_indices\\n\\n\\ndef get_train_val_split_indices(val_fraction=0.1, seed=42):\\n np.random.seed(42)\\n val_size = int(len(load_train_image_ids()) * val_fraction)\\n\\n extracted_image_indices, generated_image_indices = split_train_indices_by_source()\\n extracted_image_indices = np.random.permutation(extracted_image_indices)\\n generated_image_indices = np.random.permutation(generated_image_indices)\\n\\n val_indices = extracted_image_indices[:val_size]\\n n_generated_images_in_val = val_size - len(val_indices)\\n val_indices = np.concatenate(\\n [val_indices, generated_image_indices[:n_generated_images_in_val]]\\n )\\n\\n train_indices = generated_image_indices[n_generated_images_in_val:]\\n\\n assert len(set(train_indices) | set(val_indices)) == len(load_train_image_ids())\\n assert len(val_indices) == val_size\\n assert len(set(train_indices) & set(val_indices)) == 0\\n\\n return train_indices, val_indices\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def split_train_indices_by_source():\n",
+ " extracted_image_indices = []\n",
+ " generated_image_indices = []\n",
+ " for i, annotated_image in enumerate(DATA.annotated_images):\n",
+ " if annotated_image.annotation.source == Source.extracted:\n",
+ " extracted_image_indices.append(i)\n",
+ " else:\n",
+ " generated_image_indices.append(i)\n",
+ " return extracted_image_indices, generated_image_indices\n",
+ "\n",
+ "\n",
+ "def get_train_val_split_indices(val_fraction=0.1, seed=42):\n",
+ " np.random.seed(42)\n",
+ " val_size = int(len(load_train_image_ids()) * val_fraction)\n",
+ "\n",
+ " extracted_image_indices, generated_image_indices = split_train_indices_by_source()\n",
+ " extracted_image_indices = np.random.permutation(extracted_image_indices)\n",
+ " generated_image_indices = np.random.permutation(generated_image_indices)\n",
+ "\n",
+ " val_indices = extracted_image_indices[:val_size]\n",
+ " n_generated_images_in_val = val_size - len(val_indices)\n",
+ " val_indices = np.concatenate(\n",
+ " [val_indices, generated_image_indices[:n_generated_images_in_val]]\n",
+ " )\n",
+ "\n",
+ " train_indices = generated_image_indices[n_generated_images_in_val:]\n",
+ "\n",
+ " assert len(set(train_indices) | set(val_indices)) == len(load_train_image_ids())\n",
+ " assert len(val_indices) == val_size\n",
+ " assert len(set(train_indices) & set(val_indices)) == 0\n",
+ "\n",
+ " return train_indices, val_indices"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "3a83e270",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 25;\n",
+ " var nbb_unformatted_code = \"CONFIG.val_fraction = 0.1\\nCONFIG.seed = 42\\nDATA.train_indices, DATA.val_indices = get_train_val_split_indices(\\n CONFIG.val_fraction, CONFIG.seed\\n)\";\n",
+ " var nbb_formatted_code = \"CONFIG.val_fraction = 0.1\\nCONFIG.seed = 42\\nDATA.train_indices, DATA.val_indices = get_train_val_split_indices(\\n CONFIG.val_fraction, CONFIG.seed\\n)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "CONFIG.val_fraction = 0.1\n",
+ "CONFIG.seed = 42\n",
+ "DATA.train_indices, DATA.val_indices = get_train_val_split_indices(\n",
+ " CONFIG.val_fraction, CONFIG.seed\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2a8711a2",
+ "metadata": {},
+ "source": [
+ "### Expected model output format "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "52e5fc7e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " id | \n",
+ " data_series | \n",
+ " chart_type | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 000b92c3b098_x | \n",
+ " abc;def | \n",
+ " vertical_bar | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 000b92c3b098_y | \n",
+ " 0.0;1.0 | \n",
+ " vertical_bar | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 007a18eb4e09_x | \n",
+ " abc;def | \n",
+ " vertical_bar | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 007a18eb4e09_y | \n",
+ " 0.0;1.0 | \n",
+ " vertical_bar | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " id data_series chart_type\n",
+ "0 000b92c3b098_x abc;def vertical_bar\n",
+ "1 000b92c3b098_y 0.0;1.0 vertical_bar\n",
+ "2 007a18eb4e09_x abc;def vertical_bar\n",
+ "3 007a18eb4e09_y 0.0;1.0 vertical_bar"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 26;\n",
+ " var nbb_unformatted_code = \"pd.read_csv(\\\"data/sample_submission.csv\\\").head(4)\";\n",
+ " var nbb_formatted_code = \"pd.read_csv(\\\"data/sample_submission.csv\\\").head(4)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pd.read_csv(\"data/sample_submission.csv\").head(4)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4be2fa0d",
+ "metadata": {},
+ "source": [
+ "In the Benetech competition I need to predict chart type and axis values, so I will create appropriate tokens and later add them to the transformer."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 166,
+ "id": "6d209989",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 166;\n",
+ " var nbb_unformatted_code = \"def to_token_str(value: str or enum.Enum):\\n string = value.name if isinstance(value, enum.Enum) else value\\n if re.fullmatch(\\\"<.*>\\\", string):\\n return string\\n else:\\n return f\\\"<{string}>\\\"\\n\\n\\nTOKEN.benetech_prompt = to_token_str(\\\"benetech_prompt\\\")\\nTOKEN.benetech_prompt_end = to_token_str(\\\"/benetech_prompt\\\")\\n\\nfor chart_type in ChartType:\\n setattr(TOKEN, chart_type.name, to_token_str(chart_type))\\n\\nfor values_type in ValuesType:\\n setattr(TOKEN, values_type.name, to_token_str(values_type))\\n\\nTOKEN.x_start = to_token_str(\\\"x_start\\\")\\nTOKEN.y_start = to_token_str(\\\"y_start\\\")\\nTOKEN.value_separator = to_token_str(\\\";\\\")\";\n",
+ " var nbb_formatted_code = \"def to_token_str(value: str or enum.Enum):\\n string = value.name if isinstance(value, enum.Enum) else value\\n if re.fullmatch(\\\"<.*>\\\", string):\\n return string\\n else:\\n return f\\\"<{string}>\\\"\\n\\n\\nTOKEN.benetech_prompt = to_token_str(\\\"benetech_prompt\\\")\\nTOKEN.benetech_prompt_end = to_token_str(\\\"/benetech_prompt\\\")\\n\\nfor chart_type in ChartType:\\n setattr(TOKEN, chart_type.name, to_token_str(chart_type))\\n\\nfor values_type in ValuesType:\\n setattr(TOKEN, values_type.name, to_token_str(values_type))\\n\\nTOKEN.x_start = to_token_str(\\\"x_start\\\")\\nTOKEN.y_start = to_token_str(\\\"y_start\\\")\\nTOKEN.value_separator = to_token_str(\\\";\\\")\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def to_token_str(value: str or enum.Enum):\n",
+ " string = value.name if isinstance(value, enum.Enum) else value\n",
+ " if re.fullmatch(\"<.*>\", string):\n",
+ " return string\n",
+ " else:\n",
+ " return f\"<{string}>\"\n",
+ "\n",
+ "\n",
+ "TOKEN.benetech_prompt = to_token_str(\"benetech_prompt\")\n",
+ "TOKEN.benetech_prompt_end = to_token_str(\"/benetech_prompt\")\n",
+ "\n",
+ "for chart_type in ChartType:\n",
+ " setattr(TOKEN, chart_type.name, to_token_str(chart_type))\n",
+ "\n",
+ "for values_type in ValuesType:\n",
+ " setattr(TOKEN, values_type.name, to_token_str(values_type))\n",
+ "\n",
+ "TOKEN.x_start = to_token_str(\"x_start\")\n",
+ "TOKEN.y_start = to_token_str(\"y_start\")\n",
+ "TOKEN.value_separator = to_token_str(\";\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 225,
+ "id": "6a100c8e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 225;\n",
+ " var nbb_unformatted_code = \"def compute_numeric_data_loss_due_to_string_conversion():\\n squared_error = 0\\n n_numeric_values = 0\\n for annotated_image in DATA.annotated_images:\\n annotation = annotated_image.annotation\\n for axis, data in zip(\\n [annotation.axes.x_axis, annotation.axes.y_axis],\\n [\\n [dp.x for dp in annotation.data_series],\\n [dp.y for dp in annotation.data_series],\\n ],\\n ):\\n if axis.values_type == ValuesType.numerical:\\n string = convert_axis_data_to_string(data, ValuesType.numerical)\\n reconverted_data = convert_string_to_axis_data(\\n string, ValuesType.numerical\\n )\\n squared_error += (\\n (np.array(data) - np.array(reconverted_data)) ** 2\\n ).sum()\\n n_numeric_values += len(data)\\n\\n mse = squared_error**0.5 / n_numeric_values\\n return mse\";\n",
+ " var nbb_formatted_code = \"def compute_numeric_data_loss_due_to_string_conversion():\\n squared_error = 0\\n n_numeric_values = 0\\n for annotated_image in DATA.annotated_images:\\n annotation = annotated_image.annotation\\n for axis, data in zip(\\n [annotation.axes.x_axis, annotation.axes.y_axis],\\n [\\n [dp.x for dp in annotation.data_series],\\n [dp.y for dp in annotation.data_series],\\n ],\\n ):\\n if axis.values_type == ValuesType.numerical:\\n string = convert_axis_data_to_string(data, ValuesType.numerical)\\n reconverted_data = convert_string_to_axis_data(\\n string, ValuesType.numerical\\n )\\n squared_error += (\\n (np.array(data) - np.array(reconverted_data)) ** 2\\n ).sum()\\n n_numeric_values += len(data)\\n\\n mse = squared_error**0.5 / n_numeric_values\\n return mse\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "CONFIG.float_scientific_notation_string_precision = 5\n",
+ "\n",
+ "\n",
+ "def convert_number_to_scientific_string(value: int or float) -> str:\n",
+ " return f\"{value:.{CONFIG.float_scientific_notation_string_precision}e}\"\n",
+ "\n",
+ "\n",
+ "def convert_axis_data_to_string(\n",
+ " axis_data: list[str or float], values_type: ValuesType\n",
+ ") -> str:\n",
+ " formatted_axis_data = []\n",
+ " for value in axis_data:\n",
+ " if values_type == ValuesType.numerical:\n",
+ " value = convert_number_to_scientific_string(value)\n",
+ " formatted_axis_data.append(value)\n",
+ " return TOKEN.value_separator.join(formatted_axis_data)\n",
+ "\n",
+ "\n",
+ "def convert_string_to_axis_data(string, values_type: ValuesType):\n",
+ " data = string.split(TOKEN.value_separator)\n",
+ " if values_type == ValuesType.numerical:\n",
+ " data = [float(i) for i in data]\n",
+ " return data\n",
+ "\n",
+ "def compute_numeric_data_loss_due_to_string_conversion():\n",
+ " squared_error = 0\n",
+ " n_numeric_values = 0\n",
+ " for annotated_image in DATA.annotated_images:\n",
+ " annotation = annotated_image.annotation\n",
+ " for axis, data in zip(\n",
+ " [annotation.axes.x_axis, annotation.axes.y_axis],\n",
+ " [\n",
+ " [dp.x for dp in annotation.data_series],\n",
+ " [dp.y for dp in annotation.data_series],\n",
+ " ],\n",
+ " ):\n",
+ " if axis.values_type == ValuesType.numerical:\n",
+ " string = convert_axis_data_to_string(data, ValuesType.numerical)\n",
+ " reconverted_data = convert_string_to_axis_data(\n",
+ " string, ValuesType.numerical\n",
+ " )\n",
+ " squared_error += (\n",
+ " (np.array(data) - np.array(reconverted_data)) ** 2\n",
+ " ).sum()\n",
+ " n_numeric_values += len(data)\n",
+ "\n",
+ " mse = squared_error**0.5 / n_numeric_values\n",
+ " return mse"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 226,
+ "id": "e5ae33b0",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.4810869511837585\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 226;\n",
+ " var nbb_unformatted_code = \"print(compute_numeric_data_loss_due_to_string_conversion())\";\n",
+ " var nbb_formatted_code = \"print(compute_numeric_data_loss_due_to_string_conversion())\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "print(compute_numeric_data_loss_due_to_string_conversion())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 219,
+ "id": "46dff28d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 219;\n",
+ " var nbb_unformatted_code = \"CONFIG.float_scientific_notation_string_precision = 5\\n\\n\\ndef convert_number_to_scientific_string(value: int or float) -> str:\\n return f\\\"{value:.{CONFIG.float_scientific_notation_string_precision}e}\\\"\\n\\n\\ndef convert_axis_data_to_string(\\n axis_data: list[str or float], values_type: ValuesType\\n) -> str:\\n formatted_axis_data = []\\n for value in axis_data:\\n if values_type == ValuesType.numerical:\\n value = convert_number_to_scientific_string(value)\\n formatted_axis_data.append(value)\\n return TOKEN.value_separator.join(formatted_axis_data)\\n\\n\\ndef convert_string_to_axis_data(string, values_type: ValuesType):\\n data = string.split(TOKEN.value_separator)\\n if values_type == ValuesType.numerical:\\n data = [float(i) for i in data]\\n return data\\n\\n\\n@dataclasses.dataclass\\nclass BenetechOutput:\\n chart_type: ChartType\\n x_values_type: ValuesType\\n y_values_type: ValuesType\\n x_data: list[str or float]\\n y_data: list[str or float]\\n\\n def __post_init__(self):\\n self.chart_type = ChartType(self.chart_type)\\n self.x_values_type = ValuesType(self.x_values_type)\\n self.y_values_type = ValuesType(self.y_values_type)\\n assert isinstance(self.x_data, list)\\n assert isinstance(self.y_data, list)\\n\\n def to_string(self):\\n return self.format_strings(\\n chart_type=self.chart_type,\\n x_values_type=self.x_values_type,\\n y_values_type=self.y_values_type,\\n x_data=convert_axis_data_to_string(self.x_data, self.x_values_type),\\n y_data=convert_axis_data_to_string(self.y_data, self.y_values_type),\\n )\\n\\n @staticmethod\\n def format_strings(*, chart_type, x_values_type, y_values_type, x_data, y_data):\\n chart_type = to_token_str(chart_type)\\n x_values_type = to_token_str(x_values_type)\\n y_values_type = to_token_str(y_values_type)\\n return (\\n f\\\"{TOKEN.benetech_prompt}{chart_type}\\\"\\n f\\\"{TOKEN.x_start}{x_values_type}{x_data}\\\"\\n f\\\"{TOKEN.y_start}{y_values_type}{y_data}\\\"\\n f\\\"{TOKEN.benetech_prompt_end}\\\"\\n )\\n\\n @staticmethod\\n def get_string_pattern():\\n field_names = [field.name for field in dataclasses.fields(BenetechOutput)]\\n pattern = BenetechOutput.format_strings(\\n **{field_name: f\\\"(?P<{field_name}>.*?)\\\" for field_name in field_names}\\n )\\n return pattern\\n \\n @staticmethod\\n def does_string_match_expected_pattern(string):\\n return bool(re.fullmatch(BenetechOutput.get_string_pattern(), string))\\n \\n @staticmethod\\n def from_string(string):\\n fullmatch = re.fullmatch(BenetechOutput.get_string_pattern(), string)\\n benetech_kwargs = fullmatch.groupdict()\\n benetech_kwargs[\\\"chart_type\\\"] = ChartType(benetech_kwargs[\\\"chart_type\\\"])\\n benetech_kwargs[\\\"x_values_type\\\"] = ValuesType(benetech_kwargs[\\\"x_values_type\\\"])\\n benetech_kwargs[\\\"y_values_type\\\"] = ValuesType(benetech_kwargs[\\\"y_values_type\\\"])\\n benetech_kwargs[\\\"x_data\\\"] = convert_string_to_axis_data(\\n benetech_kwargs[\\\"x_data\\\"], benetech_kwargs[\\\"x_values_type\\\"]\\n )\\n benetech_kwargs[\\\"y_data\\\"] = convert_string_to_axis_data(\\n benetech_kwargs[\\\"y_data\\\"], benetech_kwargs[\\\"y_values_type\\\"]\\n )\\n return BenetechOutput(**benetech_kwargs)\\n\\n\\ndef get_annotation_ground_truth_str(annotation: Annotation):\\n benetech_output = BenetechOutput(\\n chart_type=annotation.chart_type,\\n x_values_type=annotation.axes.x_axis.values_type,\\n x_data=[dp.x for dp in annotation.data_series],\\n y_values_type=annotation.axes.y_axis.values_type,\\n y_data=[dp.y for dp in annotation.data_series],\\n )\\n return benetech_output.to_string()\";\n",
+ " var nbb_formatted_code = \"CONFIG.float_scientific_notation_string_precision = 5\\n\\n\\ndef convert_number_to_scientific_string(value: int or float) -> str:\\n return f\\\"{value:.{CONFIG.float_scientific_notation_string_precision}e}\\\"\\n\\n\\ndef convert_axis_data_to_string(\\n axis_data: list[str or float], values_type: ValuesType\\n) -> str:\\n formatted_axis_data = []\\n for value in axis_data:\\n if values_type == ValuesType.numerical:\\n value = convert_number_to_scientific_string(value)\\n formatted_axis_data.append(value)\\n return TOKEN.value_separator.join(formatted_axis_data)\\n\\n\\ndef convert_string_to_axis_data(string, values_type: ValuesType):\\n data = string.split(TOKEN.value_separator)\\n if values_type == ValuesType.numerical:\\n data = [float(i) for i in data]\\n return data\\n\\n\\n@dataclasses.dataclass\\nclass BenetechOutput:\\n chart_type: ChartType\\n x_values_type: ValuesType\\n y_values_type: ValuesType\\n x_data: list[str or float]\\n y_data: list[str or float]\\n\\n def __post_init__(self):\\n self.chart_type = ChartType(self.chart_type)\\n self.x_values_type = ValuesType(self.x_values_type)\\n self.y_values_type = ValuesType(self.y_values_type)\\n assert isinstance(self.x_data, list)\\n assert isinstance(self.y_data, list)\\n\\n def to_string(self):\\n return self.format_strings(\\n chart_type=self.chart_type,\\n x_values_type=self.x_values_type,\\n y_values_type=self.y_values_type,\\n x_data=convert_axis_data_to_string(self.x_data, self.x_values_type),\\n y_data=convert_axis_data_to_string(self.y_data, self.y_values_type),\\n )\\n\\n @staticmethod\\n def format_strings(*, chart_type, x_values_type, y_values_type, x_data, y_data):\\n chart_type = to_token_str(chart_type)\\n x_values_type = to_token_str(x_values_type)\\n y_values_type = to_token_str(y_values_type)\\n return (\\n f\\\"{TOKEN.benetech_prompt}{chart_type}\\\"\\n f\\\"{TOKEN.x_start}{x_values_type}{x_data}\\\"\\n f\\\"{TOKEN.y_start}{y_values_type}{y_data}\\\"\\n f\\\"{TOKEN.benetech_prompt_end}\\\"\\n )\\n\\n @staticmethod\\n def get_string_pattern():\\n field_names = [field.name for field in dataclasses.fields(BenetechOutput)]\\n pattern = BenetechOutput.format_strings(\\n **{field_name: f\\\"(?P<{field_name}>.*?)\\\" for field_name in field_names}\\n )\\n return pattern\\n\\n @staticmethod\\n def does_string_match_expected_pattern(string):\\n return bool(re.fullmatch(BenetechOutput.get_string_pattern(), string))\\n\\n @staticmethod\\n def from_string(string):\\n fullmatch = re.fullmatch(BenetechOutput.get_string_pattern(), string)\\n benetech_kwargs = fullmatch.groupdict()\\n benetech_kwargs[\\\"chart_type\\\"] = ChartType(benetech_kwargs[\\\"chart_type\\\"])\\n benetech_kwargs[\\\"x_values_type\\\"] = ValuesType(benetech_kwargs[\\\"x_values_type\\\"])\\n benetech_kwargs[\\\"y_values_type\\\"] = ValuesType(benetech_kwargs[\\\"y_values_type\\\"])\\n benetech_kwargs[\\\"x_data\\\"] = convert_string_to_axis_data(\\n benetech_kwargs[\\\"x_data\\\"], benetech_kwargs[\\\"x_values_type\\\"]\\n )\\n benetech_kwargs[\\\"y_data\\\"] = convert_string_to_axis_data(\\n benetech_kwargs[\\\"y_data\\\"], benetech_kwargs[\\\"y_values_type\\\"]\\n )\\n return BenetechOutput(**benetech_kwargs)\\n\\n\\ndef get_annotation_ground_truth_str(annotation: Annotation):\\n benetech_output = BenetechOutput(\\n chart_type=annotation.chart_type,\\n x_values_type=annotation.axes.x_axis.values_type,\\n x_data=[dp.x for dp in annotation.data_series],\\n y_values_type=annotation.axes.y_axis.values_type,\\n y_data=[dp.y for dp in annotation.data_series],\\n )\\n return benetech_output.to_string()\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "@dataclasses.dataclass\n",
+ "class BenetechOutput:\n",
+ " chart_type: ChartType\n",
+ " x_values_type: ValuesType\n",
+ " y_values_type: ValuesType\n",
+ " x_data: list[str or float]\n",
+ " y_data: list[str or float]\n",
+ "\n",
+ " def __post_init__(self):\n",
+ " self.chart_type = ChartType(self.chart_type)\n",
+ " self.x_values_type = ValuesType(self.x_values_type)\n",
+ " self.y_values_type = ValuesType(self.y_values_type)\n",
+ " assert isinstance(self.x_data, list)\n",
+ " assert isinstance(self.y_data, list)\n",
+ "\n",
+ " def to_string(self):\n",
+ " return self.format_strings(\n",
+ " chart_type=self.chart_type,\n",
+ " x_values_type=self.x_values_type,\n",
+ " y_values_type=self.y_values_type,\n",
+ " x_data=convert_axis_data_to_string(self.x_data, self.x_values_type),\n",
+ " y_data=convert_axis_data_to_string(self.y_data, self.y_values_type),\n",
+ " )\n",
+ "\n",
+ " @staticmethod\n",
+ " def format_strings(*, chart_type, x_values_type, y_values_type, x_data, y_data):\n",
+ " chart_type = to_token_str(chart_type)\n",
+ " x_values_type = to_token_str(x_values_type)\n",
+ " y_values_type = to_token_str(y_values_type)\n",
+ " return (\n",
+ " f\"{TOKEN.benetech_prompt}{chart_type}\"\n",
+ " f\"{TOKEN.x_start}{x_values_type}{x_data}\"\n",
+ " f\"{TOKEN.y_start}{y_values_type}{y_data}\"\n",
+ " f\"{TOKEN.benetech_prompt_end}\"\n",
+ " )\n",
+ "\n",
+ " @staticmethod\n",
+ " def get_string_pattern():\n",
+ " field_names = [field.name for field in dataclasses.fields(BenetechOutput)]\n",
+ " pattern = BenetechOutput.format_strings(\n",
+ " **{field_name: f\"(?P<{field_name}>.*?)\" for field_name in field_names}\n",
+ " )\n",
+ " return pattern\n",
+ "\n",
+ " @staticmethod\n",
+ " def does_string_match_expected_pattern(string):\n",
+ " return bool(re.fullmatch(BenetechOutput.get_string_pattern(), string))\n",
+ "\n",
+ " @staticmethod\n",
+ " def from_string(string):\n",
+ " fullmatch = re.fullmatch(BenetechOutput.get_string_pattern(), string)\n",
+ " benetech_kwargs = fullmatch.groupdict()\n",
+ " benetech_kwargs[\"chart_type\"] = ChartType(benetech_kwargs[\"chart_type\"])\n",
+ " benetech_kwargs[\"x_values_type\"] = ValuesType(benetech_kwargs[\"x_values_type\"])\n",
+ " benetech_kwargs[\"y_values_type\"] = ValuesType(benetech_kwargs[\"y_values_type\"])\n",
+ " benetech_kwargs[\"x_data\"] = convert_string_to_axis_data(\n",
+ " benetech_kwargs[\"x_data\"], benetech_kwargs[\"x_values_type\"]\n",
+ " )\n",
+ " benetech_kwargs[\"y_data\"] = convert_string_to_axis_data(\n",
+ " benetech_kwargs[\"y_data\"], benetech_kwargs[\"y_values_type\"]\n",
+ " )\n",
+ " return BenetechOutput(**benetech_kwargs)\n",
+ "\n",
+ "\n",
+ "def get_annotation_ground_truth_str(annotation: Annotation):\n",
+ " benetech_output = BenetechOutput(\n",
+ " chart_type=annotation.chart_type,\n",
+ " x_values_type=annotation.axes.x_axis.values_type,\n",
+ " x_data=[dp.x for dp in annotation.data_series],\n",
+ " y_values_type=annotation.axes.y_axis.values_type,\n",
+ " y_data=[dp.y for dp in annotation.data_series],\n",
+ " )\n",
+ " return benetech_output.to_string()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 244,
+ "id": "8342617b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "<(?P.*?)><(?P.*?)>(?P.*?)<(?P.*?)>(?P.*?) \n",
+ "\n",
+ "1-10<;>11-20<;>21-30<;>31-40<;>41-50<;>51-521.00000e+00<;>3.00000e+00<;>7.00000e+00<;>2.00000e+00<;>8.00000e+00<;>4.00000e+00 \n",
+ "\n",
+ "BenetechOutput(chart_type=,\n",
+ " x_values_type=,\n",
+ " y_values_type=,\n",
+ " x_data=['1-10', '11-20', '21-30', '31-40', '41-50', '51-52'],\n",
+ " y_data=[1.0, 3.0, 7.0, 2.0, 8.0, 4.0])\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 244;\n",
+ " var nbb_unformatted_code = \"if DEBUG:\\n print(BenetechOutput.get_string_pattern(), \\\"\\\\n\\\")\\n print(get_annotation_ground_truth_str(DATA.annotated_images[0].annotation), \\\"\\\\n\\\")\\n pprint.pprint(\\n BenetechOutput.from_string(\\n get_annotation_ground_truth_str(DATA.annotated_images[0].annotation)\\n )\\n )\";\n",
+ " var nbb_formatted_code = \"if DEBUG:\\n print(BenetechOutput.get_string_pattern(), \\\"\\\\n\\\")\\n print(get_annotation_ground_truth_str(DATA.annotated_images[0].annotation), \\\"\\\\n\\\")\\n pprint.pprint(\\n BenetechOutput.from_string(\\n get_annotation_ground_truth_str(DATA.annotated_images[0].annotation)\\n )\\n )\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "if DEBUG:\n",
+ " print(BenetechOutput.get_string_pattern(), \"\\n\")\n",
+ " print(get_annotation_ground_truth_str(DATA.annotated_images[0].annotation), \"\\n\")\n",
+ " pprint.pprint(\n",
+ " BenetechOutput.from_string(\n",
+ " get_annotation_ground_truth_str(DATA.annotated_images[0].annotation)\n",
+ " )\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "83bcf99d",
+ "metadata": {},
+ "source": [
+ "### Dataset "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "e532ac55",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 32;\n",
+ " var nbb_unformatted_code = \"@dataclasses.dataclass\\nclass DataItem:\\n image: torch.FloatTensor\\n target_string: str\\n data_index: int\\n\\n def __post_init__(self):\\n if DEBUG:\\n shape = einops.parse_shape(self.image, \\\"channel height width\\\")\\n assert shape[\\\"channel\\\"] == 3, \\\"Image is expected to have 3 channels.\\\"\\n\\n\\nclass Dataset(torch.utils.data.Dataset):\\n def __init__(self, split: Literal[\\\"train\\\", \\\"val\\\", \\\"complete\\\"]):\\n super().__init__()\\n match split:\\n case \\\"train\\\":\\n self.indices = DATA.train_indices\\n case \\\"val\\\":\\n self.indices = DATA.val_indices\\n case \\\"complete\\\":\\n self.indices = np.arange(len(DATA.annotated_images))\\n case _:\\n raise ValueError(f\\\"Unknown split {split}.\\\")\\n self.to_tensor = torchvision.transforms.ToTensor()\\n\\n def __len__(self):\\n return len(self.indices)\\n\\n def __getitem__(self, idx: int) -> DataItem:\\n data_index = self.indices[idx]\\n annotated_image = DATA.annotated_images[data_index]\\n\\n image = annotated_image.image\\n image = self.to_tensor(image)\\n\\n target_string = get_annotation_ground_truth_str(annotated_image.annotation)\\n\\n return DataItem(image=image, target_string=target_string, data_index=data_index)\";\n",
+ " var nbb_formatted_code = \"@dataclasses.dataclass\\nclass DataItem:\\n image: torch.FloatTensor\\n target_string: str\\n data_index: int\\n\\n def __post_init__(self):\\n if DEBUG:\\n shape = einops.parse_shape(self.image, \\\"channel height width\\\")\\n assert shape[\\\"channel\\\"] == 3, \\\"Image is expected to have 3 channels.\\\"\\n\\n\\nclass Dataset(torch.utils.data.Dataset):\\n def __init__(self, split: Literal[\\\"train\\\", \\\"val\\\", \\\"complete\\\"]):\\n super().__init__()\\n match split:\\n case \\\"train\\\":\\n self.indices = DATA.train_indices\\n case \\\"val\\\":\\n self.indices = DATA.val_indices\\n case \\\"complete\\\":\\n self.indices = np.arange(len(DATA.annotated_images))\\n case _:\\n raise ValueError(f\\\"Unknown split {split}.\\\")\\n self.to_tensor = torchvision.transforms.ToTensor()\\n\\n def __len__(self):\\n return len(self.indices)\\n\\n def __getitem__(self, idx: int) -> DataItem:\\n data_index = self.indices[idx]\\n annotated_image = DATA.annotated_images[data_index]\\n\\n image = annotated_image.image\\n image = self.to_tensor(image)\\n\\n target_string = get_annotation_ground_truth_str(annotated_image.annotation)\\n\\n return DataItem(image=image, target_string=target_string, data_index=data_index)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "@dataclasses.dataclass\n",
+ "class DataItem:\n",
+ " image: torch.FloatTensor\n",
+ " target_string: str\n",
+ " data_index: int\n",
+ "\n",
+ " def __post_init__(self):\n",
+ " if DEBUG:\n",
+ " shape = einops.parse_shape(self.image, \"channel height width\")\n",
+ " assert shape[\"channel\"] == 3, \"Image is expected to have 3 channels.\"\n",
+ "\n",
+ "\n",
+ "class Dataset(torch.utils.data.Dataset):\n",
+ " def __init__(self, split: Literal[\"train\", \"val\", \"complete\"]):\n",
+ " super().__init__()\n",
+ " match split:\n",
+ " case \"train\":\n",
+ " self.indices = DATA.train_indices\n",
+ " case \"val\":\n",
+ " self.indices = DATA.val_indices\n",
+ " case \"complete\":\n",
+ " self.indices = np.arange(len(DATA.annotated_images))\n",
+ " case _:\n",
+ " raise ValueError(f\"Unknown split {split}.\")\n",
+ " self.to_tensor = torchvision.transforms.ToTensor()\n",
+ "\n",
+ " def __len__(self):\n",
+ " return len(self.indices)\n",
+ "\n",
+ " def __getitem__(self, idx: int) -> DataItem:\n",
+ " data_index = self.indices[idx]\n",
+ " annotated_image = DATA.annotated_images[data_index]\n",
+ "\n",
+ " image = annotated_image.image\n",
+ " image = self.to_tensor(image)\n",
+ "\n",
+ " target_string = get_annotation_ground_truth_str(annotated_image.annotation)\n",
+ "\n",
+ " return DataItem(image=image, target_string=target_string, data_index=data_index)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "0ccf561f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 33;\n",
+ " var nbb_unformatted_code = \"DATA.train_dataset = Dataset(\\\"train\\\")\\nDATA.val_dataset = Dataset(\\\"val\\\")\\nDATA.complete_dataset = Dataset(\\\"complete\\\")\";\n",
+ " var nbb_formatted_code = \"DATA.train_dataset = Dataset(\\\"train\\\")\\nDATA.val_dataset = Dataset(\\\"val\\\")\\nDATA.complete_dataset = Dataset(\\\"complete\\\")\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "DATA.train_dataset = Dataset(\"train\")\n",
+ "DATA.val_dataset = Dataset(\"val\")\n",
+ "DATA.complete_dataset = Dataset(\"complete\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "773d4fcc",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/torchvision/transforms/functional.py:152: UserWarning: The given NumPy array is not writable, and PyTorch does not support non-writable tensors. This means writing to this tensor will result in undefined behavior. You may want to copy the array to protect its data or make it writable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at ../torch/csrc/utils/tensor_numpy.cpp:206.)\n",
+ " img = torch.from_numpy(pic.transpose((2, 0, 1))).contiguous()\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Asia, Central<;>Australia<;>Australia & New Zealand<;>Austria<;>Azerbaijan<;>Bahamas<;>Bahrain<;>Bangladesh<;>Barbados<;>Belarus5.90418e+06<;>2.21288e+06<;>4.33664e+06<;>8.17963e+06<;>8.58416e+06<;>6.35927e+06<;>7.87624e+06<;>8.93812e+06<;>5.29739e+06<;>8.48303e+06\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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kD6f7/jx4+fPn5dIJFKpVK1W5+fnV1RUtLW1ffDBB7W1tcuWLWNZtqWl5eGHH54xYwbDMCdOnKitrYVsUV9fv379+sHBwebm5hdeeKG8vHz58uVisfjTTz+dM2dOWVnZ+++/X1VVtXr16r6+voULF950001fBoPDpS0+1xFRjxZslHq9HhulrKxs8+bNW7ZsKSwsdLlcra2ter3+oYceWrhwoVwuT01N3bx583333adWq7Oysr7zne/cfPPNKSkp06ZNY1l248aNmZmZK1euXLNmjd/vt9lsALKYTKbc3Nzs7GysXCAQaGtr+/TTTyHXEEK8Xu+//uu/LlmyJBwOr1mz5qGHHsrPz8/Pz58xY4bL5br//vsff/zxm2++Gf6NCxcuLF68eMOGDfn5+dQngHZgDz116tSJEyekUmkoFKqtrXU4HE8//bRCoQgEAk6n87333quuru7s7IRXauvWrY8++mhZWdmuXbvg8oIxEXZnnU4HbY4QMmvWrIcffjgjI2P//v1isXj//v25ubl33HHHkSNH3G53UlLSo48+unLlyjNnzoTD4cbGRoVC8d3vfnfPnj0Wi4VOO66HSCRiMBiWL1/+5JNPpqWlpaenP/7448uXLzcYDO+9915VVdWjjz766KOPlpSUvPTSS729vYSQhQsXPvXUUxUVFSKR6LHHHnv44YfhjyKENDY2btu27dy5c5Cq0tLSioqKDAZDYWFhXl4eIQSYIZzbJUuWBIPB22+/feHChadPn7ZarUNDQ88999yqVasee+yxLVu2nD59+pNPPrHZbNOmTVu0aJFUKv3Wt75lMBgOHTqk1+uXL19uNBrnz58/a9asG2+8sby8fNGiRQsWLEhLSxOJRGvWrBGJRGKxmFqNRkdHT548+d5773k8nmAwqFKp5s2bd/vtt8+YMUMikaxYseLuu+++6aabKioqGIYBH/R4PC+99NL8+fO/+c1vrl27tqam5uDBg+np6Rs2bFi8ePE777zT399fVFR04403VlRUEELC4XB6ejrE7ccee6ygoODYsWN+v3/WrFm33357bm4u1KbMzMzFixfPmDFDo9HwPH/bbbcpFIq5c+fee++9kUjk5MmThJAlS5YYDIbS0tJvf/vbixYtOnjwYFdXF5j++fPn77rrrrvuuqu0tPT111/v7+/nOA5K25kzZ95///26ujqYU/Lz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c3NdLteuXbsgtMJm/S//8i8HDx584YUXzpw5YzQaDx065HK5Vq9e7fF4/H7/W2+9dd99923btm3NmjVyuTw/P//dd9/dtm1bbm6uRqMBBkij0ZSVlW3atKmkpAQqvNvtrqura2tr+9GPfvTqq68qlcrKysq33377xRdfLC8vT0lJ6ejoOHHixEcfffTTn/40GAyuXLmys7Pz+9//PqzbHo/nzJkzJ06cgFiNncrzfG1tbV9fX29vb0NDQygUkkqlq1evTk5O3rp16759+1paWu64445Zs2YB3tfZ2QlRrrm52e12Dw4Onjt3rrOzc9asWTk5OQUFBQMDAx999FF/f//58+c1Gk1/f//BgwfffvvtY8eODQ8PI1Svra1taGiovr4erE2j0Sxbtmz58uU1NTXbt28/cOBARUXFwoULcenW19f39vbW1dXhRhSLxUqlctq0afv27du/f//Jkydx6brd7p6enkAgcOLEiW3btr311ls1NTU2m+3o0aNpaWmrV69etGgRy7InTpyor69HSGtDQ4PP5+vo6LBYLF6vt62tzeFwtLW1OZ3OGTNm3HnnnTU1Nbt37/7ss8/Ky8srKipGRkbOnDlz8OBBh8OxZMmSO++8E2ZHgLHAiPv6+t5///3a2tpZs2bNmTMHQjT2KjQtl8tFCEEA28mTJ3meb29vh7Q7bdo0k8l0/vz53t7e4eHh0tLSe+655/Tp0y+88ILf71+1apVCofj4448PHTrU19f3wAMPpKenB4PBjz/+2OPxLF68OC8vLy8vr7u7+/33329raztw4IDBYKiqqtq/f79Go7n55pthXJZIJNXV1UeOHKmoqMjOzjaZTIODg59++qnNZrv55puLioreeOONrVu3Hj16VK1WAxLT0dExOjrq8Xh27dq1Z8+eXbt2QXcMh8Pz58+/++6729raMFGjo6M6nc7tdg8PD587dw4R0k8++STDMD/60Y/OnTtnNptvvfXWmpqampqavXv3ZmdnL1myJBQKqdXqBQsWtLe3f/jhh7DLwXxntVq9Xu/+/fvdbjf0yLNnz549exaSrxAdKETQX236KqDKSBQmglACmESB37JarZWVlSkpKT6fr6enp6enR6VSzZ07F9N95swZBF+mpaVlZ2e73e62tja73a5QKIqLi1tbW3mez83NhSjncDiamprsdvu0adNUKlVPT49a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TGFA93q9ZrOZj6aOA5oKnq6tW7fa7faCgoKOjg5CSHV19c6dO9PS0pYtW3b69OkPPviARGNq8/PzW1padu3aNWPGjJGRETBTQMh//vOfAzyOxG8cx/3v//6vXC43mUwQMtxut1arhUtq9+7dcrm8vLzcYDC43W4sqM/nA5f/1a9+BXRXZmZmVVXVzp07586d63K5fv/738Pyy3EcYotnzpx55syZHTt2lJSUQB83Go3bt29vaWnJzc0Vi8U7d+50Op1paWkmk6muru7w4cOlpaWFhYVgYWBnubm5R44cefvtt4F1AVzH4XDk5+e///77g4ODCxcuzMvL6+3tpfHKPT09v/vd7wBcw0EWiUQvv/yyXC6fM2fO7373u7feeotEE635/f66urq33nrrT3/6E8zlL7zwwrZt21544QXEcO/cuXPPnj3/8z//A9zkiy+++PDDDz/99NPCYBBIbGKx+JJJfK4qXfecdzwCKlOhUOTn5+fl5cGMqNFojh07tmfPnrKysoKCgvXr1x87duyjjz7iOC4/P3/FihWIn5HJZEDkaLVao9GYnZ2dnZ0NZEx6enpGRgYCPXmel0qlZ86cKSkpeeKJJ0KhUHp6+sqVKwFTT0tLmzdvHuz3X//61++99979+/d/9tlnwWDwgQcegESG6LWMjAzEufFR21YkErnhhhtWrFgBaJparf7444+3bds2b9683NzcrKysRx99dNmyZSMjI/v378cNX1RUpNPpqqurOzo6GIbJzs5evHixQqGoqakBZnbOnDlmsxmoZESOcByXlJSUkZGBXAHFxcXZ2dkA561evfqRRx5xuVx/+ctfII+XlJQAK63T6XJycpRK5dy5cwEVSEpKMhqNMplsyZIlN91006uvvkoR7IFA4OjRo4sWLVIoFIg3g2MnKSlp9uzZM2fO1Gq1M2fOBCsBNColJcVsNjudTnjGi4qK8vLyNBrNgQMHLBYLbsesrCyHw5GWlmY2m+GOhynQYDBUVFQgZgnZghAb3dbW5na79Xq9SqVau3bt8uXL//SnPzEMs2jRoqVLlyLVlt/vLykpqaysnDt3bnt7e1tbGyFkYGBAqVQ++OCDFRUVTqdz9erVdXV19fX1UBd4nkcMCJgLz/McxxUUFGzYsAHgKolEMn/+/I0bN9rt9ldeeUWpVCKWffr06du2bevu7tbr9UuWLJk1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1NGjR5966qm9e/fGxcUNHTqUELJhw4aKior4+PjGxkZkJPv6+tJR2FFvt4dG9Ws/P7+SkpKvv/46NTXVaDT27du3c+fOxcXFiYmJ7hVJoKC1XVCyADQ7eqvr16+vrKycPn16+/btCSEVFRUhISHwj9PiGG7MS6PRwMynFVtOnjx57NgxpLHGxMQcOnRo27Ztr7/+enx8PH5Cs10QWKM97VsLuL+uX7/+73//mxDyv//9j8vlyuXyv/71r4WFhSjxMX36dDBD2KlfxC0CDIXT6czJyTl06BAhJDo6et68eQaDYfv27ZWVlS+88AKsdbefI854vFwwvLA4cKeIxeKtW7eWl5dPmTKlffv24K7gv2hV5Z74oyo2/aS0tPTMmTMajQY5L+np6X5+fp988snrr7/esWNHsI8IIfX19WFhYWg015bKea3Fn1bnFQgEvXv31mq1y5cvr66uJoTI5fLs7Gz0f4U6jL2LuuOtvT7EqFKppJ2uwblZs2ZNaWmpyWRq167dkCFD9uzZYzAYunfvTt9MKnbd8/Niakql8oknnggJCRk6dChYuk6nc+bMmf369bNYLD179pw1a5avry8l1RNC6Kvr3lkL6hIKmRNC4uPjExISjh8/npmZ2blzZy6X2759e5SMstvtbtgQxJUbCmmLyjjod/DDDz9s2rSpsbERGVzIxCOEULFL6767AYfDAVY1La508eLFS5cu/fWvf42Li/vggw9qamoyMjLGjBmTk5NDXKtHCz+inIJ7Yler1fr4+AwdOlQqla5evXr16tUSieSJJ57o16/f559/Pnbs2AULFsyYMQPFRdlF3dpSRg51R51O57lz55577rl33nmnrKysoqLC19c3KysrNTUV1frJb4XRWgAcNfhbIBDAe3P27Nkff/zxnXfeuXz5clZWVmJi4vLly4uKimi5W+Kq3kDc2qJsUjO07I4dO6anp6vV6h9//HHUqFF9+vRp164d0vTR/QtfRuFdp9Pp5+fXli7urcWfVvIqFIq4uLi33367rKxs1apVCxYsWLNmTUpKSmxsLLIkfXx8kFfjHmkXsenc3Nw9e/agKyqfzx84cODMmTM/++yz0tJS1Mf597//HRQUpNVqbTYbzn/8HDVw3ROCer1+zJgxHTp04PP5SqXSarWi2rdarR4wYMCsWbN69+4NHyJCCmw1kGlDTTL8isPh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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 34;\n",
+ " var nbb_unformatted_code = \"print(DATA.train_dataset[0].target_string)\\ntorchvision.transforms.functional.to_pil_image(DATA.train_dataset[0].image)\";\n",
+ " var nbb_formatted_code = \"print(DATA.train_dataset[0].target_string)\\ntorchvision.transforms.functional.to_pil_image(DATA.train_dataset[0].image)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "print(DATA.train_dataset[0].target_string)\n",
+ "torchvision.transforms.functional.to_pil_image(DATA.train_dataset[0].image)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ec80e30c",
+ "metadata": {},
+ "source": [
+ "## Model "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "5257aba3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Could not find image processor class in the image processor config or the model config. Loading based on pattern matching with the model's feature extractor configuration.\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 35;\n",
+ " var nbb_unformatted_code = \"CONFIG.pretrained_model_name = \\\"naver-clova-ix/donut-base\\\"\\nCONFIG.encoder_decoder_config = transformers.VisionEncoderDecoderConfig.from_pretrained(\\n CONFIG.pretrained_model_name\\n)\\nCONFIG.encoder_decoder_config.encoder.image_size = (\\n CONFIG.image_width,\\n CONFIG.image_height,\\n)\\n\\nMODEL.donut_processor = transformers.DonutProcessor.from_pretrained(\\n CONFIG.pretrained_model_name\\n)\\nMODEL.donut_processor.image_processor.size = dict(\\n width=CONFIG.image_width, height=CONFIG.image_height\\n)\\nMODEL.donut_processor.image_processor.do_align_long_axis = False\\nMODEL.tokenizer = MODEL.donut_processor.tokenizer\\nMODEL.encoder_decoder = transformers.VisionEncoderDecoderModel.from_pretrained(\\n CONFIG.pretrained_model_name, config=CONFIG.encoder_decoder_config\\n)\\n\\nCONFIG.encoder_decoder_config.pad_token_id = MODEL.tokenizer.pad_token_id\\nCONFIG.encoder_decoder_config.decoder_start_token_id = (\\n MODEL.tokenizer.convert_tokens_to_ids(TOKEN.benetech_prompt)\\n)\\nCONFIG.encoder_decoder_config.bos_token_id = (\\n CONFIG.encoder_decoder_config.decoder_start_token_id\\n)\";\n",
+ " var nbb_formatted_code = \"CONFIG.pretrained_model_name = \\\"naver-clova-ix/donut-base\\\"\\nCONFIG.encoder_decoder_config = transformers.VisionEncoderDecoderConfig.from_pretrained(\\n CONFIG.pretrained_model_name\\n)\\nCONFIG.encoder_decoder_config.encoder.image_size = (\\n CONFIG.image_width,\\n CONFIG.image_height,\\n)\\n\\nMODEL.donut_processor = transformers.DonutProcessor.from_pretrained(\\n CONFIG.pretrained_model_name\\n)\\nMODEL.donut_processor.image_processor.size = dict(\\n width=CONFIG.image_width, height=CONFIG.image_height\\n)\\nMODEL.donut_processor.image_processor.do_align_long_axis = False\\nMODEL.tokenizer = MODEL.donut_processor.tokenizer\\nMODEL.encoder_decoder = transformers.VisionEncoderDecoderModel.from_pretrained(\\n CONFIG.pretrained_model_name, config=CONFIG.encoder_decoder_config\\n)\\n\\nCONFIG.encoder_decoder_config.pad_token_id = MODEL.tokenizer.pad_token_id\\nCONFIG.encoder_decoder_config.decoder_start_token_id = (\\n MODEL.tokenizer.convert_tokens_to_ids(TOKEN.benetech_prompt)\\n)\\nCONFIG.encoder_decoder_config.bos_token_id = (\\n CONFIG.encoder_decoder_config.decoder_start_token_id\\n)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "CONFIG.pretrained_model_name = \"naver-clova-ix/donut-base\"\n",
+ "CONFIG.encoder_decoder_config = transformers.VisionEncoderDecoderConfig.from_pretrained(\n",
+ " CONFIG.pretrained_model_name\n",
+ ")\n",
+ "CONFIG.encoder_decoder_config.encoder.image_size = (\n",
+ " CONFIG.image_width,\n",
+ " CONFIG.image_height,\n",
+ ")\n",
+ "\n",
+ "MODEL.donut_processor = transformers.DonutProcessor.from_pretrained(\n",
+ " CONFIG.pretrained_model_name\n",
+ ")\n",
+ "MODEL.donut_processor.image_processor.size = dict(\n",
+ " width=CONFIG.image_width, height=CONFIG.image_height\n",
+ ")\n",
+ "MODEL.donut_processor.image_processor.do_align_long_axis = False\n",
+ "MODEL.tokenizer = MODEL.donut_processor.tokenizer\n",
+ "MODEL.encoder_decoder = transformers.VisionEncoderDecoderModel.from_pretrained(\n",
+ " CONFIG.pretrained_model_name, config=CONFIG.encoder_decoder_config\n",
+ ")\n",
+ "\n",
+ "CONFIG.encoder_decoder_config.pad_token_id = MODEL.tokenizer.pad_token_id\n",
+ "CONFIG.encoder_decoder_config.decoder_start_token_id = (\n",
+ " MODEL.tokenizer.convert_tokens_to_ids(TOKEN.benetech_prompt)\n",
+ ")\n",
+ "CONFIG.encoder_decoder_config.bos_token_id = (\n",
+ " CONFIG.encoder_decoder_config.decoder_start_token_id\n",
+ ")\n",
+ "CONFIG.encoder_decoder_config.eos_token_id = MODEL.tokenizer.convert_tokens_to_ids(TOKEN.benetech_prompt_end)\n",
+ "MODEL.tokenizer.eos_token_id = CONFIG.encoder_decoder_config.eos_token_id"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d40f590d",
+ "metadata": {},
+ "source": [
+ "### Add task specific tokens "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "42516577",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 36;\n",
+ " var nbb_unformatted_code = \"def add_unknown_tokens_to_tokenizer(unknown_tokens: list[str]):\\n assert set(unknown_tokens) == set(unknown_tokens) - set(\\n MODEL.tokenizer.vocab.keys()\\n ), \\\"Tokens are not unknown.\\\"\\n\\n MODEL.tokenizer.add_tokens(unknown_tokens)\\n MODEL.encoder_decoder.decoder.resize_token_embeddings(len(MODEL.tokenizer))\";\n",
+ " var nbb_formatted_code = \"def add_unknown_tokens_to_tokenizer(unknown_tokens: list[str]):\\n assert set(unknown_tokens) == set(unknown_tokens) - set(\\n MODEL.tokenizer.vocab.keys()\\n ), \\\"Tokens are not unknown.\\\"\\n\\n MODEL.tokenizer.add_tokens(unknown_tokens)\\n MODEL.encoder_decoder.decoder.resize_token_embeddings(len(MODEL.tokenizer))\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def add_unknown_tokens_to_tokenizer(unknown_tokens: list[str]):\n",
+ " assert set(unknown_tokens) == set(unknown_tokens) - set(\n",
+ " MODEL.tokenizer.vocab.keys()\n",
+ " ), \"Tokens are not unknown.\"\n",
+ "\n",
+ " MODEL.tokenizer.add_tokens(unknown_tokens)\n",
+ " MODEL.encoder_decoder.decoder.resize_token_embeddings(len(MODEL.tokenizer))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "81a93859",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 37;\n",
+ " var nbb_unformatted_code = \"add_unknown_tokens_to_tokenizer(list(TOKEN.__dict__.values()))\";\n",
+ " var nbb_formatted_code = \"add_unknown_tokens_to_tokenizer(list(TOKEN.__dict__.values()))\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "add_unknown_tokens_to_tokenizer(list(TOKEN.__dict__.values()))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8070590a",
+ "metadata": {},
+ "source": [
+ "### Add dataset specific tokens "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "fe319b38",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 38;\n",
+ " var nbb_unformatted_code = \"def find_unknown_tokens_for_tokenizer() -> collections.Counter:\\n unknown_tokens_counter = collections.Counter()\\n\\n for annotated_image in tqdm.autonotebook.tqdm(\\n DATA.annotated_images, \\\"Tokenizing train data\\\"\\n ):\\n ground_truth = get_annotation_ground_truth_str(annotated_image.annotation)\\n\\n input_ids = MODEL.tokenizer(ground_truth).input_ids\\n tokens = MODEL.tokenizer.tokenize(ground_truth, add_special_tokens=True)\\n\\n for token_id, token in zip(input_ids, tokens, strict=True):\\n if token_id == MODEL.tokenizer.unk_token_id:\\n unknown_tokens_counter.update([token])\\n\\n return unknown_tokens_counter\";\n",
+ " var nbb_formatted_code = \"def find_unknown_tokens_for_tokenizer() -> collections.Counter:\\n unknown_tokens_counter = collections.Counter()\\n\\n for annotated_image in tqdm.autonotebook.tqdm(\\n DATA.annotated_images, \\\"Tokenizing train data\\\"\\n ):\\n ground_truth = get_annotation_ground_truth_str(annotated_image.annotation)\\n\\n input_ids = MODEL.tokenizer(ground_truth).input_ids\\n tokens = MODEL.tokenizer.tokenize(ground_truth, add_special_tokens=True)\\n\\n for token_id, token in zip(input_ids, tokens, strict=True):\\n if token_id == MODEL.tokenizer.unk_token_id:\\n unknown_tokens_counter.update([token])\\n\\n return unknown_tokens_counter\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def find_unknown_tokens_for_tokenizer() -> collections.Counter:\n",
+ " unknown_tokens_counter = collections.Counter()\n",
+ "\n",
+ " for annotated_image in tqdm.autonotebook.tqdm(\n",
+ " DATA.annotated_images, \"Tokenizing train data\"\n",
+ " ):\n",
+ " ground_truth = get_annotation_ground_truth_str(annotated_image.annotation)\n",
+ "\n",
+ " input_ids = MODEL.tokenizer(ground_truth).input_ids\n",
+ " tokens = MODEL.tokenizer.tokenize(ground_truth, add_special_tokens=True)\n",
+ "\n",
+ " for token_id, token in zip(input_ids, tokens, strict=True):\n",
+ " if token_id == MODEL.tokenizer.unk_token_id:\n",
+ " unknown_tokens_counter.update([token])\n",
+ "\n",
+ " return unknown_tokens_counter"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "91a5cc71",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "59bf4d12bb8041a4a61562d9d7aa2048",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Tokenizing train data: 0%| | 0/1000 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Counter({'1': 4})\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 39;\n",
+ " var nbb_unformatted_code = \"if DEBUG:\\n print(find_unknown_tokens_for_tokenizer())\";\n",
+ " var nbb_formatted_code = \"if DEBUG:\\n print(find_unknown_tokens_for_tokenizer())\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "if DEBUG:\n",
+ " print(find_unknown_tokens_for_tokenizer())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "72227777",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "09564ed83a8142979f1cebcb921eddda",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Tokenizing train data: 0%| | 0/1000 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 40;\n",
+ " var nbb_unformatted_code = \"add_unknown_tokens_to_tokenizer(list(find_unknown_tokens_for_tokenizer().keys()))\";\n",
+ " var nbb_formatted_code = \"add_unknown_tokens_to_tokenizer(list(find_unknown_tokens_for_tokenizer().keys()))\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "add_unknown_tokens_to_tokenizer(list(find_unknown_tokens_for_tokenizer().keys()))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "2fa909a1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 41;\n",
+ " var nbb_unformatted_code = \"def compute_target_tokens_length_distribution():\\n token_lenghts = []\\n for data_item in tqdm.autonotebook.tqdm(\\n DATA.complete_dataset, desc=\\\"Encoding target strings\\\"\\n ):\\n encoding = MODEL.tokenizer(data_item.target_string)\\n token_lenghts.append(len(encoding.input_ids))\\n return token_lenghts\\n\\n\\ndef visualize_target_tokens_length_distribution():\\n token_lenghts = compute_target_tokens_length_distribution()\\n plt.hist(token_lenghts, bins=50)\\n plt.title(\\\"Token length\\\")\\n series = pd.Series(token_lenghts, name=\\\"Token length\\\").to_frame().describe()\\n IPython.display.display(series)\";\n",
+ " var nbb_formatted_code = \"def compute_target_tokens_length_distribution():\\n token_lenghts = []\\n for data_item in tqdm.autonotebook.tqdm(\\n DATA.complete_dataset, desc=\\\"Encoding target strings\\\"\\n ):\\n encoding = MODEL.tokenizer(data_item.target_string)\\n token_lenghts.append(len(encoding.input_ids))\\n return token_lenghts\\n\\n\\ndef visualize_target_tokens_length_distribution():\\n token_lenghts = compute_target_tokens_length_distribution()\\n plt.hist(token_lenghts, bins=50)\\n plt.title(\\\"Token length\\\")\\n series = pd.Series(token_lenghts, name=\\\"Token length\\\").to_frame().describe()\\n IPython.display.display(series)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def compute_target_tokens_length_distribution():\n",
+ " token_lenghts = []\n",
+ " for data_item in tqdm.autonotebook.tqdm(\n",
+ " DATA.complete_dataset, desc=\"Encoding target strings\"\n",
+ " ):\n",
+ " encoding = MODEL.tokenizer(data_item.target_string)\n",
+ " token_lenghts.append(len(encoding.input_ids))\n",
+ " return token_lenghts\n",
+ "\n",
+ "\n",
+ "def visualize_target_tokens_length_distribution():\n",
+ " token_lenghts = compute_target_tokens_length_distribution()\n",
+ " plt.hist(token_lenghts, bins=50)\n",
+ " plt.title(\"Token length\")\n",
+ " series = pd.Series(token_lenghts, name=\"Token length\").to_frame().describe()\n",
+ " IPython.display.display(series)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "76eb6a64",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "745c122bed8842eabeab4c427682656e",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Encoding target strings: 0%| | 0/1000 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Token length | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " count | \n",
+ " 1000.000000 | \n",
+ "
\n",
+ " \n",
+ " mean | \n",
+ " 175.588000 | \n",
+ "
\n",
+ " \n",
+ " std | \n",
+ " 104.350886 | \n",
+ "
\n",
+ " \n",
+ " min | \n",
+ " 51.000000 | \n",
+ "
\n",
+ " \n",
+ " 25% | \n",
+ " 122.000000 | \n",
+ "
\n",
+ " \n",
+ " 50% | \n",
+ " 143.000000 | \n",
+ "
\n",
+ " \n",
+ " 75% | \n",
+ " 185.250000 | \n",
+ "
\n",
+ " \n",
+ " max | \n",
+ " 1201.000000 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Token length\n",
+ "count 1000.000000\n",
+ "mean 175.588000\n",
+ "std 104.350886\n",
+ "min 51.000000\n",
+ "25% 122.000000\n",
+ "50% 143.000000\n",
+ "75% 185.250000\n",
+ "max 1201.000000"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGzCAYAAAAFROyYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAs2klEQVR4nO3de3SU1aH//08uZLjOxADJEEkAQQUElAYNU1Cp5BAuRalwLBQxWA4saGLFoCItolIliB6p12B7zhG1IspaghW5GMJNariIoICAoGgoMImKyQBCCMn+/eGX5+cYbolJZie8X2s9azF773mevXeG5LP2c5kwY4wRAACARcJD3QEAAICfIqAAAADrEFAAAIB1CCgAAMA6BBQAAGAdAgoAALAOAQUAAFiHgAIAAKxDQAEAANYhoABwhIWFKSMjI9TdkCT16dNHffr0CXU3zuvhhx9WWFiYvvnmm1B3BahXCChAHRcWFnZB2+rVq0Pd1TptxowZWrRoUai7AVw0IkPdAQA/z6uvvhr0+pVXXlFOTk6F8k6dOtVmt+qdGTNmaNiwYRoyZEiouwJcFAgoQB13++23B71ev369cnJyKpQDQF3CKR7gInDs2DFNmjRJCQkJcrlcuvLKK/Xkk0/qQr7M/NFHH1V4eLieffZZp2zp0qW6/vrr1aRJEzVr1kyDBg3Sjh07gt43evRoNW3aVAcOHNCQIUPUtGlTtWzZUvfee6/KysqqNI6SkhI99NBD6tChg1wulxISEnT//ferpKQkqN3pa2kWLVqkLl26yOVy6aqrrtKyZcsq7HP16tXq0aOHGjZsqPbt2+vFF190riv58f6OHTuml19+2TllNnr06KD9FBUVafTo0YqOjpbH49Gdd96p77//vkrjBMAKClDvGWN08803a9WqVRozZoyuueYaLV++XPfdd58OHDig2bNnn/W9U6dO1YwZM/Tiiy9q7Nixkn44pZSWlqbU1FQ9/vjj+v7775Wdna3evXtry5Ytatu2rfP+srIypaamKjk5WU8++aRWrFih//7v/1b79u01YcKESo2jvLxcN998s9atW6dx48apU6dO2rZtm2bPnq3PPvuswvUh69at01tvvaU//OEPatasmZ555hkNHTpU+fn5at68uSRpy5Yt6t+/v1q1aqVHHnlEZWVlmj59ulq2bBm0r1dffVX/9V//peuuu07jxo2TJLVv3z6ozW233aZ27dopKytLH330kf7nf/5HsbGxevzxxys1TgD/jwFQr6Snp5sf/9detGiRkWQeffTRoHbDhg0zYWFhZu/evU6ZJJOenm6MMWbSpEkmPDzczJ0716k/cuSIiY6ONmPHjg3al9/vNx6PJ6g8LS3NSDLTp08Patu9e3eTlJR03nHceOON5sYbb3Rev/rqqyY8PNy8//77Qe3mzJljJJl//etfQeOIiooKGtvHH39sJJlnn33WKRs8eLBp3LixOXDggFO2Z88eExkZaX7667FJkyYmLS2tQj8feughI8n8/ve/Dyr/zW9+Y5o3b37ecQI4M07xAPXckiVLFBERoT/+8Y9B5ZMmTZIxRkuXLg0qN8YoIyNDTz/9tP7xj38oLS3NqcvJyVFRUZFGjBihb775xtkiIiKUnJysVatWVTj++PHjg15ff/31+uKLLyo9jgULFqhTp07q2LFj0LFvuukmSapw7JSUlKBVjm7dusntdjvHLisr04oVKzRkyBDFx8c77Tp06KABAwZUun9nGue3336rQCBQ6X0B4BQPUO999dVXio+PV7NmzYLKT9/V89VXXwWVv/LKKzp69Kiys7M1YsSIoLo9e/ZIkhMKfsrtdge9btiwYYXTJZdccom+++67So9jz5492rlzZ4X9nVZYWBj0OjExsUKbHx+7sLBQx48fV4cOHSq0O1PZ+fz0eJdccokk6bvvvqswLwDOj4ACIEivXr20detWPffcc7rtttsUExPj1JWXl0v64ZoMr9db4b2RkcG/UiIiIqqtX+Xl5erataueeuqpM9YnJCRc0LHNBVwYXBW1fTygviOgAPVcmzZttGLFCh05ciRoFWXXrl1O/Y916NBBs2bNUp8+fdS/f3/l5uY67zt9yiQ2NlYpKSm1NAI5x/7444/Vt2/foDtsqio2NlYNGzbU3r17K9Sdqaw6jgngwnENClDPDRw4UGVlZXruueeCymfPnq2wsLAzXm/RrVs3LVmyRDt37tTgwYN1/PhxSVJqaqrcbrdmzJih0tLSCu/7+uuva2YQ+uEumQMHDujvf/97hbrjx4/r2LFjldpfRESEUlJStGjRIh08eNAp37t3b4XrciSpSZMmKioqqnS/AVQNKyhAPTd48GD96le/0p///Gd9+eWXuvrqq/Xee+/p7bff1sSJEyvcLntaz5499fbbb2vgwIEaNmyYFi1aJLfbrezsbI0aNUq/+MUvNHz4cLVs2VL5+fl699131atXrwpBqLqMGjVKb775psaPH69Vq1apV69eKisr065du/Tmm29q+fLl6tGjR6X2+fDDD+u9995Tr169NGHCBCfIdenSRVu3bg1qm5SUpBUrVuipp55SfHy82rVrp+Tk5GocIYAfI6AA9Vx4eLj++c9/atq0aXrjjTf00ksvqW3btnriiSc0adKkc773pptu0ptvvqmhQ4dq1KhRmjdvnn73u98pPj5eM2fO1BNPPKGSkhJdeumluv7663XnnXfW6DgWLVqk2bNn65VXXtHChQvVuHFjXXbZZbr77rt1xRVXVHqfSUlJWrp0qe699149+OCDSkhI0PTp07Vz507nFNhpTz31lMaNG6epU6fq+PHjSktLI6AANSjMcAUXAAQZMmSIduzY4dy1BKD2cQ0KgIva6etrTtuzZ4+WLFmiPn36hKZDACSxggLgIteqVSuNHj1al112mb766itlZ2erpKREW7Zs0eWXXx7q7gEXLa5BAXBR69+/v15//XX5/X65XC75fD7NmDGDcAKEGCsoAADAOlyDAgAArENAAQAA1qmT16CUl5fr4MGDatasGY+fBgCgjjDG6MiRI4qPj1d4+LnXSOpkQDl48GCFLwYDAAB1w/79+9W6detztqlUQMnOzlZ2dra+/PJLSdJVV12ladOmOd/lceLECU2aNEnz589XSUmJUlNT9cILLyguLs7ZR35+viZMmKBVq1apadOmSktLU1ZWVoVvQT2X019ctn//fr7GHACAOiIQCCghISHoi0vPplIBpXXr1po5c6Yuv/xyGWP08ssv65ZbbtGWLVt01VVX6Z577tG7776rBQsWyOPxKCMjQ7feeqv+9a9/SZLKyso0aNAgeb1effDBBzp06JDuuOMONWjQQDNmzLjgfpw+reN2uwkoAADUMRdyecbPvs04JiZGTzzxhIYNG6aWLVtq3rx5GjZsmKQfvs69U6dOysvLU8+ePbV06VL9+te/1sGDB51VlTlz5mjy5Mn6+uuvFRUVdUHHDAQC8ng8Ki4uJqAAAFBHVObvd5Xv4ikrK9P8+fN17Ngx+Xw+bd68WaWlpUpJSXHadOzYUYmJicrLy5Mk5eXlqWvXrkGnfFJTUxUIBLRjx46zHqukpESBQCBo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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 42;\n",
+ " var nbb_unformatted_code = \"if DEBUG:\\n visualize_target_tokens_length_distribution()\";\n",
+ " var nbb_formatted_code = \"if DEBUG:\\n visualize_target_tokens_length_distribution()\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "if DEBUG:\n",
+ " visualize_target_tokens_length_distribution()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "b8a7f491",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 43;\n",
+ " var nbb_unformatted_code = \"CONFIG.encoder_decoder_config.decoder.max_length = 512\";\n",
+ " var nbb_formatted_code = \"CONFIG.encoder_decoder_config.decoder.max_length = 512\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "CONFIG.encoder_decoder_config.decoder.max_length = 512"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2a090da9",
+ "metadata": {},
+ "source": [
+ "### Dataloader "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "8637a86a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 44;\n",
+ " var nbb_unformatted_code = \"@dataclasses.dataclass\\nclass Batch:\\n images: torch.FloatTensor\\n labels: torch.IntTensor\\n data_indices: list[int]\\n\\n def __post_init__(self):\\n if DEBUG:\\n images_shape = einops.parse_shape(self.images, \\\"batch channel height width\\\")\\n labels_shape = einops.parse_shape(self.labels, \\\"batch label\\\")\\n assert images_shape[\\\"batch\\\"] == labels_shape[\\\"batch\\\"]\\n assert len(self.data_indices) == images_shape[\\\"batch\\\"]\\n\\n\\ndef replace_pad_token_id_with_negative_hundred_for_hf_transformers_automatic_batch_transformation(\\n token_ids,\\n):\\n token_ids[token_ids == MODEL.tokenizer.pad_token_id] = -100\\n return token_ids\\n\\n\\ndef collate_function(batch: list[DataItem], split: Literal[\\\"train\\\", \\\"val\\\"]) -> Batch:\\n images = [di.image for di in batch]\\n images = MODEL.donut_processor(\\n images, random_padding=split == \\\"train\\\", return_tensors=\\\"pt\\\"\\n ).pixel_values\\n\\n target_token_ids = MODEL.tokenizer(\\n [di.target_string for di in batch],\\n add_special_tokens=False,\\n max_length=CONFIG.encoder_decoder_config.decoder.max_length,\\n padding=\\\"max_length\\\",\\n truncation=True,\\n return_tensors=\\\"pt\\\",\\n ).input_ids\\n labels = replace_pad_token_id_with_negative_hundred_for_hf_transformers_automatic_batch_transformation(\\n target_token_ids\\n )\\n\\n data_indices = [di.data_index for di in batch]\\n\\n return Batch(images=images, labels=labels, data_indices=data_indices)\\n\\n\\nCONFIG.batch_size = 2 if DEBUG else 32\\nCONFIG.num_workers = 4\\n\\n\\ndef build_dataloader(split: Literal[\\\"train\\\", \\\"val\\\"]):\\n return torch.utils.data.DataLoader(\\n DATA.train_dataset if split == \\\"train\\\" else DATA.val_dataset,\\n batch_size=CONFIG.batch_size,\\n shuffle=split == \\\"train\\\",\\n num_workers=CONFIG.num_workers,\\n collate_fn=functools.partial(collate_function, split=split),\\n )\\n\\n\\nDATA.train_dataloader = build_dataloader(\\\"train\\\")\\nDATA.val_dataloader = build_dataloader(\\\"val\\\")\";\n",
+ " var nbb_formatted_code = \"@dataclasses.dataclass\\nclass Batch:\\n images: torch.FloatTensor\\n labels: torch.IntTensor\\n data_indices: list[int]\\n\\n def __post_init__(self):\\n if DEBUG:\\n images_shape = einops.parse_shape(self.images, \\\"batch channel height width\\\")\\n labels_shape = einops.parse_shape(self.labels, \\\"batch label\\\")\\n assert images_shape[\\\"batch\\\"] == labels_shape[\\\"batch\\\"]\\n assert len(self.data_indices) == images_shape[\\\"batch\\\"]\\n\\n\\ndef replace_pad_token_id_with_negative_hundred_for_hf_transformers_automatic_batch_transformation(\\n token_ids,\\n):\\n token_ids[token_ids == MODEL.tokenizer.pad_token_id] = -100\\n return token_ids\\n\\n\\ndef collate_function(batch: list[DataItem], split: Literal[\\\"train\\\", \\\"val\\\"]) -> Batch:\\n images = [di.image for di in batch]\\n images = MODEL.donut_processor(\\n images, random_padding=split == \\\"train\\\", return_tensors=\\\"pt\\\"\\n ).pixel_values\\n\\n target_token_ids = MODEL.tokenizer(\\n [di.target_string for di in batch],\\n add_special_tokens=False,\\n max_length=CONFIG.encoder_decoder_config.decoder.max_length,\\n padding=\\\"max_length\\\",\\n truncation=True,\\n return_tensors=\\\"pt\\\",\\n ).input_ids\\n labels = replace_pad_token_id_with_negative_hundred_for_hf_transformers_automatic_batch_transformation(\\n target_token_ids\\n )\\n\\n data_indices = [di.data_index for di in batch]\\n\\n return Batch(images=images, labels=labels, data_indices=data_indices)\\n\\n\\nCONFIG.batch_size = 2 if DEBUG else 32\\nCONFIG.num_workers = 4\\n\\n\\ndef build_dataloader(split: Literal[\\\"train\\\", \\\"val\\\"]):\\n return torch.utils.data.DataLoader(\\n DATA.train_dataset if split == \\\"train\\\" else DATA.val_dataset,\\n batch_size=CONFIG.batch_size,\\n shuffle=split == \\\"train\\\",\\n num_workers=CONFIG.num_workers,\\n collate_fn=functools.partial(collate_function, split=split),\\n )\\n\\n\\nDATA.train_dataloader = build_dataloader(\\\"train\\\")\\nDATA.val_dataloader = build_dataloader(\\\"val\\\")\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "@dataclasses.dataclass\n",
+ "class Batch:\n",
+ " images: torch.FloatTensor\n",
+ " labels: torch.IntTensor\n",
+ " data_indices: list[int]\n",
+ "\n",
+ " def __post_init__(self):\n",
+ " if DEBUG:\n",
+ " images_shape = einops.parse_shape(self.images, \"batch channel height width\")\n",
+ " labels_shape = einops.parse_shape(self.labels, \"batch label\")\n",
+ " assert images_shape[\"batch\"] == labels_shape[\"batch\"]\n",
+ " assert len(self.data_indices) == images_shape[\"batch\"]\n",
+ "\n",
+ "\n",
+ "def replace_pad_token_id_with_negative_hundred_for_hf_transformers_automatic_batch_transformation(\n",
+ " token_ids,\n",
+ "):\n",
+ " token_ids[token_ids == MODEL.tokenizer.pad_token_id] = -100\n",
+ " return token_ids\n",
+ "\n",
+ "\n",
+ "def collate_function(batch: list[DataItem], split: Literal[\"train\", \"val\"]) -> Batch:\n",
+ " images = [di.image for di in batch]\n",
+ " images = MODEL.donut_processor(\n",
+ " images, random_padding=split == \"train\", return_tensors=\"pt\"\n",
+ " ).pixel_values\n",
+ "\n",
+ " target_token_ids = MODEL.tokenizer(\n",
+ " [di.target_string for di in batch],\n",
+ " add_special_tokens=False,\n",
+ " max_length=CONFIG.encoder_decoder_config.decoder.max_length,\n",
+ " padding=\"max_length\",\n",
+ " truncation=True,\n",
+ " return_tensors=\"pt\",\n",
+ " ).input_ids\n",
+ " labels = replace_pad_token_id_with_negative_hundred_for_hf_transformers_automatic_batch_transformation(\n",
+ " target_token_ids\n",
+ " )\n",
+ "\n",
+ " data_indices = [di.data_index for di in batch]\n",
+ "\n",
+ " return Batch(images=images, labels=labels, data_indices=data_indices)\n",
+ "\n",
+ "\n",
+ "CONFIG.batch_size = 2 if DEBUG else 32\n",
+ "CONFIG.num_workers = 4\n",
+ "\n",
+ "\n",
+ "def build_dataloader(split: Literal[\"train\", \"val\"]):\n",
+ " return torch.utils.data.DataLoader(\n",
+ " DATA.train_dataset if split == \"train\" else DATA.val_dataset,\n",
+ " batch_size=CONFIG.batch_size,\n",
+ " shuffle=split == \"train\",\n",
+ " num_workers=CONFIG.num_workers,\n",
+ " collate_fn=functools.partial(collate_function, split=split),\n",
+ " )\n",
+ "\n",
+ "\n",
+ "DATA.train_dataloader = build_dataloader(\"train\")\n",
+ "DATA.val_dataloader = build_dataloader(\"val\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "bf389ff2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 45;\n",
+ " var nbb_unformatted_code = \"def test_dataloaders():\\n for batch in tqdm.autonotebook.tqdm(\\n DATA.val_dataloader, \\\"Iterating over val dataloader\\\"\\n ):\\n pass\\n for batch in tqdm.autonotebook.tqdm(\\n DATA.train_dataloader, \\\"Iterating over train dataloader\\\"\\n ):\\n pass\";\n",
+ " var nbb_formatted_code = \"def test_dataloaders():\\n for batch in tqdm.autonotebook.tqdm(\\n DATA.val_dataloader, \\\"Iterating over val dataloader\\\"\\n ):\\n pass\\n for batch in tqdm.autonotebook.tqdm(\\n DATA.train_dataloader, \\\"Iterating over train dataloader\\\"\\n ):\\n pass\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def test_dataloaders():\n",
+ " for batch in tqdm.autonotebook.tqdm(\n",
+ " DATA.val_dataloader, \"Iterating over val dataloader\"\n",
+ " ):\n",
+ " pass\n",
+ " for batch in tqdm.autonotebook.tqdm(\n",
+ " DATA.train_dataloader, \"Iterating over train dataloader\"\n",
+ " ):\n",
+ " pass"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "0eb3fed2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "78c165d1e7044dd98d18e2fd0c7566d7",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Iterating over val dataloader: 0%| | 0/50 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "ee9da08947b24bf586790d14e19b8697",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Iterating over train dataloader: 0%| | 0/450 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 46;\n",
+ " var nbb_unformatted_code = \"if DEBUG:\\n test_dataloaders()\";\n",
+ " var nbb_formatted_code = \"if DEBUG:\\n test_dataloaders()\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "if DEBUG:\n",
+ " test_dataloaders()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "08146c41",
+ "metadata": {},
+ "source": [
+ "### Lightning module "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "323bb5da",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 47;\n",
+ " var nbb_unformatted_code = \"CONFIG.learning_rate = 3e-5\\n\\n\\nclass LightningModule(pl.LightningModule):\\n def __init__(self):\\n super().__init__()\\n self.model = MODEL.encoder_decoder\\n\\n def training_step(self, batch: Batch, batch_idx: int) -> torch.Tensor:\\n outputs = self.model(pixel_values=batch.images, labels=batch.labels)\\n loss = outputs.loss\\n self.log(\\\"train_loss\\\", loss)\\n return loss\\n\\n def validation_step(self, batch: Batch, batch_idx: int, dataset_idx: int = 0):\\n outputs = self.model(pixel_values=batch.images, labels=batch.labels)\\n loss = outputs.loss\\n self.log(\\\"val_loss\\\", loss)\\n\\n def configure_optimizers(self) -> torch.optim.Optimizer:\\n optimizer = torch.optim.Adam(self.parameters(), lr=CONFIG.learning_rate)\\n return optimizer\\n\\n\\nMODEL.lightning_module = LightningModule()\";\n",
+ " var nbb_formatted_code = \"CONFIG.learning_rate = 3e-5\\n\\n\\nclass LightningModule(pl.LightningModule):\\n def __init__(self):\\n super().__init__()\\n self.model = MODEL.encoder_decoder\\n\\n def training_step(self, batch: Batch, batch_idx: int) -> torch.Tensor:\\n outputs = self.model(pixel_values=batch.images, labels=batch.labels)\\n loss = outputs.loss\\n self.log(\\\"train_loss\\\", loss)\\n return loss\\n\\n def validation_step(self, batch: Batch, batch_idx: int, dataset_idx: int = 0):\\n outputs = self.model(pixel_values=batch.images, labels=batch.labels)\\n loss = outputs.loss\\n self.log(\\\"val_loss\\\", loss)\\n\\n def configure_optimizers(self) -> torch.optim.Optimizer:\\n optimizer = torch.optim.Adam(self.parameters(), lr=CONFIG.learning_rate)\\n return optimizer\\n\\n\\nMODEL.lightning_module = LightningModule()\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "CONFIG.learning_rate = 3e-5\n",
+ "\n",
+ "\n",
+ "class LightningModule(pl.LightningModule):\n",
+ " def __init__(self):\n",
+ " super().__init__()\n",
+ " self.model = MODEL.encoder_decoder\n",
+ "\n",
+ " def training_step(self, batch: Batch, batch_idx: int) -> torch.Tensor:\n",
+ " outputs = self.model(pixel_values=batch.images, labels=batch.labels)\n",
+ " loss = outputs.loss\n",
+ " self.log(\"train_loss\", loss)\n",
+ " return loss\n",
+ "\n",
+ " def validation_step(self, batch: Batch, batch_idx: int, dataset_idx: int = 0):\n",
+ " outputs = self.model(pixel_values=batch.images, labels=batch.labels)\n",
+ " loss = outputs.loss\n",
+ " self.log(\"val_loss\", loss)\n",
+ "\n",
+ " def configure_optimizers(self) -> torch.optim.Optimizer:\n",
+ " optimizer = torch.optim.Adam(self.parameters(), lr=CONFIG.learning_rate)\n",
+ " return optimizer\n",
+ "\n",
+ "\n",
+ "MODEL.lightning_module = LightningModule()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7bda7494",
+ "metadata": {},
+ "source": [
+ "### Metrics "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "id": "a04524e0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 48;\n",
+ " var nbb_unformatted_code = \"def generate_token_strings(images: torch.Tensor, skip_special_tokens=True) -> list[str]:\\n decoder_output = MODEL.encoder_decoder.generate(\\n images,\\n max_length=10 if DEBUG else CONFIG.encoder_decoder_config.decoder.max_length,\\n return_dict_in_generate=True,\\n )\\n return MODEL.tokenizer.batch_decode(\\n decoder_output.sequences, skip_special_tokens=skip_special_tokens\\n )\\n\\n\\nclass MetricsCallback(pl.callbacks.Callback):\\n def on_validation_batch_start(\\n self, trainer, pl_module, batch: Batch, batch_idx, dataloader_idx=0\\n ):\\n annotated_images = [DATA.annotated_images[i] for i in batch.data_indices]\\n ground_truth_strings = [\\n get_annotation_ground_truth_str(ai.annotation) for ai in annotated_images\\n ]\\n predicted_strings = generate_token_strings(batch.images)\\n\\n strings_dataframe = pd.DataFrame(\\n dict(ground_truth=ground_truth_strings, predicted=predicted_strings)\\n )\\n wandb.log(dict(strings=wandb.Table(dataframe=strings_dataframe)))\";\n",
+ " var nbb_formatted_code = \"def generate_token_strings(images: torch.Tensor, skip_special_tokens=True) -> list[str]:\\n decoder_output = MODEL.encoder_decoder.generate(\\n images,\\n max_length=10 if DEBUG else CONFIG.encoder_decoder_config.decoder.max_length,\\n return_dict_in_generate=True,\\n )\\n return MODEL.tokenizer.batch_decode(\\n decoder_output.sequences, skip_special_tokens=skip_special_tokens\\n )\\n\\n\\nclass MetricsCallback(pl.callbacks.Callback):\\n def on_validation_batch_start(\\n self, trainer, pl_module, batch: Batch, batch_idx, dataloader_idx=0\\n ):\\n annotated_images = [DATA.annotated_images[i] for i in batch.data_indices]\\n ground_truth_strings = [\\n get_annotation_ground_truth_str(ai.annotation) for ai in annotated_images\\n ]\\n predicted_strings = generate_token_strings(batch.images)\\n\\n strings_dataframe = pd.DataFrame(\\n dict(ground_truth=ground_truth_strings, predicted=predicted_strings)\\n )\\n wandb.log(dict(strings=wandb.Table(dataframe=strings_dataframe)))\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def generate_token_strings(images: torch.Tensor, skip_special_tokens=True) -> list[str]:\n",
+ " decoder_output = MODEL.encoder_decoder.generate(\n",
+ " images,\n",
+ " max_length=10 if DEBUG else CONFIG.encoder_decoder_config.decoder.max_length,\n",
+ " eos_token_id=MODEL.tokenizer.eos_token_id,\n",
+ " return_dict_in_generate=True,\n",
+ " )\n",
+ " return MODEL.tokenizer.batch_decode(\n",
+ " decoder_output.sequences, skip_special_tokens=skip_special_tokens\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "874a8e16",
+ "metadata": {},
+ "source": [
+ "## Training "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b375ad12",
+ "metadata": {},
+ "source": [
+ "### Callbacks "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 315,
+ "id": "441e54bb",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 315;\n",
+ " var nbb_unformatted_code = \"class MetricsCallback(pl.callbacks.Callback):\\n def on_validation_batch_start(\\n self, trainer, pl_module, batch: Batch, batch_idx, dataloader_idx=0\\n ):\\n annotated_images = [DATA.annotated_images[i] for i in batch.data_indices]\\n ground_truth_strings = [\\n get_annotation_ground_truth_str(ai.annotation) for ai in annotated_images\\n ]\\n predicted_strings = generate_token_strings(batch.images)\\n\\n strings_dataframe = pd.DataFrame(\\n dict(ground_truth=ground_truth_strings, predicted=predicted_strings)\\n )\\n wandb.log(dict(strings=wandb.Table(dataframe=strings_dataframe)))\\n\\n\\nclass TransformersCheckpointIO(pl.plugins.CheckpointIO):\\n def save_checkpoint(self, checkpoint, path, storage_options=None):\\n MODEL.donut_processor.save_pretrained(path)\\n MODEL.encoder_decoder.save_pretrained(path)\\n \\n def load_checkpoint(self, path, storage_options=None):\\n pass\\n\\n def remove_checkpoint(self, path):\\n pass\";\n",
+ " var nbb_formatted_code = \"class MetricsCallback(pl.callbacks.Callback):\\n def on_validation_batch_start(\\n self, trainer, pl_module, batch: Batch, batch_idx, dataloader_idx=0\\n ):\\n annotated_images = [DATA.annotated_images[i] for i in batch.data_indices]\\n ground_truth_strings = [\\n get_annotation_ground_truth_str(ai.annotation) for ai in annotated_images\\n ]\\n predicted_strings = generate_token_strings(batch.images)\\n\\n strings_dataframe = pd.DataFrame(\\n dict(ground_truth=ground_truth_strings, predicted=predicted_strings)\\n )\\n wandb.log(dict(strings=wandb.Table(dataframe=strings_dataframe)))\\n\\n\\nclass TransformersCheckpointIO(pl.plugins.CheckpointIO):\\n def save_checkpoint(self, checkpoint, path, storage_options=None):\\n MODEL.donut_processor.save_pretrained(path)\\n MODEL.encoder_decoder.save_pretrained(path)\\n\\n def load_checkpoint(self, path, storage_options=None):\\n pass\\n\\n def remove_checkpoint(self, path):\\n pass\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "class MetricsCallback(pl.callbacks.Callback):\n",
+ " def on_validation_batch_start(\n",
+ " self, trainer, pl_module, batch: Batch, batch_idx, dataloader_idx=0\n",
+ " ):\n",
+ " annotated_images = [DATA.annotated_images[i] for i in batch.data_indices]\n",
+ " ground_truth_strings = [\n",
+ " get_annotation_ground_truth_str(ai.annotation) for ai in annotated_images\n",
+ " ]\n",
+ " predicted_strings = generate_token_strings(batch.images)\n",
+ "\n",
+ " strings_dataframe = pd.DataFrame(\n",
+ " dict(ground_truth=ground_truth_strings, predicted=predicted_strings)\n",
+ " )\n",
+ " wandb.log(dict(strings=wandb.Table(dataframe=strings_dataframe)))\n",
+ "\n",
+ "\n",
+ "class TransformersCheckpointIO(pl.plugins.CheckpointIO):\n",
+ " def save_checkpoint(self, checkpoint, path, storage_options=None):\n",
+ " MODEL.donut_processor.save_pretrained(path)\n",
+ " MODEL.encoder_decoder.save_pretrained(path)\n",
+ "\n",
+ " def load_checkpoint(self, path, storage_options=None):\n",
+ " pass\n",
+ "\n",
+ " def remove_checkpoint(self, path):\n",
+ " pass"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 316,
+ "id": "3d12b673",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/pytorch_lightning/loggers/wandb.py:395: UserWarning: There is a wandb run already in progress and newly created instances of `WandbLogger` will reuse this run. If this is not desired, call `wandb.finish()` before instantiating `WandbLogger`.\n",
+ " rank_zero_warn(\n",
+ "GPU available: True (cuda), used: False\n",
+ "TPU available: False, using: 0 TPU cores\n",
+ "IPU available: False, using: 0 IPUs\n",
+ "HPU available: False, using: 0 HPUs\n",
+ "/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/pytorch_lightning/trainer/setup.py:176: PossibleUserWarning: GPU available but not used. Set `accelerator` and `devices` using `Trainer(accelerator='gpu', devices=6)`.\n",
+ " rank_zero_warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 316;\n",
+ " var nbb_unformatted_code = \"TRAINING.accelerator = \\\"cpu\\\" if DEBUG else \\\"gpu\\\"\\nTRAINING.devices = \\\"auto\\\" if TRAINING.accelerator == \\\"cpu\\\" else [5]\\nTRAINING.directory = \\\"training\\\"\\nTRAINING.save_top_k_checkpoints = 3\\nTRAINING.wandb_project_name = \\\"MakingGraphsAccessible\\\"\\nTRAINING.limit_train_batches = 2 if DEBUG else None\\nTRAINING.limit_val_batches = 2 if DEBUG else 0.1\\n\\nTRAINING.model_checkpoint = pl.callbacks.ModelCheckpoint(\\n dirpath=TRAINING.directory,\\n monitor=\\\"val_loss\\\",\\n save_top_k=TRAINING.save_top_k_checkpoints,\\n)\\n\\nTRAINING.logger = pl.loggers.WandbLogger(\\n project=TRAINING.wandb_project_name, save_dir=TRAINING.directory\\n)\\n\\nTRAINING.trainer = pl.Trainer(\\n accelerator=TRAINING.accelerator,\\n devices=TRAINING.devices,\\n plugins=[TransformersCheckpointIO()],\\n callbacks=[TRAINING.model_checkpoint, MetricsCallback()],\\n logger=TRAINING.logger,\\n limit_train_batches=TRAINING.limit_train_batches,\\n limit_val_batches=TRAINING.limit_val_batches,\\n)\";\n",
+ " var nbb_formatted_code = \"TRAINING.accelerator = \\\"cpu\\\" if DEBUG else \\\"gpu\\\"\\nTRAINING.devices = \\\"auto\\\" if TRAINING.accelerator == \\\"cpu\\\" else [5]\\nTRAINING.directory = \\\"training\\\"\\nTRAINING.save_top_k_checkpoints = 3\\nTRAINING.wandb_project_name = \\\"MakingGraphsAccessible\\\"\\nTRAINING.limit_train_batches = 2 if DEBUG else None\\nTRAINING.limit_val_batches = 2 if DEBUG else 0.1\\n\\nTRAINING.model_checkpoint = pl.callbacks.ModelCheckpoint(\\n dirpath=TRAINING.directory,\\n monitor=\\\"val_loss\\\",\\n save_top_k=TRAINING.save_top_k_checkpoints,\\n)\\n\\nTRAINING.logger = pl.loggers.WandbLogger(\\n project=TRAINING.wandb_project_name, save_dir=TRAINING.directory\\n)\\n\\nTRAINING.trainer = pl.Trainer(\\n accelerator=TRAINING.accelerator,\\n devices=TRAINING.devices,\\n plugins=[TransformersCheckpointIO()],\\n callbacks=[TRAINING.model_checkpoint, MetricsCallback()],\\n logger=TRAINING.logger,\\n limit_train_batches=TRAINING.limit_train_batches,\\n limit_val_batches=TRAINING.limit_val_batches,\\n)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "TRAINING.accelerator = \"cpu\" if DEBUG else \"gpu\"\n",
+ "TRAINING.devices = \"auto\" if TRAINING.accelerator == \"cpu\" else [5]\n",
+ "TRAINING.directory = \"training\"\n",
+ "TRAINING.save_top_k_checkpoints = 3\n",
+ "TRAINING.wandb_project_name = \"MakingGraphsAccessible\"\n",
+ "TRAINING.limit_train_batches = 2 if DEBUG else None\n",
+ "TRAINING.limit_val_batches = 2 if DEBUG else 0.1\n",
+ "\n",
+ "TRAINING.model_checkpoint = pl.callbacks.ModelCheckpoint(\n",
+ " dirpath=TRAINING.directory,\n",
+ " monitor=\"val_loss\",\n",
+ " save_top_k=TRAINING.save_top_k_checkpoints,\n",
+ ")\n",
+ "\n",
+ "TRAINING.logger = pl.loggers.WandbLogger(\n",
+ " project=TRAINING.wandb_project_name, save_dir=TRAINING.directory\n",
+ ")\n",
+ "\n",
+ "TRAINING.trainer = pl.Trainer(\n",
+ " accelerator=TRAINING.accelerator,\n",
+ " devices=TRAINING.devices,\n",
+ " plugins=[TransformersCheckpointIO()],\n",
+ " callbacks=[TRAINING.model_checkpoint, MetricsCallback()],\n",
+ " logger=TRAINING.logger,\n",
+ " limit_train_batches=TRAINING.limit_train_batches,\n",
+ " limit_val_batches=TRAINING.limit_val_batches,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 317,
+ "id": "5c883d58",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/pytorch_lightning/loops/utilities.py:70: PossibleUserWarning: `max_epochs` was not set. Setting it to 1000 epochs. To train without an epoch limit, set `max_epochs=-1`.\n",
+ " rank_zero_warn(\n",
+ "/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:612: UserWarning: Checkpoint directory /home/dkkoshman/YSDA/machine_learning/transformers/MakingGraphsAccessible/training exists and is not empty.\n",
+ " rank_zero_warn(f\"Checkpoint directory {dirpath} exists and is not empty.\")\n",
+ "\n",
+ " | Name | Type | Params\n",
+ "----------------------------------------------------\n",
+ "0 | model | VisionEncoderDecoderModel | 201 M \n",
+ "----------------------------------------------------\n",
+ "201 M Trainable params\n",
+ "0 Non-trainable params\n",
+ "201 M Total params\n",
+ "807.461 Total estimated model params size (MB)\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Sanity Checking: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/pytorch_lightning/utilities/data.py:77: UserWarning: Trying to infer the `batch_size` from an ambiguous collection. The batch size we found is 2. To avoid any miscalculations, use `self.log(..., batch_size=batch_size)`.\n",
+ " warning_cache.warn(\n",
+ "/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/pytorch_lightning/loops/fit_loop.py:280: PossibleUserWarning: The number of training batches (2) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n",
+ " rank_zero_warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "998bc66bc47b4576b9d78ced2aba32f0",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Training: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Validation: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Validation: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Validation: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/pytorch_lightning/trainer/call.py:54: UserWarning: Detected KeyboardInterrupt, attempting graceful shutdown...\n",
+ " rank_zero_warn(\"Detected KeyboardInterrupt, attempting graceful shutdown...\")\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 317;\n",
+ " var nbb_unformatted_code = \"TRAINING.trainer.fit(\\n model=MODEL.lightning_module,\\n train_dataloaders=DATA.train_dataloader,\\n val_dataloaders=DATA.val_dataloader,\\n)\";\n",
+ " var nbb_formatted_code = \"TRAINING.trainer.fit(\\n model=MODEL.lightning_module,\\n train_dataloaders=DATA.train_dataloader,\\n val_dataloaders=DATA.val_dataloader,\\n)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "TRAINING.trainer.fit(\n",
+ " model=MODEL.lightning_module,\n",
+ " train_dataloaders=DATA.train_dataloader,\n",
+ " val_dataloaders=DATA.val_dataloader,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "32541868",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "TRAINING.trainer.validate(model=MODEL.lightning_module, dataloaders=DATA.val_dataloader)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b36b5cf7",
+ "metadata": {},
+ "source": [
+ "## Results "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "286e7d23",
+ "metadata": {},
+ "source": [
+ "### Predicting "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 292,
+ "id": "e073230c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 292;\n",
+ " var nbb_unformatted_code = \"def predict_string(image) -> str:\\n image = MODEL.donut_processor(\\n image, random_padding=False, return_tensors=\\\"pt\\\"\\n ).pixel_values\\n string = generate_token_strings(image)[0]\\n return string\\n\\n\\ndef predict_benetech_output(image):\\n string = predict_string(image)\\n assert BenetechOutput.does_string_match_expected_pattern(string)\\n return BenetechOutput.from_string(string)\";\n",
+ " var nbb_formatted_code = \"def predict_string(image) -> str:\\n image = MODEL.donut_processor(\\n image, random_padding=False, return_tensors=\\\"pt\\\"\\n ).pixel_values\\n string = generate_token_strings(image)[0]\\n return string\\n\\n\\ndef predict_benetech_output(image):\\n string = predict_string(image)\\n assert BenetechOutput.does_string_match_expected_pattern(string)\\n return BenetechOutput.from_string(string)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def predict_string(image) -> str:\n",
+ " image = MODEL.donut_processor(\n",
+ " image, random_padding=False, return_tensors=\"pt\"\n",
+ " ).pixel_values\n",
+ " string = generate_token_strings(image)[0]\n",
+ " return string\n",
+ "\n",
+ "\n",
+ "def predict_benetech_output(image):\n",
+ " string = predict_string(image)\n",
+ " assert BenetechOutput.does_string_match_expected_pattern(string)\n",
+ " return BenetechOutput.from_string(string)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "509c9eae",
+ "metadata": {},
+ "source": [
+ "### Interface "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 324,
+ "id": "2b569259",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 324;\n",
+ " var nbb_unformatted_code = \"checkpoint_path = \\\"training/epoch=0-step=2-v1.ckpt\\\"\\nMODEL.donut_processor = MODEL.donut_processor.from_pretrained(checkpoint_path)\\nMODEL.encoder_decoder = MODEL.encoder_decoder.from_pretrained(checkpoint_path)\";\n",
+ " var nbb_formatted_code = \"checkpoint_path = \\\"training/epoch=0-step=2-v1.ckpt\\\"\\nMODEL.donut_processor = MODEL.donut_processor.from_pretrained(checkpoint_path)\\nMODEL.encoder_decoder = MODEL.encoder_decoder.from_pretrained(checkpoint_path)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "checkpoint_path = \"training/epoch=0-step=2-v1.ckpt\"\n",
+ "MODEL.donut_processor = MODEL.donut_processor.from_pretrained(checkpoint_path)\n",
+ "MODEL.encoder_decoder = MODEL.encoder_decoder.from_pretrained(checkpoint_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 325,
+ "id": "6eeea089",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 325;\n",
+ " var nbb_unformatted_code = \"interface = gradio.Interface(\\n fn=predict_string,\\n inputs=gradio.Image(type=\\\"pil\\\"),\\n outputs=gradio.Text(),\\n examples=\\\"examples\\\",\\n)\";\n",
+ " var nbb_formatted_code = \"interface = gradio.Interface(\\n fn=predict_string,\\n inputs=gradio.Image(type=\\\"pil\\\"),\\n outputs=gradio.Text(),\\n examples=\\\"examples\\\",\\n)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "interface = gradio.Interface(\n",
+ " fn=predict_string,\n",
+ " inputs=gradio.Image(type=\"pil\"),\n",
+ " outputs=gradio.Text(),\n",
+ " examples=\"examples\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 326,
+ "id": "39d1e3d8",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running on local URL: http://127.0.0.1:7861\n",
+ "Running on public URL: https://aaee610c568b59982a.gradio.live\n",
+ "\n",
+ "This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": []
+ },
+ "execution_count": 326,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ " setTimeout(function() {\n",
+ " var nbb_cell_id = 326;\n",
+ " var nbb_unformatted_code = \"interface.launch(share=True)\";\n",
+ " var nbb_formatted_code = \"interface.launch(share=True)\";\n",
+ " var nbb_cells = Jupyter.notebook.get_cells();\n",
+ " for (var i = 0; i < nbb_cells.length; ++i) {\n",
+ " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
+ " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
+ " nbb_cells[i].set_text(nbb_formatted_code);\n",
+ " }\n",
+ " break;\n",
+ " }\n",
+ " }\n",
+ " }, 500);\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Traceback (most recent call last):\n",
+ " File \"/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/gradio/routes.py\", line 401, in run_predict\n",
+ " output = await app.get_blocks().process_api(\n",
+ " File \"/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/gradio/blocks.py\", line 1302, in process_api\n",
+ " result = await self.call_function(\n",
+ " File \"/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/gradio/blocks.py\", line 1025, in call_function\n",
+ " prediction = await anyio.to_thread.run_sync(\n",
+ " File \"/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/anyio/to_thread.py\", line 31, in run_sync\n",
+ " return await get_asynclib().run_sync_in_worker_thread(\n",
+ " File \"/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 937, in run_sync_in_worker_thread\n",
+ " return await future\n",
+ " File \"/home/dkkoshman/YSDA/python3.10/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 867, in run\n",
+ " result = context.run(func, *args)\n",
+ " File \"/tmp/ipykernel_3467358/2235758188.py\", line 5, in predict_string\n",
+ " string = generate_token_strings(image)[0]\n",
+ " File \"/tmp/ipykernel_3467358/2881104263.py\", line 2, in generate_token_strings\n",
+ " decoder_output = MODEL.encoder_decoder.generate(\n",
+ "AttributeError: 'DonutProcessor' object has no attribute 'generate'\n"
+ ]
+ }
+ ],
+ "source": [
+ "interface.launch(share=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3b156ea1",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.10.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}