diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5ea1958c --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# LipNet +data/ +models/ +results/ +__pycache__/ +.vscode/ +*.zip \ No newline at end of file diff --git a/LipNet.ipynb b/LipNet.ipynb index b34f4134..b44dc077 100644 --- a/LipNet.ipynb +++ b/LipNet.ipynb @@ -12,32 +12,180 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "ddfbccbe-41ae-4c23-98b1-a13868e2b499", "metadata": { "scrolled": true, "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Package Version\n", + "----------------------- -----------\n", + "absl-py 2.1.0\n", + "appnope 0.1.4\n", + "asttokens 2.4.1\n", + "astunparse 1.6.3\n", + "beautifulsoup4 4.12.3\n", + "certifi 2024.6.2\n", + "charset-normalizer 3.3.2\n", + "comm 0.2.2\n", + "contourpy 1.2.1\n", + "cycler 0.12.1\n", + "debugpy 1.8.1\n", + "decorator 5.1.1\n", + "executing 2.0.1\n", + "filelock 3.15.3\n", + "flatbuffers 24.3.25\n", + "fonttools 4.53.0\n", + "gast 0.5.4\n", + "gdown 5.2.0\n", + "google-pasta 0.2.0\n", + "grpcio 1.64.1\n", + "h5py 3.11.0\n", + "idna 3.7\n", + "imageio 2.34.1\n", + "ipykernel 6.29.4\n", + "ipython 8.25.0\n", + "jedi 0.19.1\n", + "jupyter_client 8.6.2\n", + "jupyter_core 5.7.2\n", + "keras 3.3.3\n", + "kiwisolver 1.4.5\n", + "libclang 18.1.1\n", + "Markdown 3.6\n", + "markdown-it-py 3.0.0\n", + "MarkupSafe 2.1.5\n", + "matplotlib 3.9.0\n", + "matplotlib-inline 0.1.7\n", + "mdurl 0.1.2\n", + "ml-dtypes 0.3.2\n", + "namex 0.0.8\n", + "nest-asyncio 1.6.0\n", + "numpy 1.26.4\n", + "opencv-python 4.10.0.84\n", + "opt-einsum 3.3.0\n", + "optree 0.11.0\n", + "packaging 24.1\n", + "parso 0.8.4\n", + "pexpect 4.9.0\n", + "pillow 10.3.0\n", + "pip 24.1\n", + "platformdirs 4.2.2\n", + "prompt_toolkit 3.0.47\n", + "protobuf 4.25.3\n", + "psutil 6.0.0\n", + "ptyprocess 0.7.0\n", + "pure-eval 0.2.2\n", + "Pygments 2.18.0\n", + "pyparsing 3.1.2\n", + "PySocks 1.7.1\n", + "python-dateutil 2.9.0.post0\n", + "pyzmq 26.0.3\n", + "requests 2.32.3\n", + "rich 13.7.1\n", + "setuptools 70.1.0\n", + "six 1.16.0\n", + "soupsieve 2.5\n", + "stack-data 0.6.3\n", + "tensorboard 2.16.2\n", + "tensorboard-data-server 0.7.2\n", + "tensorflow 2.16.1\n", + "termcolor 2.4.0\n", + "tornado 6.4.1\n", + "tqdm 4.66.4\n", + "traitlets 5.14.3\n", + "typing_extensions 4.12.2\n", + "urllib3 2.2.2\n", + "wcwidth 0.2.13\n", + "Werkzeug 3.0.3\n", + "wheel 0.43.0\n", + "wrapt 1.16.0\n" + ] + } + ], "source": [ - "!pip list" + "!pip3 list" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "02f907ea-f669-46c7-adcf-7f257e663448", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: opencv-python in ./.venv/lib/python3.12/site-packages (4.10.0.84)\n", + "Requirement already satisfied: matplotlib in ./.venv/lib/python3.12/site-packages (3.9.0)\n", + "Requirement already satisfied: imageio in ./.venv/lib/python3.12/site-packages (2.34.1)\n", + "Requirement already satisfied: gdown in ./.venv/lib/python3.12/site-packages (5.2.0)\n", + "Requirement already satisfied: tensorflow in ./.venv/lib/python3.12/site-packages (2.16.1)\n", + "Requirement already satisfied: numpy>=1.21.2 in ./.venv/lib/python3.12/site-packages (from opencv-python) (1.26.4)\n", + "Requirement already satisfied: contourpy>=1.0.1 in ./.venv/lib/python3.12/site-packages (from matplotlib) (1.2.1)\n", + "Requirement already satisfied: cycler>=0.10 in ./.venv/lib/python3.12/site-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in ./.venv/lib/python3.12/site-packages (from matplotlib) (4.53.0)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in ./.venv/lib/python3.12/site-packages (from matplotlib) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in ./.venv/lib/python3.12/site-packages (from matplotlib) (24.1)\n", + "Requirement already satisfied: pillow>=8 in ./.venv/lib/python3.12/site-packages (from matplotlib) (10.3.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in ./.venv/lib/python3.12/site-packages (from matplotlib) (3.1.2)\n", + "Requirement already satisfied: python-dateutil>=2.7 in ./.venv/lib/python3.12/site-packages (from matplotlib) (2.9.0.post0)\n", + "Requirement already satisfied: beautifulsoup4 in ./.venv/lib/python3.12/site-packages (from gdown) (4.12.3)\n", + "Requirement already satisfied: filelock in ./.venv/lib/python3.12/site-packages (from gdown) (3.15.3)\n", + "Requirement already satisfied: requests[socks] in ./.venv/lib/python3.12/site-packages (from gdown) (2.32.3)\n", + "Requirement already satisfied: tqdm in ./.venv/lib/python3.12/site-packages (from gdown) (4.66.4)\n", + "Requirement already satisfied: absl-py>=1.0.0 in ./.venv/lib/python3.12/site-packages (from tensorflow) (2.1.0)\n", + "Requirement already satisfied: astunparse>=1.6.0 in ./.venv/lib/python3.12/site-packages (from tensorflow) (1.6.3)\n", + "Requirement already satisfied: flatbuffers>=23.5.26 in ./.venv/lib/python3.12/site-packages (from tensorflow) (24.3.25)\n", + "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in ./.venv/lib/python3.12/site-packages (from tensorflow) (0.5.4)\n", + "Requirement already satisfied: google-pasta>=0.1.1 in ./.venv/lib/python3.12/site-packages (from tensorflow) (0.2.0)\n", + "Requirement already satisfied: h5py>=3.10.0 in ./.venv/lib/python3.12/site-packages (from tensorflow) (3.11.0)\n", + "Requirement already satisfied: libclang>=13.0.0 in ./.venv/lib/python3.12/site-packages (from tensorflow) (18.1.1)\n", + "Requirement already satisfied: ml-dtypes~=0.3.1 in ./.venv/lib/python3.12/site-packages (from tensorflow) (0.3.2)\n", + "Requirement already satisfied: opt-einsum>=2.3.2 in ./.venv/lib/python3.12/site-packages (from tensorflow) (3.3.0)\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.12/site-packages (from tensorflow) (4.25.3)\n", + "Requirement already satisfied: setuptools in ./.venv/lib/python3.12/site-packages (from tensorflow) (70.1.0)\n", + "Requirement already satisfied: six>=1.12.0 in ./.venv/lib/python3.12/site-packages (from tensorflow) (1.16.0)\n", + "Requirement already satisfied: termcolor>=1.1.0 in ./.venv/lib/python3.12/site-packages (from tensorflow) (2.4.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.6 in ./.venv/lib/python3.12/site-packages (from tensorflow) (4.12.2)\n", + "Requirement already satisfied: wrapt>=1.11.0 in ./.venv/lib/python3.12/site-packages (from tensorflow) (1.16.0)\n", + "Requirement already satisfied: grpcio<2.0,>=1.24.3 in ./.venv/lib/python3.12/site-packages (from tensorflow) (1.64.1)\n", + "Requirement already satisfied: tensorboard<2.17,>=2.16 in ./.venv/lib/python3.12/site-packages (from tensorflow) (2.16.2)\n", + "Requirement already satisfied: keras>=3.0.0 in ./.venv/lib/python3.12/site-packages (from tensorflow) (3.3.3)\n", + "Requirement already satisfied: wheel<1.0,>=0.23.0 in ./.venv/lib/python3.12/site-packages (from astunparse>=1.6.0->tensorflow) (0.43.0)\n", + "Requirement already satisfied: rich in ./.venv/lib/python3.12/site-packages (from keras>=3.0.0->tensorflow) (13.7.1)\n", + "Requirement already satisfied: namex in ./.venv/lib/python3.12/site-packages (from keras>=3.0.0->tensorflow) (0.0.8)\n", + "Requirement already satisfied: optree in ./.venv/lib/python3.12/site-packages (from keras>=3.0.0->tensorflow) (0.11.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in ./.venv/lib/python3.12/site-packages (from requests[socks]->gdown) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in ./.venv/lib/python3.12/site-packages (from requests[socks]->gdown) (3.7)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in ./.venv/lib/python3.12/site-packages (from requests[socks]->gdown) (2.2.2)\n", + "Requirement already satisfied: certifi>=2017.4.17 in ./.venv/lib/python3.12/site-packages (from requests[socks]->gdown) (2024.6.2)\n", + "Requirement already satisfied: markdown>=2.6.8 in ./.venv/lib/python3.12/site-packages (from tensorboard<2.17,>=2.16->tensorflow) (3.6)\n", + "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in ./.venv/lib/python3.12/site-packages (from tensorboard<2.17,>=2.16->tensorflow) (0.7.2)\n", + "Requirement already satisfied: werkzeug>=1.0.1 in ./.venv/lib/python3.12/site-packages (from tensorboard<2.17,>=2.16->tensorflow) (3.0.3)\n", + "Requirement already satisfied: soupsieve>1.2 in ./.venv/lib/python3.12/site-packages (from beautifulsoup4->gdown) (2.5)\n", + "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in ./.venv/lib/python3.12/site-packages (from requests[socks]->gdown) (1.7.1)\n", + "Requirement already satisfied: MarkupSafe>=2.1.1 in ./.venv/lib/python3.12/site-packages (from werkzeug>=1.0.1->tensorboard<2.17,>=2.16->tensorflow) (2.1.5)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in ./.venv/lib/python3.12/site-packages (from rich->keras>=3.0.0->tensorflow) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in ./.venv/lib/python3.12/site-packages (from rich->keras>=3.0.0->tensorflow) (2.18.0)\n", + "Requirement already satisfied: mdurl~=0.1 in ./.venv/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.0.0->tensorflow) (0.1.2)\n" + ] + } + ], "source": [ - "!pip install opencv-python matplotlib imageio gdown tensorflow" + "!pip3 install opencv-python matplotlib imageio gdown tensorflow" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "b24af50c-20b8-409d-ad78-30a933fdd669", "metadata": { "tags": [] @@ -55,17 +203,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "1e3db0b0-e559-4ad6-91fd-e7414b7d75e6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tf.config.list_physical_devices('GPU')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "378d045a-3003-4f93-b7d2-a25a97774a68", "metadata": { "tags": [] @@ -91,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "8fb99c90-e05a-437f-839d-6e772f8c1dd5", "metadata": { "tags": [] @@ -103,12 +262,1034 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "c019e4c6-2af3-4160-99ea-5c8cb009f1a7", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading...\n", + "From (original): https://drive.google.com/uc?id=1YlvpDLix3S-U8fd-gqRwPcWXAXm8JwjL\n", + "From (redirected): https://drive.google.com/uc?id=1YlvpDLix3S-U8fd-gqRwPcWXAXm8JwjL&confirm=t&uuid=54f6d0f0-0825-45b2-922d-a48e87467e61\n", + "To: /Users/lihaidun/NSCC/CodeSpace/LipNet/data.zip\n", + "100%|██████████| 423M/423M [00:37<00:00, 11.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": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "url = 'https://drive.google.com/uc?id=1YlvpDLix3S-U8fd-gqRwPcWXAXm8JwjL'\n", "output = 'data.zip'\n", @@ -118,23 +1299,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "8548cc59-6dfc-4acc-abc3-3e65212db02e", "metadata": { "tags": [] }, "outputs": [], "source": [ - "def load_video(path:str) -> List[float]: \n", + "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", + " 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", + "\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" @@ -142,7 +1323,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "ec735e0b-ec98-4eb0-8f49-c35527d6670a", "metadata": { "tags": [] @@ -154,12 +1335,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "be04e972-d7a5-4a72-82d8-a6bdde1f3ce6", "metadata": { "tags": [] }, - "outputs": [], + "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" + ] + } + ], "source": [ "char_to_num = tf.keras.layers.StringLookup(vocabulary=vocab, oov_token=\"\")\n", "num_to_char = tf.keras.layers.StringLookup(\n", @@ -174,105 +1363,194 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "559f7420-6802-45fa-9ca0-b1ff209b461c", "metadata": { "tags": [] }, - "outputs": [], + "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": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "char_to_num.get_vocabulary()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "797ff78b-b48f-4e14-bb62-8cd0ebf9501a", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "char_to_num(['n','i','c','k'])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "8cd7f4f4-ae77-4509-a4f4-c723787ebad1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "num_to_char([14, 9, 3, 11])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "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", + "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", + " 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": null, + "execution_count": 13, "id": "dd01ca9f-77fb-4643-a2aa-47dd82c5d66b", "metadata": { "tags": [] }, "outputs": [], "source": [ - "def load_data(path: str): \n", + "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", + " frames = load_video(video_path)\n", " alignments = load_alignments(alignment_path)\n", - " \n", + "\n", " return frames, alignments" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "8cb7cc58-31ae-4904-a805-1177a82717d2", "metadata": { "tags": [] }, "outputs": [], "source": [ + "import os\n", + "\n", + "pwd = os.getcwd()\n", + "\n", + "# test_path = os.path.join(pwd,'data','s1','bbal6n.mpg')\n", + "\n", "test_path = '.\\\\data\\\\s1\\\\bbal6n.mpg'" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "76aa964f-0c84-490d-897a-d00e3966e2c9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'bbal6n'" + ] + }, + "execution_count": 15, + "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": null, + "execution_count": 16, "id": "eb602c71-8560-4f9e-b26b-08202febb937", "metadata": { "scrolled": true, @@ -285,37 +1563,82 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "0e3184a1-6b02-4b4f-84a8-a0a65f951ea2", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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6EHDqpks2QW9dLgnVL6K15vfxWiAbQvYtnyKmQA9uErjbo93LCfhszJf9ulI3O4Px2VZkb17noEIp/jNZH2O73cpw74vOXi/fVtPKZDnFY09rwBlHvM0yxXkW8z7YqQI3wwYU/xdPBZEv8P4ffHYeZMhu4z8zwtlKvj74plKjqohBw4coK6uruluhqIoiqIoE6Cvr48WLVrkPGbGTT6CIKBDhw6RMYa6u7upr6+Pmpubj3/iHGJ4eJi6urq0b8ZB+yYa7ZtotG/GR/slGu2bMMYYGhkZoQULFpB/nJhUM0528X2fFi1aRMPDw0RE1NzcrA82Au2baLRvotG+iUb7Zny0X6LRvpG0tLQc/yBSg1NFURRFUWqMTj4URVEURakpM3bykUql6G//9m8plTpOUJg5iPZNNNo30WjfRKN9Mz7aL9Fo35wYM87gVFEURVGU2c2MXflQFEVRFGV2opMPRVEURVFqik4+FEVRFEWpKTr5UBRFURSlpszYycemTZto8eLFlE6naeXKlbR79+7pblJN2bhxI1144YXU1NRE8+fPp2uvvZb27dsnjslms7Ru3Tpqb2+nxsZGWrNmDQ0MDExTi6ePO++8kzzPo1tvvbX8u7ncNwcPHqQ/+ZM/ofb2dqqrq6MPfehD9Oyzz5bLjTH0ta99jU477TSqq6ujVatW0auvvjqNLa4NpVKJvvrVr9KSJUuorq6O3v/+99M3vvENkYdirvTN008/TVdddRUtWLCAPM+jhx56SJRX0g9Hjx6lG264gZqbm6m1tZVuvPFGGh0dreFdTA2uvikUCnT77bfThz70IWpoaKAFCxbQZz7zGTp06JCoY7b2zaRiZiAPPPCASSaT5l//9V/Nr371K/Pnf/7nprW11QwMDEx302rG6tWrzebNm82LL75o9u7da6644grT3d1tRkdHy8fcdNNNpqury2zbts08++yz5qKLLjIf+chHprHVtWf37t1m8eLF5txzzzW33HJL+fdztW+OHj1qTj/9dPPZz37W7Nq1y7z22mtm69at5je/+U35mDvvvNO0tLSYhx56yPziF78wV199tVmyZIk5duzYNLZ86rnjjjtMe3u7efTRR83rr79utmzZYhobG823v/3t8jFzpW8ee+wx85WvfMX86Ec/MkRkHnzwQVFeST9cdtll5sMf/rDZuXOn+fnPf27OOOMMc/3119f4TiYfV98MDg6aVatWmR/84AfmlVdeMTt27DArVqwwy5YtE3XM1r6ZTGbk5GPFihVm3bp15f1SqWQWLFhgNm7cOI2tml4OHz5siMhs377dGPPeS5BIJMyWLVvKx7z88suGiMyOHTumq5k1ZWRkxJx55pnmiSeeML/3e79XnnzM5b65/fbbzUc/+tHI8iAITGdnp/mHf/iH8u8GBwdNKpUy//Ef/1GLJk4bV155pfmzP/sz8bvrrrvO3HDDDcaYuds3+Ae2kn546aWXDBGZPXv2lI/56U9/ajzPMwcPHqxZ26ea8SZmyO7duw0RmTfffNMYM3f65kSZcbJLPp+n3t5eWrVqVfl3vu/TqlWraMeOHdPYsullaGiIiIja2tqIiKi3t5cKhYLop6VLl1J3d/ec6ad169bRlVdeKfqAaG73zcMPP0zLly+nP/qjP6L58+fT+eefT9/73vfK5a+//jr19/eLvmlpaaGVK1fO+r75yEc+Qtu2baNf//rXRET0i1/8gp555hm6/PLLiWhu9w2nkn7YsWMHtba20vLly8vHrFq1inzfp127dtW8zdPJ0NAQeZ5Hra2tRKR9UykzLrHcO++8Q6VSiTo6OsTvOzo66JVXXpmmVk0vQRDQrbfeShdffDGdc845RETU399PyWSyPOB/R0dHB/X3909DK2vLAw88QM899xzt2bMnVDaX++a1116je+65h9avX09//dd/TXv27KG//Mu/pGQySWvXri3f/3jv12zvmy9/+cs0PDxMS5cupVgsRqVSie644w664YYbiIjmdN9wKumH/v5+mj9/viiPx+PU1tY2p/oqm83S7bffTtdff305uZz2TWXMuMmHEmbdunX04osv0jPPPDPdTZkR9PX10S233EJPPPEEpdPp6W7OjCIIAlq+fDn93d/9HRERnX/++fTiiy/Sd7/7XVq7du00t256+eEPf0jf//736f7776cPfvCDtHfvXrr11ltpwYIFc75vlOopFAr0x3/8x2SMoXvuuWe6m3PSMeNkl1NPPZVisVjIM2FgYIA6OzunqVXTx80330yPPvoo/exnP6NFixaVf9/Z2Un5fJ4GBwfF8XOhn3p7e+nw4cN0wQUXUDwep3g8Ttu3b6fvfOc7FI/HqaOjY872zWmnnUYf+MAHxO/OPvts2r9/PxFR+f7n4vv1V3/1V/TlL3+ZPv3pT9OHPvQh+tM//VO67bbbaOPGjUQ0t/uGU0k/dHZ20uHDh0V5sViko0ePzom++t3E480336QnnniivOpBpH1TKTNu8pFMJmnZsmW0bdu28u+CIKBt27ZRT0/PNLasthhj6Oabb6YHH3yQnnzySVqyZIkoX7ZsGSUSCdFP+/bto/3798/6frr00kvphRdeoL1795Z/li9fTjfccEN5e672zcUXXxxyyf71r39Np59+OhERLVmyhDo7O0XfDA8P065du2Z932QyGfJ9+cmLxWIUBAERze2+4VTSDz09PTQ4OEi9vb3lY5588kkKgoBWrlxZ8zbXkt9NPF599VX6r//6L2pvbxflc7lvqmK6LV7H44EHHjCpVMrcd9995qWXXjKf//znTWtrq+nv75/uptWML3zhC6alpcU89dRT5q233ir/ZDKZ8jE33XST6e7uNk8++aR59tlnTU9Pj+np6ZnGVk8f3NvFmLnbN7t37zbxeNzccccd5tVXXzXf//73TX19vfn3f//38jF33nmnaW1tNT/+8Y/NL3/5S3PNNdfMSndSZO3atWbhwoVlV9sf/ehH5tRTTzVf+tKXysfMlb4ZGRkxzz//vHn++ecNEZl//Md/NM8//3zZY6OSfrjsssvM+eefb3bt2mWeeeYZc+aZZ84Kd1JX3+TzeXP11VebRYsWmb1794pvcy6XK9cxW/tmMpmRkw9jjPmnf/on093dbZLJpFmxYoXZuXPndDepphDRuD+bN28uH3Ps2DHzF3/xF+aUU04x9fX15pOf/KR56623pq/R0whOPuZy3zzyyCPmnHPOMalUyixdutT8y7/8iygPgsB89atfNR0dHSaVSplLL73U7Nu3b5paWzuGh4fNLbfcYrq7u006nTbve9/7zFe+8hXxR2Ou9M3Pfvazcb8va9euNcZU1g9Hjhwx119/vWlsbDTNzc3mc5/7nBkZGZmGu5lcXH3z+uuvR36bf/azn5XrmK19M5l4xrDwfoqiKIqiKFPMjLP5UBRFURRldqOTD0VRFEVRaopOPhRFURRFqSk6+VAURVEUpabo5ENRFEVRlJqikw9FURRFUWqKTj4URVEURakpOvlQFEVRFKWm6ORDURRFUZSaopMPRVEURVFqik4+FEVRFEWpKTr5UBRFURSlpvxfIjhXX9FTNvYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plt.imshow(frames[40])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "d7ec0833-d54b-4073-84cf-92d011c60ec1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "alignments" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "fe1ad370-b287-4b46-85a2-7c45b0bd9b10", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "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": null, + "execution_count": 20, "id": "6871031a-b0ba-4c76-a852-f6329b0f2606", "metadata": { "tags": [] @@ -339,7 +1662,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "7686355d-45aa-4c85-ad9c-053e6a9b4d81", "metadata": { "tags": [] @@ -351,7 +1674,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "f066fea2-91b1-42ed-a67d-00566a1a53ff", "metadata": { "tags": [] @@ -363,27 +1686,167 @@ "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", + "# Added for split\n", "train = data.take(450)\n", "test = data.skip(450)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "6b1365bd-7742-41d1-95d4-247021751c3a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "50" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "len(test)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "id": "5281bde8-fdc8-4da1-bd55-5a7929a9e80c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "OpenCV: Couldn't read video stream from file \"data/s1/.mpg\"\n", + "2024-06-21 14:54:32.104702: 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 \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n", + " return func(device, token, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n", + " outputs = self._call(device, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n", + " ret = self._func(*args)\n", + " ^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n", + " return func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1624089498.py\", line 9, in load_data\n", + " alignments = load_alignments(alignment_path)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1342149016.py\", line 2, in load_alignments\n", + " with open(path, 'r') as f:\n", + " ^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n", + " return io_open(file, *args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + "FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", + "\n", + "\n", + "2024-06-21 14:54:32.104778: W tensorflow/core/framework/local_rendezvous.cc:404] Local rendezvous is aborting with status: UNKNOWN: FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", + "Traceback (most recent call last):\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n", + " return func(device, token, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n", + " outputs = self._call(device, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n", + " ret = self._func(*args)\n", + " ^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n", + " return func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1624089498.py\", line 9, in load_data\n", + " alignments = load_alignments(alignment_path)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1342149016.py\", line 2, in load_alignments\n", + " with open(path, 'r') as f:\n", + " ^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n", + " return io_open(file, *args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + "FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", + "\n", + "\n", + "\t [[{{node EagerPyFunc}}]]\n", + "OpenCV: Couldn't read video stream from file \"data/s1/.mpg\"\n", + "2024-06-21 14:54:32.108771: 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 \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n", + " return func(device, token, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n", + " outputs = self._call(device, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n", + " ret = self._func(*args)\n", + " ^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n", + " return func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1624089498.py\", line 9, in load_data\n", + " alignments = load_alignments(alignment_path)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1342149016.py\", line 2, in load_alignments\n", + " with open(path, 'r') as f:\n", + " ^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n", + " return io_open(file, *args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\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 \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n return func(device, token, args)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n outputs = self._call(device, args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n ret = self._func(*args)\n ^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n return func(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^\n\n File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1624089498.py\", line 9, in load_data\n alignments = load_alignments(alignment_path)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1342149016.py\", line 2, in load_alignments\n with open(path, 'r') as f:\n ^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n return io_open(file, *args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\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[24], 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~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/data/ops/dataset_ops.py:4729\u001b[0m, in \u001b[0;36mNumpyIterator.next\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 4728\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-> 4729\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~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/data/ops/dataset_ops.py:4726\u001b[0m, in \u001b[0;36mNumpyIterator.__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 4723\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 4724\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m numpy\n\u001b[0;32m-> 4726\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~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/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~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/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~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/gen_dataset_ops.py:3086\u001b[0m, in \u001b[0;36miterator_get_next\u001b[0;34m(iterator, output_types, output_shapes, name)\u001b[0m\n\u001b[1;32m 3084\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _result\n\u001b[1;32m 3085\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-> 3086\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 3087\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m _core\u001b[38;5;241m.\u001b[39m_FallbackException:\n\u001b[1;32m 3088\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n", + "File \u001b[0;32m~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/framework/ops.py:5983\u001b[0m, in \u001b[0;36mraise_from_not_ok_status\u001b[0;34m(e, name)\u001b[0m\n\u001b[1;32m 5981\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 5982\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-> 5983\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 \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n return func(device, token, args)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n outputs = self._call(device, args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n ret = self._func(*args)\n ^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n return func(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^\n\n File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1624089498.py\", line 9, in load_data\n alignments = load_alignments(alignment_path)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_16494/1342149016.py\", line 2, in load_alignments\n with open(path, 'r') as f:\n ^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n return io_open(file, *args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\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()" ] @@ -393,7 +1856,18 @@ "execution_count": null, "id": "cbebe683-6afd-47fd-bba4-c83b4b13bb32", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "75" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "len(frames)" ] @@ -418,7 +1892,136 @@ "scrolled": true, "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "OpenCV: Couldn't read video stream from file \"data/s1/.mpg\"\n", + "2024-06-21 14:03:24.295650: 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 \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n", + " return func(device, token, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n", + " outputs = self._call(device, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n", + " ret = self._func(*args)\n", + " ^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n", + " return func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1624089498.py\", line 9, in load_data\n", + " alignments = load_alignments(alignment_path)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1342149016.py\", line 2, in load_alignments\n", + " with open(path, 'r') as f:\n", + " ^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n", + " return io_open(file, *args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + "FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", + "\n", + "\n", + "2024-06-21 14:03:24.295742: W tensorflow/core/framework/local_rendezvous.cc:404] Local rendezvous is aborting with status: UNKNOWN: FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", + "Traceback (most recent call last):\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n", + " return func(device, token, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n", + " outputs = self._call(device, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n", + " ret = self._func(*args)\n", + " ^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n", + " return func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1624089498.py\", line 9, in load_data\n", + " alignments = load_alignments(alignment_path)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1342149016.py\", line 2, in load_alignments\n", + " with open(path, 'r') as f:\n", + " ^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n", + " return io_open(file, *args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + "FileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n", + "\n", + "\n", + "\t [[{{node EagerPyFunc}}]]\n", + "OpenCV: Couldn't read video stream from file \"data/s1/.mpg\"\n", + "2024-06-21 14:03:24.308939: 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 \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n", + " return func(device, token, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n", + " outputs = self._call(device, args)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n", + " ret = self._func(*args)\n", + " ^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n", + " return func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1624089498.py\", line 9, in load_data\n", + " alignments = load_alignments(alignment_path)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "\n", + " File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1342149016.py\", line 2, in load_alignments\n", + " with open(path, 'r') as f:\n", + " ^^^^^^^^^^^^^^^\n", + "\n", + " File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n", + " return io_open(file, *args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\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 \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n return func(device, token, args)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n outputs = self._call(device, args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n ret = self._func(*args)\n ^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n return func(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^\n\n File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1624089498.py\", line 9, in load_data\n alignments = load_alignments(alignment_path)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1342149016.py\", line 2, in load_alignments\n with open(path, 'r') as f:\n ^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n return io_open(file, *args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\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[56], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m val \u001b[38;5;241m=\u001b[39m sample\u001b[38;5;241m.\u001b[39mnext(); val[\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[0;32m~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/data/ops/dataset_ops.py:4729\u001b[0m, in \u001b[0;36mNumpyIterator.next\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 4728\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-> 4729\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~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/data/ops/dataset_ops.py:4726\u001b[0m, in \u001b[0;36mNumpyIterator.__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 4723\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 4724\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m numpy\n\u001b[0;32m-> 4726\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~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/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~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/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~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/gen_dataset_ops.py:3086\u001b[0m, in \u001b[0;36miterator_get_next\u001b[0;34m(iterator, output_types, output_shapes, name)\u001b[0m\n\u001b[1;32m 3084\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _result\n\u001b[1;32m 3085\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-> 3086\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 3087\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m _core\u001b[38;5;241m.\u001b[39m_FallbackException:\n\u001b[1;32m 3088\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n", + "File \u001b[0;32m~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/framework/ops.py:5983\u001b[0m, in \u001b[0;36mraise_from_not_ok_status\u001b[0;34m(e, name)\u001b[0m\n\u001b[1;32m 5981\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 5982\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-> 5983\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 \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 268, in __call__\n return func(device, token, args)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 146, in __call__\n outputs = self._call(device, args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/script_ops.py\", line 153, in _call\n ret = self._func(*args)\n ^^^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/autograph/impl/api.py\", line 643, in wrapper\n return func(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^\n\n File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1624089498.py\", line 9, in load_data\n alignments = load_alignments(alignment_path)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n File \"/var/folders/5y/8wf3zbrx6k91qcb2jgf69fl40000gn/T/ipykernel_80855/1342149016.py\", line 2, in load_alignments\n with open(path, 'r') as f:\n ^^^^^^^^^^^^^^^\n\n File \"/Users/lihaidun/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 324, in _modified_open\n return io_open(file, *args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFileNotFoundError: [Errno 2] No such file or directory: 'data/alignments/s1/.align'\n\n\n\t [[{{node EagerPyFunc}}]] [Op:IteratorGetNext] name: " + ] + } + ], "source": [ "val = sample.next(); val[0]" ] @@ -430,62 +2033,64 @@ "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'val' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[57], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m imageio\u001b[38;5;241m.\u001b[39mmimsave(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m./animation.gif\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[43mval\u001b[49m[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;241m0\u001b[39m], fps\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m10\u001b[39m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'val' is not defined" + ] + } + ], "source": [ "imageio.mimsave('./animation.gif', val[0][0], fps=10)" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "id": "c33a87a2-d5e0-4ec9-b174-73ebf41bf03a", "metadata": { "tags": [] }, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] } ], "source": [ - "# 0:videos, 0: 1st video out of the batch, 0: return the first frame in the video \n", + "# 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": 35, + "execution_count": null, "id": "84593332-133c-4205-b7a6-8e235d5e2b3b", "metadata": { "tags": [] }, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] } ], "source": [ @@ -504,34 +2109,47 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "id": "d8e9a497-191b-4842-afbd-26f5e13c43ba", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "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" + "import tensorflow\n", + "from tensorflow import keras\n", + "from keras.models import Sequential\n", + "from keras.layers import Conv3D, LSTM, Dense, Dropout, Bidirectional, MaxPool3D, Activation, Reshape, SpatialDropout3D, BatchNormalization, TimeDistributed, Flatten\n", + "from keras.optimizers import Adam\n", + "from keras.callbacks import ModelCheckpoint, LearningRateScheduler" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "id": "3f753ed2-70b9-4236-8c1c-08ca065dc8bf", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "(75, 46, 140, 1)" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] } ], "source": [ @@ -540,12 +2158,23 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "id": "f9171056-a352-491a-9ed9-92b28ced268e", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "model = Sequential()\n", "model.add(Conv3D(128, 3, input_shape=(75,46,140,1), padding='same'))\n", @@ -562,10 +2191,11 @@ "\n", "model.add(TimeDistributed(Flatten()))\n", "\n", - "model.add(Bidirectional(LSTM(128, kernel_initializer='Orthogonal', return_sequences=True)))\n", + "initializer = keras.initializers.Orthogonal()\n", + "model.add(Bidirectional(LSTM(128, kernel_initializer=initializer, return_sequences=True)))\n", "model.add(Dropout(.5))\n", "\n", - "model.add(Bidirectional(LSTM(128, kernel_initializer='Orthogonal', return_sequences=True)))\n", + "model.add(Bidirectional(LSTM(128, kernel_initializer=initializer, 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'))" @@ -573,7 +2203,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "id": "78851825-2bcd-42a9-b7f2-28bb5a6bf43a", "metadata": { "collapsed": true, @@ -584,54 +2214,13 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - " Layer (type) Output Shape Param # \n", - "=================================================================\n", - " conv3d (Conv3D) (None, 75, 46, 140, 128) 3584 \n", - " \n", - " activation (Activation) (None, 75, 46, 140, 128) 0 \n", - " \n", - " max_pooling3d (MaxPooling3D (None, 75, 23, 70, 128) 0 \n", - " ) \n", - " \n", - " conv3d_1 (Conv3D) (None, 75, 23, 70, 256) 884992 \n", - " \n", - " activation_1 (Activation) (None, 75, 23, 70, 256) 0 \n", - " \n", - " max_pooling3d_1 (MaxPooling (None, 75, 11, 35, 256) 0 \n", - " 3D) \n", - " \n", - " conv3d_2 (Conv3D) (None, 75, 11, 35, 75) 518475 \n", - " \n", - " activation_2 (Activation) (None, 75, 11, 35, 75) 0 \n", - " \n", - " max_pooling3d_2 (MaxPooling (None, 75, 5, 17, 75) 0 \n", - " 3D) \n", - " \n", - " time_distributed (TimeDistr (None, 75, 6375) 0 \n", - " ibuted) \n", - " \n", - " bidirectional (Bidirectiona (None, 75, 256) 6660096 \n", - " l) \n", - " \n", - " dropout (Dropout) (None, 75, 256) 0 \n", - " \n", - " bidirectional_1 (Bidirectio (None, 75, 256) 394240 \n", - " nal) \n", - " \n", - " dropout_1 (Dropout) (None, 75, 256) 0 \n", - " \n", - " dense (Dense) (None, 75, 41) 10537 \n", - " \n", - "=================================================================\n", - "Total params: 8,471,924\n", - "Trainable params: 8,471,924\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" ] } ], @@ -644,24 +2233,38 @@ "execution_count": null, "id": "f4b4798c-a65a-4c47-9e2a-3b09dc98d320", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "5*17*75" ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "id": "e5c2eae0-c359-41a4-97a0-75c44dccb7d1", "metadata": { "tags": [] }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "1/1 [==============================] - 3s 3s/step\n" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" ] } ], @@ -671,19 +2274,19 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "id": "ffdc7319-0d69-4f7e-a6d4-ce72deb81c0b", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] } ], "source": [ @@ -692,21 +2295,21 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "id": "6ed47531-8317-4255-9a12-b757642258e6", "metadata": { "tags": [] }, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] } ], "source": [ @@ -715,21 +2318,21 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "id": "7c37b9b9-5298-4038-9c33-5031d1b457f0", "metadata": { "tags": [] }, "outputs": [ { - "data": { - "text/plain": [ - "(None, 75, 46, 140, 1)" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] } ], "source": [ @@ -738,21 +2341,21 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "id": "98b316a4-5322-4782-8e36-4b3c1a696d85", "metadata": { "tags": [] }, "outputs": [ { - "data": { - "text/plain": [ - "(None, 75, 41)" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] } ], "source": [ @@ -771,12 +2374,23 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "id": "ab015fd0-7fb4-4d5d-9fa2-30a05dbd515a", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "def scheduler(epoch, lr):\n", " if epoch < 30:\n", @@ -787,12 +2401,23 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "id": "c564d5c9-db54-4e88-b311-9aeab7fb3e69", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "def CTCLoss(y_true, y_pred):\n", " batch_len = tf.cast(tf.shape(y_true)[0], dtype=\"int64\")\n", @@ -808,22 +2433,33 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "id": "a26dc3fc-a19c-4378-bd8c-e2b597a1d15c", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ - "class ProduceExample(tf.keras.callbacks.Callback): \n", - " def __init__(self, dataset) -> None: \n", + "class ProduceExample(tf.keras.callbacks.Callback):\n", + " def __init__(self, dataset) -> None:\n", " self.dataset = dataset.as_numpy_iterator()\n", - " \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", + " 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)" @@ -831,75 +2467,112 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "id": "04be90d8-2482-46f9-b513-d5f4f8001c7e", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "model.compile(optimizer=Adam(learning_rate=0.0001), loss=CTCLoss)" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "id": "eab49367-3f1e-4464-ae76-dbd07549d97e", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ - "checkpoint_callback = ModelCheckpoint(os.path.join('models','checkpoint'), monitor='loss', save_weights_only=True) " + "checkpoint_callback = ModelCheckpoint(os.path.join('models','checkpoint'), monitor='loss', save_weights_only=True)" ] }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "id": "e085a632-d464-46ef-8777-959cad4adb2c", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "schedule_callback = LearningRateScheduler(scheduler)" ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "id": "48eca991-90ab-4592-8a79-b50e9ca015b6", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "example_callback = ProduceExample(test)" ] }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "id": "8ffba483-aa61-4bbe-a15f-a73e1ddf097c", "metadata": { "tags": [] }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/100\n", - " 2/450 [..............................] - ETA: 3:03 - loss: 213.9969 " - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "KeyboardInterrupt\n", - "\n" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" ] } ], @@ -924,7 +2597,18 @@ "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "url = 'https://drive.google.com/uc?id=1vWscXs4Vt0a_1IH1-ct2TCgXAZT-N3_Y'\n", "output = 'checkpoints.zip'\n", @@ -934,21 +2618,21 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "id": "247f664d-3c87-4e96-946e-930dad0e1c2c", "metadata": { "tags": [] }, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] } ], "source": [ @@ -957,41 +2641,66 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": null, "id": "7f8d689f-b7bb-443c-9b88-e40c1d800828", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "test_data = test.as_numpy_iterator()" ] }, { "cell_type": "code", - "execution_count": 56, + "execution_count": null, "id": "38546dc2-bee9-4837-864b-8a884df40ad7", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "sample = test_data.next()" ] }, { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "id": "a43621f0-229d-4c0d-9554-9c3a3da9c61a", "metadata": { "tags": [] }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "1/1 [==============================] - 1s 973ms/step\n" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" ] } ], @@ -1001,29 +2710,21 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": null, "id": "ea462999-f87e-4a7e-a057-5be7b6d8f7d5", "metadata": { "tags": [] }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ REAL TEXT\n" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" ] - }, - { - "data": { - "text/plain": [ - "[,\n", - " ]" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -1033,41 +2734,44 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": null, "id": "82bd4c10-dd6e-411e-834b-2a3b43fd12c5", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "decoded = tf.keras.backend.ctc_decode(yhat, input_length=[75,75], greedy=True)[0][0].numpy()" ] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": null, "id": "5d68ac46-c90b-4eab-a709-f19aee569ff5", "metadata": { "tags": [] }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PREDICTIONS\n" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" ] - }, - { - "data": { - "text/plain": [ - "[,\n", - " ]" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -1085,36 +2789,40 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": null, "id": "a8b0c4d0-2031-4331-b91d-d87b1ae6f6e2", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "sample = load_data(tf.convert_to_tensor('.\\\\data\\\\s1\\\\bras9a.mpg'))" ] }, { "cell_type": "code", - "execution_count": 62, + "execution_count": null, "id": "0cca60e4-47a9-4683-8a75-48f4684f723d", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ REAL TEXT\n" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" ] - }, - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -1124,15 +2832,18 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": null, "id": "8cc5037c-1e32-435c-b0cc-01e1fb3b863c", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "1/1 [==============================] - 1s 720ms/step\n" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" ] } ], @@ -1142,36 +2853,40 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": null, "id": "22c4f77d-715d-409f-bc5e-3ebe48704e8f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [ "decoded = tf.keras.backend.ctc_decode(yhat, input_length=[75], greedy=True)[0][0].numpy()" ] }, { "cell_type": "code", - "execution_count": 65, + "execution_count": null, "id": "e4d12ecc-b634-499e-a4bc-db9f010835fb", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PREDICTIONS\n" + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" ] - }, - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -1184,7 +2899,18 @@ "execution_count": null, "id": "551dfea2-de6b-4400-b71a-a17631529e3f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [] }, { @@ -1192,15 +2918,26 @@ "execution_count": null, "id": "fa95863d-3832-47bf-8a77-ebaa38054ace", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'Python 3.12.4' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall'" + ] + } + ], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "lips", + "display_name": "Python 3", "language": "python", - "name": "lips" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -1212,7 +2949,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/LipNet_my.ipynb b/LipNet_my.ipynb new file mode 100755 index 00000000..a67e8019 --- /dev/null +++ b/LipNet_my.ipynb @@ -0,0 +1,2520 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "view-in-github" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "id": "a3573a47-3689-4668-b62f-5c8451b2b4e9", + "metadata": { + "id": "a3573a47-3689-4668-b62f-5c8451b2b4e9", + "tags": [] + }, + "source": [ + "# 0. Install and Import Dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ddfbccbe-41ae-4c23-98b1-a13868e2b499", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ddfbccbe-41ae-4c23-98b1-a13868e2b499", + "outputId": "964dae10-91f7-4769-b15c-4a00ca9db312", + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Package Version\n", + "----------------------- -----------\n", + "absl-py 2.1.0\n", + "appnope 0.1.4\n", + "asttokens 2.4.1\n", + "astunparse 1.6.3\n", + "beautifulsoup4 4.12.3\n", + "certifi 2024.6.2\n", + "charset-normalizer 3.3.2\n", + "comm 0.2.2\n", + "contourpy 1.2.1\n", + "cycler 0.12.1\n", + "debugpy 1.8.1\n", + "decorator 5.1.1\n", + "executing 2.0.1\n", + "filelock 3.15.3\n", + "flatbuffers 24.3.25\n", + "fonttools 4.53.0\n", + "gast 0.5.4\n", + "gdown 5.2.0\n", + "google-pasta 0.2.0\n", + "grpcio 1.64.1\n", + "h5py 3.11.0\n", + "idna 3.7\n", + "imageio 2.34.1\n", + "ipykernel 6.29.4\n", + "ipython 8.25.0\n", + "jedi 0.19.1\n", + "jupyter_client 8.6.2\n", + "jupyter_core 5.7.2\n", + "keras 3.3.3\n", + "kiwisolver 1.4.5\n", + "libclang 18.1.1\n", + "Markdown 3.6\n", + "markdown-it-py 3.0.0\n", + "MarkupSafe 2.1.5\n", + "matplotlib 3.9.0\n", + "matplotlib-inline 0.1.7\n", + "mdurl 0.1.2\n", + "ml-dtypes 0.3.2\n", + "namex 0.0.8\n", + "nest-asyncio 1.6.0\n", + "numpy 1.26.4\n", + "opencv-python 4.10.0.84\n", + "opt-einsum 3.3.0\n", + "optree 0.11.0\n", + "packaging 24.1\n", + "parso 0.8.4\n", + "pexpect 4.9.0\n", + "pillow 10.3.0\n", + "pip 24.1\n", + "platformdirs 4.2.2\n", + "prompt_toolkit 3.0.47\n", + "protobuf 4.25.3\n", + "psutil 6.0.0\n", + "ptyprocess 0.7.0\n", + "pure-eval 0.2.2\n", + "Pygments 2.18.0\n", + "pyparsing 3.1.2\n", + "PySocks 1.7.1\n", + "python-dateutil 2.9.0.post0\n", + "pyzmq 26.0.3\n", + "requests 2.32.3\n", + "rich 13.7.1\n", + "setuptools 70.1.0\n", + "six 1.16.0\n", + "soupsieve 2.5\n", + "stack-data 0.6.3\n", + "tensorboard 2.16.2\n", + "tensorboard-data-server 0.7.2\n", + "tensorflow 2.16.1\n", + "termcolor 2.4.0\n", + "tornado 6.4.1\n", + "tqdm 4.66.4\n", + "traitlets 5.14.3\n", + "typing_extensions 4.12.2\n", + "urllib3 2.2.2\n", + "wcwidth 0.2.13\n", + "Werkzeug 3.0.3\n", + "wheel 0.43.0\n", + "wrapt 1.16.0\n" + ] + } + ], + "source": [ + "!pip3 list" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "02f907ea-f669-46c7-adcf-7f257e663448", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "02f907ea-f669-46c7-adcf-7f257e663448", + "outputId": "e444b2f9-189a-40bd-a2f9-925f13917c35", + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: opencv-python in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (4.6.0.66)\n", + "Requirement already satisfied: matplotlib in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (3.8.4)\n", + "Requirement already satisfied: imageio in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (2.23.0)\n", + "Requirement already satisfied: gdown in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (5.1.0)\n", + "Requirement already satisfied: tensorflow in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (2.16.1)\n", + "Requirement already satisfied: numpy>=1.21.2 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from opencv-python) (1.26.4)\n", + "Requirement already satisfied: contourpy>=1.0.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from matplotlib) (1.2.1)\n", + "Requirement already satisfied: cycler>=0.10 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from matplotlib) (4.51.0)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from matplotlib) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from matplotlib) (24.0)\n", + "Requirement already satisfied: pillow>=8 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from matplotlib) (10.3.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from matplotlib) (3.1.2)\n", + "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from matplotlib) (2.9.0.post0)\n", + "Requirement already satisfied: beautifulsoup4 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gdown) (4.12.3)\n", + "Requirement already satisfied: filelock in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gdown) (3.13.4)\n", + "Requirement already satisfied: requests[socks] in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gdown) (2.31.0)\n", + "Requirement already satisfied: tqdm in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gdown) (4.66.2)\n", + "Requirement already satisfied: tensorflow-intel==2.16.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow) (2.16.1)\n", + "Requirement already satisfied: absl-py>=1.0.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (2.1.0)\n", + "Requirement already satisfied: astunparse>=1.6.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (1.6.3)\n", + "Requirement already satisfied: flatbuffers>=23.5.26 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (24.3.25)\n", + "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (0.5.4)\n", + "Requirement already satisfied: google-pasta>=0.1.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (0.2.0)\n", + "Requirement already satisfied: h5py>=3.10.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (3.11.0)\n", + "Requirement already satisfied: libclang>=13.0.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (18.1.1)\n", + "Requirement already satisfied: ml-dtypes~=0.3.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (0.3.2)\n", + "Requirement already satisfied: opt-einsum>=2.3.2 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (3.3.0)\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 c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (4.25.3)\n", + "Requirement already satisfied: setuptools in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (69.2.0)\n", + "Requirement already satisfied: six>=1.12.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (1.16.0)\n", + "Requirement already satisfied: termcolor>=1.1.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (2.4.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.6 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (4.11.0)\n", + "Requirement already satisfied: wrapt>=1.11.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (1.16.0)\n", + "Requirement already satisfied: grpcio<2.0,>=1.24.3 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (1.62.1)\n", + "Requirement already satisfied: tensorboard<2.17,>=2.16 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorflow-intel==2.16.1->tensorflow) (2.16.2)\n", + "Collecting keras>=3.0.0 (from tensorflow-intel==2.16.1->tensorflow)\n", + " Using cached keras-3.2.1-py3-none-any.whl.metadata (5.6 kB)\n", + "Requirement already satisfied: soupsieve>1.2 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from beautifulsoup4->gdown) (2.5)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from requests[socks]->gdown) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from requests[socks]->gdown) (3.7)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from requests[socks]->gdown) (2.2.1)\n", + "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from requests[socks]->gdown) (2024.2.2)\n", + "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from requests[socks]->gdown) (1.7.1)\n", + "Requirement already satisfied: colorama in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tqdm->gdown) (0.4.6)\n", + "Requirement already satisfied: wheel<1.0,>=0.23.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from astunparse>=1.6.0->tensorflow-intel==2.16.1->tensorflow) (0.43.0)\n", + "Requirement already satisfied: rich in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from keras>=3.0.0->tensorflow-intel==2.16.1->tensorflow) (13.7.1)\n", + "Requirement already satisfied: namex in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from keras>=3.0.0->tensorflow-intel==2.16.1->tensorflow) (0.0.7)\n", + "Requirement already satisfied: optree in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from keras>=3.0.0->tensorflow-intel==2.16.1->tensorflow) (0.11.0)\n", + "Requirement already satisfied: markdown>=2.6.8 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorboard<2.17,>=2.16->tensorflow-intel==2.16.1->tensorflow) (3.6)\n", + "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorboard<2.17,>=2.16->tensorflow-intel==2.16.1->tensorflow) (0.7.2)\n", + "Requirement already satisfied: werkzeug>=1.0.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tensorboard<2.17,>=2.16->tensorflow-intel==2.16.1->tensorflow) (3.0.2)\n", + "Requirement already satisfied: MarkupSafe>=2.1.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from werkzeug>=1.0.1->tensorboard<2.17,>=2.16->tensorflow-intel==2.16.1->tensorflow) (2.1.5)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from rich->keras>=3.0.0->tensorflow-intel==2.16.1->tensorflow) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from rich->keras>=3.0.0->tensorflow-intel==2.16.1->tensorflow) (2.17.2)\n", + "Requirement already satisfied: mdurl~=0.1 in c:\\users\\lhdto\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.0.0->tensorflow-intel==2.16.1->tensorflow) (0.1.2)\n", + "Using cached keras-3.2.1-py3-none-any.whl (1.1 MB)\n", + "Installing collected packages: keras\n", + "Successfully installed keras-3.2.1\n" + ] + } + ], + "source": [ + "!pip3 install opencv-python matplotlib imageio gdown tensorflow" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "b24af50c-20b8-409d-ad78-30a933fdd669", + "metadata": { + "id": "b24af50c-20b8-409d-ad78-30a933fdd669", + "tags": [] + }, + "outputs": [], + "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": 27, + "id": "1e3db0b0-e559-4ad6-91fd-e7414b7d75e6", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1e3db0b0-e559-4ad6-91fd-e7414b7d75e6", + "outputId": "c1e41844-c8fd-4efc-eb22-11f3817b0c9f" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tf.config.list_physical_devices('GPU')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "378d045a-3003-4f93-b7d2-a25a97774a68", + "metadata": { + "id": "378d045a-3003-4f93-b7d2-a25a97774a68", + "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": { + "id": "7a19e88e-c7b9-45c1-ae1e-f2109329c71b", + "tags": [] + }, + "source": [ + "# 1. Build Data Loading Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8fb99c90-e05a-437f-839d-6e772f8c1dd5", + "metadata": { + "id": "8fb99c90-e05a-437f-839d-6e772f8c1dd5", + "tags": [] + }, + "outputs": [], + "source": [ + "import gdown" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c019e4c6-2af3-4160-99ea-5c8cb009f1a7", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "c019e4c6-2af3-4160-99ea-5c8cb009f1a7", + "outputId": "49a7c7ff-ab7d-480e-bcfd-ee652ad89af1", + "tags": [] + }, + "outputs": [], + "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": 10, + "id": "8548cc59-6dfc-4acc-abc3-3e65212db02e", + "metadata": { + "id": "8548cc59-6dfc-4acc-abc3-3e65212db02e", + "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": 11, + "id": "ec735e0b-ec98-4eb0-8f49-c35527d6670a", + "metadata": { + "id": "ec735e0b-ec98-4eb0-8f49-c35527d6670a", + "tags": [] + }, + "outputs": [], + "source": [ + "vocab = [x for x in \"abcdefghijklmnopqrstuvwxyz'?!123456789 \"]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "be04e972-d7a5-4a72-82d8-a6bdde1f3ce6", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "be04e972-d7a5-4a72-82d8-a6bdde1f3ce6", + "outputId": "01f490ee-dabf-4e94-c6ed-181e8c1ae2c4", + "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" + ] + } + ], + "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": 13, + "id": "559f7420-6802-45fa-9ca0-b1ff209b461c", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "559f7420-6802-45fa-9ca0-b1ff209b461c", + "outputId": "90f0547b-3308-478e-be4a-c89cef1d58e6", + "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": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "char_to_num.get_vocabulary()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "797ff78b-b48f-4e14-bb62-8cd0ebf9501a", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "797ff78b-b48f-4e14-bb62-8cd0ebf9501a", + "outputId": "cedf213c-95e4-439a-a871-641aec307517", + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "char_to_num(['n','i','c','k'])" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "8cd7f4f4-ae77-4509-a4f4-c723787ebad1", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8cd7f4f4-ae77-4509-a4f4-c723787ebad1", + "outputId": "cb5428be-73ea-47b2-ea8e-4d2c4e3dcb00" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_to_char([14, 9, 3, 11])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "9491bab5-6a3c-4f79-879a-8f9fbe73ae2e", + "metadata": { + "id": "9491bab5-6a3c-4f79-879a-8f9fbe73ae2e", + "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": 17, + "id": "dd01ca9f-77fb-4643-a2aa-47dd82c5d66b", + "metadata": { + "id": "dd01ca9f-77fb-4643-a2aa-47dd82c5d66b", + "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": 18, + "id": "8cb7cc58-31ae-4904-a805-1177a82717d2", + "metadata": { + "id": "8cb7cc58-31ae-4904-a805-1177a82717d2", + "tags": [] + }, + "outputs": [], + "source": [ + "test_path = '.\\\\data\\\\s1\\\\bbal6n.mpg'\n", + "# test_path = './data/s1/bbal6n.mpg'" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "76aa964f-0c84-490d-897a-d00e3966e2c9", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "76aa964f-0c84-490d-897a-d00e3966e2c9", + "outputId": "d04d49ad-4eeb-4be1-ffa7-f2655aa86a7a" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'bbal6n'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tf.convert_to_tensor(test_path).numpy().decode('utf-8').split('\\\\')[-1].split('.')[0]\n", + "# tf.convert_to_tensor(test_path).numpy().decode('utf-8').split('/')[-1].split('.')[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "eb602c71-8560-4f9e-b26b-08202febb937", + "metadata": { + "id": "eb602c71-8560-4f9e-b26b-08202febb937", + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "frames, alignments = load_data(tf.convert_to_tensor(test_path))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "0e3184a1-6b02-4b4f-84a8-a0a65f951ea2", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 244 + }, + "id": "0e3184a1-6b02-4b4f-84a8-a0a65f951ea2", + "outputId": "ca65c601-b300-4a41-d8fe-7915a8e5a50b" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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6EHDqpks2QW9dLgnVL6K15vfxWiAbQvYtnyKmQA9uErjbo93LCfhszJf9ulI3O4Px2VZkb17noEIp/jNZH2O73cpw74vOXi/fVtPKZDnFY09rwBlHvM0yxXkW8z7YqQI3wwYU/xdPBZEv8P4ffHYeZMhu4z8zwtlKvj74plKjqohBw4coK6uruluhqIoiqIoE6Cvr48WLVrkPGbGTT6CIKBDhw6RMYa6u7upr6+Pmpubj3/iHGJ4eJi6urq0b8ZB+yYa7ZtotG/GR/slGu2bMMYYGhkZoQULFpB/nJhUM0528X2fFi1aRMPDw0RE1NzcrA82Au2baLRvotG+iUb7Zny0X6LRvpG0tLQc/yBSg1NFURRFUWqMTj4URVEURakpM3bykUql6G//9m8plTpOUJg5iPZNNNo30WjfRKN9Mz7aL9Fo35wYM87gVFEURVGU2c2MXflQFEVRFGV2opMPRVEURVFqik4+FEVRFEWpKTr5UBRFURSlpszYycemTZto8eLFlE6naeXKlbR79+7pblJN2bhxI1144YXU1NRE8+fPp2uvvZb27dsnjslms7Ru3Tpqb2+nxsZGWrNmDQ0MDExTi6ePO++8kzzPo1tvvbX8u7ncNwcPHqQ/+ZM/ofb2dqqrq6MPfehD9Oyzz5bLjTH0ta99jU477TSqq6ujVatW0auvvjqNLa4NpVKJvvrVr9KSJUuorq6O3v/+99M3vvENkYdirvTN008/TVdddRUtWLCAPM+jhx56SJRX0g9Hjx6lG264gZqbm6m1tZVuvPFGGh0dreFdTA2uvikUCnT77bfThz70IWpoaKAFCxbQZz7zGTp06JCoY7b2zaRiZiAPPPCASSaT5l//9V/Nr371K/Pnf/7nprW11QwMDEx302rG6tWrzebNm82LL75o9u7da6644grT3d1tRkdHy8fcdNNNpqury2zbts08++yz5qKLLjIf+chHprHVtWf37t1m8eLF5txzzzW33HJL+fdztW+OHj1qTj/9dPPZz37W7Nq1y7z22mtm69at5je/+U35mDvvvNO0tLSYhx56yPziF78wV199tVmyZIk5duzYNLZ86rnjjjtMe3u7efTRR83rr79utmzZYhobG823v/3t8jFzpW8ee+wx85WvfMX86Ec/MkRkHnzwQVFeST9cdtll5sMf/rDZuXOn+fnPf27OOOMMc/3119f4TiYfV98MDg6aVatWmR/84AfmlVdeMTt27DArVqwwy5YtE3XM1r6ZTGbk5GPFihVm3bp15f1SqWQWLFhgNm7cOI2tml4OHz5siMhs377dGPPeS5BIJMyWLVvKx7z88suGiMyOHTumq5k1ZWRkxJx55pnmiSeeML/3e79XnnzM5b65/fbbzUc/+tHI8iAITGdnp/mHf/iH8u8GBwdNKpUy//Ef/1GLJk4bV155pfmzP/sz8bvrrrvO3HDDDcaYuds3+Ae2kn546aWXDBGZPXv2lI/56U9/ajzPMwcPHqxZ26ea8SZmyO7duw0RmTfffNMYM3f65kSZcbJLPp+n3t5eWrVqVfl3vu/TqlWraMeOHdPYsullaGiIiIja2tqIiKi3t5cKhYLop6VLl1J3d/ec6ad169bRlVdeKfqAaG73zcMPP0zLly+nP/qjP6L58+fT+eefT9/73vfK5a+//jr19/eLvmlpaaGVK1fO+r75yEc+Qtu2baNf//rXRET0i1/8gp555hm6/PLLiWhu9w2nkn7YsWMHtba20vLly8vHrFq1inzfp127dtW8zdPJ0NAQeZ5Hra2tRKR9UykzLrHcO++8Q6VSiTo6OsTvOzo66JVXXpmmVk0vQRDQrbfeShdffDGdc845RETU399PyWSyPOB/R0dHB/X3909DK2vLAw88QM899xzt2bMnVDaX++a1116je+65h9avX09//dd/TXv27KG//Mu/pGQySWvXri3f/3jv12zvmy9/+cs0PDxMS5cupVgsRqVSie644w664YYbiIjmdN9wKumH/v5+mj9/viiPx+PU1tY2p/oqm83S7bffTtdff305uZz2TWXMuMmHEmbdunX04osv0jPPPDPdTZkR9PX10S233EJPPPEEpdPp6W7OjCIIAlq+fDn93d/9HRERnX/++fTiiy/Sd7/7XVq7du00t256+eEPf0jf//736f7776cPfvCDtHfvXrr11ltpwYIFc75vlOopFAr0x3/8x2SMoXvuuWe6m3PSMeNkl1NPPZVisVjIM2FgYIA6OzunqVXTx80330yPPvoo/exnP6NFixaVf9/Z2Un5fJ4GBwfF8XOhn3p7e+nw4cN0wQUXUDwep3g8Ttu3b6fvfOc7FI/HqaOjY872zWmnnUYf+MAHxO/OPvts2r9/PxFR+f7n4vv1V3/1V/TlL3+ZPv3pT9OHPvQh+tM//VO67bbbaOPGjUQ0t/uGU0k/dHZ20uHDh0V5sViko0ePzom++t3E480336QnnniivOpBpH1TKTNu8pFMJmnZsmW0bdu28u+CIKBt27ZRT0/PNLasthhj6Oabb6YHH3yQnnzySVqyZIkoX7ZsGSUSCdFP+/bto/3798/6frr00kvphRdeoL1795Z/li9fTjfccEN5e672zcUXXxxyyf71r39Np59+OhERLVmyhDo7O0XfDA8P065du2Z932QyGfJ9+cmLxWIUBAERze2+4VTSDz09PTQ4OEi9vb3lY5588kkKgoBWrlxZ8zbXkt9NPF599VX6r//6L2pvbxflc7lvqmK6LV7H44EHHjCpVMrcd9995qWXXjKf//znTWtrq+nv75/uptWML3zhC6alpcU89dRT5q233ir/ZDKZ8jE33XST6e7uNk8++aR59tlnTU9Pj+np6ZnGVk8f3NvFmLnbN7t37zbxeNzccccd5tVXXzXf//73TX19vfn3f//38jF33nmnaW1tNT/+8Y/NL3/5S3PNNdfMSndSZO3atWbhwoVlV9sf/ehH5tRTTzVf+tKXysfMlb4ZGRkxzz//vHn++ecNEZl//Md/NM8//3zZY6OSfrjsssvM+eefb3bt2mWeeeYZc+aZZ84Kd1JX3+TzeXP11VebRYsWmb1794pvcy6XK9cxW/tmMpmRkw9jjPmnf/on093dbZLJpFmxYoXZuXPndDepphDRuD+bN28uH3Ps2DHzF3/xF+aUU04x9fX15pOf/KR56623pq/R0whOPuZy3zzyyCPmnHPOMalUyixdutT8y7/8iygPgsB89atfNR0dHSaVSplLL73U7Nu3b5paWzuGh4fNLbfcYrq7u006nTbve9/7zFe+8hXxR2Ou9M3Pfvazcb8va9euNcZU1g9Hjhwx119/vWlsbDTNzc3mc5/7nBkZGZmGu5lcXH3z+uuvR36bf/azn5XrmK19M5l4xrDwfoqiKIqiKFPMjLP5UBRFURRldqOTD0VRFEVRaopOPhRFURRFqSk6+VAURVEUpabo5ENRFEVRlJqikw9FURRFUWqKTj4URVEURakpOvlQFEVRFKWm6ORDURRFUZSaopMPRVEURVFqik4+FEVRFEWpKTr5UBRFURSlpvxfIjhXX9FTNvYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(frames[40])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "d7ec0833-d54b-4073-84cf-92d011c60ec1", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "d7ec0833-d54b-4073-84cf-92d011c60ec1", + "outputId": "02abd7a1-113b-42b1-a6ba-9a458373b112" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alignments" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "fe1ad370-b287-4b46-85a2-7c45b0bd9b10", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fe1ad370-b287-4b46-85a2-7c45b0bd9b10", + "outputId": "8910d788-545b-4e76-b154-4a90d8e63927" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "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": 24, + "id": "6871031a-b0ba-4c76-a852-f6329b0f2606", + "metadata": { + "id": "6871031a-b0ba-4c76-a852-f6329b0f2606", + "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": { + "id": "c40a7eb4-0c3e-4eab-9291-5611cb68ce08", + "tags": [] + }, + "source": [ + "# 2. Create Data Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "7686355d-45aa-4c85-ad9c-053e6a9b4d81", + "metadata": { + "id": "7686355d-45aa-4c85-ad9c-053e6a9b4d81", + "tags": [] + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "f066fea2-91b1-42ed-a67d-00566a1a53ff", + "metadata": { + "id": "f066fea2-91b1-42ed-a67d-00566a1a53ff", + "tags": [] + }, + "outputs": [ + { + "ename": "InvalidArgumentError", + "evalue": "Expected 'tf.Tensor(False, shape=(), dtype=bool)' to be true. Summarized data: b'No files matched pattern: .\\\\data\\\\s1\\\\*.mpg'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mInvalidArgumentError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[26], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[43mtf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mDataset\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlist_files\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m.\u001b[39;49m\u001b[38;5;130;43;01m\\\\\u001b[39;49;00m\u001b[38;5;124;43mdata\u001b[39;49m\u001b[38;5;130;43;01m\\\\\u001b[39;49;00m\u001b[38;5;124;43ms1\u001b[39;49m\u001b[38;5;130;43;01m\\\\\u001b[39;49;00m\u001b[38;5;124;43m*.mpg\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m data \u001b[38;5;241m=\u001b[39m data\u001b[38;5;241m.\u001b[39mshuffle(\u001b[38;5;241m500\u001b[39m, reshuffle_each_iteration\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 3\u001b[0m data \u001b[38;5;241m=\u001b[39m data\u001b[38;5;241m.\u001b[39mmap(mappable_function)\n", + "File \u001b[0;32m~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/data/ops/dataset_ops.py:1320\u001b[0m, in \u001b[0;36mDatasetV2.list_files\u001b[0;34m(file_pattern, shuffle, seed, name)\u001b[0m\n\u001b[1;32m 1313\u001b[0m condition \u001b[38;5;241m=\u001b[39m math_ops\u001b[38;5;241m.\u001b[39mgreater(array_ops\u001b[38;5;241m.\u001b[39mshape(matching_files)[\u001b[38;5;241m0\u001b[39m], \u001b[38;5;241m0\u001b[39m,\n\u001b[1;32m 1314\u001b[0m name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmatch_not_empty\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1316\u001b[0m message \u001b[38;5;241m=\u001b[39m math_ops\u001b[38;5;241m.\u001b[39madd(\n\u001b[1;32m 1317\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo files matched pattern: \u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 1318\u001b[0m string_ops\u001b[38;5;241m.\u001b[39mreduce_join(file_pattern, separator\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m\"\u001b[39m), name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmessage\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 1320\u001b[0m assert_not_empty \u001b[38;5;241m=\u001b[39m \u001b[43mcontrol_flow_assert\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mAssert\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1321\u001b[0m \u001b[43m \u001b[49m\u001b[43mcondition\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mmessage\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msummarize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43massert_not_empty\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1322\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m ops\u001b[38;5;241m.\u001b[39mcontrol_dependencies([assert_not_empty]):\n\u001b[1;32m 1323\u001b[0m matching_files \u001b[38;5;241m=\u001b[39m array_ops\u001b[38;5;241m.\u001b[39midentity(matching_files)\n", + "File \u001b[0;32m~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/util/traceback_utils.py:153\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 152\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n\u001b[0;32m--> 153\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 155\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n", + "File \u001b[0;32m~/NSCC/CodeSpace/LipNet/.venv/lib/python3.12/site-packages/tensorflow/python/ops/control_flow_assert.py:102\u001b[0m, in \u001b[0;36mAssert\u001b[0;34m(condition, data, summarize, name)\u001b[0m\n\u001b[1;32m 100\u001b[0m xs \u001b[38;5;241m=\u001b[39m ops\u001b[38;5;241m.\u001b[39mconvert_n_to_tensor(data)\n\u001b[1;32m 101\u001b[0m data_str \u001b[38;5;241m=\u001b[39m [_summarize_eager(x, summarize) \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m xs]\n\u001b[0;32m--> 102\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m errors\u001b[38;5;241m.\u001b[39mInvalidArgumentError(\n\u001b[1;32m 103\u001b[0m node_def\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 104\u001b[0m op\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 105\u001b[0m message\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExpected \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to be true. Summarized data: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m\n\u001b[1;32m 106\u001b[0m (condition, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(data_str)))\n\u001b[1;32m 107\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 109\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m ops\u001b[38;5;241m.\u001b[39mname_scope(name, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAssert\u001b[39m\u001b[38;5;124m\"\u001b[39m, [condition, data]) \u001b[38;5;28;01mas\u001b[39;00m name:\n", + "\u001b[0;31mInvalidArgumentError\u001b[0m: Expected 'tf.Tensor(False, shape=(), dtype=bool)' to be true. Summarized data: b'No files matched pattern: .\\\\data\\\\s1\\\\*.mpg'" + ] + } + ], + "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": null, + "id": "4de3b276", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(450, 50)" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(train), len(test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5281bde8-fdc8-4da1-bd55-5a7929a9e80c", + "metadata": { + "id": "5281bde8-fdc8-4da1-bd55-5a7929a9e80c" + }, + "outputs": [], + "source": [ + "frames, alignments = data.as_numpy_iterator().next()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cbebe683-6afd-47fd-bba4-c83b4b13bb32", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cbebe683-6afd-47fd-bba4-c83b4b13bb32", + "outputId": "8924019e-28cd-4bfa-9e1e-bb836d71e6f8" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(frames)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5cf2d676-93a9-434c-b3c7-bdcc2577b2e7", + "metadata": { + "id": "5cf2d676-93a9-434c-b3c7-bdcc2577b2e7", + "tags": [] + }, + "outputs": [], + "source": [ + "sample = data.as_numpy_iterator()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efa6cd46-7079-46c0-b45b-832f339f6cb0", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "efa6cd46-7079-46c0-b45b-832f339f6cb0", + "outputId": "c24ecd06-8d12-4531-df65-27a9f77acada", + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[[ 1.2631532 ],\n", + " [ 1.3815738 ],\n", + " [ 1.1842061 ],\n", + " ...,\n", + " [ 0.3157883 ],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.3421003 ],\n", + " [ 1.4210473 ],\n", + " [ 1.1842061 ],\n", + " ...,\n", + " [ 0.3157883 ],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.2236797 ],\n", + " [ 1.3421003 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0.3157883 ],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " ...,\n", + " [ 0.03947354],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0.03947354],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0.03947354],\n", + " [ 0. ],\n", + " [ 0. ]]],\n", + "\n", + "\n", + " [[[ 1.3421003 ],\n", + " [ 1.4605209 ],\n", + " [ 1.1842061 ],\n", + " ...,\n", + " [ 0.3157883 ],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.4605209 ],\n", + " [ 1.4999944 ],\n", + " [ 1.2631532 ],\n", + " ...,\n", + " [ 0.3157883 ],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.3421003 ],\n", + " [ 1.5789415 ],\n", + " [ 1.3026267 ],\n", + " ...,\n", + " [ 0.27631477],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.1842061 ],\n", + " [ 1.1842061 ],\n", + " [ 1.1842061 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.0657855 ],\n", + " [ 1.0657855 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.0657855 ],\n", + " [ 1.0657855 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [10.065752 ]]],\n", + "\n", + "\n", + " [[[ 1.4210473 ],\n", + " [ 1.4999944 ],\n", + " [ 1.3026267 ],\n", + " ...,\n", + " [ 0.3157883 ],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.4605209 ],\n", + " [ 1.5789415 ],\n", + " [ 1.3421003 ],\n", + " ...,\n", + " [ 0.3157883 ],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.3421003 ],\n", + " [ 1.618415 ],\n", + " [ 1.3026267 ],\n", + " ...,\n", + " [ 0.27631477],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.2236797 ],\n", + " [ 1.2236797 ],\n", + " [ 1.1842061 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.1842061 ],\n", + " [ 1.1842061 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.1842061 ],\n", + " [ 1.1842061 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]]],\n", + "\n", + "\n", + " ...,\n", + "\n", + "\n", + " [[[ 1.1447326 ],\n", + " [ 1.1447326 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0.27631477],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.1447326 ],\n", + " [ 1.1447326 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0.27631477],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.1842061 ],\n", + " [ 1.3026267 ],\n", + " [ 0.98683846],\n", + " ...,\n", + " [ 0.19736768],\n", + " [ 0.19736768],\n", + " [ 0.19736768]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.1447326 ],\n", + " [ 1.1447326 ],\n", + " [ 1.1052591 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [10.065752 ]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0. ],\n", + " [10.065752 ],\n", + " [10.065752 ]]],\n", + "\n", + "\n", + " [[[ 1.1052591 ],\n", + " [ 1.1447326 ],\n", + " [ 0.98683846],\n", + " ...,\n", + " [ 0.27631477],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 0.9473649 ],\n", + " ...,\n", + " [ 0.27631477],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.3815738 ],\n", + " [ 1.4210473 ],\n", + " [ 0.98683846],\n", + " ...,\n", + " [ 0.27631477],\n", + " [ 0.27631477],\n", + " [ 0.19736768]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.1447326 ],\n", + " [ 1.1447326 ],\n", + " [ 1.1052591 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [10.065752 ]]],\n", + "\n", + "\n", + " [[[ 1.026312 ],\n", + " [ 1.1447326 ],\n", + " [ 1.026312 ],\n", + " ...,\n", + " [ 0.27631477],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.0657855 ],\n", + " [ 0.8684178 ],\n", + " ...,\n", + " [ 0.27631477],\n", + " [ 0.27631477],\n", + " [ 0.27631477]],\n", + "\n", + " [[ 1.3815738 ],\n", + " [ 1.4210473 ],\n", + " [ 0.98683846],\n", + " ...,\n", + " [ 0.23684123],\n", + " [ 0.23684123],\n", + " [ 0.23684123]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.0657855 ],\n", + " [ 1.0657855 ],\n", + " [ 1.0657855 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " [ 1.1052591 ],\n", + " ...,\n", + " [ 0. ],\n", + " [ 0. ],\n", + " [10.065752 ]]]],\n", + "\n", + "\n", + "\n", + " [[[[ 1.5229521 ],\n", + " [ 1.4848783 ],\n", + " [ 1.3325831 ],\n", + " ...,\n", + " [ 0.41881183],\n", + " [ 0.34266424],\n", + " [ 0.34266424]],\n", + "\n", + " [[ 1.5229521 ],\n", + " [ 1.5229521 ],\n", + " [ 1.4087307 ],\n", + " ...,\n", + " [ 0.41881183],\n", + " [ 0.34266424],\n", + " [ 0.34266424]],\n", + "\n", + " [[ 1.4468045 ],\n", + " [ 1.4468045 ],\n", + " [ 1.5229521 ],\n", + " ...,\n", + " [ 0.34266424],\n", + " [ 0.30459043],\n", + " [ 0.30459043]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.0660665 ],\n", + " [ 1.0660665 ],\n", + " [ 1.0660665 ],\n", + " ...,\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ],\n", + " [ 0. ]]],\n", + "\n", + "\n", + " [[[ 1.561026 ],\n", + " [ 1.370657 ],\n", + " [ 1.370657 ],\n", + " ...,\n", + " [ 0.38073802],\n", + " [ 0.34266424],\n", + " [ 0.34266424]],\n", + "\n", + " [[ 1.4848783 ],\n", + " [ 1.4087307 ],\n", + " [ 1.3325831 ],\n", + " ...,\n", + " [ 0.38073802],\n", + " [ 0.34266424],\n", + " [ 0.34266424]],\n", + "\n", + " [[ 1.4087307 ],\n", + " [ 1.4087307 ],\n", + " [ 1.4468045 ],\n", + " ...,\n", + " [ 0.34266424],\n", + " [ 0.30459043],\n", + " [ 0.30459043]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.0660665 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]],\n", + "\n", + " [[ 1.0660665 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 0.9899189 ],\n", + " [ 0.9899189 ],\n", + " ...,\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ],\n", + " [ 0. ]]],\n", + "\n", + "\n", + " [[[ 1.561026 ],\n", + " [ 1.4087307 ],\n", + " [ 1.4848783 ],\n", + " ...,\n", + " [ 0.34266424],\n", + " [ 0.34266424],\n", + " [ 0.34266424]],\n", + "\n", + " [[ 1.5229521 ],\n", + " [ 1.4848783 ],\n", + " [ 1.370657 ],\n", + " ...,\n", + " [ 0.34266424],\n", + " [ 0.34266424],\n", + " [ 0.34266424]],\n", + "\n", + " [[ 1.4848783 ],\n", + " [ 1.4848783 ],\n", + " [ 1.5229521 ],\n", + " ...,\n", + " [ 0.34266424],\n", + " [ 0.34266424],\n", + " [ 0.34266424]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.0660665 ],\n", + " [ 1.0660665 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 0.9899189 ],\n", + " [ 0.9899189 ],\n", + " ...,\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ],\n", + " [ 0. ]]],\n", + "\n", + "\n", + " ...,\n", + "\n", + "\n", + " [[[ 1.561026 ],\n", + " [ 1.4087307 ],\n", + " [ 1.180288 ],\n", + " ...,\n", + " [ 0.30459043],\n", + " [ 0.26651663],\n", + " [ 0.26651663]],\n", + "\n", + " [[ 1.5229521 ],\n", + " [ 1.4468045 ],\n", + " [ 1.1422141 ],\n", + " ...,\n", + " [ 0.30459043],\n", + " [ 0.26651663],\n", + " [ 0.26651663]],\n", + "\n", + " [[ 1.4848783 ],\n", + " [ 1.4848783 ],\n", + " [ 1.4848783 ],\n", + " ...,\n", + " [ 0.30459043],\n", + " [ 0.30459043],\n", + " [ 0.30459043]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.11422141],\n", + " [ 0.07614761],\n", + " [ 0.0380738 ]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.07614761],\n", + " [ 0.0380738 ],\n", + " [ 0. ]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.07614761],\n", + " [ 0.0380738 ],\n", + " [ 0. ]]],\n", + "\n", + "\n", + " [[[ 1.561026 ],\n", + " [ 1.4468045 ],\n", + " [ 1.2183617 ],\n", + " ...,\n", + " [ 0.30459043],\n", + " [ 0.34266424],\n", + " [ 0.34266424]],\n", + "\n", + " [[ 1.561026 ],\n", + " [ 1.4087307 ],\n", + " [ 1.2183617 ],\n", + " ...,\n", + " [ 0.30459043],\n", + " [ 0.34266424],\n", + " [ 0.34266424]],\n", + "\n", + " [[ 1.5229521 ],\n", + " [ 1.5229521 ],\n", + " [ 1.561026 ],\n", + " ...,\n", + " [ 0.34266424],\n", + " [ 0.30459043],\n", + " [ 0.30459043]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.11422141],\n", + " [ 0.07614761],\n", + " [ 0.07614761]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.07614761],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.07614761],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]]],\n", + "\n", + "\n", + " [[[ 1.5990998 ],\n", + " [ 1.4468045 ],\n", + " [ 1.2564355 ],\n", + " ...,\n", + " [ 0.34266424],\n", + " [ 0.38073802],\n", + " [ 0.38073802]],\n", + "\n", + " [[ 1.5229521 ],\n", + " [ 1.4087307 ],\n", + " [ 1.2564355 ],\n", + " ...,\n", + " [ 0.34266424],\n", + " [ 0.38073802],\n", + " [ 0.38073802]],\n", + "\n", + " [[ 1.561026 ],\n", + " [ 1.561026 ],\n", + " [ 1.561026 ],\n", + " ...,\n", + " [ 0.34266424],\n", + " [ 0.30459043],\n", + " [ 0.34266424]],\n", + "\n", + " ...,\n", + "\n", + " [[ 1.0660665 ],\n", + " [ 1.0660665 ],\n", + " [ 1.0660665 ],\n", + " ...,\n", + " [ 0.11422141],\n", + " [ 0.07614761],\n", + " [ 0.07614761]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.07614761],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]],\n", + "\n", + " [[ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " [ 1.0279927 ],\n", + " ...,\n", + " [ 0.07614761],\n", + " [ 0.0380738 ],\n", + " [ 0.0380738 ]]]]], dtype=float32)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "val = sample.next(); val[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "acf5eb4f-a0da-4a9a-bf24-af13e9cc2fbe", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "acf5eb4f-a0da-4a9a-bf24-af13e9cc2fbe", + "outputId": "2b7ce709-6400-402c-ab9d-0e4c5739cafc", + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n", + "Lossy conversion from float32 to uint8. Range [0.0, 10.065752029418945]. Convert image to uint8 prior to saving to suppress this warning.\n" + ] + } + ], + "source": [ + "imageio.mimsave('.\\\\animation.gif', val[0][0], fps=10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c33a87a2-d5e0-4ec9-b174-73ebf41bf03a", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 244 + }, + "id": "c33a87a2-d5e0-4ec9-b174-73ebf41bf03a", + "outputId": "1b7cc028-1990-4714-8d7e-fda85218c0d5", + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "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": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "84593332-133c-4205-b7a6-8e235d5e2b3b", + "outputId": "69f24afc-2cb9-4d07-9d93-3b4e1fde5046", + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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": { + "id": "0f47733c-83bc-465c-b118-b198b492ad37", + "tags": [] + }, + "source": [ + "# 3. Design the Deep Neural Network" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8e9a497-191b-4842-afbd-26f5e13c43ba", + "metadata": { + "id": "d8e9a497-191b-4842-afbd-26f5e13c43ba", + "tags": [] + }, + "outputs": [], + "source": [ + "import tensorflow\n", + "from tensorflow import keras\n", + "\n", + "from keras.models import Sequential\n", + "from keras.layers import Conv3D, LSTM, Dense, Dropout, Bidirectional, MaxPool3D, Activation, Reshape, SpatialDropout3D, BatchNormalization, TimeDistributed, Flatten\n", + "from keras.optimizers import Adam\n", + "from keras.callbacks import ModelCheckpoint, LearningRateScheduler\n", + "from keras.layers import LSTM, Bidirectional\n", + "from keras.initializers import Orthogonal\n", + "from keras.layers import Lambda\n", + "from keras.layers import Reshape\n", + "import tensorflow as tf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f753ed2-70b9-4236-8c1c-08ca065dc8bf", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3f753ed2-70b9-4236-8c1c-08ca065dc8bf", + "outputId": "b06442c3-cc68-4c88-d5e8-c9a915fc8b96" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(75, 46, 140, 1)" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.as_numpy_iterator().next()[0][0].shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9171056-a352-491a-9ed9-92b28ced268e", + "metadata": { + "id": "f9171056-a352-491a-9ed9-92b28ced268e", + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\convolutional\\base_conv.py:99: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n", + " super().__init__(\n" + ] + } + ], + "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(Lambda(lambda x: tf.print(\"Shape before TimeDistributed:\", tf.shape(x))))\n", + "\n", + "model.add(TimeDistributed(Flatten()))\n", + "\n", + "# model.add(Reshape((-1, 75*5*17)))\n", + "\n", + "# model.add(Bidirectional(LSTM(128, return_sequences=True)))\n", + "model.add(Bidirectional(LSTM(128, return_sequences=True)))\n", + "\n", + "# # model.add(Bidirectional(LSTM(128, kernel_initializer='Orthogonal', return_sequences=True)))\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(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": "ab905c18", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Model: \"sequential\"\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"sequential\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+              "┃ Layer (type)                     Output Shape                  Param # ┃\n",
+              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+              "│ conv3d (Conv3D)                 │ (None, 75, 46, 140,    │         3,584 │\n",
+              "│                                 │ 128)                   │               │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ activation (Activation)         │ (None, 75, 46, 140,    │             0 │\n",
+              "│                                 │ 128)                   │               │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ max_pooling3d (MaxPooling3D)    │ (None, 75, 23, 70,     │             0 │\n",
+              "│                                 │ 128)                   │               │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ conv3d_1 (Conv3D)               │ (None, 75, 23, 70,     │       884,992 │\n",
+              "│                                 │ 256)                   │               │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ activation_1 (Activation)       │ (None, 75, 23, 70,     │             0 │\n",
+              "│                                 │ 256)                   │               │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ max_pooling3d_1 (MaxPooling3D)  │ (None, 75, 11, 35,     │             0 │\n",
+              "│                                 │ 256)                   │               │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ conv3d_2 (Conv3D)               │ (None, 75, 11, 35, 75) │       518,475 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ activation_2 (Activation)       │ (None, 75, 11, 35, 75) │             0 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ max_pooling3d_2 (MaxPooling3D)  │ (None, 75, 5, 17, 75)  │             0 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ time_distributed                │ (None, 75, 6375)       │             0 │\n",
+              "│ (TimeDistributed)               │                        │               │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ bidirectional (Bidirectional)   │ (None, 75, 256)        │     6,660,096 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ bidirectional_1 (Bidirectional) │ (None, 75, 256)        │       394,240 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ dropout (Dropout)               │ (None, 75, 256)        │             0 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ bidirectional_2 (Bidirectional) │ (None, 75, 256)        │       394,240 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ dropout_1 (Dropout)             │ (None, 75, 256)        │             0 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ dense (Dense)                   │ (None, 75, 41)         │        10,537 │\n",
+              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+              "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", + "│ conv3d (\u001b[38;5;33mConv3D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m46\u001b[0m, \u001b[38;5;34m140\u001b[0m, │ \u001b[38;5;34m3,584\u001b[0m │\n", + "│ │ \u001b[38;5;34m128\u001b[0m) │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ activation (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m46\u001b[0m, \u001b[38;5;34m140\u001b[0m, │ \u001b[38;5;34m0\u001b[0m │\n", + "│ │ \u001b[38;5;34m128\u001b[0m) │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ max_pooling3d (\u001b[38;5;33mMaxPooling3D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m23\u001b[0m, \u001b[38;5;34m70\u001b[0m, │ \u001b[38;5;34m0\u001b[0m │\n", + "│ │ \u001b[38;5;34m128\u001b[0m) │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ conv3d_1 (\u001b[38;5;33mConv3D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m23\u001b[0m, \u001b[38;5;34m70\u001b[0m, │ \u001b[38;5;34m884,992\u001b[0m │\n", + "│ │ \u001b[38;5;34m256\u001b[0m) │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ activation_1 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m23\u001b[0m, \u001b[38;5;34m70\u001b[0m, │ \u001b[38;5;34m0\u001b[0m │\n", + "│ │ \u001b[38;5;34m256\u001b[0m) │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ max_pooling3d_1 (\u001b[38;5;33mMaxPooling3D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m35\u001b[0m, │ \u001b[38;5;34m0\u001b[0m │\n", + "│ │ \u001b[38;5;34m256\u001b[0m) │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ conv3d_2 (\u001b[38;5;33mConv3D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m35\u001b[0m, \u001b[38;5;34m75\u001b[0m) │ \u001b[38;5;34m518,475\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ activation_2 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m35\u001b[0m, \u001b[38;5;34m75\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ max_pooling3d_2 (\u001b[38;5;33mMaxPooling3D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m17\u001b[0m, \u001b[38;5;34m75\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ time_distributed │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m6375\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "│ (\u001b[38;5;33mTimeDistributed\u001b[0m) │ │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ bidirectional (\u001b[38;5;33mBidirectional\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m6,660,096\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ bidirectional_1 (\u001b[38;5;33mBidirectional\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m394,240\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ bidirectional_2 (\u001b[38;5;33mBidirectional\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m394,240\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m75\u001b[0m, \u001b[38;5;34m41\u001b[0m) │ \u001b[38;5;34m10,537\u001b[0m │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 8,866,164 (33.82 MB)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m8,866,164\u001b[0m (33.82 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 8,866,164 (33.82 MB)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m8,866,164\u001b[0m (33.82 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 0 (0.00 B)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fae71bed", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6375" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "5*17*75" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a5815ab", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 3s/step\n" + ] + } + ], + "source": [ + "yhat = model.predict(val[0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65eccd93", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6ed47531-8317-4255-9a12-b757642258e6", + "outputId": "5b755432-4136-4834-fd69-78aace01b57b", + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7c37b9b9-5298-4038-9c33-5031d1b457f0", + "outputId": "fcdf9c94-35db-4aa0-fcf7-3029f32eac97", + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(None, 75, 46, 140, 1)" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.input_shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98b316a4-5322-4782-8e36-4b3c1a696d85", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "98b316a4-5322-4782-8e36-4b3c1a696d85", + "outputId": "5f9ebad7-b4cc-4ac8-c5e6-f5471120f50f", + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(None, 75, 41)" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.output_shape" + ] + }, + { + "cell_type": "markdown", + "id": "2ec02176-5c26-46c3-aff7-8352e6563c7d", + "metadata": { + "id": "2ec02176-5c26-46c3-aff7-8352e6563c7d", + "tags": [] + }, + "source": [ + "# 4. Setup Training Options and Train" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab015fd0-7fb4-4d5d-9fa2-30a05dbd515a", + "metadata": { + "id": "ab015fd0-7fb4-4d5d-9fa2-30a05dbd515a", + "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": { + "id": "c564d5c9-db54-4e88-b311-9aeab7fb3e69", + "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": { + "id": "a26dc3fc-a19c-4378-bd8c-e2b597a1d15c", + "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": { + "id": "04be90d8-2482-46f9-b513-d5f4f8001c7e", + "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": { + "id": "eab49367-3f1e-4464-ae76-dbd07549d97e", + "tags": [] + }, + "outputs": [], + "source": [ + "# Adjust the file path to end with '.weights.h5'\n", + "checkpoint_path = os.path.join('models', 'overlapped-weights368.weights.h5')\n", + "\n", + "# Create the ModelCheckpoint callback\n", + "checkpoint_callback = ModelCheckpoint(\n", + " filepath=checkpoint_path,\n", + " monitor='loss',\n", + " save_weights_only=True\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e085a632-d464-46ef-8777-959cad4adb2c", + "metadata": { + "id": "e085a632-d464-46ef-8777-959cad4adb2c", + "tags": [] + }, + "outputs": [], + "source": [ + "schedule_callback = LearningRateScheduler(scheduler)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48eca991-90ab-4592-8a79-b50e9ca015b6", + "metadata": { + "id": "48eca991-90ab-4592-8a79-b50e9ca015b6", + "tags": [] + }, + "outputs": [], + "source": [ + "example_callback = ProduceExample(test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ffba483-aa61-4bbe-a15f-a73e1ddf097c", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8ffba483-aa61-4bbe-a15f-a73e1ddf097c", + "outputId": "5ac8771e-cd3b-4d4d-eaf5-15add3c1e8ae", + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/100\n", + "WARNING:tensorflow:From c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\legacy\\backend.py:666: The name tf.nn.ctc_loss is deprecated. Please use tf.compat.v1.nn.ctc_loss instead.\n", + "\n" + ] + }, + { + "ename": "InvalidArgumentError", + "evalue": "Graph execution error:\n\nDetected at node sequential_1/time_distributed_1/Reshape_17 defined at (most recent call last):\n File \"\", line 198, in _run_module_as_main\n\n File \"\", line 88, in _run_code\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel_launcher.py\", line 18, in \n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\traitlets\\config\\application.py\", line 1075, in launch_instance\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelapp.py\", line 739, in start\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\tornado\\platform\\asyncio.py\", line 205, in start\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_events.py\", line 641, in run_forever\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_events.py\", line 1987, in _run_once\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\events.py\", line 88, in _run\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 545, in dispatch_queue\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 534, in process_one\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 437, in dispatch_shell\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 362, in execute_request\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 778, in execute_request\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 449, in do_execute\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\zmqshell.py\", line 549, in run_cell\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3075, in run_cell\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3130, in _run_cell\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\async_helpers.py\", line 129, in _pseudo_sync_runner\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3334, in run_cell_async\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3517, in run_ast_nodes\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3577, in run_code\n\n File \"C:\\Users\\lhdto\\AppData\\Local\\Temp\\ipykernel_11284\\3536403359.py\", line 1, in \n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py\", line 329, in fit\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py\", line 122, in one_step_on_iterator\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py\", line 110, in one_step_on_data\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py\", line 57, in train_step\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\layer.py\", line 826, in __call__\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\ops\\operation.py\", line 48, in __call__\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 156, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\models\\sequential.py\", line 206, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\models\\functional.py\", line 199, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\ops\\function.py\", line 151, in _run_through_graph\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\models\\functional.py\", line 583, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\layer.py\", line 826, in __call__\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\ops\\operation.py\", line 48, in __call__\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 156, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\rnn\\time_distributed.py\", line 108, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\rnn\\time_distributed.py\", line 102, in step_function\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\reshaping\\flatten.py\", line 54, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\ops\\numpy.py\", line 4527, in reshape\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\numpy.py\", line 1618, in reshape\n\nOnly one input size may be -1, not both 0 and 1\n\t [[{{node sequential_1/time_distributed_1/Reshape_17}}]] [Op:__inference_one_step_on_iterator_34683]", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mInvalidArgumentError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[50], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrain\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalidation_data\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mepochs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m100\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[43mcheckpoint_callback\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mschedule_callback\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexample_callback\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py:122\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 119\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n\u001b[0;32m 120\u001b[0m \u001b[38;5;66;03m# To get the full stack trace, call:\u001b[39;00m\n\u001b[0;32m 121\u001b[0m \u001b[38;5;66;03m# `keras.config.disable_traceback_filtering()`\u001b[39;00m\n\u001b[1;32m--> 122\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 123\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 124\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n", + "File \u001b[1;32mc:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\tensorflow\\python\\eager\\execute.py:53\u001b[0m, in \u001b[0;36mquick_execute\u001b[1;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[0;32m 51\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 52\u001b[0m ctx\u001b[38;5;241m.\u001b[39mensure_initialized()\n\u001b[1;32m---> 53\u001b[0m tensors \u001b[38;5;241m=\u001b[39m pywrap_tfe\u001b[38;5;241m.\u001b[39mTFE_Py_Execute(ctx\u001b[38;5;241m.\u001b[39m_handle, device_name, op_name,\n\u001b[0;32m 54\u001b[0m inputs, attrs, num_outputs)\n\u001b[0;32m 55\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 56\u001b[0m \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:\n", + "\u001b[1;31mInvalidArgumentError\u001b[0m: Graph execution error:\n\nDetected at node sequential_1/time_distributed_1/Reshape_17 defined at (most recent call last):\n File \"\", line 198, in _run_module_as_main\n\n File \"\", line 88, in _run_code\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel_launcher.py\", line 18, in \n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\traitlets\\config\\application.py\", line 1075, in launch_instance\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelapp.py\", line 739, in start\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\tornado\\platform\\asyncio.py\", line 205, in start\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_events.py\", line 641, in run_forever\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_events.py\", line 1987, in _run_once\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\events.py\", line 88, in _run\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 545, in dispatch_queue\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 534, in process_one\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 437, in dispatch_shell\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 362, in execute_request\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 778, in execute_request\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 449, in do_execute\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ipykernel\\zmqshell.py\", line 549, in run_cell\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3075, in run_cell\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3130, in _run_cell\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\async_helpers.py\", line 129, in _pseudo_sync_runner\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3334, in run_cell_async\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3517, in run_ast_nodes\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3577, in run_code\n\n File \"C:\\Users\\lhdto\\AppData\\Local\\Temp\\ipykernel_11284\\3536403359.py\", line 1, in \n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py\", line 329, in fit\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py\", line 122, in one_step_on_iterator\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py\", line 110, in one_step_on_data\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py\", line 57, in train_step\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\layer.py\", line 826, in __call__\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\ops\\operation.py\", line 48, in __call__\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 156, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\models\\sequential.py\", line 206, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\models\\functional.py\", line 199, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\ops\\function.py\", line 151, in _run_through_graph\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\models\\functional.py\", line 583, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\layer.py\", line 826, in __call__\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 117, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\ops\\operation.py\", line 48, in __call__\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 156, in error_handler\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\rnn\\time_distributed.py\", line 108, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\rnn\\time_distributed.py\", line 102, in step_function\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\layers\\reshaping\\flatten.py\", line 54, in call\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\ops\\numpy.py\", line 4527, in reshape\n\n File \"c:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\numpy.py\", line 1618, in reshape\n\nOnly one input size may be -1, not both 0 and 1\n\t [[{{node sequential_1/time_distributed_1/Reshape_17}}]] [Op:__inference_one_step_on_iterator_34683]" + ] + } + ], + "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": { + "id": "fa8ee94b-89f7-4733-8a0c-a86f86ff590a", + "tags": [] + }, + "source": [ + "# 5. Make a Prediction" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "01fa7204-ce0e-49a8-8dbd-14fe5dfead40", + "metadata": { + "id": "01fa7204-ce0e-49a8-8dbd-14fe5dfead40", + "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": { + "id": "247f664d-3c87-4e96-946e-930dad0e1c2c", + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "models\\unseen-weights178.h5\n" + ] + }, + { + "ename": "ValueError", + "evalue": "Layer count mismatch when loading weights from file. Model expected 7 layers, found 9 saved layers.", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[51], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m checkpoint_path \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmodels\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124munseen-weights178.h5\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(checkpoint_path)\n\u001b[1;32m----> 3\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_weights\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcheckpoint_path\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py:122\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 119\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n\u001b[0;32m 120\u001b[0m \u001b[38;5;66;03m# To get the full stack trace, call:\u001b[39;00m\n\u001b[0;32m 121\u001b[0m \u001b[38;5;66;03m# `keras.config.disable_traceback_filtering()`\u001b[39;00m\n\u001b[1;32m--> 122\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 123\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 124\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n", + "File \u001b[1;32mc:\\Users\\lhdto\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\keras\\src\\legacy\\saving\\legacy_h5_format.py:357\u001b[0m, in \u001b[0;36mload_weights_from_hdf5_group\u001b[1;34m(f, model)\u001b[0m\n\u001b[0;32m 355\u001b[0m layer_names \u001b[38;5;241m=\u001b[39m filtered_layer_names\n\u001b[0;32m 356\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(layer_names) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mlen\u001b[39m(filtered_layers):\n\u001b[1;32m--> 357\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 358\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLayer count mismatch when loading weights from file. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 359\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mModel expected \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(filtered_layers)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m layers, found \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 360\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(layer_names)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m saved layers.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 361\u001b[0m )\n\u001b[0;32m 363\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m k, name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(layer_names):\n\u001b[0;32m 364\u001b[0m g \u001b[38;5;241m=\u001b[39m f[name]\n", + "\u001b[1;31mValueError\u001b[0m: Layer count mismatch when loading weights from file. Model expected 7 layers, found 9 saved layers." + ] + } + ], + "source": [ + "checkpoint_path = os.path.join('models', 'unseen-weights178.h5')\n", + "print(checkpoint_path)\n", + "model.load_weights(checkpoint_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7f8d689f-b7bb-443c-9b88-e40c1d800828", + "metadata": { + "id": "7f8d689f-b7bb-443c-9b88-e40c1d800828", + "tags": [] + }, + "outputs": [], + "source": [ + "test_data = test.as_numpy_iterator()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38546dc2-bee9-4837-864b-8a884df40ad7", + "metadata": { + "id": "38546dc2-bee9-4837-864b-8a884df40ad7", + "tags": [] + }, + "outputs": [], + "source": [ + "sample = test_data.next()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a43621f0-229d-4c0d-9554-9c3a3da9c61a", + "metadata": { + "id": "a43621f0-229d-4c0d-9554-9c3a3da9c61a", + "tags": [] + }, + "outputs": [], + "source": [ + "yhat = model.predict(sample[0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea462999-f87e-4a7e-a057-5be7b6d8f7d5", + "metadata": { + "id": "ea462999-f87e-4a7e-a057-5be7b6d8f7d5", + "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": { + "id": "82bd4c10-dd6e-411e-834b-2a3b43fd12c5", + "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": { + "id": "5d68ac46-c90b-4eab-a709-f19aee569ff5", + "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": { + "id": "64622f98-e99b-4fed-a2cc-f0da82eb5431" + }, + "source": [ + "# Test on a Video" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8b0c4d0-2031-4331-b91d-d87b1ae6f6e2", + "metadata": { + "id": "a8b0c4d0-2031-4331-b91d-d87b1ae6f6e2" + }, + "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": { + "id": "0cca60e4-47a9-4683-8a75-48f4684f723d" + }, + "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": { + "id": "8cc5037c-1e32-435c-b0cc-01e1fb3b863c" + }, + "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": { + "id": "22c4f77d-715d-409f-bc5e-3ebe48704e8f" + }, + "outputs": [], + "source": [ + "# decoded = tf.keras.backend.ctc_decode(yhat, input_length=[75], greedy=True)[0][0].numpy()\n", + "decoded = 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": { + "id": "e4d12ecc-b634-499e-a4bc-db9f010835fb" + }, + "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": { + "id": "551dfea2-de6b-4400-b71a-a17631529e3f" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa95863d-3832-47bf-8a77-ebaa38054ace", + "metadata": { + "id": "fa95863d-3832-47bf-8a77-ebaa38054ace" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "include_colab_link": true, + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/aligment_generator/align_gen.py b/aligment_generator/align_gen.py new file mode 100644 index 00000000..5b5aeadc --- /dev/null +++ b/aligment_generator/align_gen.py @@ -0,0 +1,49 @@ +from moviepy.editor import VideoFileClip +import speech_recognition as sr +import os +video_path = os.getcwd() + "/data_reprocess/input.mp4" +print('video_path:', video_path) +audio_path = os.getcwd() + "/data_reprocess/input.wav" +print('audio_path:', audio_path) +align_file_path = os.getcwd() + "/data_reprocess/input.txt" +print('align_file_path:', align_file_path) + +def extract_audio_from_video(video_path, audio_path): + video_clip = VideoFileClip(video_path) + audio_clip = video_clip.audio + audio_clip.write_audiofile(audio_path) + +def recognize_speech_from_file(file_path): + recognizer = sr.Recognizer() + + with sr.AudioFile(file_path) as source: + audio = recognizer.record(source) + + return recognizer.recognize_google(audio) + +def format_align_file(transcription): + # For simplicity, let's assume that the words in the transcription are separated by spaces + words = transcription.split() + + # Set the total duration of the video (in milliseconds) + total_duration = 74500 + + # Calculate the approximate duration of each word + word_duration = total_duration / len(words) + + align_file_content = "" + + start_time = 0 + for i, word in enumerate(words): + end_time = start_time + word_duration + align_file_content += f"{start_time} {end_time} {word}\n" + start_time = end_time + + return align_file_content + +extract_audio_from_video(video_path, audio_path) +transcription = recognize_speech_from_file(audio_path) +align_file_content = format_align_file(transcription) + +with open(align_file_path, "w") as align_file: + align_file.write(align_file_content) diff --git a/animation.gif b/animation.gif new file mode 100755 index 00000000..7350284e Binary files /dev/null and b/animation.gif differ diff --git a/app/animation.gif b/app/animation.gif index c95ad362..bd1ce12c 100644 Binary files a/app/animation.gif and b/app/animation.gif differ diff --git a/app/modelutil.py b/app/modelutil.py index 7521a1e9..63533320 100644 --- a/app/modelutil.py +++ b/app/modelutil.py @@ -1,8 +1,13 @@ -import os -from tensorflow.keras.models import Sequential -from tensorflow.keras.layers import Conv3D, LSTM, Dense, Dropout, Bidirectional, MaxPool3D, Activation, Reshape, SpatialDropout3D, BatchNormalization, TimeDistributed, Flatten - -def load_model() -> Sequential: +import os +# from tensorflow.keras.models import Sequential +# from tensorflow.keras.layers import Conv3D, LSTM, Dense, Dropout, Bidirectional, MaxPool3D, Activation, Reshape, SpatialDropout3D, BatchNormalization, TimeDistributed, Flatten +from keras.layers import Conv3D, LSTM, Dense, Dropout, Bidirectional, MaxPool3D, Activation, Reshape, SpatialDropout3D, BatchNormalization, TimeDistributed, Flatten +from keras.models import Sequential +from keras.layers import LSTM, Bidirectional +from keras.initializers import Orthogonal +import tensorflow as tf + +def load_model() -> Sequential: model = Sequential() model.add(Conv3D(128, 3, input_shape=(75,46,140,1), padding='same')) @@ -19,14 +24,29 @@ def load_model() -> Sequential: model.add(TimeDistributed(Flatten())) - model.add(Bidirectional(LSTM(128, kernel_initializer='Orthogonal', return_sequences=True))) + # model.add(Bidirectional(LSTM(128, kernel_initializer='Orthogonal', return_sequences=True))) + model.add(Bidirectional(LSTM(128, kernel_initializer=Orthogonal(), return_sequences=True))) model.add(Dropout(.5)) - model.add(Bidirectional(LSTM(128, kernel_initializer='Orthogonal', return_sequences=True))) + # model.add(Bidirectional(LSTM(128, kernel_initializer='Orthogonal', return_sequences=True))) + model.add(Bidirectional(LSTM(128, kernel_initializer=Orthogonal(), return_sequences=True))) model.add(Dropout(.5)) model.add(Dense(41, kernel_initializer='he_normal', activation='softmax')) - model.load_weights(os.path.join('..','models','checkpoint')) + # model.load_weights(os.path.join('..','models','checkpoint')) + + # Ensure the checkpoint directory is correctly set relative to the script's execution directory + checkpoint_dir = os.path.join('..', 'models') + + # Create a checkpoint instance that points to the folder where the checkpoints are saved + checkpoint = tf.train.Checkpoint(model=model) + + # Restore the latest checkpoint + latest = tf.train.latest_checkpoint(checkpoint_dir) + if latest: + checkpoint.restore(latest) + else: + raise FileNotFoundError(f"No checkpoint found in {checkpoint_dir}") return model \ No newline at end of file diff --git a/app/streamlitapp.py b/app/streamlitapp.py index 3ce027c4..f07b5ee7 100644 --- a/app/streamlitapp.py +++ b/app/streamlitapp.py @@ -1,48 +1,50 @@ # Import all of the dependencies import streamlit as st -import os -import imageio +import os +import imageio +import keras -import tensorflow as tf +import tensorflow as tf from utils import load_data, num_to_char from modelutil import load_model -# Set the layout to the streamlit app as wide +# Set the layout to the streamlit app as wide st.set_page_config(layout='wide') # Setup the sidebar -with st.sidebar: - st.image('https://www.onepointltd.com/wp-content/uploads/2020/03/inno2.png') - st.title('LipBuddy') - st.info('This application is originally developed from the LipNet deep learning model.') +# with st.sidebar: +# st.image('https://www.onepointltd.com/wp-content/uploads/2020/03/inno2.png') +# st.title('LipBuddy') +# st.info('This application is originally developed from the LipNet deep learning model.') -st.title('LipNet Full Stack App') -# Generating a list of options or videos +st.title('LipNet Full Stack App') +# Generating a list of options or videos options = os.listdir(os.path.join('..', 'data', 's1')) selected_video = st.selectbox('Choose video', options) -# Generate two columns +# Generate two columns col1, col2 = st.columns(2) -if options: +if options: - # Rendering the video - with col1: + # Rendering the video + with col1: st.info('The video below displays the converted video in mp4 format') file_path = os.path.join('..','data','s1', selected_video) os.system(f'ffmpeg -i {file_path} -vcodec libx264 test_video.mp4 -y') # Rendering inside of the app - video = open('test_video.mp4', 'rb') - video_bytes = video.read() + video = open('test_video.mp4', 'rb') + # video = open('input.mp4', 'rb') + video_bytes = video.read() st.video(video_bytes) - with col2: + with col2: st.info('This is all the machine learning model sees when making a prediction') video, annotations = load_data(tf.convert_to_tensor(file_path)) imageio.mimsave('animation.gif', video, fps=10) - st.image('animation.gif', width=400) + st.image('animation.gif', width=400) st.info('This is the output of the machine learning model as tokens') model = load_model() @@ -54,4 +56,4 @@ st.info('Decode the raw tokens into words') converted_prediction = tf.strings.reduce_join(num_to_char(decoder)).numpy().decode('utf-8') st.text(converted_prediction) - + diff --git a/app/utils.py b/app/utils.py index b73bfef1..29785c5b 100644 --- a/app/utils.py +++ b/app/utils.py @@ -1,7 +1,8 @@ import tensorflow as tf from typing import List +import numpy as np import cv2 -import os +import os vocab = [x for x in "abcdefghijklmnopqrstuvwxyz'?!123456789 "] char_to_num = tf.keras.layers.StringLookup(vocabulary=vocab, oov_token="") @@ -10,39 +11,40 @@ vocabulary=char_to_num.get_vocabulary(), oov_token="", invert=True ) -def load_video(path:str) -> List[float]: +def load_video(path:str) -> List[float]: #print(path) cap = cv2.VideoCapture(path) frames = [] - for _ in range(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))): + for _ in range(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))): ret, frame = cap.read() frame = tf.image.rgb_to_grayscale(frame) frames.append(frame[190:236,80:220,:]) cap.release() - + mean = tf.math.reduce_mean(frames) std = tf.math.reduce_std(tf.cast(frames, tf.float32)) return tf.cast((frames - mean), tf.float32) / std - -def load_alignments(path:str) -> List[str]: + +def load_alignments(path:str) -> List[str]: #print(path) - with open(path, 'r') as f: - lines = f.readlines() + with open(path, 'r') as f: + lines = f.readlines() tokens = [] for line in lines: line = line.split() - if line[2] != 'sil': + if line[2] != 'sil': tokens = [*tokens,' ',line[2]] return char_to_num(tf.reshape(tf.strings.unicode_split(tokens, input_encoding='UTF-8'), (-1)))[1:] -def load_data(path: str): +def load_data(path: str): path = bytes.decode(path.numpy()) file_name = path.split('/')[-1].split('.')[0] # File name splitting for windows file_name = path.split('\\')[-1].split('.')[0] video_path = os.path.join('..','data','s1',f'{file_name}.mpg') alignment_path = os.path.join('..','data','alignments','s1',f'{file_name}.align') - frames = load_video(video_path) + frames = load_video(video_path) + print(frames.shape) alignments = load_alignments(alignment_path) - + return frames, alignments \ No newline at end of file