{ "cells": [ { "cell_type": "markdown", "id": "a3573a47-3689-4668-b62f-5c8451b2b4e9", "metadata": { "tags": [] }, "source": [ "# 0. Install and Import Dependencies" ] }, { "cell_type": "code", "execution_count": 1, "id": "ddfbccbe-41ae-4c23-98b1-a13868e2b499", "metadata": { "scrolled": true, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Package Version\n", "---------------------------- ---------\n", "absl-py 2.0.0\n", "anyio 4.0.0\n", "argon2-cffi 23.1.0\n", "argon2-cffi-bindings 21.2.0\n", "arrow 1.3.0\n", "asttokens 2.4.1\n", "astunparse 1.6.3\n", "async-lru 2.0.4\n", "attrs 23.1.0\n", "Babel 2.13.1\n", "backcall 0.2.0\n", "beautifulsoup4 4.12.2\n", "bleach 6.1.0\n", "cachetools 5.3.2\n", "certifi 2023.7.22\n", "cffi 1.16.0\n", "charset-normalizer 3.3.1\n", "comm 0.1.4\n", "contourpy 1.1.1\n", "cycler 0.12.1\n", "debugpy 1.8.0\n", "decorator 5.1.1\n", "defusedxml 0.7.1\n", "exceptiongroup 1.1.3\n", "executing 2.0.0\n", "fastjsonschema 2.18.1\n", "filelock 3.13.0\n", "flatbuffers 23.5.26\n", "fonttools 4.43.1\n", "fqdn 1.5.1\n", "gast 0.5.4\n", "gdown 4.7.1\n", "google-auth 2.23.3\n", "google-auth-oauthlib 1.0.0\n", "google-pasta 0.2.0\n", "grpcio 1.59.0\n", "h5py 3.10.0\n", "idna 3.4\n", "imageio 2.31.6\n", "importlib-metadata 6.8.0\n", "importlib-resources 6.1.0\n", "ipykernel 6.26.0\n", "ipython 8.16.1\n", "ipython-genutils 0.2.0\n", "ipywidgets 8.1.1\n", "isoduration 20.11.0\n", "jedi 0.19.1\n", "Jinja2 3.1.2\n", "json5 0.9.14\n", "jsonpointer 2.4\n", "jsonschema 4.19.1\n", "jsonschema-specifications 2023.7.1\n", "jupyter 1.0.0\n", "jupyter_client 8.5.0\n", "jupyter-console 6.6.3\n", "jupyter_core 5.4.0\n", "jupyter-events 0.8.0\n", "jupyter-lsp 2.2.0\n", "jupyter_server 2.9.1\n", "jupyter_server_terminals 0.4.4\n", "jupyterlab 4.0.7\n", "jupyterlab-pygments 0.2.2\n", "jupyterlab_server 2.25.0\n", "jupyterlab-widgets 3.0.9\n", "keras 2.14.0\n", "kiwisolver 1.4.5\n", "libclang 16.0.6\n", "Markdown 3.5\n", "MarkupSafe 2.1.3\n", "matplotlib 3.8.0\n", "matplotlib-inline 0.1.6\n", "mistune 3.0.2\n", "ml-dtypes 0.2.0\n", "nbclient 0.8.0\n", "nbconvert 7.9.2\n", "nbformat 5.9.2\n", "nest-asyncio 1.5.8\n", "notebook 7.0.6\n", "notebook_shim 0.2.3\n", "numpy 1.26.1\n", "oauthlib 3.2.2\n", "opencv-python 4.8.1.78\n", "opt-einsum 3.3.0\n", "overrides 7.4.0\n", "packaging 23.2\n", "pandocfilters 1.5.0\n", "parso 0.8.3\n", "pexpect 4.8.0\n", "pickleshare 0.7.5\n", "Pillow 10.0.1\n", "pip 23.0.1\n", "platformdirs 3.11.0\n", "prometheus-client 0.17.1\n", "prompt-toolkit 3.0.39\n", "protobuf 4.24.4\n", "psutil 5.9.6\n", "ptyprocess 0.7.0\n", "pure-eval 0.2.2\n", "pyasn1 0.5.0\n", "pyasn1-modules 0.3.0\n", "pycparser 2.21\n", "Pygments 2.16.1\n", "pyparsing 3.1.1\n", "PySocks 1.7.1\n", "python-dateutil 2.8.2\n", "python-json-logger 2.0.7\n", "python-version 0.0.2\n", "PyYAML 6.0.1\n", "pyzmq 25.1.1\n", "qtconsole 5.4.4\n", "QtPy 2.4.1\n", "referencing 0.30.2\n", "requests 2.31.0\n", "requests-oauthlib 1.3.1\n", "rfc3339-validator 0.1.4\n", "rfc3986-validator 0.1.1\n", "rpds-py 0.10.6\n", "rsa 4.9\n", "Send2Trash 1.8.2\n", "setuptools 58.1.0\n", "six 1.16.0\n", "sniffio 1.3.0\n", "soupsieve 2.5\n", "stack-data 0.6.3\n", "tensorboard 2.14.1\n", "tensorboard-data-server 0.7.2\n", "tensorflow 2.14.0\n", "tensorflow-estimator 2.14.0\n", "tensorflow-io-gcs-filesystem 0.34.0\n", "termcolor 2.3.0\n", "terminado 0.17.1\n", "tinycss2 1.2.1\n", "tomli 2.0.1\n", "tornado 6.3.3\n", "tqdm 4.66.1\n", "traitlets 5.12.0\n", "types-python-dateutil 2.8.19.14\n", "typing_extensions 4.8.0\n", "uri-template 1.3.0\n", "urllib3 2.0.7\n", "wcwidth 0.2.8\n", "webcolors 1.13\n", "webencodings 0.5.1\n", "websocket-client 1.6.4\n", "Werkzeug 3.0.1\n", "wheel 0.41.2\n", "widgetsnbextension 4.0.9\n", "wrapt 1.14.1\n", "zipp 3.17.0\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.3.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" ] } ], "source": [ "!pip list" ] }, { "cell_type": "code", "execution_count": 2, "id": "02f907ea-f669-46c7-adcf-7f257e663448", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: opencv-python in ./venv/lib/python3.9/site-packages (4.8.1.78)\n", "Requirement already satisfied: matplotlib in ./venv/lib/python3.9/site-packages (3.8.0)\n", "Requirement already satisfied: imageio in ./venv/lib/python3.9/site-packages (2.31.6)\n", "Requirement already satisfied: gdown in ./venv/lib/python3.9/site-packages (4.7.1)\n", "Requirement already satisfied: tensorflow in ./venv/lib/python3.9/site-packages (2.14.0)\n", "Requirement already satisfied: numpy>=1.17.0 in ./venv/lib/python3.9/site-packages (from opencv-python) (1.26.1)\n", "Requirement already satisfied: python-dateutil>=2.7 in ./venv/lib/python3.9/site-packages (from matplotlib) (2.8.2)\n", "Requirement already satisfied: contourpy>=1.0.1 in ./venv/lib/python3.9/site-packages (from matplotlib) (1.1.1)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in ./venv/lib/python3.9/site-packages (from matplotlib) (1.4.5)\n", "Requirement already satisfied: pillow>=6.2.0 in ./venv/lib/python3.9/site-packages (from matplotlib) (10.0.1)\n", "Requirement already satisfied: pyparsing>=2.3.1 in ./venv/lib/python3.9/site-packages (from matplotlib) (3.1.1)\n", "Requirement already satisfied: importlib-resources>=3.2.0 in ./venv/lib/python3.9/site-packages (from matplotlib) (6.1.0)\n", "Requirement already satisfied: fonttools>=4.22.0 in ./venv/lib/python3.9/site-packages (from matplotlib) (4.43.1)\n", "Requirement already satisfied: packaging>=20.0 in ./venv/lib/python3.9/site-packages (from matplotlib) (23.2)\n", "Requirement already satisfied: cycler>=0.10 in ./venv/lib/python3.9/site-packages (from matplotlib) (0.12.1)\n", "Requirement already satisfied: six in ./venv/lib/python3.9/site-packages (from gdown) (1.16.0)\n", "Requirement already satisfied: filelock in ./venv/lib/python3.9/site-packages (from gdown) (3.13.0)\n", "Requirement already satisfied: requests[socks] in ./venv/lib/python3.9/site-packages (from gdown) (2.31.0)\n", "Requirement already satisfied: tqdm in ./venv/lib/python3.9/site-packages (from gdown) (4.66.1)\n", "Requirement already satisfied: beautifulsoup4 in ./venv/lib/python3.9/site-packages (from gdown) (4.12.2)\n", "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in ./venv/lib/python3.9/site-packages (from tensorflow) (0.5.4)\n", "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in ./venv/lib/python3.9/site-packages (from tensorflow) (4.24.4)\n", "Requirement already satisfied: absl-py>=1.0.0 in ./venv/lib/python3.9/site-packages (from tensorflow) (2.0.0)\n", "Requirement already satisfied: astunparse>=1.6.0 in ./venv/lib/python3.9/site-packages (from tensorflow) (1.6.3)\n", "Requirement already satisfied: keras<2.15,>=2.14.0 in ./venv/lib/python3.9/site-packages (from tensorflow) (2.14.0)\n", "Requirement already satisfied: setuptools in ./venv/lib/python3.9/site-packages (from tensorflow) (58.1.0)\n", "Requirement already satisfied: grpcio<2.0,>=1.24.3 in ./venv/lib/python3.9/site-packages (from tensorflow) (1.59.0)\n", "Requirement already satisfied: libclang>=13.0.0 in ./venv/lib/python3.9/site-packages (from tensorflow) (16.0.6)\n", "Requirement already satisfied: tensorboard<2.15,>=2.14 in ./venv/lib/python3.9/site-packages (from tensorflow) (2.14.1)\n", "Requirement already satisfied: wrapt<1.15,>=1.11.0 in ./venv/lib/python3.9/site-packages (from tensorflow) (1.14.1)\n", "Requirement already satisfied: google-pasta>=0.1.1 in ./venv/lib/python3.9/site-packages (from tensorflow) (0.2.0)\n", "Requirement already satisfied: ml-dtypes==0.2.0 in ./venv/lib/python3.9/site-packages (from tensorflow) (0.2.0)\n", "Requirement already satisfied: typing-extensions>=3.6.6 in ./venv/lib/python3.9/site-packages (from tensorflow) (4.8.0)\n", "Requirement already satisfied: tensorflow-estimator<2.15,>=2.14.0 in ./venv/lib/python3.9/site-packages (from tensorflow) (2.14.0)\n", "Requirement already satisfied: h5py>=2.9.0 in ./venv/lib/python3.9/site-packages (from tensorflow) (3.10.0)\n", "Requirement already satisfied: opt-einsum>=2.3.2 in ./venv/lib/python3.9/site-packages (from tensorflow) (3.3.0)\n", "Requirement already satisfied: flatbuffers>=23.5.26 in ./venv/lib/python3.9/site-packages (from tensorflow) (23.5.26)\n", "Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in ./venv/lib/python3.9/site-packages (from tensorflow) (0.34.0)\n", "Requirement already satisfied: termcolor>=1.1.0 in ./venv/lib/python3.9/site-packages (from tensorflow) (2.3.0)\n", "Requirement already satisfied: wheel<1.0,>=0.23.0 in ./venv/lib/python3.9/site-packages (from astunparse>=1.6.0->tensorflow) (0.41.2)\n", "Requirement already satisfied: zipp>=3.1.0 in ./venv/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib) (3.17.0)\n", "Requirement already satisfied: markdown>=2.6.8 in ./venv/lib/python3.9/site-packages (from tensorboard<2.15,>=2.14->tensorflow) (3.5)\n", "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in ./venv/lib/python3.9/site-packages (from tensorboard<2.15,>=2.14->tensorflow) (0.7.2)\n", "Requirement already satisfied: werkzeug>=1.0.1 in ./venv/lib/python3.9/site-packages (from tensorboard<2.15,>=2.14->tensorflow) (3.0.1)\n", "Requirement already satisfied: google-auth<3,>=1.6.3 in ./venv/lib/python3.9/site-packages (from tensorboard<2.15,>=2.14->tensorflow) (2.23.3)\n", "Requirement already satisfied: google-auth-oauthlib<1.1,>=0.5 in ./venv/lib/python3.9/site-packages (from tensorboard<2.15,>=2.14->tensorflow) (1.0.0)\n", "Requirement already satisfied: soupsieve>1.2 in ./venv/lib/python3.9/site-packages (from beautifulsoup4->gdown) (2.5)\n", "Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.9/site-packages (from requests[socks]->gdown) (2023.7.22)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.9/site-packages (from requests[socks]->gdown) (2.0.7)\n", "Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.9/site-packages (from requests[socks]->gdown) (3.4)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.9/site-packages (from requests[socks]->gdown) (3.3.1)\n", "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in ./venv/lib/python3.9/site-packages (from requests[socks]->gdown) (1.7.1)\n", "Requirement already satisfied: pyasn1-modules>=0.2.1 in ./venv/lib/python3.9/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.15,>=2.14->tensorflow) (0.3.0)\n", "Requirement already satisfied: rsa<5,>=3.1.4 in ./venv/lib/python3.9/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.15,>=2.14->tensorflow) (4.9)\n", "Requirement already satisfied: cachetools<6.0,>=2.0.0 in ./venv/lib/python3.9/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.15,>=2.14->tensorflow) (5.3.2)\n", "Requirement already satisfied: requests-oauthlib>=0.7.0 in ./venv/lib/python3.9/site-packages (from google-auth-oauthlib<1.1,>=0.5->tensorboard<2.15,>=2.14->tensorflow) (1.3.1)\n", "Requirement already satisfied: importlib-metadata>=4.4 in ./venv/lib/python3.9/site-packages (from markdown>=2.6.8->tensorboard<2.15,>=2.14->tensorflow) (6.8.0)\n", "Requirement already satisfied: MarkupSafe>=2.1.1 in ./venv/lib/python3.9/site-packages (from werkzeug>=1.0.1->tensorboard<2.15,>=2.14->tensorflow) (2.1.3)\n", "Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in ./venv/lib/python3.9/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard<2.15,>=2.14->tensorflow) (0.5.0)\n", "Requirement already satisfied: oauthlib>=3.0.0 in ./venv/lib/python3.9/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<1.1,>=0.5->tensorboard<2.15,>=2.14->tensorflow) (3.2.2)\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.3.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" ] } ], "source": [ "!pip install opencv-python matplotlib imageio gdown tensorflow" ] }, { "cell_type": "code", "execution_count": 3, "id": "b24af50c-20b8-409d-ad78-30a933fdd669", "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2023-10-28 14:48:46.731246: E tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", "2023-10-28 14:48:46.731275: E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", "2023-10-28 14:48:46.731289: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", "2023-10-28 14:48:46.735509: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2023-10-28 14:48:47.276167: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n" ] } ], "source": [ "import os\n", "import cv2\n", "import tensorflow as tf\n", "import numpy as np\n", "from typing import List\n", "from matplotlib import pyplot as plt\n", "import imageio" ] }, { "cell_type": "code", "execution_count": 4, "id": "1e3db0b0-e559-4ad6-91fd-e7414b7d75e6", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2023-10-28 14:48:47.910813: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", "2023-10-28 14:48:47.944337: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", "2023-10-28 14:48:47.944475: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n" ] }, { "data": { "text/plain": [ "[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tf.config.list_physical_devices('GPU')" ] }, { "cell_type": "code", "execution_count": 5, "id": "378d045a-3003-4f93-b7d2-a25a97774a68", "metadata": { "tags": [] }, "outputs": [], "source": [ "physical_devices = tf.config.list_physical_devices('GPU')\n", "try:\n", " tf.config.experimental.set_memory_growth(physical_devices[0], True)\n", "except:\n", " pass" ] }, { "cell_type": "markdown", "id": "7a19e88e-c7b9-45c1-ae1e-f2109329c71b", "metadata": { "tags": [] }, "source": [ "# 1. Build Data Loading Functions" ] }, { "cell_type": "code", "execution_count": 6, "id": "8fb99c90-e05a-437f-839d-6e772f8c1dd5", "metadata": { "tags": [] }, "outputs": [], "source": [ "import gdown" ] }, { "cell_type": "code", "execution_count": 7, "id": "c019e4c6-2af3-4160-99ea-5c8cb009f1a7", "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Downloading...\n", "From (uriginal): https://drive.google.com/uc?id=1YlvpDLix3S-U8fd-gqRwPcWXAXm8JwjL\n", "From (redirected): https://drive.google.com/uc?id=1YlvpDLix3S-U8fd-gqRwPcWXAXm8JwjL&confirm=t&uuid=124d6401-4674-40b4-afc5-a45c064d0b89\n", "To: /home/milselarch/projects/SUTD/50-035/lipread-project/data.zip\n", "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 423M/423M [00:04<00:00, 97.2MB/s]\n" ] }, { "data": { "text/plain": [ "['data/',\n", " 'data/alignments/',\n", " 'data/alignments/s1/',\n", " 'data/alignments/s1/bbaf2n.align',\n", " 'data/alignments/s1/bbaf3s.align',\n", " 'data/alignments/s1/bbaf4p.align',\n", " 'data/alignments/s1/bbaf5a.align',\n", " 'data/alignments/s1/bbal6n.align',\n", " 'data/alignments/s1/bbal7s.align',\n", " 'data/alignments/s1/bbal8p.align',\n", " 'data/alignments/s1/bbal9a.align',\n", " 'data/alignments/s1/bbas1s.align',\n", " 'data/alignments/s1/bbas2p.align',\n", " 'data/alignments/s1/bbas3a.align',\n", " 'data/alignments/s1/bbaszn.align',\n", " 'data/alignments/s1/bbaz4n.align',\n", " 'data/alignments/s1/bbaz5s.align',\n", " 'data/alignments/s1/bbaz6p.align',\n", " 'data/alignments/s1/bbaz7a.align',\n", " 'data/alignments/s1/bbbf6n.align',\n", " 'data/alignments/s1/bbbf7s.align',\n", " 'data/alignments/s1/bbbf8p.align',\n", " 'data/alignments/s1/bbbf9a.align',\n", " 'data/alignments/s1/bbbm1s.align',\n", " 'data/alignments/s1/bbbm2p.align',\n", " 'data/alignments/s1/bbbm3a.align',\n", " 'data/alignments/s1/bbbmzn.align',\n", " 'data/alignments/s1/bbbs4n.align',\n", " 'data/alignments/s1/bbbs5s.align',\n", " 'data/alignments/s1/bbbs6p.align',\n", " 'data/alignments/s1/bbbs7a.align',\n", " 'data/alignments/s1/bbbz8n.align',\n", " 'data/alignments/s1/bbbz9s.align',\n", " 'data/alignments/s1/bbie8n.align',\n", " 'data/alignments/s1/bbie9s.align',\n", " 'data/alignments/s1/bbif1a.align',\n", " 'data/alignments/s1/bbifzp.align',\n", " 'data/alignments/s1/bbil2n.align',\n", " 'data/alignments/s1/bbil3s.align',\n", " 'data/alignments/s1/bbil4p.align',\n", " 'data/alignments/s1/bbil5a.align',\n", " 'data/alignments/s1/bbir6n.align',\n", " 'data/alignments/s1/bbir7s.align',\n", " 'data/alignments/s1/bbir8p.align',\n", " 'data/alignments/s1/bbir9a.align',\n", " 'data/alignments/s1/bbiz1s.align',\n", " 'data/alignments/s1/bbiz2p.align',\n", " 'data/alignments/s1/bbiz3a.align',\n", " 'data/alignments/s1/bbizzn.align',\n", " 'data/alignments/s1/bbwg1s.align',\n", " 'data/alignments/s1/bbwg2p.align',\n", " 'data/alignments/s1/bbwg3a.align',\n", " 'data/alignments/s1/bbwgzn.align',\n", " 'data/alignments/s1/bbwm4n.align',\n", " 'data/alignments/s1/bbwm5s.align',\n", " 'data/alignments/s1/bbwm6p.align',\n", " 'data/alignments/s1/bbwm7a.align',\n", " 'data/alignments/s1/bbws8n.align',\n", " 'data/alignments/s1/bbws9s.align',\n", " 'data/alignments/s1/bbwt1a.align',\n", " 'data/alignments/s1/bbwtzp.align',\n", " 'data/alignments/s1/bgaa6n.align',\n", " 'data/alignments/s1/bgaa7s.align',\n", " 'data/alignments/s1/bgaa8p.align',\n", " 'data/alignments/s1/bgaa9a.align',\n", " 'data/alignments/s1/bgah1s.align',\n", " 'data/alignments/s1/bgah2p.align',\n", " 'data/alignments/s1/bgah3a.align',\n", " 'data/alignments/s1/bgahzn.align',\n", " 'data/alignments/s1/bgan4n.align',\n", " 'data/alignments/s1/bgan5s.align',\n", " 'data/alignments/s1/bgan6p.align',\n", " 'data/alignments/s1/bgan7a.align',\n", " 'data/alignments/s1/bgat8n.align',\n", " 'data/alignments/s1/bgat9s.align',\n", " 'data/alignments/s1/bgau1a.align',\n", " 'data/alignments/s1/bgauzp.align',\n", " 'data/alignments/s1/bgbb1s.align',\n", " 'data/alignments/s1/bgbb2p.align',\n", " 'data/alignments/s1/bgbb3a.align',\n", " 'data/alignments/s1/bgbbzn.align',\n", " 'data/alignments/s1/bgbh4n.align',\n", " 'data/alignments/s1/bgbh5s.align',\n", " 'data/alignments/s1/bgbh6p.align',\n", " 'data/alignments/s1/bgbh7a.align',\n", " 'data/alignments/s1/bgbn8n.align',\n", " 'data/alignments/s1/bgbn9s.align',\n", " 'data/alignments/s1/bgbo1a.align',\n", " 'data/alignments/s1/bgbozp.align',\n", " 'data/alignments/s1/bgbu2n.align',\n", " 'data/alignments/s1/bgbu3s.align',\n", " 'data/alignments/s1/bgbu4p.align',\n", " 'data/alignments/s1/bgbu5a.align',\n", " 'data/alignments/s1/bgia2n.align',\n", " 'data/alignments/s1/bgia3s.align',\n", " 'data/alignments/s1/bgia4p.align',\n", " 'data/alignments/s1/bgia5a.align',\n", " 'data/alignments/s1/bgig6n.align',\n", " 'data/alignments/s1/bgig7s.align',\n", " 'data/alignments/s1/bgig8p.align',\n", " 'data/alignments/s1/bgig9a.align',\n", " 'data/alignments/s1/bgin1s.align',\n", " 'data/alignments/s1/bgin2p.align',\n", " 'data/alignments/s1/bgin3a.align',\n", " 'data/alignments/s1/bginzn.align',\n", " 'data/alignments/s1/bgit4n.align',\n", " 'data/alignments/s1/bgit5s.align',\n", " 'data/alignments/s1/bgit6p.align',\n", " 'data/alignments/s1/bgit7a.align',\n", " 'data/alignments/s1/bgwb4n.align',\n", " 'data/alignments/s1/bgwb5s.align',\n", " 'data/alignments/s1/bgwb6p.align',\n", " 'data/alignments/s1/bgwb7a.align',\n", " 'data/alignments/s1/bgwh8n.align',\n", " 'data/alignments/s1/bgwh9s.align',\n", " 'data/alignments/s1/bgwi1a.align',\n", " 'data/alignments/s1/bgwizp.align',\n", " 'data/alignments/s1/bgwo2n.align',\n", " 'data/alignments/s1/bgwo3s.align',\n", " 'data/alignments/s1/bgwo4p.align',\n", " 'data/alignments/s1/bgwo5a.align',\n", " 'data/alignments/s1/bgwu6n.align',\n", " 'data/alignments/s1/bgwu7s.align',\n", " 'data/alignments/s1/bgwu8p.align',\n", " 'data/alignments/s1/bgwu9a.align',\n", " 'data/alignments/s1/braf8n.align',\n", " 'data/alignments/s1/braf9s.align',\n", " 'data/alignments/s1/brag1a.align',\n", " 'data/alignments/s1/bragzp.align',\n", " 'data/alignments/s1/bram2n.align',\n", " 'data/alignments/s1/bram3s.align',\n", " 'data/alignments/s1/bram4p.align',\n", " 'data/alignments/s1/bram5a.align',\n", " 'data/alignments/s1/bras6n.align',\n", " 'data/alignments/s1/bras7s.align',\n", " 'data/alignments/s1/bras8p.align',\n", " 'data/alignments/s1/bras9a.align',\n", " 'data/alignments/s1/brba1a.align',\n", " 'data/alignments/s1/brbazp.align',\n", " 'data/alignments/s1/brbg2n.align',\n", " 'data/alignments/s1/brbg3s.align',\n", " 'data/alignments/s1/brbg4p.align',\n", " 'data/alignments/s1/brbg5a.align',\n", " 'data/alignments/s1/brbm6n.align',\n", " 'data/alignments/s1/brbm7s.align',\n", " 'data/alignments/s1/brbm8p.align',\n", " 'data/alignments/s1/brbm9a.align',\n", " 'data/alignments/s1/brbt1s.align',\n", " 'data/alignments/s1/brbt2p.align',\n", " 'data/alignments/s1/brbt3a.align',\n", " 'data/alignments/s1/brbtzn.align',\n", " 'data/alignments/s1/brif4n.align',\n", " 'data/alignments/s1/brif5s.align',\n", " 'data/alignments/s1/brif6p.align',\n", " 'data/alignments/s1/brif7a.align',\n", " 'data/alignments/s1/bril8n.align',\n", " 'data/alignments/s1/bril9s.align',\n", " 'data/alignments/s1/brim1a.align',\n", " 'data/alignments/s1/brimzp.align',\n", " 'data/alignments/s1/bris2n.align',\n", " 'data/alignments/s1/bris3s.align',\n", " 'data/alignments/s1/bris4p.align',\n", " 'data/alignments/s1/bris5a.align',\n", " 'data/alignments/s1/briz6n.align',\n", " 'data/alignments/s1/briz7s.align',\n", " 'data/alignments/s1/briz8p.align',\n", " 'data/alignments/s1/briz9a.align',\n", " 'data/alignments/s1/brwa2n.align',\n", " 'data/alignments/s1/brwa3s.align',\n", " 'data/alignments/s1/brwa4p.align',\n", " 'data/alignments/s1/brwa5a.align',\n", " 'data/alignments/s1/brwg6n.align',\n", " 'data/alignments/s1/brwg7s.align',\n", " 'data/alignments/s1/brwg8p.align',\n", " 'data/alignments/s1/brwg9a.align',\n", " 'data/alignments/s1/brwn1s.align',\n", " 'data/alignments/s1/brwn2p.align',\n", " 'data/alignments/s1/brwn3a.align',\n", " 'data/alignments/s1/brwnzn.align',\n", " 'data/alignments/s1/brwt4n.align',\n", " 'data/alignments/s1/brwt5s.align',\n", " 'data/alignments/s1/brwt6p.align',\n", " 'data/alignments/s1/brwt7a.align',\n", " 'data/alignments/s1/bwaa1s.align',\n", " 'data/alignments/s1/bwaa2p.align',\n", " 'data/alignments/s1/bwaa3a.align',\n", " 'data/alignments/s1/bwaazn.align',\n", " 'data/alignments/s1/bwag4n.align',\n", " 'data/alignments/s1/bwag5s.align',\n", " 'data/alignments/s1/bwag6p.align',\n", " 'data/alignments/s1/bwag7a.align',\n", " 'data/alignments/s1/bwam8n.align',\n", " 'data/alignments/s1/bwam9s.align',\n", " 'data/alignments/s1/bwan1a.align',\n", " 'data/alignments/s1/bwanzp.align',\n", " 'data/alignments/s1/bwat2n.align',\n", " 'data/alignments/s1/bwat3s.align',\n", " 'data/alignments/s1/bwat4p.align',\n", " 'data/alignments/s1/bwat5a.align',\n", " 'data/alignments/s1/bwba4n.align',\n", " 'data/alignments/s1/bwba5s.align',\n", " 'data/alignments/s1/bwba6p.align',\n", " 'data/alignments/s1/bwba7a.align',\n", " 'data/alignments/s1/bwbg8n.align',\n", " 'data/alignments/s1/bwbg9s.align',\n", " 'data/alignments/s1/bwbh1a.align',\n", " 'data/alignments/s1/bwbhzp.align',\n", " 'data/alignments/s1/bwbn2n.align',\n", " 'data/alignments/s1/bwbn3s.align',\n", " 'data/alignments/s1/bwbn4p.align',\n", " 'data/alignments/s1/bwbn5a.align',\n", " 'data/alignments/s1/bwbt6n.align',\n", " 'data/alignments/s1/bwbt7s.align',\n", " 'data/alignments/s1/bwbt8p.align',\n", " 'data/alignments/s1/bwbt9a.align',\n", " 'data/alignments/s1/bwig1s.align',\n", " 'data/alignments/s1/bwig2p.align',\n", " 'data/alignments/s1/bwig3a.align',\n", " 'data/alignments/s1/bwigzn.align',\n", " 'data/alignments/s1/bwim4n.align',\n", " 'data/alignments/s1/bwim5s.align',\n", " 'data/alignments/s1/bwim6p.align',\n", " 'data/alignments/s1/bwim7a.align',\n", " 'data/alignments/s1/bwis8n.align',\n", " 'data/alignments/s1/bwis9s.align',\n", " 'data/alignments/s1/bwit1a.align',\n", " 'data/alignments/s1/bwitzp.align',\n", " 'data/alignments/s1/bwwa8n.align',\n", " 'data/alignments/s1/bwwa9s.align',\n", " 'data/alignments/s1/bwwb1a.align',\n", " 'data/alignments/s1/bwwbzp.align',\n", " 'data/alignments/s1/bwwh2n.align',\n", " 'data/alignments/s1/bwwh3s.align',\n", " 'data/alignments/s1/bwwh4p.align',\n", " 'data/alignments/s1/bwwh5a.align',\n", " 'data/alignments/s1/bwwn6n.align',\n", " 'data/alignments/s1/bwwn7s.align',\n", " 'data/alignments/s1/bwwn8p.align',\n", " 'data/alignments/s1/bwwn9a.align',\n", " 'data/alignments/s1/bwwu1s.align',\n", " 'data/alignments/s1/bwwu2p.align',\n", " 'data/alignments/s1/bwwu3a.align',\n", " 'data/alignments/s1/bwwuzn.align',\n", " 'data/alignments/s1/lbad6n.align',\n", " 'data/alignments/s1/lbad7s.align',\n", " 'data/alignments/s1/lbad8p.align',\n", " 'data/alignments/s1/lbad9a.align',\n", " 'data/alignments/s1/lbak1s.align',\n", " 'data/alignments/s1/lbak2p.align',\n", " 'data/alignments/s1/lbak3a.align',\n", " 'data/alignments/s1/lbakzn.align',\n", " 'data/alignments/s1/lbaq4n.align',\n", " 'data/alignments/s1/lbaq5s.align',\n", " 'data/alignments/s1/lbaq6p.align',\n", " 'data/alignments/s1/lbaq7a.align',\n", " 'data/alignments/s1/lbax8n.align',\n", " 'data/alignments/s1/lbax9s.align',\n", " 'data/alignments/s1/lbay1a.align',\n", " 'data/alignments/s1/lbayzp.align',\n", " 'data/alignments/s1/lbbe1s.align',\n", " 'data/alignments/s1/lbbe2p.align',\n", " 'data/alignments/s1/lbbe3a.align',\n", " 'data/alignments/s1/lbbezn.align',\n", " 'data/alignments/s1/lbbk4n.align',\n", " 'data/alignments/s1/lbbk5s.align',\n", " 'data/alignments/s1/lbbk6p.align',\n", " 'data/alignments/s1/lbbk7a.align',\n", " 'data/alignments/s1/lbbq8n.align',\n", " 'data/alignments/s1/lbbq9s.align',\n", " 'data/alignments/s1/lbbr1a.align',\n", " 'data/alignments/s1/lbbrzp.align',\n", " 'data/alignments/s1/lbby2n.align',\n", " 'data/alignments/s1/lbby3s.align',\n", " 'data/alignments/s1/lbby4p.align',\n", " 'data/alignments/s1/lbby5a.align',\n", " 'data/alignments/s1/lbid2n.align',\n", " 'data/alignments/s1/lbid3s.align',\n", " 'data/alignments/s1/lbid4p.align',\n", " 'data/alignments/s1/lbid5a.align',\n", " 'data/alignments/s1/lbij6n.align',\n", " 'data/alignments/s1/lbij7s.align',\n", " 'data/alignments/s1/lbij8p.align',\n", " 'data/alignments/s1/lbij9a.align',\n", " 'data/alignments/s1/lbiq1s.align',\n", " 'data/alignments/s1/lbiq2p.align',\n", " 'data/alignments/s1/lbiq3a.align',\n", " 'data/alignments/s1/lbiqzn.align',\n", " 'data/alignments/s1/lbix4n.align',\n", " 'data/alignments/s1/lbix5s.align',\n", " 'data/alignments/s1/lbix6p.align',\n", " 'data/alignments/s1/lbix7a.align',\n", " 'data/alignments/s1/lbwe4n.align',\n", " 'data/alignments/s1/lbwe5s.align',\n", " 'data/alignments/s1/lbwe6p.align',\n", " 'data/alignments/s1/lbwe7a.align',\n", " 'data/alignments/s1/lbwk8n.align',\n", " 'data/alignments/s1/lbwk9s.align',\n", " 'data/alignments/s1/lbwl1a.align',\n", " 'data/alignments/s1/lbwlzp.align',\n", " 'data/alignments/s1/lbwr2n.align',\n", " 'data/alignments/s1/lbwr3s.align',\n", " 'data/alignments/s1/lbwr4p.align',\n", " 'data/alignments/s1/lbwr5a.align',\n", " 'data/alignments/s1/lbwy6n.align',\n", " 'data/alignments/s1/lbwy7s.align',\n", " 'data/alignments/s1/lbwy8p.align',\n", " 'data/alignments/s1/lbwy9a.align',\n", " 'data/alignments/s1/lgaf4n.align',\n", " 'data/alignments/s1/lgaf5s.align',\n", " 'data/alignments/s1/lgaf6p.align',\n", " 'data/alignments/s1/lgaf7a.align',\n", " 'data/alignments/s1/lgal8n.align',\n", " 'data/alignments/s1/lgal9s.align',\n", " 'data/alignments/s1/lgam1a.align',\n", " 'data/alignments/s1/lgamzp.align',\n", " 'data/alignments/s1/lgas2n.align',\n", " 'data/alignments/s1/lgas3s.align',\n", " 'data/alignments/s1/lgas4p.align',\n", " 'data/alignments/s1/lgas5a.align',\n", " 'data/alignments/s1/lgaz6n.align',\n", " 'data/alignments/s1/lgaz7s.align',\n", " 'data/alignments/s1/lgaz8p.align',\n", " 'data/alignments/s1/lgaz9a.align',\n", " 'data/alignments/s1/lgbf8n.align',\n", " 'data/alignments/s1/lgbf9s.align',\n", " 'data/alignments/s1/lgbg1a.align',\n", " 'data/alignments/s1/lgbgzp.align',\n", " 'data/alignments/s1/lgbm2n.align',\n", " 'data/alignments/s1/lgbm3s.align',\n", " 'data/alignments/s1/lgbm4p.align',\n", " 'data/alignments/s1/lgbm5a.align',\n", " 'data/alignments/s1/lgbs6n.align',\n", " 'data/alignments/s1/lgbs7s.align',\n", " 'data/alignments/s1/lgbs8p.align',\n", " 'data/alignments/s1/lgbs9a.align',\n", " 'data/alignments/s1/lgif1s.align',\n", " 'data/alignments/s1/lgif2p.align',\n", " 'data/alignments/s1/lgif3a.align',\n", " 'data/alignments/s1/lgifzn.align',\n", " 'data/alignments/s1/lgil4n.align',\n", " 'data/alignments/s1/lgil5s.align',\n", " 'data/alignments/s1/lgil6p.align',\n", " 'data/alignments/s1/lgil7a.align',\n", " 'data/alignments/s1/lgir8n.align',\n", " 'data/alignments/s1/lgir9s.align',\n", " 'data/alignments/s1/lgis1a.align',\n", " 'data/alignments/s1/lgiszp.align',\n", " 'data/alignments/s1/lgiz2n.align',\n", " 'data/alignments/s1/lgiz3s.align',\n", " 'data/alignments/s1/lgiz4p.align',\n", " 'data/alignments/s1/lgiz5a.align',\n", " 'data/alignments/s1/lgwa1a.align',\n", " 'data/alignments/s1/lgwazp.align',\n", " 'data/alignments/s1/lgwg2n.align',\n", " 'data/alignments/s1/lgwg3s.align',\n", " 'data/alignments/s1/lgwg4p.align',\n", " 'data/alignments/s1/lgwg5a.align',\n", " 'data/alignments/s1/lgwm6n.align',\n", " 'data/alignments/s1/lgwm7s.align',\n", " 'data/alignments/s1/lgwm8p.align',\n", " 'data/alignments/s1/lgwm9a.align',\n", " 'data/alignments/s1/lgwt1s.align',\n", " 'data/alignments/s1/lgwt2p.align',\n", " 'data/alignments/s1/lgwt3a.align',\n", " 'data/alignments/s1/lgwtzn.align',\n", " 'data/alignments/s1/lrae2n.align',\n", " 'data/alignments/s1/lrae3s.align',\n", " 'data/alignments/s1/lrae4p.align',\n", " 'data/alignments/s1/lrae5a.align',\n", " 'data/alignments/s1/lrak6n.align',\n", " 'data/alignments/s1/lrak7s.align',\n", " 'data/alignments/s1/lrak8p.align',\n", " 'data/alignments/s1/lrak9a.align',\n", " 'data/alignments/s1/lrar1s.align',\n", " 'data/alignments/s1/lrar2p.align',\n", " 'data/alignments/s1/lrar3a.align',\n", " 'data/alignments/s1/lrarzn.align',\n", " 'data/alignments/s1/lray4n.align',\n", " 'data/alignments/s1/lray5s.align',\n", " 'data/alignments/s1/lray6p.align',\n", " 'data/alignments/s1/lray7a.align',\n", " 'data/alignments/s1/lrbe6n.align',\n", " 'data/alignments/s1/lrbe7s.align',\n", " 'data/alignments/s1/lrbe8p.align',\n", " 'data/alignments/s1/lrbe9a.align',\n", " 'data/alignments/s1/lrbl1s.align',\n", " 'data/alignments/s1/lrbl2p.align',\n", " 'data/alignments/s1/lrbl3a.align',\n", " 'data/alignments/s1/lrblzn.align',\n", " 'data/alignments/s1/lrbr4n.align',\n", " 'data/alignments/s1/lrbr5s.align',\n", " 'data/alignments/s1/lrbr6p.align',\n", " 'data/alignments/s1/lrbr7a.align',\n", " 'data/alignments/s1/lrby8n.align',\n", " 'data/alignments/s1/lrby9s.align',\n", " 'data/alignments/s1/lrbz1a.align',\n", " 'data/alignments/s1/lrbzzp.align',\n", " 'data/alignments/s1/lrid8n.align',\n", " 'data/alignments/s1/lrid9s.align',\n", " 'data/alignments/s1/lrie1a.align',\n", " 'data/alignments/s1/lriezp.align',\n", " 'data/alignments/s1/lrik2n.align',\n", " 'data/alignments/s1/lrik3s.align',\n", " 'data/alignments/s1/lrik4p.align',\n", " 'data/alignments/s1/lrik5a.align',\n", " 'data/alignments/s1/lriq6n.align',\n", " 'data/alignments/s1/lriq7s.align',\n", " 'data/alignments/s1/lriq8p.align',\n", " 'data/alignments/s1/lriq9a.align',\n", " 'data/alignments/s1/lriy1s.align',\n", " 'data/alignments/s1/lriy2p.align',\n", " 'data/alignments/s1/lriy3a.align',\n", " 'data/alignments/s1/lriyzn.align',\n", " 'data/alignments/s1/lrwf1s.align',\n", " 'data/alignments/s1/lrwf2p.align',\n", " 'data/alignments/s1/lrwf3a.align',\n", " 'data/alignments/s1/lrwfzn.align',\n", " 'data/alignments/s1/lrwl4n.align',\n", " 'data/alignments/s1/lrwl5s.align',\n", " 'data/alignments/s1/lrwl6p.align',\n", " 'data/alignments/s1/lrwl7a.align',\n", " 'data/alignments/s1/lrwr8n.align',\n", " 'data/alignments/s1/lrwr9s.align',\n", " 'data/alignments/s1/lrws1a.align',\n", " 'data/alignments/s1/lrwszp.align',\n", " 'data/alignments/s1/lrwz2n.align',\n", " 'data/alignments/s1/lrwz3s.align',\n", " 'data/alignments/s1/lrwz4p.align',\n", " 'data/alignments/s1/lrwz5a.align',\n", " 'data/alignments/s1/lwae8n.align',\n", " 'data/alignments/s1/lwae9s.align',\n", " 'data/alignments/s1/lwaf1a.align',\n", " 'data/alignments/s1/lwafzp.align',\n", " 'data/alignments/s1/lwal2n.align',\n", " 'data/alignments/s1/lwal3s.align',\n", " 'data/alignments/s1/lwal4p.align',\n", " 'data/alignments/s1/lwal5a.align',\n", " 'data/alignments/s1/lwar6n.align',\n", " 'data/alignments/s1/lwar7s.align',\n", " 'data/alignments/s1/lwar8p.align',\n", " 'data/alignments/s1/lwar9a.align',\n", " 'data/alignments/s1/lwaz1s.align',\n", " 'data/alignments/s1/lwaz2p.align',\n", " 'data/alignments/s1/lwaz3a.align',\n", " 'data/alignments/s1/lwazzn.align',\n", " 'data/alignments/s1/lwbf2n.align',\n", " 'data/alignments/s1/lwbf3s.align',\n", " 'data/alignments/s1/lwbf4p.align',\n", " 'data/alignments/s1/lwbf5a.align',\n", " 'data/alignments/s1/lwbl6n.align',\n", " 'data/alignments/s1/lwbl7s.align',\n", " 'data/alignments/s1/lwbl8p.align',\n", " 'data/alignments/s1/lwbl9a.align',\n", " 'data/alignments/s1/lwbs1s.align',\n", " 'data/alignments/s1/lwbs2p.align',\n", " 'data/alignments/s1/lwbs3a.align',\n", " 'data/alignments/s1/lwbszn.align',\n", " 'data/alignments/s1/lwbz4n.align',\n", " 'data/alignments/s1/lwbz5s.align',\n", " 'data/alignments/s1/lwbz6p.align',\n", " 'data/alignments/s1/lwbz7a.align',\n", " 'data/alignments/s1/lwie4n.align',\n", " 'data/alignments/s1/lwie5s.align',\n", " 'data/alignments/s1/lwie6p.align',\n", " 'data/alignments/s1/lwie7a.align',\n", " 'data/alignments/s1/lwik8n.align',\n", " 'data/alignments/s1/lwik9s.align',\n", " 'data/alignments/s1/lwil1a.align',\n", " 'data/alignments/s1/lwilzp.align',\n", " 'data/alignments/s1/lwir2n.align',\n", " 'data/alignments/s1/lwir3s.align',\n", " 'data/alignments/s1/lwir4p.align',\n", " 'data/alignments/s1/lwir5a.align',\n", " 'data/alignments/s1/lwiy6n.align',\n", " 'data/alignments/s1/lwiy7s.align',\n", " 'data/alignments/s1/lwiy8p.align',\n", " 'data/alignments/s1/lwiy9a.align',\n", " 'data/alignments/s1/lwwf6n.align',\n", " 'data/alignments/s1/lwwf7s.align',\n", " 'data/alignments/s1/lwwf8p.align',\n", " 'data/alignments/s1/lwwf9a.align',\n", " 'data/alignments/s1/lwwm1s.align',\n", " 'data/alignments/s1/lwwm2p.align',\n", " 'data/alignments/s1/lwwm3a.align',\n", " 'data/alignments/s1/lwwmzn.align',\n", " 'data/alignments/s1/lwws4n.align',\n", " 'data/alignments/s1/lwws5s.align',\n", " 'data/alignments/s1/lwws6p.align',\n", " 'data/alignments/s1/lwws7a.align',\n", " 'data/alignments/s1/lwwz8n.align',\n", " 'data/alignments/s1/lwwz9s.align',\n", " 'data/alignments/s1/pbac1s.align',\n", " 'data/alignments/s1/pbac2p.align',\n", " 'data/alignments/s1/pbac3a.align',\n", " 'data/alignments/s1/pbaczn.align',\n", " 'data/alignments/s1/pbai4n.align',\n", " 'data/alignments/s1/pbai5s.align',\n", " 'data/alignments/s1/pbai6p.align',\n", " 'data/alignments/s1/pbai7a.align',\n", " 'data/alignments/s1/pbao8n.align',\n", " 'data/alignments/s1/pbao9s.align',\n", " 'data/alignments/s1/pbap1a.align',\n", " 'data/alignments/s1/pbapzp.align',\n", " 'data/alignments/s1/pbav2n.align',\n", " 'data/alignments/s1/pbav3s.align',\n", " 'data/alignments/s1/pbav4p.align',\n", " 'data/alignments/s1/pbav5a.align',\n", " 'data/alignments/s1/pbbc4n.align',\n", " 'data/alignments/s1/pbbc5s.align',\n", " 'data/alignments/s1/pbbc6p.align',\n", " 'data/alignments/s1/pbbc7a.align',\n", " 'data/alignments/s1/pbbi8n.align',\n", " 'data/alignments/s1/pbbi9s.align',\n", " 'data/alignments/s1/pbbj1a.align',\n", " 'data/alignments/s1/pbbjzp.align',\n", " 'data/alignments/s1/pbbp2n.align',\n", " 'data/alignments/s1/pbbp3s.align',\n", " 'data/alignments/s1/pbbp4p.align',\n", " 'data/alignments/s1/pbbp5a.align',\n", " 'data/alignments/s1/pbbv6n.align',\n", " 'data/alignments/s1/pbbv7s.align',\n", " 'data/alignments/s1/pbbv8p.align',\n", " 'data/alignments/s1/pbbv9a.align',\n", " 'data/alignments/s1/pbib6n.align',\n", " 'data/alignments/s1/pbib7s.align',\n", " 'data/alignments/s1/pbib8p.align',\n", " 'data/alignments/s1/pbib9a.align',\n", " 'data/alignments/s1/pbii1s.align',\n", " 'data/alignments/s1/pbii2p.align',\n", " 'data/alignments/s1/pbii3a.align',\n", " 'data/alignments/s1/pbiizn.align',\n", " 'data/alignments/s1/pbio4n.align',\n", " 'data/alignments/s1/pbio5s.align',\n", " 'data/alignments/s1/pbio6p.align',\n", " 'data/alignments/s1/pbio7a.align',\n", " 'data/alignments/s1/pbiu8n.align',\n", " 'data/alignments/s1/pbiu9s.align',\n", " 'data/alignments/s1/pbiv1a.align',\n", " 'data/alignments/s1/pbivzp.align',\n", " 'data/alignments/s1/pbwc8n.align',\n", " 'data/alignments/s1/pbwc9s.align',\n", " 'data/alignments/s1/pbwd1a.align',\n", " 'data/alignments/s1/pbwdzp.align',\n", " 'data/alignments/s1/pbwj2n.align',\n", " 'data/alignments/s1/pbwj3s.align',\n", " 'data/alignments/s1/pbwj4p.align',\n", " 'data/alignments/s1/pbwj5a.align',\n", " 'data/alignments/s1/pbwp6n.align',\n", " 'data/alignments/s1/pbwp7s.align',\n", " 'data/alignments/s1/pbwp8p.align',\n", " 'data/alignments/s1/pbwp9a.align',\n", " 'data/alignments/s1/pbwx1s.align',\n", " 'data/alignments/s1/pbwx2p.align',\n", " 'data/alignments/s1/pbwx3a.align',\n", " 'data/alignments/s1/pbwxzn.align',\n", " 'data/alignments/s1/pgad8n.align',\n", " 'data/alignments/s1/pgad9s.align',\n", " 'data/alignments/s1/pgae1a.align',\n", " 'data/alignments/s1/pgaezp.align',\n", " 'data/alignments/s1/pgak2n.align',\n", " 'data/alignments/s1/pgak3s.align',\n", " 'data/alignments/s1/pgak4p.align',\n", " 'data/alignments/s1/pgak5a.align',\n", " 'data/alignments/s1/pgaq6n.align',\n", " 'data/alignments/s1/pgaq7s.align',\n", " 'data/alignments/s1/pgaq8p.align',\n", " 'data/alignments/s1/pgaq9a.align',\n", " 'data/alignments/s1/pgay1s.align',\n", " 'data/alignments/s1/pgay2p.align',\n", " 'data/alignments/s1/pgay3a.align',\n", " 'data/alignments/s1/pgayzn.align',\n", " 'data/alignments/s1/pgbe2n.align',\n", " 'data/alignments/s1/pgbe3s.align',\n", " 'data/alignments/s1/pgbe4p.align',\n", " 'data/alignments/s1/pgbe5a.align',\n", " 'data/alignments/s1/pgbk6n.align',\n", " 'data/alignments/s1/pgbk7s.align',\n", " 'data/alignments/s1/pgbk8p.align',\n", " 'data/alignments/s1/pgbk9a.align',\n", " 'data/alignments/s1/pgbr1s.align',\n", " 'data/alignments/s1/pgbr2p.align',\n", " 'data/alignments/s1/pgbr3a.align',\n", " 'data/alignments/s1/pgbrzn.align',\n", " 'data/alignments/s1/pgby4n.align',\n", " 'data/alignments/s1/pgby5s.align',\n", " 'data/alignments/s1/pgby6p.align',\n", " 'data/alignments/s1/pgby7a.align',\n", " 'data/alignments/s1/pgid4n.align',\n", " 'data/alignments/s1/pgid5s.align',\n", " 'data/alignments/s1/pgid6p.align',\n", " 'data/alignments/s1/pgid7a.align',\n", " 'data/alignments/s1/pgij8n.align',\n", " 'data/alignments/s1/pgij9s.align',\n", " 'data/alignments/s1/pgik1a.align',\n", " 'data/alignments/s1/pgikzp.align',\n", " 'data/alignments/s1/pgiq2n.align',\n", " 'data/alignments/s1/pgiq3s.align',\n", " 'data/alignments/s1/pgiq4p.align',\n", " 'data/alignments/s1/pgiq5a.align',\n", " 'data/alignments/s1/pgix6n.align',\n", " 'data/alignments/s1/pgix7s.align',\n", " 'data/alignments/s1/pgix8p.align',\n", " 'data/alignments/s1/pgix9a.align',\n", " 'data/alignments/s1/pgwe6n.align',\n", " 'data/alignments/s1/pgwe7s.align',\n", " 'data/alignments/s1/pgwe8p.align',\n", " 'data/alignments/s1/pgwe9a.align',\n", " 'data/alignments/s1/pgwl1s.align',\n", " 'data/alignments/s1/pgwl2p.align',\n", " 'data/alignments/s1/pgwl3a.align',\n", " 'data/alignments/s1/pgwlzn.align',\n", " 'data/alignments/s1/pgwr4n.align',\n", " 'data/alignments/s1/pgwr5s.align',\n", " 'data/alignments/s1/pgwr6p.align',\n", " 'data/alignments/s1/pgwr7a.align',\n", " 'data/alignments/s1/pgwy8n.align',\n", " 'data/alignments/s1/pgwy9s.align',\n", " 'data/alignments/s1/pgwz1a.align',\n", " 'data/alignments/s1/pgwzzp.align',\n", " 'data/alignments/s1/prac6n.align',\n", " 'data/alignments/s1/prac7s.align',\n", " 'data/alignments/s1/prac8p.align',\n", " 'data/alignments/s1/prac9a.align',\n", " 'data/alignments/s1/praj1s.align',\n", " 'data/alignments/s1/praj2p.align',\n", " 'data/alignments/s1/praj3a.align',\n", " 'data/alignments/s1/prajzn.align',\n", " 'data/alignments/s1/prap4n.align',\n", " 'data/alignments/s1/prap5s.align',\n", " 'data/alignments/s1/prap6p.align',\n", " 'data/alignments/s1/prap7a.align',\n", " 'data/alignments/s1/prav8n.align',\n", " 'data/alignments/s1/prav9s.align',\n", " 'data/alignments/s1/prax1a.align',\n", " 'data/alignments/s1/praxzp.align',\n", " 'data/alignments/s1/prbd1s.align',\n", " 'data/alignments/s1/prbd2p.align',\n", " 'data/alignments/s1/prbd3a.align',\n", " 'data/alignments/s1/prbdzn.align',\n", " 'data/alignments/s1/prbj4n.align',\n", " 'data/alignments/s1/prbj5s.align',\n", " 'data/alignments/s1/prbj6p.align',\n", " 'data/alignments/s1/prbj7a.align',\n", " 'data/alignments/s1/prbp8n.align',\n", " 'data/alignments/s1/prbp9s.align',\n", " 'data/alignments/s1/prbq1a.align',\n", " 'data/alignments/s1/prbqzp.align',\n", " 'data/alignments/s1/prbx2n.align',\n", " 'data/alignments/s1/prbx3s.align',\n", " 'data/alignments/s1/prbx4p.align',\n", " 'data/alignments/s1/prbx5a.align',\n", " 'data/alignments/s1/pric2n.align',\n", " 'data/alignments/s1/pric3s.align',\n", " 'data/alignments/s1/pric4p.align',\n", " 'data/alignments/s1/pric5a.align',\n", " 'data/alignments/s1/prii6n.align',\n", " 'data/alignments/s1/prii7s.align',\n", " 'data/alignments/s1/prii8p.align',\n", " 'data/alignments/s1/prii9a.align',\n", " 'data/alignments/s1/prip1s.align',\n", " 'data/alignments/s1/prip2p.align',\n", " 'data/alignments/s1/prip3a.align',\n", " 'data/alignments/s1/pripzn.align',\n", " 'data/alignments/s1/priv4n.align',\n", " 'data/alignments/s1/priv5s.align',\n", " 'data/alignments/s1/priv6p.align',\n", " 'data/alignments/s1/priv7a.align',\n", " 'data/alignments/s1/prwd4n.align',\n", " 'data/alignments/s1/prwd5s.align',\n", " 'data/alignments/s1/prwd6p.align',\n", " 'data/alignments/s1/prwd7a.align',\n", " 'data/alignments/s1/prwj8n.align',\n", " 'data/alignments/s1/prwj9s.align',\n", " 'data/alignments/s1/prwk1a.align',\n", " 'data/alignments/s1/prwkzp.align',\n", " 'data/alignments/s1/prwq2n.align',\n", " 'data/alignments/s1/prwq3s.align',\n", " 'data/alignments/s1/prwq4p.align',\n", " 'data/alignments/s1/prwq5a.align',\n", " 'data/alignments/s1/prwx6n.align',\n", " 'data/alignments/s1/prwx7s.align',\n", " 'data/alignments/s1/prwx8p.align',\n", " 'data/alignments/s1/prwx9a.align',\n", " 'data/alignments/s1/pwad2n.align',\n", " 'data/alignments/s1/pwad3s.align',\n", " 'data/alignments/s1/pwad4p.align',\n", " 'data/alignments/s1/pwad5a.align',\n", " 'data/alignments/s1/pwaj6n.align',\n", " 'data/alignments/s1/pwaj7s.align',\n", " 'data/alignments/s1/pwaj8p.align',\n", " 'data/alignments/s1/pwaj9a.align',\n", " 'data/alignments/s1/pwaq1s.align',\n", " 'data/alignments/s1/pwaq2p.align',\n", " 'data/alignments/s1/pwaq3a.align',\n", " 'data/alignments/s1/pwaqzn.align',\n", " 'data/alignments/s1/pwax4n.align',\n", " 'data/alignments/s1/pwax5s.align',\n", " 'data/alignments/s1/pwax6p.align',\n", " 'data/alignments/s1/pwax7a.align',\n", " 'data/alignments/s1/pwbd6n.align',\n", " 'data/alignments/s1/pwbd7s.align',\n", " 'data/alignments/s1/pwbd8p.align',\n", " 'data/alignments/s1/pwbd9a.align',\n", " 'data/alignments/s1/pwbk1s.align',\n", " 'data/alignments/s1/pwbk2p.align',\n", " 'data/alignments/s1/pwbk3a.align',\n", " 'data/alignments/s1/pwbkzn.align',\n", " 'data/alignments/s1/pwbq4n.align',\n", " 'data/alignments/s1/pwbq5s.align',\n", " 'data/alignments/s1/pwbq6p.align',\n", " 'data/alignments/s1/pwbq7a.align',\n", " 'data/alignments/s1/pwbx8n.align',\n", " 'data/alignments/s1/pwbx9s.align',\n", " 'data/alignments/s1/pwby1a.align',\n", " 'data/alignments/s1/pwbyzp.align',\n", " 'data/alignments/s1/pwic8n.align',\n", " 'data/alignments/s1/pwic9s.align',\n", " 'data/alignments/s1/pwid1a.align',\n", " 'data/alignments/s1/pwidzp.align',\n", " 'data/alignments/s1/pwij2n.align',\n", " 'data/alignments/s1/pwij3s.align',\n", " 'data/alignments/s1/pwij4p.align',\n", " 'data/alignments/s1/pwij5a.align',\n", " 'data/alignments/s1/pwip6n.align',\n", " 'data/alignments/s1/pwip7s.align',\n", " 'data/alignments/s1/pwip8p.align',\n", " 'data/alignments/s1/pwip9a.align',\n", " 'data/alignments/s1/pwix1s.align',\n", " 'data/alignments/s1/pwix2p.align',\n", " 'data/alignments/s1/pwix3a.align',\n", " 'data/alignments/s1/pwixzn.align',\n", " 'data/alignments/s1/pwwe1s.align',\n", " 'data/alignments/s1/pwwe2p.align',\n", " 'data/alignments/s1/pwwe3a.align',\n", " 'data/alignments/s1/pwwezn.align',\n", " 'data/alignments/s1/pwwk4n.align',\n", " 'data/alignments/s1/pwwk5s.align',\n", " 'data/alignments/s1/pwwk6p.align',\n", " 'data/alignments/s1/pwwk7a.align',\n", " 'data/alignments/s1/pwwq8n.align',\n", " 'data/alignments/s1/pwwq9s.align',\n", " 'data/alignments/s1/pwwr1a.align',\n", " 'data/alignments/s1/pwwrzp.align',\n", " 'data/alignments/s1/pwwy2n.align',\n", " 'data/alignments/s1/pwwy3s.align',\n", " 'data/alignments/s1/pwwy4p.align',\n", " 'data/alignments/s1/pwwy5a.align',\n", " 'data/alignments/s1/sbaa4n.align',\n", " 'data/alignments/s1/sbaa5s.align',\n", " 'data/alignments/s1/sbaa6p.align',\n", " 'data/alignments/s1/sbaa7a.align',\n", " 'data/alignments/s1/sbag8n.align',\n", " 'data/alignments/s1/sbag9s.align',\n", " 'data/alignments/s1/sbah1a.align',\n", " 'data/alignments/s1/sbahzp.align',\n", " 'data/alignments/s1/sban2n.align',\n", " 'data/alignments/s1/sban3s.align',\n", " 'data/alignments/s1/sban4p.align',\n", " 'data/alignments/s1/sban5a.align',\n", " 'data/alignments/s1/sbat6n.align',\n", " 'data/alignments/s1/sbat7s.align',\n", " 'data/alignments/s1/sbat8p.align',\n", " 'data/alignments/s1/sbat9a.align',\n", " 'data/alignments/s1/sbba8n.align',\n", " 'data/alignments/s1/sbba9s.align',\n", " 'data/alignments/s1/sbbb1a.align',\n", " 'data/alignments/s1/sbbbzp.align',\n", " 'data/alignments/s1/sbbh2n.align',\n", " 'data/alignments/s1/sbbh3s.align',\n", " 'data/alignments/s1/sbbh4p.align',\n", " 'data/alignments/s1/sbbh5a.align',\n", " 'data/alignments/s1/sbbn6n.align',\n", " 'data/alignments/s1/sbbn7s.align',\n", " 'data/alignments/s1/sbbn8p.align',\n", " 'data/alignments/s1/sbbn9a.align',\n", " 'data/alignments/s1/sbbu1s.align',\n", " 'data/alignments/s1/sbbu2p.align',\n", " 'data/alignments/s1/sbbu3a.align',\n", " 'data/alignments/s1/sbbuzn.align',\n", " 'data/alignments/s1/sbia1s.align',\n", " 'data/alignments/s1/sbia2p.align',\n", " 'data/alignments/s1/sbia3a.align',\n", " 'data/alignments/s1/sbiazn.align',\n", " 'data/alignments/s1/sbig4n.align',\n", " 'data/alignments/s1/sbig5s.align',\n", " 'data/alignments/s1/sbig6p.align',\n", " 'data/alignments/s1/sbig7a.align',\n", " 'data/alignments/s1/sbim8n.align',\n", " 'data/alignments/s1/sbim9s.align',\n", " 'data/alignments/s1/sbin1a.align',\n", " 'data/alignments/s1/sbinzp.align',\n", " 'data/alignments/s1/sbit2n.align',\n", " 'data/alignments/s1/sbit3s.align',\n", " 'data/alignments/s1/sbit4p.align',\n", " 'data/alignments/s1/sbit5a.align',\n", " 'data/alignments/s1/sbwb2n.align',\n", " 'data/alignments/s1/sbwb3s.align',\n", " 'data/alignments/s1/sbwb4p.align',\n", " 'data/alignments/s1/sbwb5a.align',\n", " 'data/alignments/s1/sbwh6n.align',\n", " 'data/alignments/s1/sbwh7s.align',\n", " 'data/alignments/s1/sbwh8p.align',\n", " 'data/alignments/s1/sbwh9a.align',\n", " 'data/alignments/s1/sbwo1s.align',\n", " 'data/alignments/s1/sbwo2p.align',\n", " 'data/alignments/s1/sbwo3a.align',\n", " 'data/alignments/s1/sbwozn.align',\n", " 'data/alignments/s1/sbwu4n.align',\n", " 'data/alignments/s1/sbwu5s.align',\n", " 'data/alignments/s1/sbwu6p.align',\n", " 'data/alignments/s1/sbwu7a.align',\n", " 'data/alignments/s1/sgac2n.align',\n", " 'data/alignments/s1/sgac3s.align',\n", " 'data/alignments/s1/sgac4p.align',\n", " 'data/alignments/s1/sgac5a.align',\n", " 'data/alignments/s1/sgai6n.align',\n", " 'data/alignments/s1/sgai7s.align',\n", " 'data/alignments/s1/sgai8p.align',\n", " 'data/alignments/s1/sgai9a.align',\n", " 'data/alignments/s1/sgap1s.align',\n", " 'data/alignments/s1/sgap2p.align',\n", " 'data/alignments/s1/sgap3a.align',\n", " 'data/alignments/s1/sgapzn.align',\n", " 'data/alignments/s1/sgav4n.align',\n", " 'data/alignments/s1/sgav5s.align',\n", " 'data/alignments/s1/sgav6p.align',\n", " 'data/alignments/s1/sgav7a.align',\n", " 'data/alignments/s1/sgbc6n.align',\n", " 'data/alignments/s1/sgbc7s.align',\n", " 'data/alignments/s1/sgbc8p.align',\n", " 'data/alignments/s1/sgbc9a.align',\n", " 'data/alignments/s1/sgbj1s.align',\n", " 'data/alignments/s1/sgbj2p.align',\n", " 'data/alignments/s1/sgbj3a.align',\n", " 'data/alignments/s1/sgbjzn.align',\n", " 'data/alignments/s1/sgbp4n.align',\n", " 'data/alignments/s1/sgbp5s.align',\n", " 'data/alignments/s1/sgbp6p.align',\n", " 'data/alignments/s1/sgbp7a.align',\n", " 'data/alignments/s1/sgbv8n.align',\n", " 'data/alignments/s1/sgbv9s.align',\n", " 'data/alignments/s1/sgbx1a.align',\n", " 'data/alignments/s1/sgbxzp.align',\n", " 'data/alignments/s1/sgib8n.align',\n", " 'data/alignments/s1/sgib9s.align',\n", " 'data/alignments/s1/sgic1a.align',\n", " 'data/alignments/s1/sgiczp.align',\n", " 'data/alignments/s1/sgii2n.align',\n", " 'data/alignments/s1/sgii3s.align',\n", " 'data/alignments/s1/sgii4p.align',\n", " 'data/alignments/s1/sgii5a.align',\n", " 'data/alignments/s1/sgio6n.align',\n", " 'data/alignments/s1/sgio7s.align',\n", " 'data/alignments/s1/sgio8p.align',\n", " 'data/alignments/s1/sgio9a.align',\n", " 'data/alignments/s1/sgiv1s.align',\n", " 'data/alignments/s1/sgiv2p.align',\n", " 'data/alignments/s1/sgiv3a.align',\n", " 'data/alignments/s1/sgivzn.align',\n", " 'data/alignments/s1/sgwd1s.align',\n", " 'data/alignments/s1/sgwd2p.align',\n", " 'data/alignments/s1/sgwd3a.align',\n", " 'data/alignments/s1/sgwdzn.align',\n", " 'data/alignments/s1/sgwj4n.align',\n", " 'data/alignments/s1/sgwj5s.align',\n", " 'data/alignments/s1/sgwj6p.align',\n", " 'data/alignments/s1/sgwj7a.align',\n", " 'data/alignments/s1/sgwp8n.align',\n", " 'data/alignments/s1/sgwp9s.align',\n", " 'data/alignments/s1/sgwq1a.align',\n", " 'data/alignments/s1/sgwqzp.align',\n", " 'data/alignments/s1/sgwx2n.align',\n", " 'data/alignments/s1/sgwx3s.align',\n", " 'data/alignments/s1/sgwx4p.align',\n", " 'data/alignments/s1/sgwx5a.align',\n", " 'data/alignments/s1/srab1s.align',\n", " 'data/alignments/s1/srab2p.align',\n", " 'data/alignments/s1/srab3a.align',\n", " 'data/alignments/s1/srabzn.align',\n", " 'data/alignments/s1/srah4n.align',\n", " 'data/alignments/s1/srah5s.align',\n", " 'data/alignments/s1/srah6p.align',\n", " 'data/alignments/s1/srah7a.align',\n", " 'data/alignments/s1/sran8n.align',\n", " 'data/alignments/s1/sran9s.align',\n", " 'data/alignments/s1/srao1a.align',\n", " 'data/alignments/s1/sraozp.align',\n", " 'data/alignments/s1/srau2n.align',\n", " 'data/alignments/s1/srau3s.align',\n", " 'data/alignments/s1/srau4p.align',\n", " 'data/alignments/s1/srau5a.align',\n", " 'data/alignments/s1/srbb4n.align',\n", " 'data/alignments/s1/srbb5s.align',\n", " 'data/alignments/s1/srbb6p.align',\n", " 'data/alignments/s1/srbb7a.align',\n", " 'data/alignments/s1/srbh8n.align',\n", " 'data/alignments/s1/srbh9s.align',\n", " 'data/alignments/s1/srbi1a.align',\n", " 'data/alignments/s1/srbizp.align',\n", " 'data/alignments/s1/srbo2n.align',\n", " 'data/alignments/s1/srbo3s.align',\n", " 'data/alignments/s1/srbo4p.align',\n", " 'data/alignments/s1/srbo5a.align',\n", " 'data/alignments/s1/srbu6n.align',\n", " 'data/alignments/s1/srbu7s.align',\n", " 'data/alignments/s1/srbu8p.align',\n", " 'data/alignments/s1/srbu9a.align',\n", " 'data/alignments/s1/sria6n.align',\n", " 'data/alignments/s1/sria7s.align',\n", " 'data/alignments/s1/sria8p.align',\n", " 'data/alignments/s1/sria9a.align',\n", " 'data/alignments/s1/srih1s.align',\n", " 'data/alignments/s1/srih2p.align',\n", " 'data/alignments/s1/srih3a.align',\n", " 'data/alignments/s1/srihzn.align',\n", " 'data/alignments/s1/srin4n.align',\n", " 'data/alignments/s1/srin5s.align',\n", " 'data/alignments/s1/srin6p.align',\n", " 'data/alignments/s1/srin7a.align',\n", " 'data/alignments/s1/srit8n.align',\n", " 'data/alignments/s1/srit9s.align',\n", " 'data/alignments/s1/sriu1a.align',\n", " 'data/alignments/s1/sriuzp.align',\n", " 'data/alignments/s1/srwb8n.align',\n", " 'data/alignments/s1/srwb9s.align',\n", " 'data/alignments/s1/srwc1a.align',\n", " 'data/alignments/s1/srwczp.align',\n", " 'data/alignments/s1/srwi2n.align',\n", " 'data/alignments/s1/srwi3s.align',\n", " 'data/alignments/s1/srwi4p.align',\n", " 'data/alignments/s1/srwi5a.align',\n", " 'data/alignments/s1/srwo6n.align',\n", " 'data/alignments/s1/srwo7s.align',\n", " 'data/alignments/s1/srwo8p.align',\n", " 'data/alignments/s1/srwo9a.align',\n", " 'data/alignments/s1/srwv1s.align',\n", " 'data/alignments/s1/srwv2p.align',\n", " 'data/alignments/s1/srwv3a.align',\n", " 'data/alignments/s1/srwvzn.align',\n", " 'data/alignments/s1/swab6n.align',\n", " 'data/alignments/s1/swab7s.align',\n", " 'data/alignments/s1/swab8p.align',\n", " 'data/alignments/s1/swab9a.align',\n", " 'data/alignments/s1/swai1s.align',\n", " 'data/alignments/s1/swai2p.align',\n", " 'data/alignments/s1/swai3a.align',\n", " 'data/alignments/s1/swaizn.align',\n", " 'data/alignments/s1/swao4n.align',\n", " 'data/alignments/s1/swao5s.align',\n", " 'data/alignments/s1/swao6p.align',\n", " 'data/alignments/s1/swao7a.align',\n", " 'data/alignments/s1/swau8n.align',\n", " 'data/alignments/s1/swau9s.align',\n", " 'data/alignments/s1/swav1a.align',\n", " 'data/alignments/s1/swavzp.align',\n", " 'data/alignments/s1/swbc1s.align',\n", " 'data/alignments/s1/swbc2p.align',\n", " 'data/alignments/s1/swbc3a.align',\n", " 'data/alignments/s1/swbczn.align',\n", " 'data/alignments/s1/swbi4n.align',\n", " 'data/alignments/s1/swbi5s.align',\n", " 'data/alignments/s1/swbi6p.align',\n", " 'data/alignments/s1/swbi7a.align',\n", " 'data/alignments/s1/swbo8n.align',\n", " 'data/alignments/s1/swbo9s.align',\n", " 'data/alignments/s1/swbp1a.align',\n", " 'data/alignments/s1/swbpzp.align',\n", " 'data/alignments/s1/swbv2n.align',\n", " 'data/alignments/s1/swbv3s.align',\n", " 'data/alignments/s1/swbv4p.align',\n", " 'data/alignments/s1/swbv5a.align',\n", " 'data/alignments/s1/swib2n.align',\n", " 'data/alignments/s1/swib3s.align',\n", " 'data/alignments/s1/swib4p.align',\n", " 'data/alignments/s1/swib5a.align',\n", " 'data/alignments/s1/swih6n.align',\n", " 'data/alignments/s1/swih7s.align',\n", " 'data/alignments/s1/swih8p.align',\n", " 'data/alignments/s1/swih9a.align',\n", " 'data/alignments/s1/swio1s.align',\n", " 'data/alignments/s1/swio2p.align',\n", " 'data/alignments/s1/swio3a.align',\n", " 'data/alignments/s1/swiozn.align',\n", " 'data/alignments/s1/swiu4n.align',\n", " 'data/alignments/s1/swiu5s.align',\n", " 'data/alignments/s1/swiu6p.align',\n", " 'data/alignments/s1/swiu7a.align',\n", " 'data/alignments/s1/swwc4n.align',\n", " 'data/alignments/s1/swwc5s.align',\n", " 'data/alignments/s1/swwc6p.align',\n", " 'data/alignments/s1/swwc7a.align',\n", " 'data/alignments/s1/swwi8n.align',\n", " 'data/alignments/s1/swwi9s.align',\n", " 'data/alignments/s1/swwj1a.align',\n", " 'data/alignments/s1/swwjzp.align',\n", " 'data/alignments/s1/swwp2n.align',\n", " 'data/alignments/s1/swwp3s.align',\n", " 'data/alignments/s1/swwp4p.align',\n", " 'data/alignments/s1/swwp5a.align',\n", " 'data/alignments/s1/swwv6n.align',\n", " ...]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = 'https://drive.google.com/uc?id=1YlvpDLix3S-U8fd-gqRwPcWXAXm8JwjL'\n", "output = 'data.zip'\n", "gdown.download(url, output, quiet=False)\n", "gdown.extractall('data.zip')" ] }, { "cell_type": "code", "execution_count": 8, "id": "8548cc59-6dfc-4acc-abc3-3e65212db02e", "metadata": { "tags": [] }, "outputs": [], "source": [ "def load_video(path:str) -> List[float]: \n", "\n", " cap = cv2.VideoCapture(path)\n", " frames = []\n", " for _ in range(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))): \n", " ret, frame = cap.read()\n", " frame = tf.image.rgb_to_grayscale(frame)\n", " frames.append(frame[190:236,80:220,:])\n", " cap.release()\n", " \n", " mean = tf.math.reduce_mean(frames)\n", " std = tf.math.reduce_std(tf.cast(frames, tf.float32))\n", " return tf.cast((frames - mean), tf.float32) / std" ] }, { "cell_type": "code", "execution_count": 9, "id": "ec735e0b-ec98-4eb0-8f49-c35527d6670a", "metadata": { "tags": [] }, "outputs": [], "source": [ "vocab = [x for x in \"abcdefghijklmnopqrstuvwxyz'?!123456789 \"]" ] }, { "cell_type": "code", "execution_count": 10, "id": "be04e972-d7a5-4a72-82d8-a6bdde1f3ce6", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The vocabulary is: ['', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', \"'\", '?', '!', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' '] (size =40)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2023-10-28 14:48:55.511317: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", "2023-10-28 14:48:55.511509: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", "2023-10-28 14:48:55.511632: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", "2023-10-28 14:48:55.579171: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", "2023-10-28 14:48:55.579291: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", "2023-10-28 14:48:55.579389: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", "2023-10-28 14:48:55.579464: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1886] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 9597 MB memory: -> device: 0, name: NVIDIA GeForce RTX 3060, pci bus id: 0000:09:00.0, compute capability: 8.6\n" ] } ], "source": [ "char_to_num = tf.keras.layers.StringLookup(vocabulary=vocab, oov_token=\"\")\n", "num_to_char = tf.keras.layers.StringLookup(\n", " vocabulary=char_to_num.get_vocabulary(), oov_token=\"\", invert=True\n", ")\n", "\n", "print(\n", " f\"The vocabulary is: {char_to_num.get_vocabulary()} \"\n", " f\"(size ={char_to_num.vocabulary_size()})\"\n", ")" ] }, { "cell_type": "code", "execution_count": 11, "id": "559f7420-6802-45fa-9ca0-b1ff209b461c", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "['',\n", " 'a',\n", " 'b',\n", " 'c',\n", " 'd',\n", " 'e',\n", " 'f',\n", " 'g',\n", " 'h',\n", " 'i',\n", " 'j',\n", " 'k',\n", " 'l',\n", " 'm',\n", " 'n',\n", " 'o',\n", " 'p',\n", " 'q',\n", " 'r',\n", " 's',\n", " 't',\n", " 'u',\n", " 'v',\n", " 'w',\n", " 'x',\n", " 'y',\n", " 'z',\n", " \"'\",\n", " '?',\n", " '!',\n", " '1',\n", " '2',\n", " '3',\n", " '4',\n", " '5',\n", " '6',\n", " '7',\n", " '8',\n", " '9',\n", " ' ']" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "char_to_num.get_vocabulary()" ] }, { "cell_type": "code", "execution_count": 12, "id": "797ff78b-b48f-4e14-bb62-8cd0ebf9501a", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "char_to_num(['n','i','c','k'])" ] }, { "cell_type": "code", "execution_count": 13, "id": "8cd7f4f4-ae77-4509-a4f4-c723787ebad1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "num_to_char([14, 9, 3, 11])" ] }, { "cell_type": "code", "execution_count": 14, "id": "9491bab5-6a3c-4f79-879a-8f9fbe73ae2e", "metadata": { "tags": [] }, "outputs": [], "source": [ "def load_alignments(path:str) -> List[str]: \n", " with open(path, 'r') as f: \n", " lines = f.readlines() \n", " tokens = []\n", " for line in lines:\n", " line = line.split()\n", " if line[2] != 'sil': \n", " tokens = [*tokens,' ',line[2]]\n", " return char_to_num(tf.reshape(tf.strings.unicode_split(tokens, input_encoding='UTF-8'), (-1)))[1:]" ] }, { "cell_type": "code", "execution_count": 15, "id": "dd01ca9f-77fb-4643-a2aa-47dd82c5d66b", "metadata": { "tags": [] }, "outputs": [], "source": [ "def load_data(path: str): \n", " path = bytes.decode(path.numpy())\n", " #file_name = path.split('/')[-1].split('.')[0]\n", " # File name splitting for windows\n", " file_name = path.split('\\\\')[-1].split('.')[0]\n", " video_path = os.path.join('data','s1',f'{file_name}.mpg')\n", " alignment_path = os.path.join('data','alignments','s1',f'{file_name}.align')\n", " frames = load_video(video_path) \n", " alignments = load_alignments(alignment_path)\n", " \n", " return frames, alignments" ] }, { "cell_type": "code", "execution_count": 16, "id": "8cb7cc58-31ae-4904-a805-1177a82717d2", "metadata": { "tags": [] }, "outputs": [], "source": [ "test_path = '.\\\\data\\\\s1\\\\bbal6n.mpg'" ] }, { "cell_type": "code", "execution_count": 17, "id": "76aa964f-0c84-490d-897a-d00e3966e2c9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'bbal6n'" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tf.convert_to_tensor(test_path).numpy().decode('utf-8').split('\\\\')[-1].split('.')[0]" ] }, { "cell_type": "code", "execution_count": 18, "id": "eb602c71-8560-4f9e-b26b-08202febb937", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "frames, alignments = load_data(tf.convert_to_tensor(test_path))" ] }, { "cell_type": "code", "execution_count": 19, "id": "0e3184a1-6b02-4b4f-84a8-a0a65f951ea2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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ArNp06Yp7NXUcvToUUNEZseOHcaY9x+CVCpltm7dWj7mpZdeMkRkdu7cOVXdrCkDAwPm9NNPN4899pj5xCc+Uf74mM1jc+utt5qPfexjseVhGJqOjg7zd3/3d+Xf9fb2mkwmY/7t3/6tFl2cMi6//HLzx3/8x+J311xzjbnuuuuMMbN3bPAPbCXj8OKLLxoiMnv37i0f87Of/cx4nmcOHz5cs75PNqN9mCF79uwxRGTeeOMNY8zsGZvjZdqZXQqFAu3bt49Wr15d/p3v+7R69WrauXPnFPZsaunr6yMiora2NiIi2rdvHxWLRTFOy5Yto87OzlkzTuvXr6fLL79cjAHR7B6bBx98kFasWEG///u/T/Pnz6fzzjuPvv/975fLX3vtNeru7hZj09LSQqtWrZrxY/PRj36Utm/fTr/61a+IiOiXv/wlPfXUU3TppZcS0eweG04l47Bz505qbW2lFStWlI9ZvXo1+b5Pu3fvrnmfp5K+vj7yPI9aW1uJSMemUqZdYrl33nmHgiCg9vZ28fv29nZ6+eWXp6hXU0sYhnTzzTfThRdeSGeddRYREXV3d1M6nS5P+N/S3t5O3d3dU9DL2nLffffRM888Q3v37o2UzeaxefXVV+nOO++kDRs20F/8xV/Q3r176c/+7M8onU7TunXrytc/2vM108fmq1/9KvX399OyZcsokUhQEAR022230XXXXUdENKvHhlPJOHR3d9P8+fNFeTKZpLa2tlk1Vrlcjm699Va69tpry8nldGwqY9p9fChR1q9fT88//zw99dRTU92VacGhQ4fopptuoscee4yy2exUd2daEYYhrVixgv7mb/6GiIjOO+88ev755+muu+6idevWTXHvppYf/ehH9IMf/IDuvfde+tCHPkT79++nm2++mRYsWDDrx0apnmKxSH/wB39Axhi68847p7o7JxzTzuwyd+5cSiQSEWVCT08PdXR0TFGvpo4bb7yRHn74Yfr5z39OixYtKv++o6ODCoUC9fb2iuNnwzjt27ePjh49Sueffz4lk0lKJpO0Y8cO+u53v0vJZJLa29tn7dicfPLJdOaZZ4rfnXHGGXTw4EEiovL1z8bn68///M/pq1/9Kn32s5+ls88+m/7oj/6IbrnlFtq0aRMRze6x4VQyDh0dHXT06FFRXiqV6NixY7NirH774fHGG2/QY489Vl71INKxqZRp9/GRTqdp+fLltH379vLvwjCk7du3U1dX1xT2rLYYY+jGG2+k+++/nx5//HFaunSpKF++fDmlUikxTgcOHKCDBw/O+HG6+OKL6bnnnqP9+/eXf1asWEHXXXddeXu2js2FF14YkWT/6le/olNOOYWIiJYuXUodHR1ibPr7+2n37t0zfmyGh4fJ9+UrL5FIUBiGRDS7x4ZTyTh0dXVRb28v7du3r3zM448/TmEY0qpVq2re51ry2w+PV155hf7jP/6D5syZI8pn89hUxVR7vI7GfffdZzKZjLnnnnvMiy++aL74xS+a1tZW093dPdVdqxlf+tKXTEtLi3niiSfMW2+9Vf4ZHh4uH3PDDTeYzs5O8/jjj5unn37adHV1ma6urins9dTB1S7GzN6x2bNnj0kmk+a2224zr7zyivnBD35g6uvrzb/+67+Wj7n99ttNa2ur+clPfmL++7//21x11VUzUk6KrFu3zixcuLAstf3xj39s5s6da77yla+Uj5ktYzMwMGCeffZZ8+yzzxoiMn//939vnn322bJio5JxuOSSS8x5551ndu/ebZ566ilz+umnzwg5qWtsCoWCufLKK82iRYvM/v37xbs5n8+X65ipYzORTMuPD2OM+Yd/+AfT2dlp0um0Wblypdm1a9dUd6mmENGoP1u2bCkfMzIyYv70T//UnHTSSaa+vt58+tOfNm+99dbUdXoKwY+P2Tw2Dz30kDnrrLNMJpMxy5YtM//0T/8kysMwNF//+tdNe3u7yWQy5uKLLzYHDhyYot7Wjv7+fnPTTTeZzs5Ok81mzQc+8AHzta99TfzRmC1j8/Of/3zU98u6deuMMZWNw7vvvmuuvfZa09jYaJqbm80XvvAFMzAwMAVXM7G4xua1116LfTf//Oc/L9cxU8dmIvGMYeH9FEVRFEVRJplp5/OhKIqiKMrMRj8+FEVRFEWpKfrxoSiKoihKTdGPD0VRFEVRaop+fCiKoiiKUlP040NRFEVRlJqiHx+KoiiKotQU/fhQFEVRFKWm6MeHoiiKoig1RT8+FEVRFEWpKfrxoSiKoihKTdGPD0VRFEVRasr/A1EXL/BESGnOAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(frames[40])" ] }, { "cell_type": "code", "execution_count": 20, "id": "d7ec0833-d54b-4073-84cf-92d011c60ec1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alignments" ] }, { "cell_type": "code", "execution_count": 21, "id": "fe1ad370-b287-4b46-85a2-7c45b0bd9b10", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tf.strings.reduce_join([bytes.decode(x) for x in num_to_char(alignments.numpy()).numpy()])" ] }, { "cell_type": "code", "execution_count": 22, "id": "6871031a-b0ba-4c76-a852-f6329b0f2606", "metadata": { "tags": [] }, "outputs": [], "source": [ "def mappable_function(path:str) ->List[str]:\n", " result = tf.py_function(load_data, [path], (tf.float32, tf.int64))\n", " return result" ] }, { "cell_type": "markdown", "id": "c40a7eb4-0c3e-4eab-9291-5611cb68ce08", "metadata": { "tags": [] }, "source": [ "# 2. Create Data Pipeline" ] }, { "cell_type": "code", "execution_count": 23, "id": "7686355d-45aa-4c85-ad9c-053e6a9b4d81", "metadata": { "tags": [] }, "outputs": [], "source": [ "from matplotlib import pyplot as plt" ] }, { "cell_type": "code", "execution_count": 24, "id": "f066fea2-91b1-42ed-a67d-00566a1a53ff", "metadata": { "tags": [] }, "outputs": [], "source": [ "data = tf.data.Dataset.list_files('./data/s1/*.mpg')\n", "data = data.shuffle(500, reshuffle_each_iteration=False)\n", "data = data.map(mappable_function)\n", "data = data.padded_batch(2, padded_shapes=([75,None,None,None],[40]))\n", "data = data.prefetch(tf.data.AUTOTUNE)\n", "# Added for split \n", "train = data.take(450)\n", "test = data.skip(450)" ] }, { "cell_type": "code", "execution_count": 25, "id": "6b1365bd-7742-41d1-95d4-247021751c3a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "50" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(test)" ] }, { "cell_type": "code", "execution_count": 26, "id": "5281bde8-fdc8-4da1-bd55-5a7929a9e80c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[ERROR:0@10.058] global cap.cpp:164 open VIDEOIO(CV_IMAGES): raised OpenCV exception:\n", "\n", "OpenCV(4.8.1) /io/opencv/modules/videoio/src/cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): data/s1/.mpg in function 'icvExtractPattern'\n", "\n", "\n", "2023-10-28 14:48:56.660230: W tensorflow/core/framework/op_kernel.cc:1827] UNKNOWN: FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", "Traceback (most recent call last):\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n", " return func(device, token, args)\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n", " outputs = self._call(device, args)\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n", " ret = self._func(*args)\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n", " return func(*args, **kwargs)\n", "\n", " File \"/tmp/ipykernel_116383/3912287231.py\", line 9, in load_data\n", " alignments = load_alignments(alignment_path)\n", "\n", " File \"/tmp/ipykernel_116383/885867866.py\", line 2, in load_alignments\n", " with open(path, 'r') as f:\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/IPython/core/interactiveshell.py\", line 286, in _modified_open\n", " return io_open(file, *args, **kwargs)\n", "\n", "FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", "\n", "\n", "[ERROR:0@10.061] global cap.cpp:164 open VIDEOIO(CV_IMAGES): raised OpenCV exception:\n", "\n", "OpenCV(4.8.1) /io/opencv/modules/videoio/src/cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): data/s1/.mpg in function 'icvExtractPattern'\n", "\n", "\n", "2023-10-28 14:48:56.666485: W tensorflow/core/framework/op_kernel.cc:1827] UNKNOWN: FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", "Traceback (most recent call last):\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n", " return func(device, token, args)\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n", " outputs = self._call(device, args)\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n", " ret = self._func(*args)\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n", " return func(*args, **kwargs)\n", "\n", " File \"/tmp/ipykernel_116383/3912287231.py\", line 9, in load_data\n", " alignments = load_alignments(alignment_path)\n", "\n", " File \"/tmp/ipykernel_116383/885867866.py\", line 2, in load_alignments\n", " with open(path, 'r') as f:\n", "\n", " File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/IPython/core/interactiveshell.py\", line 286, in _modified_open\n", " return io_open(file, *args, **kwargs)\n", "\n", "FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", "\n", "\n" ] }, { "ename": "UnknownError", "evalue": "{{function_node __wrapped__IteratorGetNext_output_types_2_device_/job:localhost/replica:0/task:0/device:CPU:0}} FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\nTraceback (most recent call last):\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n return func(device, token, args)\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n outputs = self._call(device, args)\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n ret = self._func(*args)\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n return func(*args, **kwargs)\n\n File \"/tmp/ipykernel_116383/3912287231.py\", line 9, in load_data\n alignments = load_alignments(alignment_path)\n\n File \"/tmp/ipykernel_116383/885867866.py\", line 2, in load_alignments\n with open(path, 'r') as f:\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/IPython/core/interactiveshell.py\", line 286, in _modified_open\n return io_open(file, *args, **kwargs)\n\nFileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n\n\n\t [[{{node EagerPyFunc}}]] [Op:IteratorGetNext] name: ", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mUnknownError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[26], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m frames, alignments \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mas_numpy_iterator\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnext\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/data/ops/dataset_ops.py:4694\u001b[0m, in \u001b[0;36mNumpyIterator.next\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 4693\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnext\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m-> 4694\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__next__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/data/ops/dataset_ops.py:4691\u001b[0m, in \u001b[0;36mNumpyIterator.__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 4688\u001b[0m numpy\u001b[38;5;241m.\u001b[39msetflags(write\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 4689\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m numpy\n\u001b[0;32m-> 4691\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m nest\u001b[38;5;241m.\u001b[39mmap_structure(to_numpy, \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_iterator\u001b[49m\u001b[43m)\u001b[49m)\n", "File \u001b[0;32m~/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py:809\u001b[0m, in \u001b[0;36mOwnedIterator.__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 807\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__next__\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 808\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 809\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_next_internal\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 810\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m errors\u001b[38;5;241m.\u001b[39mOutOfRangeError:\n\u001b[1;32m 811\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m\n", "File \u001b[0;32m~/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py:772\u001b[0m, in \u001b[0;36mOwnedIterator._next_internal\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 769\u001b[0m \u001b[38;5;66;03m# TODO(b/77291417): This runs in sync mode as iterators use an error status\u001b[39;00m\n\u001b[1;32m 770\u001b[0m \u001b[38;5;66;03m# to communicate that there is no more data to iterate over.\u001b[39;00m\n\u001b[1;32m 771\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m context\u001b[38;5;241m.\u001b[39mexecution_mode(context\u001b[38;5;241m.\u001b[39mSYNC):\n\u001b[0;32m--> 772\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mgen_dataset_ops\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miterator_get_next\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 773\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_iterator_resource\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 774\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_types\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_flat_output_types\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 775\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_shapes\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_flat_output_shapes\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 777\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 778\u001b[0m \u001b[38;5;66;03m# Fast path for the case `self._structure` is not a nested structure.\u001b[39;00m\n\u001b[1;32m 779\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_element_spec\u001b[38;5;241m.\u001b[39m_from_compatible_tensor_list(ret) \u001b[38;5;66;03m# pylint: disable=protected-access\u001b[39;00m\n", "File \u001b[0;32m~/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/gen_dataset_ops.py:3028\u001b[0m, in \u001b[0;36miterator_get_next\u001b[0;34m(iterator, output_types, output_shapes, name)\u001b[0m\n\u001b[1;32m 3026\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _result\n\u001b[1;32m 3027\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m _core\u001b[38;5;241m.\u001b[39m_NotOkStatusException \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m-> 3028\u001b[0m \u001b[43m_ops\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraise_from_not_ok_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3029\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m _core\u001b[38;5;241m.\u001b[39m_FallbackException:\n\u001b[1;32m 3030\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n", "File \u001b[0;32m~/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/framework/ops.py:5888\u001b[0m, in \u001b[0;36mraise_from_not_ok_status\u001b[0;34m(e, name)\u001b[0m\n\u001b[1;32m 5886\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mraise_from_not_ok_status\u001b[39m(e, name) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m NoReturn:\n\u001b[1;32m 5887\u001b[0m e\u001b[38;5;241m.\u001b[39mmessage \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m name: \u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mstr\u001b[39m(name \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n\u001b[0;32m-> 5888\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m core\u001b[38;5;241m.\u001b[39m_status_to_exception(e) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", "\u001b[0;31mUnknownError\u001b[0m: {{function_node __wrapped__IteratorGetNext_output_types_2_device_/job:localhost/replica:0/task:0/device:CPU:0}} FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\nTraceback (most recent call last):\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n return func(device, token, args)\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n outputs = self._call(device, args)\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n ret = self._func(*args)\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n return func(*args, **kwargs)\n\n File \"/tmp/ipykernel_116383/3912287231.py\", line 9, in load_data\n alignments = load_alignments(alignment_path)\n\n File \"/tmp/ipykernel_116383/885867866.py\", line 2, in load_alignments\n with open(path, 'r') as f:\n\n File \"/home/milselarch/projects/SUTD/50-035/lipread-project/venv/lib/python3.9/site-packages/IPython/core/interactiveshell.py\", line 286, in _modified_open\n return io_open(file, *args, **kwargs)\n\nFileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n\n\n\t [[{{node EagerPyFunc}}]] [Op:IteratorGetNext] name: " ] } ], "source": [ "frames, alignments = data.as_numpy_iterator().next()" ] }, { "cell_type": "code", "execution_count": null, "id": "cbebe683-6afd-47fd-bba4-c83b4b13bb32", "metadata": {}, "outputs": [], "source": [ "len(frames)" ] }, { "cell_type": "code", "execution_count": null, "id": "5cf2d676-93a9-434c-b3c7-bdcc2577b2e7", "metadata": { "tags": [] }, "outputs": [], "source": [ "sample = data.as_numpy_iterator()" ] }, { "cell_type": "code", "execution_count": null, "id": "efa6cd46-7079-46c0-b45b-832f339f6cb0", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "val = sample.next(); val[0]" ] }, { "cell_type": "code", "execution_count": null, "id": "acf5eb4f-a0da-4a9a-bf24-af13e9cc2fbe", "metadata": { "tags": [] }, "outputs": [], "source": [ "imageio.mimsave('./animation.gif', val[0][0], fps=10)" ] }, { "cell_type": "code", "execution_count": null, "id": "c33a87a2-d5e0-4ec9-b174-73ebf41bf03a", "metadata": { "tags": [] }, "outputs": [], "source": [ "# 0:videos, 0: 1st video out of the batch, 0: return the first frame in the video \n", "plt.imshow(val[0][0][35])" ] }, { "cell_type": "code", "execution_count": null, "id": "84593332-133c-4205-b7a6-8e235d5e2b3b", "metadata": { "tags": [] }, "outputs": [], "source": [ "tf.strings.reduce_join([num_to_char(word) for word in val[1][0]])" ] }, { "cell_type": "markdown", "id": "0f47733c-83bc-465c-b118-b198b492ad37", "metadata": { "tags": [] }, "source": [ "# 3. Design the Deep Neural Network" ] }, { "cell_type": "code", "execution_count": null, "id": "d8e9a497-191b-4842-afbd-26f5e13c43ba", "metadata": { "tags": [] }, "outputs": [], "source": [ "from tensorflow.keras.models import Sequential \n", "from tensorflow.keras.layers import Conv3D, LSTM, Dense, Dropout, Bidirectional, MaxPool3D, Activation, Reshape, SpatialDropout3D, BatchNormalization, TimeDistributed, Flatten\n", "from tensorflow.keras.optimizers import Adam\n", "from tensorflow.keras.callbacks import ModelCheckpoint, LearningRateScheduler" ] }, { "cell_type": "code", "execution_count": null, "id": "3f753ed2-70b9-4236-8c1c-08ca065dc8bf", "metadata": {}, "outputs": [], "source": [ "data.as_numpy_iterator().next()[0][0].shape" ] }, { "cell_type": "code", "execution_count": null, "id": "f9171056-a352-491a-9ed9-92b28ced268e", "metadata": { "tags": [] }, "outputs": [], "source": [ "model = Sequential()\n", "model.add(Conv3D(128, 3, input_shape=(75,46,140,1), padding='same'))\n", "model.add(Activation('relu'))\n", "model.add(MaxPool3D((1,2,2)))\n", "\n", "model.add(Conv3D(256, 3, padding='same'))\n", "model.add(Activation('relu'))\n", "model.add(MaxPool3D((1,2,2)))\n", "\n", "model.add(Conv3D(75, 3, padding='same'))\n", "model.add(Activation('relu'))\n", "model.add(MaxPool3D((1,2,2)))\n", "\n", "model.add(TimeDistributed(Flatten()))\n", "\n", "model.add(Bidirectional(LSTM(128, kernel_initializer='Orthogonal', return_sequences=True)))\n", "model.add(Dropout(.5))\n", "\n", "model.add(Bidirectional(LSTM(128, kernel_initializer='Orthogonal', return_sequences=True)))\n", "model.add(Dropout(.5))\n", "\n", "model.add(Dense(char_to_num.vocabulary_size()+1, kernel_initializer='he_normal', activation='softmax'))" ] }, { "cell_type": "code", "execution_count": null, "id": "78851825-2bcd-42a9-b7f2-28bb5a6bf43a", "metadata": { "tags": [] }, "outputs": [], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": null, "id": "f4b4798c-a65a-4c47-9e2a-3b09dc98d320", "metadata": {}, "outputs": [], "source": [ "5*17*75" ] }, { "cell_type": "code", "execution_count": null, "id": "e5c2eae0-c359-41a4-97a0-75c44dccb7d1", "metadata": { "tags": [] }, "outputs": [], "source": [ "yhat = model.predict(val[0])" ] }, { "cell_type": "code", "execution_count": null, "id": "ffdc7319-0d69-4f7e-a6d4-ce72deb81c0b", "metadata": {}, "outputs": [], "source": [ "tf.strings.reduce_join([num_to_char(x) for x in tf.argmax(yhat[0],axis=1)])" ] }, { "cell_type": "code", "execution_count": null, "id": "6ed47531-8317-4255-9a12-b757642258e6", "metadata": { "tags": [] }, "outputs": [], "source": [ "tf.strings.reduce_join([num_to_char(tf.argmax(x)) for x in yhat[0]])" ] }, { "cell_type": "code", "execution_count": null, "id": "7c37b9b9-5298-4038-9c33-5031d1b457f0", "metadata": { "tags": [] }, "outputs": [], "source": [ "model.input_shape" ] }, { "cell_type": "code", "execution_count": null, "id": "98b316a4-5322-4782-8e36-4b3c1a696d85", "metadata": { "tags": [] }, "outputs": [], "source": [ "model.output_shape" ] }, { "cell_type": "markdown", "id": "2ec02176-5c26-46c3-aff7-8352e6563c7d", "metadata": { "tags": [] }, "source": [ "# 4. Setup Training Options and Train" ] }, { "cell_type": "code", "execution_count": null, "id": "ab015fd0-7fb4-4d5d-9fa2-30a05dbd515a", "metadata": { "tags": [] }, "outputs": [], "source": [ "def scheduler(epoch, lr):\n", " if epoch < 30:\n", " return lr\n", " else:\n", " return lr * tf.math.exp(-0.1)" ] }, { "cell_type": "code", "execution_count": null, "id": "c564d5c9-db54-4e88-b311-9aeab7fb3e69", "metadata": { "tags": [] }, "outputs": [], "source": [ "def CTCLoss(y_true, y_pred):\n", " batch_len = tf.cast(tf.shape(y_true)[0], dtype=\"int64\")\n", " input_length = tf.cast(tf.shape(y_pred)[1], dtype=\"int64\")\n", " label_length = tf.cast(tf.shape(y_true)[1], dtype=\"int64\")\n", "\n", " input_length = input_length * tf.ones(shape=(batch_len, 1), dtype=\"int64\")\n", " label_length = label_length * tf.ones(shape=(batch_len, 1), dtype=\"int64\")\n", "\n", " loss = tf.keras.backend.ctc_batch_cost(y_true, y_pred, input_length, label_length)\n", " return loss" ] }, { "cell_type": "code", "execution_count": null, "id": "a26dc3fc-a19c-4378-bd8c-e2b597a1d15c", "metadata": { "tags": [] }, "outputs": [], "source": [ "class ProduceExample(tf.keras.callbacks.Callback): \n", " def __init__(self, dataset) -> None: \n", " self.dataset = dataset.as_numpy_iterator()\n", " \n", " def on_epoch_end(self, epoch, logs=None) -> None:\n", " data = self.dataset.next()\n", " yhat = self.model.predict(data[0])\n", " decoded = tf.keras.backend.ctc_decode(yhat, [75,75], greedy=False)[0][0].numpy()\n", " for x in range(len(yhat)): \n", " print('Original:', tf.strings.reduce_join(num_to_char(data[1][x])).numpy().decode('utf-8'))\n", " print('Prediction:', tf.strings.reduce_join(num_to_char(decoded[x])).numpy().decode('utf-8'))\n", " print('~'*100)" ] }, { "cell_type": "code", "execution_count": null, "id": "04be90d8-2482-46f9-b513-d5f4f8001c7e", "metadata": { "tags": [] }, "outputs": [], "source": [ "model.compile(optimizer=Adam(learning_rate=0.0001), loss=CTCLoss)" ] }, { "cell_type": "code", "execution_count": null, "id": "eab49367-3f1e-4464-ae76-dbd07549d97e", "metadata": { "tags": [] }, "outputs": [], "source": [ "checkpoint_callback = ModelCheckpoint(os.path.join('models','checkpoint'), monitor='loss', save_weights_only=True) " ] }, { "cell_type": "code", "execution_count": null, "id": "e085a632-d464-46ef-8777-959cad4adb2c", "metadata": { "tags": [] }, "outputs": [], "source": [ "schedule_callback = LearningRateScheduler(scheduler)" ] }, { "cell_type": "code", "execution_count": null, "id": "48eca991-90ab-4592-8a79-b50e9ca015b6", "metadata": { "tags": [] }, "outputs": [], "source": [ "example_callback = ProduceExample(test)" ] }, { "cell_type": "code", "execution_count": null, "id": "8ffba483-aa61-4bbe-a15f-a73e1ddf097c", "metadata": { "tags": [] }, "outputs": [], "source": [ "model.fit(train, validation_data=test, epochs=100, callbacks=[checkpoint_callback, schedule_callback, example_callback])" ] }, { "cell_type": "markdown", "id": "fa8ee94b-89f7-4733-8a0c-a86f86ff590a", "metadata": { "tags": [] }, "source": [ "# 5. Make a Prediction " ] }, { "cell_type": "code", "execution_count": null, "id": "01fa7204-ce0e-49a8-8dbd-14fe5dfead40", "metadata": { "tags": [] }, "outputs": [], "source": [ "url = 'https://drive.google.com/uc?id=1vWscXs4Vt0a_1IH1-ct2TCgXAZT-N3_Y'\n", "output = 'checkpoints.zip'\n", "gdown.download(url, output, quiet=False)\n", "gdown.extractall('checkpoints.zip', 'models')" ] }, { "cell_type": "code", "execution_count": null, "id": "247f664d-3c87-4e96-946e-930dad0e1c2c", "metadata": { "tags": [] }, "outputs": [], "source": [ "model.load_weights('models/checkpoint')" ] }, { "cell_type": "code", "execution_count": null, "id": "7f8d689f-b7bb-443c-9b88-e40c1d800828", "metadata": { "tags": [] }, "outputs": [], "source": [ "test_data = test.as_numpy_iterator()" ] }, { "cell_type": "code", "execution_count": null, "id": "38546dc2-bee9-4837-864b-8a884df40ad7", "metadata": { "tags": [] }, "outputs": [], "source": [ "sample = test_data.next()" ] }, { "cell_type": "code", "execution_count": null, "id": "a43621f0-229d-4c0d-9554-9c3a3da9c61a", "metadata": { "tags": [] }, "outputs": [], "source": [ "yhat = model.predict(sample[0])" ] }, { "cell_type": "code", "execution_count": null, "id": "ea462999-f87e-4a7e-a057-5be7b6d8f7d5", "metadata": { "tags": [] }, "outputs": [], "source": [ "print('~'*100, 'REAL TEXT')\n", "[tf.strings.reduce_join([num_to_char(word) for word in sentence]) for sentence in sample[1]]" ] }, { "cell_type": "code", "execution_count": null, "id": "82bd4c10-dd6e-411e-834b-2a3b43fd12c5", "metadata": { "tags": [] }, "outputs": [], "source": [ "decoded = tf.keras.backend.ctc_decode(yhat, input_length=[75,75], greedy=True)[0][0].numpy()" ] }, { "cell_type": "code", "execution_count": null, "id": "5d68ac46-c90b-4eab-a709-f19aee569ff5", "metadata": { "tags": [] }, "outputs": [], "source": [ "print('~'*100, 'PREDICTIONS')\n", "[tf.strings.reduce_join([num_to_char(word) for word in sentence]) for sentence in decoded]" ] }, { "cell_type": "markdown", "id": "64622f98-e99b-4fed-a2cc-f0da82eb5431", "metadata": {}, "source": [ "# Test on a Video" ] }, { "cell_type": "code", "execution_count": null, "id": "a8b0c4d0-2031-4331-b91d-d87b1ae6f6e2", "metadata": {}, "outputs": [], "source": [ "sample = load_data(tf.convert_to_tensor('.\\\\data\\\\s1\\\\bras9a.mpg'))" ] }, { "cell_type": "code", "execution_count": null, "id": "0cca60e4-47a9-4683-8a75-48f4684f723d", "metadata": {}, "outputs": [], "source": [ "print('~'*100, 'REAL TEXT')\n", "[tf.strings.reduce_join([num_to_char(word) for word in sentence]) for sentence in [sample[1]]]" ] }, { "cell_type": "code", "execution_count": null, "id": "8cc5037c-1e32-435c-b0cc-01e1fb3b863c", "metadata": {}, "outputs": [], "source": [ "yhat = model.predict(tf.expand_dims(sample[0], axis=0))" ] }, { "cell_type": "code", "execution_count": null, "id": "22c4f77d-715d-409f-bc5e-3ebe48704e8f", "metadata": {}, "outputs": [], "source": [ "decoded = tf.keras.backend.ctc_decode(yhat, input_length=[75], greedy=True)[0][0].numpy()" ] }, { "cell_type": "code", "execution_count": null, "id": "e4d12ecc-b634-499e-a4bc-db9f010835fb", "metadata": {}, "outputs": [], "source": [ "print('~'*100, 'PREDICTIONS')\n", "[tf.strings.reduce_join([num_to_char(word) for word in sentence]) for sentence in decoded]" ] }, { "cell_type": "code", "execution_count": null, "id": "551dfea2-de6b-4400-b71a-a17631529e3f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "fa95863d-3832-47bf-8a77-ebaa38054ace", "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.9.17" } }, "nbformat": 4, "nbformat_minor": 5 }