diff --git a/README2.md b/README2.md new file mode 100644 index 0000000..b157d7d --- /dev/null +++ b/README2.md @@ -0,0 +1,20 @@ +# Spoter Embeddings + +## Creating dataset +First, make a folder where all you're videos are located. When this is done, all keypoints can be extracted from the videos using the following command. This will extract the keypoints and store them in \. +``` +python3 preprocessing.py extract --videos-folder --output-folder +``` + +When this is done, the dataset can be created using the following command: +``` +python3 preprocessing.py create --landmarks-dataset --videos-folder --dataset-folder (--create-new-split --test-size ) +``` +The above command generates a train (and val) csv file which includes all the extracted keypoints. These can then be used to train or generates embeddings. + +## Creating Embeddings +The embeddings can be created using the following command: +``` +python3 export_embeddings.py --checkpoint --dataset --output +``` +The command above generates the embeddings for a given dataset and saves them as a csv file. \ No newline at end of file diff --git a/export_embeddings.py b/export_embeddings.py new file mode 100644 index 0000000..7246d70 --- /dev/null +++ b/export_embeddings.py @@ -0,0 +1,91 @@ +import multiprocessing +import os +import torch +import argparse +from datasets.dataset_loader import LocalDatasetLoader +from datasets.embedding_dataset import SLREmbeddingDataset +from torch.utils.data import DataLoader +from datasets import SLREmbeddingDataset, collate_fn_padd +from models.spoter_embedding_model import SPOTER_EMBEDDINGS +import numpy as np +import random +import pandas as pd + +seed = 43 +random.seed(seed) +np.random.seed(seed) +os.environ["PYTHONHASHSEED"] = str(seed) +torch.manual_seed(seed) +torch.cuda.manual_seed(seed) +torch.cuda.manual_seed_all(seed) +torch.backends.cudnn.deterministic = True +torch.use_deterministic_algorithms(True) +generator = torch.Generator() +generator.manual_seed(seed) + +def seed_worker(worker_id): + worker_seed = torch.initial_seed() % 2**32 + np.random.seed(worker_seed) + random.seed(worker_seed) + +generator = torch.Generator() +generator.manual_seed(seed) + +def parse_args(): + parser = argparse.ArgumentParser(description='Export embeddings') + parser.add_argument('--checkpoint', type=str, default=None, help='Path to checkpoint') + parser.add_argument('--output', type=str, default=None, help='Path to output') + parser.add_argument('--dataset', type=str, default=None, help='Path to data') + args = parser.parse_args() + return args + +args = parse_args() + +device = torch.device("cpu") +if torch.cuda.is_available(): + device = torch.device("cuda") + +# load the model +checkpoint = torch.load(args.checkpoint, map_location=device) + +model = SPOTER_EMBEDDINGS( + features=checkpoint["config_args"].vector_length, + hidden_dim=checkpoint["config_args"].hidden_dim, + norm_emb=checkpoint["config_args"].normalize_embeddings, +).to(device) + +model.load_state_dict(checkpoint["state_dict"]) + +dataset_loader = LocalDatasetLoader() +dataset = SLREmbeddingDataset(args.dataset, triplet=False, augmentations=False) + +data_loader = DataLoader( + dataset, + batch_size=1, + shuffle=False, + collate_fn=collate_fn_padd, + pin_memory=torch.cuda.is_available(), + num_workers=multiprocessing.cpu_count(), + worker_init_fn=seed_worker, + generator=generator, + ) + +embeddings = [] +k = 0 +with torch.no_grad(): + for i, (inputs, labels, masks) in enumerate(data_loader): + k += 1 + inputs = inputs.to(device) + masks = masks.to(device) + outputs = model(inputs, masks) + + for n in range(outputs.shape[0]): + embeddings.append(outputs[n].cpu().numpy()) + +df = pd.read_csv(args.dataset) +df["embeddings"] = embeddings +df = df[['embeddings', 'label_name', 'labels']] +df['embeddings2'] = df['embeddings'].apply(lambda x: x.tolist()) + + +df.to_csv(args.output, index=False) \ No newline at end of file diff --git a/notebooks/embeddings_evaluation.ipynb b/notebooks/embeddings_evaluation.ipynb index 717a026..d012c83 100644 --- a/notebooks/embeddings_evaluation.ipynb +++ b/notebooks/embeddings_evaluation.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "id": "c20f7fd5", "metadata": {}, "outputs": [], @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "id": "ada032d0", "metadata": {}, "outputs": [], @@ -22,13 +22,12 @@ "import os\n", "import os.path as op\n", "import pandas as pd\n", - "import json\n", - "import base64" + "import json" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "id": "05682e73", "metadata": {}, "outputs": [], @@ -38,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "id": "fede7684", "metadata": {}, "outputs": [], @@ -48,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "id": "ce531994", "metadata": {}, "outputs": [], @@ -64,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "id": "f4a2d672", "metadata": {}, "outputs": [], @@ -87,17 +86,17 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "id": "1d9db764", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 7, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -119,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "id": "71224139", "metadata": {}, "outputs": [], @@ -133,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 13, "id": "013d3774", "metadata": {}, "outputs": [ @@ -143,7 +142,7 @@ "" ] }, - "execution_count": 9, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -169,27 +168,28 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 24, "id": "ba6b58f0", "metadata": {}, "outputs": [], "source": [ - "SL_DATASET = 'wlasl' # or 'lsa'\n", - "if SL_DATASET == 'wlasl':\n", + "SL_DATASET = 'basic-signs' # or 'wlasl'\n", + "\n", + "if SL_DATASET == 'fingerspelling':\n", " dataset_name = \"fingerspelling\"\n", - " num_classes = 100\n", " split_dataset_path = \"fingerspelling_{}.csv\"\n", - "else:\n", - " dataset_name = \"lsa64_mapped_mediapipe_only_landmarks_25fps\"\n", - " num_classes = 64\n", - " split_dataset_path = \"LSA64_{}.csv\"\n", - " \n", + "elif SL_DATASET == 'wlasl':\n", + " dataset_name = \"wlasl\"\n", + " split_dataset_path = \"WLASL100_{}.csv\"\n", + "elif SL_DATASET == 'basic-signs':\n", + " dataset_name = \"basic-signs\"\n", + " split_dataset_path = \"basic-signs_{}.csv\"\n", " " ] }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 25, "id": "5643a72c", "metadata": {}, "outputs": [], @@ -209,7 +209,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 16, "id": "04a62088", "metadata": {}, "outputs": [], @@ -222,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 17, "id": "79c837c1", "metadata": {}, "outputs": [], @@ -253,7 +253,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 18, "id": "8b5bda73", "metadata": {}, "outputs": [], @@ -280,17 +280,17 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 19, "id": "0efa0871", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(560, 560)" + "(164, 164)" ] }, - "execution_count": 88, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -301,7 +301,21 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 21, + "id": "ab83c6e2", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [ + "for split in splits:\n", + " df = dfs[split]\n", + " df['embeddings'] = embeddings_split[split]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, "id": "0b9fb9c2", "metadata": {}, "outputs": [ @@ -309,54 +323,42 @@ "name": "stdout", "output_type": "stream", "text": [ - "0 [0.4734516, -0.58630264, 0.18397862, -0.165259...\n", - "1 [1.6672437, -2.3754091, -0.77506787, -0.666019...\n", - "2 [1.7801772, -0.0077665895, 0.22098881, 0.09736...\n", - "3 [-0.6503094, 0.14683367, 0.1253598, 0.5183654,...\n", - "4 [1.2275296, -0.4874984, 0.56826925, -0.9628880...\n", + "0 [1.7327625, -3.015248, -1.4775522, -0.7505071,...\n", + "1 [2.0936582, -0.596195, -0.7918601, -0.15896143...\n", + "2 [-1.4007742, -0.9608915, 1.3294879, -0.5185398...\n", + "3 [1.3280737, -3.299126, -1.0110444, -1.2528414,...\n", + "4 [-0.071124956, -0.79259753, 0.7182858, 0.38130...\n", " ... \n", - "555 [-0.4408903, -0.9623146, 0.21583065, -0.381131...\n", - "556 [1.7910445, -3.5434258, -1.332628, -0.95276725...\n", - "557 [2.3283613, 0.11504881, -0.4955331, -0.4563401...\n", - "558 [-1.0491562, -1.1793315, 0.3248821, 0.16679825...\n", - "559 [1.447621, -1.2482919, 0.17936605, -1.4752473,...\n", - "Name: embeddings, Length: 560, dtype: object\n", - "0 B\n", - "1 D\n", - "2 X\n", - "3 O\n", - "4 W\n", - " ..\n", - "555 F\n", - "556 X\n", - "557 Z\n", - "558 Y\n", - "559 W\n", - "Name: label_name, Length: 560, dtype: object\n", + "159 [-1.5968355, 1.9617733, 0.28859574, 1.256657, ...\n", + "160 [0.44801116, -1.8377966, 1.1004394, -1.195648,...\n", + "161 [2.0584257, 1.6986116, 0.5129896, 0.27279535, ...\n", + "162 [1.6695516, -2.967027, -1.5715427, -0.77170163...\n", + "163 [1.4977738, -2.6278958, -1.6123883, -0.8420623...\n", + "Name: embeddings, Length: 164, dtype: object\n", + "0 TOT-ZIENS\n", + "1 GOED\n", + "2 GOEDENACHT\n", + "3 NEE\n", + "4 SLECHT\n", + " ... \n", + "159 SORRY\n", + "160 GOEDEMORGEN\n", + "161 LINKS\n", + "162 TOT-ZIENS\n", + "163 GOED\n", + "Name: label_name, Length: 164, dtype: object\n", "0 0\n", "1 1\n", "2 2\n", "3 3\n", - "4 5\n", + "4 4\n", " ..\n", - "555 24\n", - "556 2\n", - "557 14\n", - "558 8\n", - "559 5\n", - "Name: labels, Length: 560, dtype: int64\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_969762/1944871806.py:9: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " dfs['train']['embeddings2'] = dfs['train']['embeddings'].apply(lambda x: x.tolist())\n" + "159 7\n", + "160 5\n", + "161 13\n", + "162 0\n", + "163 1\n", + "Name: labels, Length: 164, dtype: int64\n" ] } ], @@ -372,21 +374,7 @@ "dfs['train']['embeddings2'] = dfs['train']['embeddings'].apply(lambda x: x.tolist())\n", "\n", "# save the dfs['train']\n", - "dfs['train'].to_csv('../data/fingerspelling/embeddings.csv', index=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "id": "ab83c6e2", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [], - "source": [ - "for split in splits:\n", - " df = dfs[split]\n", - " df['embeddings'] = embeddings_split[split]" + "dfs['train'].to_csv(f'../data/{dataset_name}/embeddings.csv', index=False)" ] }, { @@ -400,7 +388,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 23, "id": "7399b8ae", "metadata": {}, "outputs": [ @@ -409,16 +397,16 @@ "output_type": "stream", "text": [ "Using centroids only\n", - "Top-1 accuracy: 77.06 %\n", - "Top-5 embeddings class match: 100.00 % (Picks any class in the 5 closest embeddings)\n", + "Top-1 accuracy: 80.00 %\n", + "Top-5 embeddings class match: 93.33 % (Picks any class in the 5 closest embeddings)\n", "\n", "################################\n", "\n", "Using all embeddings\n", - "Top-1 accuracy: 81.65 %\n", - "5-nn accuracy: 83.49 % (Picks the class that appears most often in the 5 closest embeddings)\n", - "Top-5 embeddings class match: 96.33 % (Picks any class in the 5 closest embeddings)\n", - "Top-5 unique class match: 99.08 % (Picks the 5 closest distinct classes)\n", + "Top-1 accuracy: 80.00 %\n", + "5-nn accuracy: 80.00 % (Picks the class that appears most often in the 5 closest embeddings)\n", + "Top-5 embeddings class match: 86.67 % (Picks any class in the 5 closest embeddings)\n", + "Top-5 unique class match: 93.33 % (Picks the 5 closest distinct classes)\n", "\n", "################################\n", "\n" diff --git a/notebooks/visualize_embeddings.ipynb b/notebooks/visualize_embeddings.ipynb index 5940d63..84ebdff 100644 --- a/notebooks/visualize_embeddings.ipynb +++ b/notebooks/visualize_embeddings.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 117, + "execution_count": 30, "id": "8ef5cd92", "metadata": {}, "outputs": [ @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 31, "id": "78c4643a", "metadata": {}, "outputs": [], @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 32, "id": "ffba4333", "metadata": {}, "outputs": [], @@ -47,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 33, "id": "5bc81f71", "metadata": {}, "outputs": [], @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 34, "id": "3de8bcf2", "metadata": { "lines_to_next_cell": 0 @@ -73,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 35, "id": "91a045ba", "metadata": {}, "outputs": [], @@ -93,17 +93,17 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 36, "id": "bc50c296", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 123, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -124,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 37, "id": "82766a17", "metadata": {}, "outputs": [], @@ -138,7 +138,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 38, "id": "ead15a36", "metadata": {}, "outputs": [ @@ -148,7 +148,7 @@ "" ] }, - "execution_count": 125, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -175,26 +175,28 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 40, "id": "20f8036d", "metadata": {}, "outputs": [], "source": [ - "SL_DATASET = 'wlasl' # or 'lsa'\n", - "if SL_DATASET == 'wlasl':\n", + "SL_DATASET = 'basic-signs' # or 'wlasl'\n", + "\n", + "if SL_DATASET == 'fingerspelling':\n", " dataset_name = \"fingerspelling\"\n", - " num_classes = 15\n", - " split_dataset_path = \"fingerspelling_train.csv\"\n", - "else:\n", - " dataset_name = \"lsa64_mapped_mediapipe_only_landmarks_25fps\"\n", - " num_classes = 64\n", - " split_dataset_path = \"LSA64_{}.csv\"\n", + " split_dataset_path = \"fingerspelling_{}.csv\"\n", + "elif SL_DATASET == 'wlasl':\n", + " dataset_name = \"wlasl\"\n", + " split_dataset_path = \"WLASL100_{}.csv\"\n", + "elif SL_DATASET == 'basic-signs':\n", + " dataset_name = \"basic-signs\"\n", + " split_dataset_path = \"basic-signs_{}.csv\"\n", " " ] }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 41, "id": "758716b6", "metadata": {}, "outputs": [], @@ -214,7 +216,7 @@ }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 42, "id": "f1527959", "metadata": {}, "outputs": [ @@ -231,7 +233,7 @@ ], "source": [ "dataloaders = {}\n", - "splits = ['train']\n", + "splits = ['train', 'val']\n", "dfs = {}\n", "for split in splits:\n", " split_set_path = op.join(dataset_folder, split_dataset_path.format(split))\n", @@ -264,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 129, + "execution_count": 43, "id": "3c3af5bf", "metadata": { "lines_to_next_cell": 0 @@ -273,10 +275,10 @@ { "data": { "text/plain": [ - "560" + "164" ] }, - "execution_count": 129, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -301,7 +303,7 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 44, "id": "dccbe1b9", "metadata": {}, "outputs": [], @@ -324,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": 45, "id": "904298f0", "metadata": {}, "outputs": [], @@ -338,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 46, "id": "42832f7c", "metadata": { "scrolled": false @@ -349,7 +351,7 @@ "text/html": [ "
\n", " \n", - " Loading BokehJS ...\n", + " Loading BokehJS ...\n", "
\n" ] }, @@ -358,7 +360,7 @@ }, { "data": { - "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n // Clean up Bokeh references\n if (id != null && id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim();\n if (id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"3649\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"3649\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n // Clean up Bokeh references\n if (id != null && id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim();\n if (id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"1368\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"1368\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", "application/vnd.bokehjs_load.v0+json": "" }, "metadata": {}, @@ -401,7 +403,7 @@ }, { "cell_type": "code", - "execution_count": 133, + "execution_count": 47, "id": "ead4daf7", "metadata": { "scrolled": false @@ -411,7 +413,7 @@ "data": { "text/html": [ "\n", - "
\n" + "
\n" ] }, "metadata": {}, @@ -419,12 +421,12 @@ }, { "data": { - "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"3319067e-80c8-43c4-bb1a-c415f4fcd840\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"3661\"}],\"center\":[{\"id\":\"3664\"},{\"id\":\"3668\"},{\"id\":\"3702\"}],\"height\":800,\"left\":[{\"id\":\"3665\"}],\"renderers\":[{\"id\":\"3690\"}],\"title\":{\"id\":\"3651\"},\"toolbar\":{\"id\":\"3677\"},\"width\":1000,\"x_range\":{\"id\":\"3653\"},\"x_scale\":{\"id\":\"3657\"},\"y_range\":{\"id\":\"3655\"},\"y_scale\":{\"id\":\"3659\"}},\"id\":\"3650\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"3674\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"3697\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"3670\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"data\":{\"label\":[0,1,2,3,5,2,6,7,6,6,8,2,9,10,6,12,9,4,13,5,4,8,14,15,13,14,16,17,13,18,5,16,19,17,20,15,21,10,3,5,22,14,21,16,19,3,13,23,18,3,20,10,2,3,11,13,9,5,2,15,21,13,18,6,2,9,22,4,22,21,23,0,3,14,17,6,12,23,0,3,23,7,16,3,18,4,11,6,25,7,4,9,9,11,13,4,25,10,9,10,17,12,5,24,0,13,21,17,15,25,17,11,5,2,12,10,21,22,8,12,24,0,22,23,21,22,10,21,23,22,17,22,21,7,24,7,19,7,3,15,24,19,25,10,2,21,5,19,15,21,7,3,19,20,9,3,15,6,3,12,23,8,18,13,6,3,20,23,20,1,7,24,8,3,19,3,5,15,8,21,24,3,13,2,13,5,22,9,22,21,6,1,14,4,7,5,24,13,15,2,8,5,6,24,10,0,4,4,22,8,8,8,25,8,15,17,19,1,17,11,5,22,14,5,24,16,10,25,12,3,6,0,19,0,11,25,7,19,16,9,14,19,9,12,19,13,20,1,6,19,11,12,23,14,12,14,24,16,6,5,24,25,14,6,8,1,9,13,4,12,10,13,12,10,9,18,15,22,10,3,9,25,20,21,23,10,11,17,1,25,21,7,3,18,14,4,17,8,11,22,25,25,15,4,22,9,23,4,21,18,1,23,17,25,9,17,21,7,14,24,9,11,25,5,5,9,23,13,15,3,0,15,16,6,14,3,20,5,23,4,11,0,23,0,9,16,21,4,21,22,7,15,1,22,12,24,24,16,20,20,3,15,11,13,12,2,4,23,14,22,18,12,13,11,16,19,6,21,8,9,5,21,10,23,10,19,7,14,7,23,3,8,18,19,11,0,25,8,15,11,12,4,7,9,23,14,22,1,1,22,12,18,24,23,22,20,18,17,10,1,2,0,20,10,18,2,6,16,11,24,24,2,24,6,11,20,0,23,17,25,15,12,9,4,18,4,15,24,15,16,16,12,21,16,9,17,6,12,15,5,13,20,20,5,13,20,12,16,19,10,25,14,2,8,10,19,12,20,20,10,16,18,3,23,5,14,17,25,11,0,18,0,20,19,19,24,4,14,4,3,14,10,7,24,19,1,1,25,6,25,13,10,25,14,2,2,14,7,0,5,12,8,9,1,10,0,5,19,19,22,9,10,19,5,15,4,7,0,6,8,15,22,20,5,17,20,7,17,11,25,7,17,24,13,17,24,2,14,8,5],\"label_desc\":[\"B\",\"D\",\"X\",\"O\",\"W\",\"X\",\"G\",\"I\",\"G\",\"G\",\"Y\",\"X\",\"H\",\"T\",\"G\",\"R\",\"H\",\"S\",\"M\",\"W\",\"S\",\"Y\",\"Z\",\"N\",\"M\",\"Z\",\"C\",\"J\",\"M\",\"E\",\"W\",\"C\",\"U\",\"J\",\"L\",\"N\",\"V\",\"T\",\"O\",\"W\",\"Q\",\"Z\",\"V\",\"C\",\"U\",\"O\",\"M\",\"A\",\"E\",\"O\",\"L\",\"T\",\"X\",\"O\",\"K\",\"M\",\"H\",\"W\",\"X\",\"N\",\"V\",\"M\",\"E\",\"G\",\"X\",\"H\",\"Q\",\"S\",\"Q\",\"V\",\"A\",\"B\",\"O\",\"Z\",\"J\",\"G\",\"R\",\"A\",\"B\",\"O\",\"A\",\"I\",\"C\",\"O\",\"E\",\"S\",\"K\",\"G\",\"P\",\"I\",\"S\",\"H\",\"H\",\"K\",\"M\",\"S\",\"P\",\"T\",\"H\",\"T\",\"J\",\"R\",\"W\",\"F\",\"B\",\"M\",\"V\",\"J\",\"N\",\"P\",\"J\",\"K\",\"W\",\"X\",\"R\",\"T\",\"V\",\"Q\",\"Y\",\"R\",\"F\",\"B\",\"Q\",\"A\",\"V\",\"Q\",\"T\",\"V\",\"A\",\"Q\",\"J\",\"Q\",\"V\",\"I\",\"F\",\"I\",\"U\",\"I\",\"O\",\"N\",\"F\",\"U\",\"P\",\"T\",\"X\",\"V\",\"W\",\"U\",\"N\",\"V\",\"I\",\"O\",\"U\",\"L\",\"H\",\"O\",\"N\",\"G\",\"O\",\"R\",\"A\",\"Y\",\"E\",\"M\",\"G\",\"O\",\"L\",\"A\",\"L\",\"D\",\"I\",\"F\",\"Y\",\"O\",\"U\",\"O\",\"W\",\"N\",\"Y\",\"V\",\"F\",\"O\",\"M\",\"X\",\"M\",\"W\",\"Q\",\"H\",\"Q\",\"V\",\"G\",\"D\",\"Z\",\"S\",\"I\",\"W\",\"F\",\"M\",\"N\",\"X\",\"Y\",\"W\",\"G\",\"F\",\"T\",\"B\",\"S\",\"S\",\"Q\",\"Y\",\"Y\",\"Y\",\"P\",\"Y\",\"N\",\"J\",\"U\",\"D\",\"J\",\"K\",\"W\",\"Q\",\"Z\",\"W\",\"F\",\"C\",\"T\",\"P\",\"R\",\"O\",\"G\",\"B\",\"U\",\"B\",\"K\",\"P\",\"I\",\"U\",\"C\",\"H\",\"Z\",\"U\",\"H\",\"R\",\"U\",\"M\",\"L\",\"D\",\"G\",\"U\",\"K\",\"R\",\"A\",\"Z\",\"R\",\"Z\",\"F\",\"C\",\"G\",\"W\",\"F\",\"P\",\"Z\",\"G\",\"Y\",\"D\",\"H\",\"M\",\"S\",\"R\",\"T\",\"M\",\"R\",\"T\",\"H\",\"E\",\"N\",\"Q\",\"T\",\"O\",\"H\",\"P\",\"L\",\"V\",\"A\",\"T\",\"K\",\"J\",\"D\",\"P\",\"V\",\"I\",\"O\",\"E\",\"Z\",\"S\",\"J\",\"Y\",\"K\",\"Q\",\"P\",\"P\",\"N\",\"S\",\"Q\",\"H\",\"A\",\"S\",\"V\",\"E\",\"D\",\"A\",\"J\",\"P\",\"H\",\"J\",\"V\",\"I\",\"Z\",\"F\",\"H\",\"K\",\"P\",\"W\",\"W\",\"H\",\"A\",\"M\",\"N\",\"O\",\"B\",\"N\",\"C\",\"G\",\"Z\",\"O\",\"L\",\"W\",\"A\",\"S\",\"K\",\"B\",\"A\",\"B\",\"H\",\"C\",\"V\",\"S\",\"V\",\"Q\",\"I\",\"N\",\"D\",\"Q\",\"R\",\"F\",\"F\",\"C\",\"L\",\"L\",\"O\",\"N\",\"K\",\"M\",\"R\",\"X\",\"S\",\"A\",\"Z\",\"Q\",\"E\",\"R\",\"M\",\"K\",\"C\",\"U\",\"G\",\"V\",\"Y\",\"H\",\"W\",\"V\",\"T\",\"A\",\"T\",\"U\",\"I\",\"Z\",\"I\",\"A\",\"O\",\"Y\",\"E\",\"U\",\"K\",\"B\",\"P\",\"Y\",\"N\",\"K\",\"R\",\"S\",\"I\",\"H\",\"A\",\"Z\",\"Q\",\"D\",\"D\",\"Q\",\"R\",\"E\",\"F\",\"A\",\"Q\",\"L\",\"E\",\"J\",\"T\",\"D\",\"X\",\"B\",\"L\",\"T\",\"E\",\"X\",\"G\",\"C\",\"K\",\"F\",\"F\",\"X\",\"F\",\"G\",\"K\",\"L\",\"B\",\"A\",\"J\",\"P\",\"N\",\"R\",\"H\",\"S\",\"E\",\"S\",\"N\",\"F\",\"N\",\"C\",\"C\",\"R\",\"V\",\"C\",\"H\",\"J\",\"G\",\"R\",\"N\",\"W\",\"M\",\"L\",\"L\",\"W\",\"M\",\"L\",\"R\",\"C\",\"U\",\"T\",\"P\",\"Z\",\"X\",\"Y\",\"T\",\"U\",\"R\",\"L\",\"L\",\"T\",\"C\",\"E\",\"O\",\"A\",\"W\",\"Z\",\"J\",\"P\",\"K\",\"B\",\"E\",\"B\",\"L\",\"U\",\"U\",\"F\",\"S\",\"Z\",\"S\",\"O\",\"Z\",\"T\",\"I\",\"F\",\"U\",\"D\",\"D\",\"P\",\"G\",\"P\",\"M\",\"T\",\"P\",\"Z\",\"X\",\"X\",\"Z\",\"I\",\"B\",\"W\",\"R\",\"Y\",\"H\",\"D\",\"T\",\"B\",\"W\",\"U\",\"U\",\"Q\",\"H\",\"T\",\"U\",\"W\",\"N\",\"S\",\"I\",\"B\",\"G\",\"Y\",\"N\",\"Q\",\"L\",\"W\",\"J\",\"L\",\"I\",\"J\",\"K\",\"P\",\"I\",\"J\",\"F\",\"M\",\"J\",\"F\",\"X\",\"Z\",\"Y\",\"W\"],\"labels\":[0,1,2,3,5,2,6,7,6,6,8,2,9,10,6,12,9,4,13,5,4,8,14,15,13,14,16,17,13,18,5,16,19,17,20,15,21,10,3,5,22,14,21,16,19,3,13,23,18,3,20,10,2,3,11,13,9,5,2,15,21,13,18,6,2,9,22,4,22,21,23,0,3,14,17,6,12,23,0,3,23,7,16,3,18,4,11,6,25,7,4,9,9,11,13,4,25,10,9,10,17,12,5,24,0,13,21,17,15,25,17,11,5,2,12,10,21,22,8,12,24,0,22,23,21,22,10,21,23,22,17,22,21,7,24,7,19,7,3,15,24,19,25,10,2,21,5,19,15,21,7,3,19,20,9,3,15,6,3,12,23,8,18,13,6,3,20,23,20,1,7,24,8,3,19,3,5,15,8,21,24,3,13,2,13,5,22,9,22,21,6,1,14,4,7,5,24,13,15,2,8,5,6,24,10,0,4,4,22,8,8,8,25,8,15,17,19,1,17,11,5,22,14,5,24,16,10,25,12,3,6,0,19,0,11,25,7,19,16,9,14,19,9,12,19,13,20,1,6,19,11,12,23,14,12,14,24,16,6,5,24,25,14,6,8,1,9,13,4,12,10,13,12,10,9,18,15,22,10,3,9,25,20,21,23,10,11,17,1,25,21,7,3,18,14,4,17,8,11,22,25,25,15,4,22,9,23,4,21,18,1,23,17,25,9,17,21,7,14,24,9,11,25,5,5,9,23,13,15,3,0,15,16,6,14,3,20,5,23,4,11,0,23,0,9,16,21,4,21,22,7,15,1,22,12,24,24,16,20,20,3,15,11,13,12,2,4,23,14,22,18,12,13,11,16,19,6,21,8,9,5,21,10,23,10,19,7,14,7,23,3,8,18,19,11,0,25,8,15,11,12,4,7,9,23,14,22,1,1,22,12,18,24,23,22,20,18,17,10,1,2,0,20,10,18,2,6,16,11,24,24,2,24,6,11,20,0,23,17,25,15,12,9,4,18,4,15,24,15,16,16,12,21,16,9,17,6,12,15,5,13,20,20,5,13,20,12,16,19,10,25,14,2,8,10,19,12,20,20,10,16,18,3,23,5,14,17,25,11,0,18,0,20,19,19,24,4,14,4,3,14,10,7,24,19,1,1,25,6,25,13,10,25,14,2,2,14,7,0,5,12,8,9,1,10,0,5,19,19,22,9,10,19,5,15,4,7,0,6,8,15,22,20,5,17,20,7,17,11,25,7,17,24,13,17,24,2,14,8,5],\"split\":[\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\"],\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float32\",\"order\":\"little\",\"shape\":[560]},\"y\":{\"__ndarray__\":\"3xcnQVpIVMG+5hrBAgqfQWRMGEFkpQHBpPy4wRuCxUBAaqjBZyqzwUXcCUGAB53BMTd3QHhzf8HL8AHBOjZ9QPkaqsBdVJLALMYLQbAkWcALEuM+IWjsQHzB0cEWIxVBzJQEQQepzcHDhLJBqiwgwRis9sDMt+HAqK4mQTj5psDnQHRAqSgiwVWE2MH7hhJBgbuiQA/DkMGsgqNB9FtFwKgGMEHMIbHB0adlQAhq2MDvENxA/KGfQWMOJkD3gUHBlT6IQd/amUFS8gvBkgAXwYpTj8E0qq/AWFG6wfKHCEBvORpANQkFQaEjgMEyGHJAC3puQBHW/0DSLNvAVqT7wCYudcF1HZpAC4LWQCN5jz/HghtB6VOEwF3BQ8HkWR1B0nCeQeuX18GYzJpAtgurwZytG0BLrEDBkIQtQULin0FXoCjBqU8DQbLXsEF1gapBt3qJQbKIvMBYnKHBa3K/wThzS0HM9xNBz2u+wBaBS0Ah3BDB2lzkwaCGz0B5jSW+1gRCQddfbsEtwihA6ZyPwaNLi0AQqd9ADdgcQc9vDUE8GwVBW+tgQGeZ30CooMXA8EWnQGO1PkHSMsPAf6XPwefxlkD/s4/BZLcZwXJTo8Fon+tA/rVVQC8DIkELpJY/K0sWQTp9NEEpOO9A24UxwQJjCEGCEzDB93whwczXqEBgQjbBxHgGwd8WHcEHERTBrIyOQGMX8kCs0u5AaHbwQFN3IkAqFgNBrEmaQQ01nkANdSlBOnCKwL/yP0FoqJfBOMVtwTto1UDGKhdBI/PdQAnbsT9/Ke9Am+3cwE3QmkHCzLBAyUbewbR5zD+Q0rvAar+uQFgmnMGDSYxBLSu4wJfoPMFffCJB4xmOQXvmBUHXyrnBYhjVwJ7T4sFnt0LBLyIWwf+hEcGUmbpA9nsPQYGnJUFGNqVBVD2gwNSvsEHLWANBzrEAQYqd40AweOFAa5kHQUNoqUGVU9lASXyGwXF238BWpEDAUVcdQbd2JUBdjwhBWUfYwJRYu8EGi5FBgi3dwbgICz9PdcI/YjvEQDqtiMBNewbB2HMAQUtCisHAC6tAOG0SQcUTqMHEGypBkmCJwaRrH0HXXOLAAk01wLThG0GszQtBdckEQb2wiUDYpDdB/+awQB4A28BnmKvAJAW7wNgDpT4CqFm/JUrbweLC4kCWGitBCuWgwT1bg8DikSNBjPyrQVxqgMGI9AzBUyKvQP7RikFGzavBYDIvQfTRhED6jTpBUDAMwRhL1UAZW8pAAXAAQfG3p8AIykRAzN6mwR7Z+UBhUe4/aYTkQEPRNz+4YSFAuBjgwVGtmMFSdq/BD1HXQMdVwcGpYy0/0V0ywZ2OF0DkTAFBq7wJwQHMBUHslqFBmNC7we26JUGbMvtAGjA3QSIQrMFojanBGPSTQF/hIsGgwVk+ZsDLQGEbgL7fko0/6daOwaqS3EBhAJ4/ItOTwQTRS0DOB4dBqDgVQenoL0GX2BDBbGqNQbq6aL6N2jBBw+3gwW6LQ0BnXj/BLDyXwecvz8EjjCDBEyWNQQKKN0FoGNpAUsG9wIVokkGUPIzAY8edwcSNfT5t9cg+E8P1wILeucEmFTFBxqY2wYCyK8Gz+xTBxoeMv5WdFEGbOxxAdZURwfJv1L+jdF5ATjDAwFGrj0FDXR7BAlgawZd/JEEvN3FA2B/1wLZevkApGwJB4ESWwbNKB0GT1oxArX7zwOGRB8FvJxdBoJcPQZpMD0CzoTDBQnorQPKs3ECETqBBZdxDQbDYSEB006hBThO4wcJWqMFkG6VBnSjVwUvVZcDzYTnByKNQv4JqyMHbLiZBin05wZ+6DkFkCRVAi9SnQZWPk8Ct4Ia/WEu/QF1tJ0FRPAtBRRqNP6SgDUGlkRZBbJGjQO1oD0HG5RtB7pezQXtNwcEotPzASVGgQUiqEMEdVrfBrQAmQJewE0DTuoLB8fxkPb3JLcGYARLB6lbqQOPwiUHWesLAXIb/QE2k/MCep6tBRxMiQAxHsMEksWbAG40jQU6+mEAtCR5B3C2zP8FVj8GxERHBO1OJwR7duUAs+uRAqqvTwcDVJUE730HB9taQQem29UALypVB60mxQLkOxcHVfojAncw3QT3BNEGlH6NA4C/HwU/d0cB+tIA/1msIQTgsjT9yBe/ArznTwRK5HEHu/99Ai1GMQe96N0FO0iY+QdmIQSErF0HGtkXBEaspQQLY2sGHTtXASw7XwOYm6MDxehXBodGDwQHKFEGLCsvBXzadwTxSlUGnZYXBBl3EwVe7rUG9h/DA5EPwQFNv9EC6UmfBjY8LQcau38AjDsLBl8zbwfM0KEHaSUfBlHcIwTqvIkECynBA7beAP+2weUA0xP6+5riEQb6xML7nxiJBfrQBQcLAi0DkYKpBSZWNwJGht8C3a5lAJkSlQXATAsFD4SLBr+aywdEBGEFRDgRAs6IjQeYk5UCCb7/BXVTZwbPoCEFeCy1B9I3EwQ2kkkBI7yHBv4lcwHKLX8EaBDxB+vmrwYAXdsGcJidB6d+Owf6hm0COmc5ACUHYwS2c4MEOVnLBylKtQYg0y8AMN7JBM3OJwTGlFEH0J6rB1F6WQDgIKEHgB9bBrSiTwDcll0GS0SbAj6jkwaX0iUBnhcVACYZhwJ5ulj7qms/Bin0nP2k6rUFYCcfBwJiLwU5u0UAGUBZBKBf2QBehiUH4VtbAirw4QZE8oMHIQkBBQTG0QAOnocHd+SPBaFbGweE1b8EPiFfB0DvJwbJGs0CpGzDBhIkDQT2eakCCGRRBorKxPyHzj0HJf5nBU01EQYy0I0EhvOhA4BOqQGQBO0HjBow/T9CTwRUjeECsIQhBDpPKQNbW3sBqOw9BFdYCQRHWs8DzagpBaML7QC62P0GjcdXBa68hQfUWvcCbNMnB21oFQWMns8BOJ7zBkgDoQO4n7cBNk/vATJbqQORMGMGR4PDAPj0ZQQpfiMEcF77BRnkqQf+nC0E=\",\"dtype\":\"float32\",\"order\":\"little\",\"shape\":[560]}},\"selected\":{\"id\":\"3700\"},\"selection_policy\":{\"id\":\"3699\"}},\"id\":\"3685\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"3662\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"3685\"},\"glyph\":{\"id\":\"3687\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"3689\"},\"nonselection_glyph\":{\"id\":\"3688\"},\"view\":{\"id\":\"3691\"}},\"id\":\"3690\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"3700\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"3672\",\"type\":\"SaveTool\"},{\"attributes\":{\"overlay\":{\"id\":\"3675\"}},\"id\":\"3671\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"3648\"}},\"hatch_alpha\":{\"value\":0.5},\"hatch_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"3648\"}},\"line_alpha\":{\"value\":0.5},\"line_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"3648\"}},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3687\",\"type\":\"Scatter\"},{\"attributes\":{\"axis\":{\"id\":\"3661\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"3664\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"3699\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"3698\",\"type\":\"AllLabels\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"3675\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"source\":{\"id\":\"3685\"}},\"id\":\"3691\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"3695\",\"type\":\"AllLabels\"},{\"attributes\":{\"tools\":[{\"id\":\"3669\"},{\"id\":\"3670\"},{\"id\":\"3671\"},{\"id\":\"3672\"},{\"id\":\"3673\"},{\"id\":\"3674\"},{\"id\":\"3676\"}]},\"id\":\"3677\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"3694\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"3659\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"3673\",\"type\":\"ResetTool\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"3648\"}},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"3648\"}},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"3648\"}},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3689\",\"type\":\"Scatter\"},{\"attributes\":{\"high\":26,\"low\":0,\"palette\":[\"#30123b\",\"#311542\",\"#32184a\",\"#341b51\",\"#351e58\",\"#36215f\",\"#372365\",\"#38266c\",\"#392972\",\"#3a2c79\",\"#3b2f7f\",\"#3c3285\",\"#3c358b\",\"#3d3791\",\"#3e3a96\",\"#3f3d9c\",\"#4040a1\",\"#4043a6\",\"#4145ab\",\"#4148b0\",\"#424bb5\",\"#434eba\",\"#4350be\",\"#4353c2\",\"#4456c7\",\"#4458cb\",\"#455bce\",\"#455ed2\",\"#4560d6\",\"#4563d9\",\"#4666dd\",\"#4668e0\",\"#466be3\",\"#466de6\",\"#4670e8\",\"#4673eb\",\"#4675ed\",\"#4678f0\",\"#467af2\",\"#467df4\",\"#467ff6\",\"#4682f8\",\"#4584f9\",\"#4587fb\",\"#4589fc\",\"#448cfd\",\"#438efd\",\"#4291fe\",\"#4193fe\",\"#4096fe\",\"#3f98fe\",\"#3e9bfe\",\"#3c9dfd\",\"#3ba0fc\",\"#39a2fc\",\"#38a5fb\",\"#36a8f9\",\"#34aaf8\",\"#33acf6\",\"#31aff5\",\"#2fb1f3\",\"#2db4f1\",\"#2bb6ef\",\"#2ab9ed\",\"#28bbeb\",\"#26bde9\",\"#25c0e6\",\"#23c2e4\",\"#21c4e1\",\"#20c6df\",\"#1ec9dc\",\"#1dcbda\",\"#1ccdd7\",\"#1bcfd4\",\"#1ad1d2\",\"#19d3cf\",\"#18d5cc\",\"#18d7ca\",\"#17d9c7\",\"#17dac4\",\"#17dcc2\",\"#17debf\",\"#18e0bd\",\"#18e1ba\",\"#19e3b8\",\"#1ae4b6\",\"#1be5b4\",\"#1de7b1\",\"#1ee8af\",\"#20e9ac\",\"#22eba9\",\"#24eca6\",\"#27eda3\",\"#29eea0\",\"#2cef9d\",\"#2ff09a\",\"#32f197\",\"#35f394\",\"#38f491\",\"#3bf48d\",\"#3ff58a\",\"#42f687\",\"#46f783\",\"#4af880\",\"#4df97c\",\"#51f979\",\"#55fa76\",\"#59fb72\",\"#5dfb6f\",\"#61fc6c\",\"#65fc68\",\"#69fd65\",\"#6dfd62\",\"#71fd5f\",\"#74fe5c\",\"#78fe59\",\"#7cfe56\",\"#80fe53\",\"#84fe50\",\"#87fe4d\",\"#8bfe4b\",\"#8efe48\",\"#92fe46\",\"#95fe44\",\"#98fe42\",\"#9bfd40\",\"#9efd3e\",\"#a1fc3d\",\"#a4fc3b\",\"#a6fb3a\",\"#a9fb39\",\"#acfa37\",\"#aef937\",\"#b1f836\",\"#b3f835\",\"#b6f735\",\"#b9f534\",\"#bbf434\",\"#bef334\",\"#c0f233\",\"#c3f133\",\"#c5ef33\",\"#c8ee33\",\"#caed33\",\"#cdeb34\",\"#cfea34\",\"#d1e834\",\"#d4e735\",\"#d6e535\",\"#d8e335\",\"#dae236\",\"#dde036\",\"#dfde36\",\"#e1dc37\",\"#e3da37\",\"#e5d838\",\"#e7d738\",\"#e8d538\",\"#ead339\",\"#ecd139\",\"#edcf39\",\"#efcd39\",\"#f0cb3a\",\"#f2c83a\",\"#f3c63a\",\"#f4c43a\",\"#f6c23a\",\"#f7c039\",\"#f8be39\",\"#f9bc39\",\"#f9ba38\",\"#fab737\",\"#fbb537\",\"#fbb336\",\"#fcb035\",\"#fcae34\",\"#fdab33\",\"#fda932\",\"#fda631\",\"#fda330\",\"#fea12f\",\"#fe9e2e\",\"#fe9b2d\",\"#fe982c\",\"#fd952b\",\"#fd9229\",\"#fd8f28\",\"#fd8c27\",\"#fc8926\",\"#fc8624\",\"#fb8323\",\"#fb8022\",\"#fa7d20\",\"#fa7a1f\",\"#f9771e\",\"#f8741c\",\"#f7711b\",\"#f76e1a\",\"#f66b18\",\"#f56817\",\"#f46516\",\"#f36315\",\"#f26014\",\"#f15d13\",\"#ef5a11\",\"#ee5810\",\"#ed550f\",\"#ec520e\",\"#ea500d\",\"#e94d0d\",\"#e84b0c\",\"#e6490b\",\"#e5460a\",\"#e3440a\",\"#e24209\",\"#e04008\",\"#de3e08\",\"#dd3c07\",\"#db3a07\",\"#d93806\",\"#d73606\",\"#d63405\",\"#d43205\",\"#d23005\",\"#d02f04\",\"#ce2d04\",\"#cb2b03\",\"#c92903\",\"#c72803\",\"#c52602\",\"#c32402\",\"#c02302\",\"#be2102\",\"#bb1f01\",\"#b91e01\",\"#b61c01\",\"#b41b01\",\"#b11901\",\"#ae1801\",\"#ac1601\",\"#a91501\",\"#a61401\",\"#a31201\",\"#a01101\",\"#9d1001\",\"#9a0e01\",\"#970d01\",\"#940c01\",\"#910b01\",\"#8e0a01\",\"#8b0901\",\"#870801\",\"#840701\",\"#810602\",\"#7d0502\",\"#7a0402\"]},\"id\":\"3648\",\"type\":\"LinearColorMapper\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Check label by hovering mouse over the dots\"},\"id\":\"3651\",\"type\":\"Title\"},{\"attributes\":{\"axis\":{\"id\":\"3665\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"3668\",\"type\":\"Grid\"},{\"attributes\":{\"label\":{\"field\":\"label_desc\"},\"renderers\":[{\"id\":\"3690\"}]},\"id\":\"3703\",\"type\":\"LegendItem\"},{\"attributes\":{\"callback\":null,\"tooltips\":\"\\n
\\n \\n
\\n @label_desc - @split\\n [#@video_id]\\n
\\n
\\n \\n\"},\"id\":\"3676\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"3657\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"3697\"},\"group\":null,\"major_label_policy\":{\"id\":\"3698\"},\"ticker\":{\"id\":\"3662\"}},\"id\":\"3661\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"3653\",\"type\":\"DataRange1d\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"items\":[{\"id\":\"3703\"}]},\"id\":\"3702\",\"type\":\"Legend\"},{\"attributes\":{},\"id\":\"3669\",\"type\":\"PanTool\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"3694\"},\"group\":null,\"major_label_policy\":{\"id\":\"3695\"},\"ticker\":{\"id\":\"3666\"}},\"id\":\"3665\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"3648\"}},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"3648\"}},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"3648\"}},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"3688\",\"type\":\"Scatter\"},{\"attributes\":{},\"id\":\"3655\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"3666\",\"type\":\"BasicTicker\"}],\"root_ids\":[\"3650\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n const render_items = [{\"docid\":\"3319067e-80c8-43c4-bb1a-c415f4fcd840\",\"root_ids\":[\"3650\"],\"roots\":{\"3650\":\"0936cd18-7278-46e3-94eb-fd0b9db94288\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", + "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"8ca9adeb-5053-419f-ac22-431834c16cd9\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1380\"}],\"center\":[{\"id\":\"1383\"},{\"id\":\"1387\"},{\"id\":\"1421\"}],\"height\":800,\"left\":[{\"id\":\"1384\"}],\"renderers\":[{\"id\":\"1409\"}],\"title\":{\"id\":\"1370\"},\"toolbar\":{\"id\":\"1396\"},\"width\":1000,\"x_range\":{\"id\":\"1372\"},\"x_scale\":{\"id\":\"1376\"},\"y_range\":{\"id\":\"1374\"},\"y_scale\":{\"id\":\"1378\"}},\"id\":\"1369\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"1367\"}},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"1367\"}},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"1367\"}},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1407\",\"type\":\"Scatter\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Check label by hovering mouse over the dots\"},\"id\":\"1370\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1388\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1418\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1416\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"1367\"}},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"1367\"}},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"1367\"}},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1408\",\"type\":\"Scatter\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"items\":[{\"id\":\"1422\"}]},\"id\":\"1421\",\"type\":\"Legend\"},{\"attributes\":{\"tools\":[{\"id\":\"1388\"},{\"id\":\"1389\"},{\"id\":\"1390\"},{\"id\":\"1391\"},{\"id\":\"1392\"},{\"id\":\"1393\"},{\"id\":\"1395\"}]},\"id\":\"1396\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1372\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1419\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1376\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1385\",\"type\":\"BasicTicker\"},{\"attributes\":{\"data\":{\"label\":[0,1,2,3,4,1,2,3,2,6,5,0,7,7,8,2,9,2,4,2,8,4,1,10,3,11,10,12,4,9,13,0,10,11,5,8,8,13,6,9,2,3,13,14,3,14,9,6,8,3,7,1,7,11,0,5,5,5,6,4,11,2,10,11,4,7,3,10,9,6,9,12,7,11,12,2,9,1,12,10,11,13,9,13,13,14,6,1,9,8,1,10,2,5,9,0,1,8,6,4,0,6,5,11,4,7,14,12,14,6,0,10,9,11,0,8,9,7,4,5,8,6,14,10,3,10,9,9,14,8,9,0,5,2,12,11,6,2,8,10,4,8,1,13,1,4,4,11,12,14,0,1,2,12,14,13,6,7,3,7,5,13,0,1],\"label_desc\":[\"TOT-ZIENS\",\"GOED\",\"GOEDENACHT\",\"NEE\",\"SLECHT\",\"GOED\",\"GOEDENACHT\",\"NEE\",\"GOEDENACHT\",\"JA\",\"GOEDEMORGEN\",\"TOT-ZIENS\",\"SORRY\",\"SORRY\",\"SMAKELIJK\",\"GOEDENACHT\",\"RECHTS\",\"GOEDENACHT\",\"SLECHT\",\"GOEDENACHT\",\"SMAKELIJK\",\"SLECHT\",\"GOED\",\"GOEDENAVOND\",\"NEE\",\"SALUUT\",\"GOEDENAVOND\",\"BEDANKEN\",\"SLECHT\",\"RECHTS\",\"LINKS\",\"TOT-ZIENS\",\"GOEDENAVOND\",\"SALUUT\",\"GOEDEMORGEN\",\"SMAKELIJK\",\"SMAKELIJK\",\"LINKS\",\"JA\",\"RECHTS\",\"GOEDENACHT\",\"NEE\",\"LINKS\",\"GOEDEMIDDAG\",\"NEE\",\"GOEDEMIDDAG\",\"RECHTS\",\"JA\",\"SMAKELIJK\",\"NEE\",\"SORRY\",\"GOED\",\"SORRY\",\"SALUUT\",\"TOT-ZIENS\",\"GOEDEMORGEN\",\"GOEDEMORGEN\",\"GOEDEMORGEN\",\"JA\",\"SLECHT\",\"SALUUT\",\"GOEDENACHT\",\"GOEDENAVOND\",\"SALUUT\",\"SLECHT\",\"SORRY\",\"NEE\",\"GOEDENAVOND\",\"RECHTS\",\"JA\",\"RECHTS\",\"BEDANKEN\",\"SORRY\",\"SALUUT\",\"BEDANKEN\",\"GOEDENACHT\",\"RECHTS\",\"GOED\",\"BEDANKEN\",\"GOEDENAVOND\",\"SALUUT\",\"LINKS\",\"RECHTS\",\"LINKS\",\"LINKS\",\"GOEDEMIDDAG\",\"JA\",\"GOED\",\"RECHTS\",\"SMAKELIJK\",\"GOED\",\"GOEDENAVOND\",\"GOEDENACHT\",\"GOEDEMORGEN\",\"RECHTS\",\"TOT-ZIENS\",\"GOED\",\"SMAKELIJK\",\"JA\",\"SLECHT\",\"TOT-ZIENS\",\"JA\",\"GOEDEMORGEN\",\"SALUUT\",\"SLECHT\",\"SORRY\",\"GOEDEMIDDAG\",\"BEDANKEN\",\"GOEDEMIDDAG\",\"JA\",\"TOT-ZIENS\",\"GOEDENAVOND\",\"RECHTS\",\"SALUUT\",\"TOT-ZIENS\",\"SMAKELIJK\",\"RECHTS\",\"SORRY\",\"SLECHT\",\"GOEDEMORGEN\",\"SMAKELIJK\",\"JA\",\"GOEDEMIDDAG\",\"GOEDENAVOND\",\"NEE\",\"GOEDENAVOND\",\"RECHTS\",\"RECHTS\",\"GOEDEMIDDAG\",\"SMAKELIJK\",\"RECHTS\",\"TOT-ZIENS\",\"GOEDEMORGEN\",\"GOEDENACHT\",\"BEDANKEN\",\"SALUUT\",\"JA\",\"GOEDENACHT\",\"SMAKELIJK\",\"GOEDENAVOND\",\"SLECHT\",\"SMAKELIJK\",\"GOED\",\"LINKS\",\"GOED\",\"SLECHT\",\"SLECHT\",\"SALUUT\",\"BEDANKEN\",\"GOEDEMIDDAG\",\"TOT-ZIENS\",\"GOED\",\"GOEDENACHT\",\"BEDANKEN\",\"GOEDEMIDDAG\",\"LINKS\",\"JA\",\"SORRY\",\"NEE\",\"SORRY\",\"GOEDEMORGEN\",\"LINKS\",\"TOT-ZIENS\",\"GOED\"],\"labels\":[0,1,2,3,4,1,2,3,2,6,5,0,7,7,8,2,9,2,4,2,8,4,1,10,3,11,10,12,4,9,13,0,10,11,5,8,8,13,6,9,2,3,13,14,3,14,9,6,8,3,7,1,7,11,0,5,5,5,6,4,11,2,10,11,4,7,3,10,9,6,9,12,7,11,12,2,9,1,12,10,11,13,9,13,13,14,6,1,9,8,1,10,2,5,9,0,1,8,6,4,0,6,5,11,4,7,14,12,14,6,0,10,9,11,0,8,9,7,4,5,8,6,14,10,3,10,9,9,14,8,9,0,5,2,12,11,6,2,8,10,4,8,1,13,1,4,4,11,12,14,0,1,2,12,14,13,6,7,3,7,5,13,0,1],\"split\":[\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\",\"train\"],\"x\":{\"__ndarray__\":\"TI2JP4Cspr8K+Yc/DrgbQPNtnsBmVIE/HdmIP6zwXUCp/8Q/ZL+cQGWpK8ATig8/bsaWv/Yi178IG4w8UPeEP/VnikDEzfg/Oe+4wMmzlD/JyR0+owQIwHLlnj+ShTnApg/tP6BbpMB0jIE+A7PpPhqgpcD+b0NA6mXFQCq4AD9ctvq/VJtawCDEfMBcXba+6n7TP37txED1t4BAFXZZQKppsj9OdYo/xL3PQMesY8D41ghA2do8wAbklECdtmpAOAWTPrVQ7T+Bzqm/4LXKPzR0Vr+Nz5PAr5qHv/QB7D5trULAnx19wPMaj0BXQdXAncO2wGOfbD6cGtW/LRJfwC5LwMAs6QTAmNG7P48wQ8BZ05NA/mtbQOea5T82Xre/IRd+v6OcksB5976+4/KZvfzJm0BsePU/vUhYv3FwpL92k5/AiyvXQExpnUBqf8pAV4bfQJL2H79bqZNAC3BBQJFmlEDvAYo//og4QI7OO7/zYgNAGYeSP1tJC0Dzn44/2xdsQGoDrL+sdCVAtZ7UwE1BEj4Px49AOM1ywCPSqcBLlpzATgfWv/yqWsCxdfy+dfMrwICP+z+JT5O/XdDnv4mMckAiJKTA7Yrgvpw1g79k8ZBAmXUXwH62z8ANE3HAbzwIwAuLl0BYPLC/uzoJwIJeMz9AbBq/qa3VP0CLsEDBUzs+pdgawBTfYEB6Xho+3eg5wFED3j9CU7y/f7KbwO0hEUAf0o++VmqOv0yByz6sqr/AnMIZQJLPckDTueNAmCAzQG9Tv8DIo87AJgApwBU/9L/xqd++LBiYv6zxZEBoSxK9TzE1v4cHg8A9pNdAuXjqP4lBtr/6twY/MksGwHoTQb+cGeNA0OcEPjc2LUA=\",\"dtype\":\"float32\",\"order\":\"little\",\"shape\":[164]},\"y\":{\"__ndarray__\":\"l+8ZwXSNLcFDlKxAqCfFwMyh4D8sjgPBKTN5QJNKmcCFaWpA3s2YwFh0AkGiwBbBFP0gQa9WG0ExngbBkw+qQKRG6L8w7bNA7aFVP3dktUC0YhrAyCYMwQV/BMF+awJAbG+owD8fm0DPpV7AnEWkvedbG0Bz0l+/B74zv3ebIMHqRFI+Tz2XQB9RBz5QuPjAD7kwwfo6Lr/T1gDBEURbv0ZuokBawU3AWod5v1zzf0BQPsTAbKBmQHM0ib/Cvs7AZJIQwdE10MDvBRZBy4fZwLCfHkErbp1Ad58gwTUPPb+RtehAEpuHvB/c98A6RGk/nrywQD3DlkAHjzXANi6kQGAKBkBTphJB6oKgwNlMtD6fUh++7+AFwVAHG7/XqNK/nMMYQYVasUClZBrA40MyQFcMt70OlRDBh8ZVwMaUYb/IM4hAprmGv8T647+NtZO/QVSRv7a/tj/Rr7fAcD0hwcwJAj+VjjLBgYsfwYwaX8BP55NA281MQPWeLb9B1B3BxxUwwQM3Vj+oVvfAq6+aP5bnGMGYSpHAzwJ9PxG/skDdOMI/jM8hQV80XUAUaDzAaMZQQICiDcHluBbBkpZdvxwHub57WapAB2gSwceyAsE4v3g/dtwSQRRypT/iUR1A9bYCQaNvz8DRqgFAawC4vgbB4sA5XoHAGEn1v7MWEcCjoLc+LzW+v8/ZLcAbhR/BNFf8QNdjkEB8o9i+rpaKQH3HHcEWNAxBfTHVwIbImsCjDaQ/ovMywXcFL8EPojDAOY8pwR1QOD9PaQJAQ559QLY/F8DigKY/tPgTwZ9sL8FaNG5ARz6Hv5u6pUB/2cW/hHX+wGnJIkEsQczA9CUbQfa+ID4LajDAlJEiwSVlCcE=\",\"dtype\":\"float32\",\"order\":\"little\",\"shape\":[164]}},\"selected\":{\"id\":\"1419\"},\"selection_policy\":{\"id\":\"1418\"}},\"id\":\"1404\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1404\"},\"glyph\":{\"id\":\"1406\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1408\"},\"nonselection_glyph\":{\"id\":\"1407\"},\"view\":{\"id\":\"1410\"}},\"id\":\"1409\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1374\",\"type\":\"DataRange1d\"},{\"attributes\":{\"callback\":null,\"tooltips\":\"\\n
\\n \\n
\\n @label_desc - @split\\n [#@video_id]\\n
\\n
\\n \\n\"},\"id\":\"1395\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"1414\",\"type\":\"AllLabels\"},{\"attributes\":{\"label\":{\"field\":\"label_desc\"},\"renderers\":[{\"id\":\"1409\"}]},\"id\":\"1422\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1389\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1394\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1393\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1381\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1416\"},\"group\":null,\"major_label_policy\":{\"id\":\"1417\"},\"ticker\":{\"id\":\"1381\"}},\"id\":\"1380\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1380\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1383\",\"type\":\"Grid\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"1367\"}},\"hatch_alpha\":{\"value\":0.5},\"hatch_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"1367\"}},\"line_alpha\":{\"value\":0.5},\"line_color\":{\"field\":\"labels\",\"transform\":{\"id\":\"1367\"}},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1406\",\"type\":\"Scatter\"},{\"attributes\":{\"axis\":{\"id\":\"1384\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1387\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1392\",\"type\":\"ResetTool\"},{\"attributes\":{\"high\":15,\"low\":0,\"palette\":[\"#30123b\",\"#311542\",\"#32184a\",\"#341b51\",\"#351e58\",\"#36215f\",\"#372365\",\"#38266c\",\"#392972\",\"#3a2c79\",\"#3b2f7f\",\"#3c3285\",\"#3c358b\",\"#3d3791\",\"#3e3a96\",\"#3f3d9c\",\"#4040a1\",\"#4043a6\",\"#4145ab\",\"#4148b0\",\"#424bb5\",\"#434eba\",\"#4350be\",\"#4353c2\",\"#4456c7\",\"#4458cb\",\"#455bce\",\"#455ed2\",\"#4560d6\",\"#4563d9\",\"#4666dd\",\"#4668e0\",\"#466be3\",\"#466de6\",\"#4670e8\",\"#4673eb\",\"#4675ed\",\"#4678f0\",\"#467af2\",\"#467df4\",\"#467ff6\",\"#4682f8\",\"#4584f9\",\"#4587fb\",\"#4589fc\",\"#448cfd\",\"#438efd\",\"#4291fe\",\"#4193fe\",\"#4096fe\",\"#3f98fe\",\"#3e9bfe\",\"#3c9dfd\",\"#3ba0fc\",\"#39a2fc\",\"#38a5fb\",\"#36a8f9\",\"#34aaf8\",\"#33acf6\",\"#31aff5\",\"#2fb1f3\",\"#2db4f1\",\"#2bb6ef\",\"#2ab9ed\",\"#28bbeb\",\"#26bde9\",\"#25c0e6\",\"#23c2e4\",\"#21c4e1\",\"#20c6df\",\"#1ec9dc\",\"#1dcbda\",\"#1ccdd7\",\"#1bcfd4\",\"#1ad1d2\",\"#19d3cf\",\"#18d5cc\",\"#18d7ca\",\"#17d9c7\",\"#17dac4\",\"#17dcc2\",\"#17debf\",\"#18e0bd\",\"#18e1ba\",\"#19e3b8\",\"#1ae4b6\",\"#1be5b4\",\"#1de7b1\",\"#1ee8af\",\"#20e9ac\",\"#22eba9\",\"#24eca6\",\"#27eda3\",\"#29eea0\",\"#2cef9d\",\"#2ff09a\",\"#32f197\",\"#35f394\",\"#38f491\",\"#3bf48d\",\"#3ff58a\",\"#42f687\",\"#46f783\",\"#4af880\",\"#4df97c\",\"#51f979\",\"#55fa76\",\"#59fb72\",\"#5dfb6f\",\"#61fc6c\",\"#65fc68\",\"#69fd65\",\"#6dfd62\",\"#71fd5f\",\"#74fe5c\",\"#78fe59\",\"#7cfe56\",\"#80fe53\",\"#84fe50\",\"#87fe4d\",\"#8bfe4b\",\"#8efe48\",\"#92fe46\",\"#95fe44\",\"#98fe42\",\"#9bfd40\",\"#9efd3e\",\"#a1fc3d\",\"#a4fc3b\",\"#a6fb3a\",\"#a9fb39\",\"#acfa37\",\"#aef937\",\"#b1f836\",\"#b3f835\",\"#b6f735\",\"#b9f534\",\"#bbf434\",\"#bef334\",\"#c0f233\",\"#c3f133\",\"#c5ef33\",\"#c8ee33\",\"#caed33\",\"#cdeb34\",\"#cfea34\",\"#d1e834\",\"#d4e735\",\"#d6e535\",\"#d8e335\",\"#dae236\",\"#dde036\",\"#dfde36\",\"#e1dc37\",\"#e3da37\",\"#e5d838\",\"#e7d738\",\"#e8d538\",\"#ead339\",\"#ecd139\",\"#edcf39\",\"#efcd39\",\"#f0cb3a\",\"#f2c83a\",\"#f3c63a\",\"#f4c43a\",\"#f6c23a\",\"#f7c039\",\"#f8be39\",\"#f9bc39\",\"#f9ba38\",\"#fab737\",\"#fbb537\",\"#fbb336\",\"#fcb035\",\"#fcae34\",\"#fdab33\",\"#fda932\",\"#fda631\",\"#fda330\",\"#fea12f\",\"#fe9e2e\",\"#fe9b2d\",\"#fe982c\",\"#fd952b\",\"#fd9229\",\"#fd8f28\",\"#fd8c27\",\"#fc8926\",\"#fc8624\",\"#fb8323\",\"#fb8022\",\"#fa7d20\",\"#fa7a1f\",\"#f9771e\",\"#f8741c\",\"#f7711b\",\"#f76e1a\",\"#f66b18\",\"#f56817\",\"#f46516\",\"#f36315\",\"#f26014\",\"#f15d13\",\"#ef5a11\",\"#ee5810\",\"#ed550f\",\"#ec520e\",\"#ea500d\",\"#e94d0d\",\"#e84b0c\",\"#e6490b\",\"#e5460a\",\"#e3440a\",\"#e24209\",\"#e04008\",\"#de3e08\",\"#dd3c07\",\"#db3a07\",\"#d93806\",\"#d73606\",\"#d63405\",\"#d43205\",\"#d23005\",\"#d02f04\",\"#ce2d04\",\"#cb2b03\",\"#c92903\",\"#c72803\",\"#c52602\",\"#c32402\",\"#c02302\",\"#be2102\",\"#bb1f01\",\"#b91e01\",\"#b61c01\",\"#b41b01\",\"#b11901\",\"#ae1801\",\"#ac1601\",\"#a91501\",\"#a61401\",\"#a31201\",\"#a01101\",\"#9d1001\",\"#9a0e01\",\"#970d01\",\"#940c01\",\"#910b01\",\"#8e0a01\",\"#8b0901\",\"#870801\",\"#840701\",\"#810602\",\"#7d0502\",\"#7a0402\"]},\"id\":\"1367\",\"type\":\"LinearColorMapper\"},{\"attributes\":{},\"id\":\"1391\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1378\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"1404\"}},\"id\":\"1410\",\"type\":\"CDSView\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1413\"},\"group\":null,\"major_label_policy\":{\"id\":\"1414\"},\"ticker\":{\"id\":\"1385\"}},\"id\":\"1384\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1413\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1417\",\"type\":\"AllLabels\"},{\"attributes\":{\"overlay\":{\"id\":\"1394\"}},\"id\":\"1390\",\"type\":\"BoxZoomTool\"}],\"root_ids\":[\"1369\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n const render_items = [{\"docid\":\"8ca9adeb-5053-419f-ac22-431834c16cd9\",\"root_ids\":[\"1369\"],\"roots\":{\"1369\":\"1a2f2ca2-cdb2-4df2-ba23-85018cca17d9\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { - "id": "3650" + "id": "1369" } }, "output_type": "display_data" diff --git a/preprocessing/create_fingerspelling_dataset.py b/preprocessing/create_fingerspelling_dataset.py index db4e4cb..c3793cb 100644 --- a/preprocessing/create_fingerspelling_dataset.py +++ b/preprocessing/create_fingerspelling_dataset.py @@ -152,19 +152,23 @@ def create(args): df = pd.concat([df, df_aux], axis=1) if args.create_new_split: df_train, df_test = train_test_split(df, test_size=test_size, stratify=df['labels'], random_state=42) - else: - print(df['split'].unique()) - df_train = df[(df['split'] == 'train') | (df['split'] == 'val')] - df_test = df[df['split'] == 'test'] + - print(f'Num classes: {num_classes}') - print(df_train['labels'].value_counts()) - assert set(df_train['labels'].unique()) == set(df_test['labels'].unique( - )), 'The labels for train and test dataframe are different. We recommend to download the dataset again, or to use \ - the --create-new-split flag' - for split, df_split in zip(['train', 'val'], - [df_train, df_test]): - fn_out = op.join(dataset_folder, f'fingerspelling_{split}.csv') - (df_split.reset_index(drop=True) - .applymap(convert_to_str) - .to_csv(fn_out, index=False)) + print(f'Num classes: {num_classes}') + print(df_train['labels'].value_counts()) + print(df_test['labels'].value_counts()) + assert set(df_train['labels'].unique()) == set(df_test['labels'].unique( + )), 'The labels for train and test dataframe are different. We recommend to download the dataset again, or to use \ + the --create-new-split flag' + for split, df_split in zip(['train', 'val'], + [df_train, df_test]): + fn_out = op.join(dataset_folder, f'{split}.csv') + (df_split.reset_index(drop=True) + .applymap(convert_to_str) + .to_csv(fn_out, index=False)) + + else: + fn_out = op.join(dataset_folder, 'train.csv') + (df.reset_index(drop=True) + .applymap(convert_to_str) + .to_csv(fn_out, index=False)) \ No newline at end of file diff --git a/train.sh b/train.sh index 4572863..b6eb7ef 100755 --- a/train.sh +++ b/train.sh @@ -1,14 +1,14 @@ #!/bin/sh python -m train \ --save_checkpoints_every 10 \ - --experiment_name "basic" \ + --experiment_name "wlasl" \ --epochs 300 \ --optimizer "ADAM" \ --lr 0.0001 \ --batch_size 16 \ - --dataset_name "GoogleWLASL" \ - --training_set_path "spoter_train.csv" \ - --validation_set_path "spoter_test.csv" \ + --dataset_name "WLASL" \ + --training_set_path "WLASL100_train.csv" \ + --validation_set_path "WLASL100_val.csv" \ --vector_length 32 \ --epoch_iters -1 \ --scheduler_factor 0.2 \