diff --git "a/Final_Training.ipynb" "b/Final_Training.ipynb" --- "a/Final_Training.ipynb" +++ "b/Final_Training.ipynb" @@ -1,2546 +1,3189 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "ba8dc4a1", - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: huggingface_hub in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (1.2.3)\n", - "Requirement already satisfied: filelock in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (3.20.0)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (2025.10.0)\n", - "Requirement already satisfied: hf-xet<2.0.0,>=1.2.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (1.2.0)\n", - "Requirement already satisfied: httpx<1,>=0.23.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (0.28.1)\n", - "Requirement already satisfied: packaging>=20.9 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (25.0)\n", - "Requirement already satisfied: pyyaml>=5.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (6.0.3)\n", - "Requirement already satisfied: shellingham in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (1.5.4)\n", - "Requirement already satisfied: tqdm>=4.42.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (4.67.1)\n", - "Requirement already satisfied: typer-slim in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (0.21.0)\n", - "Requirement already satisfied: typing-extensions>=3.7.4.3 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from huggingface_hub) (4.15.0)\n", - "Requirement already satisfied: anyio in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from httpx<1,>=0.23.0->huggingface_hub) (4.12.0)\n", - "Requirement already satisfied: certifi in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from httpx<1,>=0.23.0->huggingface_hub) (2025.11.12)\n", - "Requirement already satisfied: httpcore==1.* in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from httpx<1,>=0.23.0->huggingface_hub) (1.0.9)\n", - "Requirement already satisfied: idna in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from httpx<1,>=0.23.0->huggingface_hub) (3.11)\n", - "Requirement already satisfied: h11>=0.16 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from httpcore==1.*->httpx<1,>=0.23.0->huggingface_hub) (0.16.0)\n", - "Requirement already satisfied: colorama in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from tqdm>=4.42.1->huggingface_hub) (0.4.6)\n", - "Requirement already satisfied: click>=8.0.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from typer-slim->huggingface_hub) (8.3.1)\n", - "Requirement already satisfied: opencv-python in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (4.12.0)\n", - "Requirement already satisfied: torch in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (2.5.1)\n", - "Requirement already satisfied: numpy in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (2.3.1)\n", - "Requirement already satisfied: torchvision in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (0.20.1)\n", - "Requirement already satisfied: tqdm in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (4.67.1)\n", - "Requirement already satisfied: filelock in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch) (3.20.0)\n", - "Requirement already satisfied: typing-extensions>=4.8.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch) (4.15.0)\n", - "Requirement already satisfied: networkx in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch) (3.6.1)\n", - "Requirement already satisfied: jinja2 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch) (3.1.6)\n", - "Requirement already satisfied: fsspec in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch) (2025.10.0)\n", - "Requirement already satisfied: setuptools in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch) (72.1.0)\n", - "Requirement already satisfied: sympy!=1.13.2,>=1.13.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch) (1.14.0)\n", - "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torchvision) (12.0.0)\n", - "Requirement already satisfied: colorama in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from tqdm) (0.4.6)\n", - "Requirement already satisfied: mpmath<1.4,>=1.1.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from sympy!=1.13.2,>=1.13.1->torch) (1.3.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from jinja2->torch) (3.0.2)\n", - "Requirement already satisfied: ultralytics in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (8.3.240)\n", - "Requirement already satisfied: numpy>=1.23.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (2.3.1)\n", - "Requirement already satisfied: matplotlib>=3.3.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (3.10.8)\n", - "Requirement already satisfied: opencv-python>=4.6.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (4.12.0)\n", - "Requirement already satisfied: pillow>=7.1.2 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (12.0.0)\n", - "Requirement already satisfied: pyyaml>=5.3.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (6.0.3)\n", - "Requirement already satisfied: requests>=2.23.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (2.32.5)\n", - "Requirement already satisfied: scipy>=1.4.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (1.16.3)\n", - "Requirement already satisfied: torch>=1.8.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (2.5.1)\n", - "Requirement already satisfied: torchvision>=0.9.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (0.20.1)\n", - "Requirement already satisfied: psutil>=5.8.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (7.1.3)\n", - "Requirement already satisfied: polars>=0.20.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (1.36.1)\n", - "Requirement already satisfied: ultralytics-thop>=2.0.18 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from ultralytics) (2.0.18)\n", - "Requirement already satisfied: contourpy>=1.0.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from matplotlib>=3.3.0->ultralytics) (1.3.3)\n", - "Requirement already satisfied: cycler>=0.10 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from matplotlib>=3.3.0->ultralytics) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from matplotlib>=3.3.0->ultralytics) (4.61.1)\n", - "Requirement already satisfied: kiwisolver>=1.3.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from matplotlib>=3.3.0->ultralytics) (1.4.9)\n", - "Requirement already satisfied: packaging>=20.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from matplotlib>=3.3.0->ultralytics) (25.0)\n", - "Requirement already satisfied: pyparsing>=3 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from matplotlib>=3.3.0->ultralytics) (3.2.5)\n", - "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from matplotlib>=3.3.0->ultralytics) (2.9.0.post0)\n", - "Requirement already satisfied: polars-runtime-32==1.36.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from polars>=0.20.0->ultralytics) (1.36.1)\n", - "Requirement already satisfied: six>=1.5 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics) (1.17.0)\n", - "Requirement already satisfied: charset_normalizer<4,>=2 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from requests>=2.23.0->ultralytics) (3.4.4)\n", - "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from requests>=2.23.0->ultralytics) (3.11)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from requests>=2.23.0->ultralytics) (2.6.1)\n", - "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from requests>=2.23.0->ultralytics) (2025.11.12)\n", - "Requirement already satisfied: filelock in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch>=1.8.0->ultralytics) (3.20.0)\n", - "Requirement already satisfied: typing-extensions>=4.8.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch>=1.8.0->ultralytics) (4.15.0)\n", - "Requirement already satisfied: networkx in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch>=1.8.0->ultralytics) (3.6.1)\n", - "Requirement already satisfied: jinja2 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch>=1.8.0->ultralytics) (3.1.6)\n", - "Requirement already satisfied: fsspec in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch>=1.8.0->ultralytics) (2025.10.0)\n", - "Requirement already satisfied: setuptools in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch>=1.8.0->ultralytics) (72.1.0)\n", - "Requirement already satisfied: sympy!=1.13.2,>=1.13.1 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from torch>=1.8.0->ultralytics) (1.14.0)\n", - "Requirement already satisfied: mpmath<1.4,>=1.1.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from sympy!=1.13.2,>=1.13.1->torch>=1.8.0->ultralytics) (1.3.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\lib\\site-packages (from jinja2->torch>=1.8.0->ultralytics) (3.0.2)\n" - ] - } - ], - "source": [ - "# ===== INSTALL DEPENDENCIES =====\n", - "!pip install huggingface_hub\n", - "!pip install boto3 -q\n", - "!pip install opencv-python torch numpy torchvision tqdm pandas\n", - "!pip install lap\n", - "!pip install ultralytics" - ] - }, - { - "cell_type": "markdown", - "id": "91153249", - "metadata": {}, - "source": [ - "## Parameters and Global Variables" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "9ba61cb6", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 1, + "id": "ba8dc4a1", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ba8dc4a1", + "outputId": "b86a1cf8-9afa-40d4-8135-dec3ab6fa072" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: huggingface_hub in /usr/local/lib/python3.12/dist-packages (0.36.0)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (3.20.0)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (2025.3.0)\n", + "Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (25.0)\n", + "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (6.0.3)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (2.32.4)\n", + "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (4.67.1)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (4.15.0)\n", + "Requirement already satisfied: hf-xet<2.0.0,>=1.1.3 in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (1.2.0)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests->huggingface_hub) (3.4.4)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests->huggingface_hub) (3.11)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests->huggingface_hub) (2.5.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests->huggingface_hub) (2025.11.12)\n", + "Requirement already satisfied: opencv-python in /usr/local/lib/python3.12/dist-packages (4.12.0.88)\n", + "Requirement already satisfied: torch in /usr/local/lib/python3.12/dist-packages (2.9.0+cu126)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (2.0.2)\n", + "Requirement already satisfied: torchvision in /usr/local/lib/python3.12/dist-packages (0.24.0+cu126)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.12/dist-packages (4.67.1)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (2.2.2)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from torch) (3.20.0)\n", + "Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.12/dist-packages (from torch) (4.15.0)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from torch) (75.2.0)\n", + "Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.12/dist-packages (from torch) (1.14.0)\n", + "Requirement already satisfied: networkx>=2.5.1 in /usr/local/lib/python3.12/dist-packages (from torch) (3.6.1)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch) (3.1.6)\n", + "Requirement already satisfied: fsspec>=0.8.5 in /usr/local/lib/python3.12/dist-packages (from torch) (2025.3.0)\n", + "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch) (12.6.77)\n", + "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch) (12.6.77)\n", + "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.6.80 in /usr/local/lib/python3.12/dist-packages (from torch) (12.6.80)\n", + "Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /usr/local/lib/python3.12/dist-packages (from torch) (9.10.2.21)\n", + "Requirement already satisfied: nvidia-cublas-cu12==12.6.4.1 in /usr/local/lib/python3.12/dist-packages (from torch) (12.6.4.1)\n", + "Requirement already satisfied: nvidia-cufft-cu12==11.3.0.4 in /usr/local/lib/python3.12/dist-packages (from torch) (11.3.0.4)\n", + "Requirement already satisfied: nvidia-curand-cu12==10.3.7.77 in /usr/local/lib/python3.12/dist-packages (from torch) (10.3.7.77)\n", + "Requirement already satisfied: nvidia-cusolver-cu12==11.7.1.2 in /usr/local/lib/python3.12/dist-packages (from torch) (11.7.1.2)\n", + "Requirement already satisfied: nvidia-cusparse-cu12==12.5.4.2 in /usr/local/lib/python3.12/dist-packages (from torch) (12.5.4.2)\n", + "Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.12/dist-packages (from torch) (0.7.1)\n", + "Requirement already satisfied: nvidia-nccl-cu12==2.27.5 in /usr/local/lib/python3.12/dist-packages (from torch) (2.27.5)\n", + "Requirement already satisfied: nvidia-nvshmem-cu12==3.3.20 in /usr/local/lib/python3.12/dist-packages (from torch) (3.3.20)\n", + "Requirement already satisfied: nvidia-nvtx-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch) (12.6.77)\n", + "Requirement already satisfied: nvidia-nvjitlink-cu12==12.6.85 in /usr/local/lib/python3.12/dist-packages (from torch) (12.6.85)\n", + "Requirement already satisfied: nvidia-cufile-cu12==1.11.1.6 in /usr/local/lib/python3.12/dist-packages (from torch) (1.11.1.6)\n", + "Requirement already satisfied: triton==3.5.0 in /usr/local/lib/python3.12/dist-packages (from torch) (3.5.0)\n", + "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /usr/local/lib/python3.12/dist-packages (from torchvision) (11.3.0)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/dist-packages (from pandas) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.3)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy>=1.13.3->torch) (1.3.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch) (3.0.3)\n", + "Requirement already satisfied: lap in /usr/local/lib/python3.12/dist-packages (0.5.12)\n", + "Requirement already satisfied: numpy>=1.21.6 in /usr/local/lib/python3.12/dist-packages (from lap) (2.0.2)\n", + "Requirement already satisfied: ultralytics in /usr/local/lib/python3.12/dist-packages (8.3.248)\n", + "Requirement already satisfied: numpy>=1.23.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (2.0.2)\n", + "Requirement already satisfied: matplotlib>=3.3.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (3.10.0)\n", + "Requirement already satisfied: opencv-python>=4.6.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (4.12.0.88)\n", + "Requirement already satisfied: pillow>=7.1.2 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (11.3.0)\n", + "Requirement already satisfied: pyyaml>=5.3.1 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (6.0.3)\n", + "Requirement already satisfied: requests>=2.23.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (2.32.4)\n", + "Requirement already satisfied: scipy>=1.4.1 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (1.16.3)\n", + "Requirement already satisfied: torch>=1.8.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (2.9.0+cu126)\n", + "Requirement already satisfied: torchvision>=0.9.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (0.24.0+cu126)\n", + "Requirement already satisfied: psutil>=5.8.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (5.9.5)\n", + "Requirement already satisfied: polars>=0.20.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (1.31.0)\n", + "Requirement already satisfied: ultralytics-thop>=2.0.18 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (2.0.18)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (1.3.3)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (4.61.1)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (1.4.9)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (25.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (3.2.5)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (2.9.0.post0)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests>=2.23.0->ultralytics) (3.4.4)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests>=2.23.0->ultralytics) (3.11)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests>=2.23.0->ultralytics) (2.5.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests>=2.23.0->ultralytics) (2025.11.12)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.20.0)\n", + "Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (4.15.0)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (75.2.0)\n", + "Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (1.14.0)\n", + "Requirement already satisfied: networkx>=2.5.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.6.1)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.1.6)\n", + "Requirement already satisfied: fsspec>=0.8.5 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (2025.3.0)\n", + "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.6.77)\n", + "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.6.77)\n", + "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.6.80 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.6.80)\n", + "Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (9.10.2.21)\n", + "Requirement already satisfied: nvidia-cublas-cu12==12.6.4.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.6.4.1)\n", + "Requirement already satisfied: nvidia-cufft-cu12==11.3.0.4 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (11.3.0.4)\n", + "Requirement already satisfied: nvidia-curand-cu12==10.3.7.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (10.3.7.77)\n", + "Requirement already satisfied: nvidia-cusolver-cu12==11.7.1.2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (11.7.1.2)\n", + "Requirement already satisfied: nvidia-cusparse-cu12==12.5.4.2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.5.4.2)\n", + "Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (0.7.1)\n", + "Requirement already satisfied: nvidia-nccl-cu12==2.27.5 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (2.27.5)\n", + "Requirement already satisfied: nvidia-nvshmem-cu12==3.3.20 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.3.20)\n", + "Requirement already satisfied: nvidia-nvtx-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.6.77)\n", + "Requirement already satisfied: nvidia-nvjitlink-cu12==12.6.85 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.6.85)\n", + "Requirement already satisfied: nvidia-cufile-cu12==1.11.1.6 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (1.11.1.6)\n", + "Requirement already satisfied: triton==3.5.0 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.5.0)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics) (1.17.0)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy>=1.13.3->torch>=1.8.0->ultralytics) (1.3.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch>=1.8.0->ultralytics) (3.0.3)\n" + ] + } + ], + "source": [ + "# ===== INSTALL DEPENDENCIES =====\n", + "!pip install huggingface_hub\n", + "!pip install boto3 -q\n", + "!pip install opencv-python torch numpy torchvision tqdm pandas\n", + "!pip install lap\n", + "!pip install ultralytics" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Device: cpu\n" - ] - } - ], - "source": [ - "# Admin =================================================================================\n", - "import os\n", - "DOWNLOAD_DIR = './training-data'\n", - "CACHE_DIR = './cache-data'\n", - "WEIGHTS_DIR = './model-weights'\n", - "os.makedirs(DOWNLOAD_DIR, exist_ok=True)\n", - "os.makedirs(CACHE_DIR, exist_ok=True)\n", - "os.makedirs(WEIGHTS_DIR, exist_ok=True)\n", - "\n", - "# To GPU or not to GPU =================================================================\n", - "import torch\n", - "DEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", - "print(f\"Device: {DEVICE}\")\n", - "\n", - "# Landmark Extraction ==================================================================\n", - "from ultralytics import YOLO\n", - "YOLO_DIR = './yolo-weights'\n", - "YOLO_MODEL = \"yolo11n\"\n", - "YOLO_MODEL_FILE = os.path.join(YOLO_DIR, f\"{YOLO_MODEL}-pose.pt\")\n", - "assert os.path.exists(YOLO_MODEL_FILE)\n", - "YOLO_TRACKER = \"bytetrack.yaml\"\n", - "YOLO_TRACKER_FILE = os.path.join(YOLO_DIR, YOLO_TRACKER)\n", - "assert os.path.exists(YOLO_TRACKER_FILE)\n", - "\n", - "# Model Stuff ===========================================================================\n", - "DEBUG = False\n", - "RAND_SEED = 4227\n", - "VID_STRIDE = 2\n", - "MAX_FRAMES = 1000\n", - "MAX_EPOCHS = 200\n", - "MAX_FRAME_LENGTH = 640" - ] - }, - { - "cell_type": "markdown", - "id": "397089dc", - "metadata": {}, - "source": [ - "## Download Training Videos" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "21717985", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "91153249", + "metadata": { + "id": "91153249" + }, + "source": [ + "## Parameters and Global Variables" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "File already exists, skipping: 1_dksksjfwijf.mp4\n", - "File already exists, skipping: 2_dfsaeklnvvalkej.mp4\n", - "File already exists, skipping: 2_difficult_2.mp4\n", - "File already exists, skipping: 2_difficult_sdafkljsalkfj.mp4\n", - "File already exists, skipping: 2_dkdjwkndkfw.mp4\n", - "File already exists, skipping: 2_dkdmkejkeimdh.mp4\n", - "File already exists, skipping: 2_dkjd823kjf.mp4\n", - "File already exists, skipping: 2_dsalkfjalwkenlke.mp4\n", - "File already exists, skipping: 2_kling_20251205_Text_to_Video_On_a_sandy_4976_0.mp4\n", - "File already exists, skipping: 2_kling_20251206_Text_to_Video_Generate_a_71_1.mp4\n", - "File already exists, skipping: 2_sadfasjldkfjaseifj.mp4\n", - "File already exists, skipping: 2_sdafkjaslkclaksdjkas.mp4\n", - "File already exists, skipping: 2_sdfkjsaleijflaskdjf.mp4\n", - "File already exists, skipping: 2_sdjfhafsldkjhjk.mp4\n", - "File already exists, skipping: 2_sdkjdsflkjfwa.mp4\n", - "File already exists, skipping: 2_sdlfjlewlkjkj.mp4\n", - "File already exists, skipping: 2_sdlkjsaelijfksdjf.mp4\n", - "File already exists, skipping: 3_asldkfjalwieaskdfaskdf.mp4\n", - "File already exists, skipping: 3_dkk873lkjlksajdf.mp4\n", - "File already exists, skipping: 3_dsjlaeijlksjdfie.mp4\n", - "File already exists, skipping: 3_dsksdfjbvsdkj.mp4\n", - "File already exists, skipping: 3_dslkaldskjflakjs.mp4\n", - "File already exists, skipping: 3_ewdfkjwaeoihjlkasdjf.mp4\n", - "File already exists, skipping: 3_kling_20251205_Text_to_Video_In_a_grass_4697_0.mp4\n", - "File already exists, skipping: 3_kling_20251205_Text_to_Video_On_a_playg_5028_0.mp4\n", - "File already exists, skipping: 3_kling_20251205_Text_to_Video_On_a_playg_5064_0.mp4\n", - "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_17_0.mp4\n", - "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_315_0.mp4\n", - "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_315_2.mp4\n", - "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_712_3.mp4\n", - "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_71_0.mp4\n", - "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_71_2.mp4\n", - "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_71_3.mp4\n", - "File already exists, skipping: 3_kling_20251209_Image_to_Video_Generate_a_613_1.mp4\n", - "File already exists, skipping: 3_kling_20251209_Image_to_Video_Generate_a_635_0.mp4\n", - "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_190_1.mp4\n", - "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_403_1.mp4\n", - "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_491_0.mp4\n", - "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_491_1.mp4\n", - "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_491_2.mp4\n", - "File already exists, skipping: 3_kling_dskfseu.mp4\n", - "File already exists, skipping: 3_kling_kdjflaskdjf.mp4\n", - "File already exists, skipping: 3_sadklfjasbnlkjlfkj.mp4\n", - "File already exists, skipping: 3_sadlfkjasldkfjasleijlkjfd.mp4\n", - "File already exists, skipping: 3_sadlfkjawelnflksdjf.mp4\n", - "File already exists, skipping: 3_sdfjwaiejflkasjdf.mp4\n", - "File already exists, skipping: 3_sdflkjliejkjdf.mp4\n", - "File already exists, skipping: 3_sdlkfjaleknaksej.mp4\n", - "File already exists, skipping: 3_sdlkfjalkjejafe.mp4\n", - "File already exists, skipping: 3_sdlkjfaslkjfalskjdf.mp4\n", - "File already exists, skipping: 3_sdlkjslndflkseijlkjef.mp4\n", - "File already exists, skipping: 4_20251209_Text_to_Video_Generate_a_561_0.mp4\n", - "File already exists, skipping: 4_asdlkfjalsflnekj.mp4\n", - "File already exists, skipping: 4_aslkcasckmwlejk.mp4\n", - "File already exists, skipping: 4_aslkjasmcalkewjlkje.mp4\n", - "File already exists, skipping: 4_dssalsdkfjweijf.mp4\n", - "File already exists, skipping: 4_kling_20251206_Text_to_Video_Generate_a_28_0.mp4\n", - "File already exists, skipping: 4_kling_20251206_Text_to_Video_Generate_a_315_3.mp4\n", - "File already exists, skipping: 4_kling_20251206_Text_to_Video_Generate_a_58_0.mp4\n", - "File already exists, skipping: 4_kling_20251207_Text_to_Video_Generate_a_521_1.mp4\n", - "File already exists, skipping: 4_kling_20251209_Image_to_Video_Generate_a_635_1.mp4\n", - "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_190_0.mp4\n", - "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_218_0.mp4\n", - "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_263_1.mp4\n", - "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_377_1.mp4\n", - "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_452_0.mp4\n", - "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_452_1.mp4\n", - "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_561_1.mp4\n", - "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_588_2.mp4\n", - "File already exists, skipping: 4_pushup_1f2da596-7619-4d55-9376-069e15a42a1a_h264.mp4\n", - "File already exists, skipping: 4_sadflkjasldkjfalseij.mp4\n", - "File already exists, skipping: 4_sadlfkjlknewkjejk.mp4\n", - "File already exists, skipping: 5_sadfjhaslfkjasdlkfjsa.mp4\n", - "File already exists, skipping: 5_sdfkljweoijlkjdsflkjweaij.mp4\n", - "File already exists, skipping: 6_dfjewaijsldkjfsaef.mp4\n", - "File already exists, skipping: 6_kling_20251209_Text_to_Video_Generate_a_218_1.mp4\n", - "File already exists, skipping: 7_sadkjfkljekj.mp4\n", - "\n", - "==================================================\n", - "Downloaded videos:\n", - "==================================================\n", - "1_dksksjfwijf.mp4\n", - "2_dfsaeklnvvalkej.mp4\n", - "2_difficult_2.mp4\n", - "2_difficult_sdafkljsalkfj.mp4\n", - "2_dkdjwkndkfw.mp4\n", - "2_dkdmkejkeimdh.mp4\n", - "2_dkjd823kjf.mp4\n", - "2_dsalkfjalwkenlke.mp4\n", - "2_kling_20251205_Text_to_Video_On_a_sandy_4976_0.mp4\n", - "2_kling_20251206_Text_to_Video_Generate_a_71_1.mp4\n", - "2_sadfasjldkfjaseifj.mp4\n", - "2_sdafkjaslkclaksdjkas.mp4\n", - "2_sdfkjsaleijflaskdjf.mp4\n", - "2_sdjfhafsldkjhjk.mp4\n", - "2_sdkjdsflkjfwa.mp4\n", - "2_sdlfjlewlkjkj.mp4\n", - "2_sdlkjsaelijfksdjf.mp4\n", - "3_asldkfjalwieaskdfaskdf.mp4\n", - "3_dkk873lkjlksajdf.mp4\n", - "3_dsjlaeijlksjdfie.mp4\n", - "3_dsksdfjbvsdkj.mp4\n", - "3_dslkaldskjflakjs.mp4\n", - "3_ewdfkjwaeoihjlkasdjf.mp4\n", - "3_kling_20251205_Text_to_Video_In_a_grass_4697_0.mp4\n", - "3_kling_20251205_Text_to_Video_On_a_playg_5028_0.mp4\n", - "3_kling_20251205_Text_to_Video_On_a_playg_5064_0.mp4\n", - "3_kling_20251206_Text_to_Video_Generate_a_17_0.mp4\n", - "3_kling_20251206_Text_to_Video_Generate_a_315_0.mp4\n", - "3_kling_20251206_Text_to_Video_Generate_a_315_2.mp4\n", - "3_kling_20251206_Text_to_Video_Generate_a_712_3.mp4\n", - "3_kling_20251206_Text_to_Video_Generate_a_71_0.mp4\n", - "3_kling_20251206_Text_to_Video_Generate_a_71_2.mp4\n", - "3_kling_20251206_Text_to_Video_Generate_a_71_3.mp4\n", - "3_kling_20251209_Image_to_Video_Generate_a_613_1.mp4\n", - "3_kling_20251209_Image_to_Video_Generate_a_635_0.mp4\n", - "3_kling_20251209_Text_to_Video_Generate_a_190_1.mp4\n", - "3_kling_20251209_Text_to_Video_Generate_a_403_1.mp4\n", - "3_kling_20251209_Text_to_Video_Generate_a_491_0.mp4\n", - "3_kling_20251209_Text_to_Video_Generate_a_491_1.mp4\n", - "3_kling_20251209_Text_to_Video_Generate_a_491_2.mp4\n", - "3_kling_dskfseu.mp4\n", - "3_kling_kdjflaskdjf.mp4\n", - "3_sadklfjasbnlkjlfkj.mp4\n", - "3_sadlfkjasldkfjasleijlkjfd.mp4\n", - "3_sadlfkjawelnflksdjf.mp4\n", - "3_sdfjwaiejflkasjdf.mp4\n", - "3_sdflkjliejkjdf.mp4\n", - "3_sdlkfjaleknaksej.mp4\n", - "3_sdlkfjalkjejafe.mp4\n", - "3_sdlkjfaslkjfalskjdf.mp4\n", - "3_sdlkjslndflkseijlkjef.mp4\n", - "4_20251209_Text_to_Video_Generate_a_561_0.mp4\n", - "4_asdlkfjalsflnekj.mp4\n", - "4_aslkcasckmwlejk.mp4\n", - "4_aslkjasmcalkewjlkje.mp4\n", - "4_dssalsdkfjweijf.mp4\n", - "4_kling_20251206_Text_to_Video_Generate_a_28_0.mp4\n", - "4_kling_20251206_Text_to_Video_Generate_a_315_3.mp4\n", - "4_kling_20251206_Text_to_Video_Generate_a_58_0.mp4\n", - "4_kling_20251207_Text_to_Video_Generate_a_521_1.mp4\n", - "4_kling_20251209_Image_to_Video_Generate_a_635_1.mp4\n", - "4_kling_20251209_Text_to_Video_Generate_a_190_0.mp4\n", - "4_kling_20251209_Text_to_Video_Generate_a_218_0.mp4\n", - "4_kling_20251209_Text_to_Video_Generate_a_263_1.mp4\n", - "4_kling_20251209_Text_to_Video_Generate_a_377_1.mp4\n", - "4_kling_20251209_Text_to_Video_Generate_a_452_0.mp4\n", - "4_kling_20251209_Text_to_Video_Generate_a_452_1.mp4\n", - "4_kling_20251209_Text_to_Video_Generate_a_561_1.mp4\n", - "4_kling_20251209_Text_to_Video_Generate_a_588_2.mp4\n", - "4_pushup_1f2da596-7619-4d55-9376-069e15a42a1a_h264.mp4\n", - "4_sadflkjasldkjfalseij.mp4\n", - "4_sadlfkjlknewkjejk.mp4\n", - "5_sadfjhaslfkjasdlkfjsa.mp4\n", - "5_sdfkljweoijlkjdsflkjweaij.mp4\n", - "6_dfjewaijsldkjfsaef.mp4\n", - "6_kling_20251209_Text_to_Video_Generate_a_218_1.mp4\n", - "7_sadkjfkljekj.mp4\n", - "\n", - "Total: 77 files\n" - ] - } - ], - "source": [ - "import boto3\n", - "from botocore import UNSIGNED\n", - "from botocore.config import Config\n", - "import os\n", - "\n", - "# Connect to S3 without authentication (public bucket)\n", - "s3 = boto3.client('s3', config=Config(signature_version=UNSIGNED))\n", - "\n", - "bucket_name = 'prism-mvta'\n", - "prefix = 'training-and-validation-data/'\n", - "\n", - "# List all objects in the S3 path\n", - "paginator = s3.get_paginator('list_objects_v2')\n", - "pages = paginator.paginate(Bucket=bucket_name, Prefix=prefix)\n", - "\n", - "video_names = []\n", - "\n", - "for page in pages:\n", - " if 'Contents' not in page:\n", - " print(\"No files found at the specified path! Go and complain to the TAs!\")\n", - " break\n", - "\n", - " for obj in page['Contents']:\n", - " key = obj['Key']\n", - " filename = os.path.basename(key)\n", - "\n", - " if not filename:\n", - " continue\n", - "\n", - " video_names.append(filename)\n", - "\n", - " remote_path = os.path.join(DOWNLOAD_DIR, filename)\n", - " if os.path.exists(remote_path):\n", - " print(f\"File already exists, skipping: {filename}\")\n", - " continue\n", - " print(f\"Downloading: {filename}\")\n", - " s3.download_file(bucket_name, key, remote_path)\n", - "\n", - "print(\"\\n\" + \"=\"*50)\n", - "print(\"Downloaded videos:\")\n", - "print(\"=\"*50)\n", - "for name in video_names:\n", - " print(name)\n", - "\n", - "print(f\"\\nTotal: {len(video_names)} files\")" - ] - }, - { - "cell_type": "markdown", - "id": "c5b3333e", - "metadata": {}, - "source": [ - "## Secret Sauce" - ] - }, - { - "cell_type": "markdown", - "id": "86fa605d", - "metadata": {}, - "source": [ - "### Transformation" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "4c884713", - "metadata": {}, - "outputs": [], - "source": [ - "import torchvision.transforms.functional as TF\n", - "import random\n", - "import torch # Needed for TF.to_tensor which uses torch internally\n", - "\n", - "\n", - "class VideoResizerSingle:\n", - " def __init__(self, largest_dim):\n", - " # resize such that aspect ratio is retained\n", - " self.largest_dim = largest_dim\n", - " \n", - " def __call__(self, single_frame):\n", - " original_width, original_height = single_frame.size\n", - " scale = max(self.largest_dim/original_width, self.largest_dim/original_height)\n", - " new_width = int(original_width * scale)\n", - " new_height = int(original_height * scale)\n", - " single_frame = TF.resize(single_frame, (new_height, new_width))\n", - " return single_frame\n", - "\n", - "\n", - "class VideoResizer:\n", - " def __init__(self, largest_dim):\n", - " self.largest_dim = largest_dim\n", - "\n", - " def __call__(self, frames_list_pil):\n", - " if not frames_list_pil:\n", - " return []\n", - "\n", - " transformed_frames_pil = []\n", - " helper = VideoResizerSingle(self.largest_dim)\n", - " for img_pil in frames_list_pil:\n", - " img_pil = helper(img_pil)\n", - " transformed_frames_pil.append(img_pil)\n", - " return transformed_frames_pil\n", - "\n", - "\n", - "class VideoTransform:\n", - " def __init__(self, rotation_degrees, hflip_p, vflip_p, color_jitter_params, resize_dims=None):\n", - " self.rotation_degrees = rotation_degrees\n", - " self.hflip_p = hflip_p\n", - " self.vflip_p = vflip_p\n", - " self.color_jitter_params = color_jitter_params # (brightness, contrast, saturation, hue)\n", - " self.resize_dims = resize_dims # (height, width)\n", - "\n", - " def __call__(self, frames_list_pil):\n", - " if not frames_list_pil:\n", - " return []\n", - "\n", - " # Sample parameters once per video\n", - " angle = random.uniform(-self.rotation_degrees, self.rotation_degrees)\n", - " h_flip = random.random() < self.hflip_p\n", - " v_flip = random.random() < self.vflip_p\n", - "\n", - " # Manually compute ColorJitter factors for consistency across frames\n", - " brightness_param = self.color_jitter_params[0]\n", - " contrast_param = self.color_jitter_params[1]\n", - " saturation_param = self.color_jitter_params[2]\n", - " hue_param = self.color_jitter_params[3]\n", - "\n", - " brightness_factor = random.uniform(max(0, 1 - brightness_param), 1 + brightness_param)\n", - " contrast_factor = random.uniform(max(0, 1 - contrast_param), 1 + contrast_param)\n", - " saturation_factor = random.uniform(max(0, 1 - saturation_param), 1 + saturation_param)\n", - " hue_factor = random.uniform(-hue_param, hue_param)\n", - "\n", - "\n", - " transformed_frames_pil = [] # Changed variable name to reflect return type\n", - " for img_pil in frames_list_pil:\n", - " # Apply same random parameters to each frame\n", - " img_pil = TF.rotate(img_pil, angle)\n", - " if h_flip:\n", - " img_pil = TF.hflip(img_pil)\n", - " if v_flip:\n", - " img_pil = TF.vflip(img_pil)\n", - " img_pil = TF.adjust_brightness(img_pil, brightness_factor)\n", - " img_pil = TF.adjust_contrast(img_pil, contrast_factor)\n", - " img_pil = TF.adjust_saturation(img_pil, saturation_factor)\n", - " img_pil = TF.adjust_hue(img_pil, hue_factor)\n", - "\n", - " # Resize while maintaining aspect ratio\n", - " if self.resize_dims:\n", - " original_width, original_height = img_pil.size\n", - " target_height, target_width = self.resize_dims\n", - "\n", - " # Calculate new dimensions to fit within target while maintaining aspect ratio\n", - " scale_w = target_width / original_width\n", - " scale_h = target_height / original_height\n", - " scale = min(scale_w, scale_h)\n", - "\n", - " new_width = int(original_width * scale)\n", - " new_height = int(original_height * scale)\n", - "\n", - " img_pil = TF.resize(img_pil, (new_height, new_width))\n", - "\n", - " # Pad if necessary to reach target_dims\n", - " pad_left = (target_width - new_width) // 2\n", - " pad_right = target_width - new_width - pad_left\n", - " pad_top = (target_height - new_height) // 2\n", - " pad_bottom = target_height - new_height - pad_top\n", - "\n", - " img_pil = TF.pad(img_pil, (pad_left, pad_top, pad_right, pad_bottom))\n", - "\n", - " transformed_frames_pil.append(img_pil) # Append PIL image directly, remove TF.to_tensor\n", - "\n", - " return transformed_frames_pil # Return list of PIL images\n", - "\n", - "TRANSFORMATIONS = VideoTransform(\n", - " rotation_degrees=180,\n", - " hflip_p=0.5,\n", - " vflip_p=0.5,\n", - " color_jitter_params=(0.2, 0.2, 0.2, 0.2),\n", - " resize_dims=(640, 640) # Example: resize to 224x224\n", - ")\n", - "\n", - "RESIZER = VideoResizerSingle(MAX_FRAME_LENGTH)" - ] - }, - { - "cell_type": "markdown", - "id": "aabf9bdb", - "metadata": {}, - "source": [ - "### Signal Calculators and Utils" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "b1f96bf6", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import torch\n", - "import torch.nn as nn\n", - "import numpy as np\n", - "\n", - "class SignalPerturbator:\n", - " @staticmethod\n", - " def __call__(self, signals):\n", - " \"\"\"Applies dynamic 1D augmentation to the signal sequence.\"\"\"\n", - " # Add Gaussian noise\n", - " noise = torch.randn_like(signals) * 0.01\n", - " # Random scaling (simulates different range of motion)\n", - " scale = random.uniform(0.9, 1.1)\n", - " # Random baseline shift\n", - " shift = random.uniform(-0.05, 0.05)\n", - " return torch.clamp(signals * scale + noise + shift, 0, 1)\n", - "\n", - "\n", - "class SignalAverager:\n", - " @staticmethod\n", - " def __call__(signal_tensor, window_size=3):\n", - " \"\"\"\n", - " Applies a moving average to smooth signals.\n", - " \"\"\"\n", - " # 1. Ensure the tensor is at least 2D (Batch, Length)\n", - " if signal_tensor.dim() == 1:\n", - " signal_tensor = signal_tensor.unsqueeze(0)\n", - " \n", - " # 2. Reshape to (Batch, Channels, Length) for avg_pool1d\n", - " # We treat the elbow angle as a single channel\n", - " x = signal_tensor.unsqueeze(1)\n", - " \n", - " # 3. Apply average pooling\n", - " # stride=1 keeps the resolution the same\n", - " # padding=1 ensures the output length matches the input length\n", - " smoothed = nn.functional.avg_pool1d(x, kernel_size=window_size, stride=1, padding=window_size//2)\n", - " \n", - " # 4. Remove the extra channel dimension and return\n", - " return smoothed.squeeze(1)\n", - "\n", - "class SignalMedianator:\n", - " @staticmethod\n", - " def __call__(signal_tensor, window_size=3):\n", - " \"\"\"\n", - " Applies a moving media to smooth the signals.\n", - " Good for bring out local signals dwarfed by global normalization\n", - " \"\"\"\n", - " def moving_median(data, window):\n", - " return np.array([np.median(data[max(0, i-window//2):min(len(data), i+window//2+1)]) \n", - " for i in range(len(data))])\n", - " smoothed = moving_median(signal_tensor, window_size)\n", - " mean = np.mean(smoothed)\n", - " std = np.std(smoothed) + 1e-6\n", - " smoothed = (smoothed - mean) / std\n", - " return torch.tensor(smoothed, dtype=torch.float32)" - ] - }, - { - "cell_type": "markdown", - "id": "0739d1f9", - "metadata": {}, - "source": [ - "### Elbow Calculation" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "bd0ed587", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from enum import Enum\n", - "\n", - "\n", - "class COCO(Enum):\n", - " R_SHOULDER = 5\n", - " L_SHOULDER = 6\n", - " R_ELBOW = 7\n", - " L_ELBOW = 8\n", - " R_WRIST = 9\n", - " L_WRIST = 10\n", - " L_HIP = 11\n", - " R_HIP = 12\n", - " L_KNEE = 13\n", - " R_KNEE = 14\n", - "\n", - "\n", - "class AngleCalculator:\n", - " \"\"\"Calculates the elbow angle of a person from landmarks.\"\"\"\n", - " def __init__(self, landmarks) -> None:\n", - " # landmarks as returned by Ultralytics: np.ndarray[np._AnyShape, np.dtype[np.Any]] | np.Any\n", - " self.landmarks = landmarks\n", - "\n", - " def _ref_len(self):\n", - " # Determine Scale Reference (Hips or Fallback to Shoulder Width)\n", - " if self.landmarks[COCO.L_HIP.value].any() and self.landmarks[COCO.R_HIP.value].any():\n", - " ref_len = np.linalg.norm(self.landmarks[COCO.L_SHOULDER.value] - self.landmarks[COCO.L_HIP.value])\n", - " else:\n", - " ref_len = np.linalg.norm(self.landmarks[COCO.L_SHOULDER.value] - self.landmarks[COCO.R_SHOULDER.value]) / 0.75\n", - " return ref_len\n", - "\n", - " def _uplift_arm_to_3d(self, sh_idx, el_idx, wr_idx, ref_len):\n", - " \"\"\"Uplifts 2D keypoints to 3D using Da Vinci's ratios\"\"\"\n", - " # Ratios (relative to torso length)\n", - " R_UPPER_ARM = 0.45 \n", - " R_FOREARM = 0.42\n", - "\n", - " # 1. Shoulder is the root (z=0)\n", - " sh_3d = np.array([self.landmarks[sh_idx][0], self.landmarks[sh_idx][1], 0.0])\n", - "\n", - " # 2. Lift Elbow (Relative to Shoulder)\n", - " L_upper = R_UPPER_ARM * ref_len\n", - " dx1 = self.landmarks[el_idx][0] - self.landmarks[sh_idx][0]\n", - " dy1 = self.landmarks[el_idx][1] - self.landmarks[sh_idx][1]\n", - " dz1 = np.sqrt(max(0, L_upper**2 - (dx1**2 + dy1**2)))\n", - " el_3d = np.array([self.landmarks[el_idx][0], self.landmarks[el_idx][1], dz1])\n", - "\n", - " # 3. Lift Wrist (Relative to Elbow)\n", - " L_fore = R_FOREARM * ref_len\n", - " dx2 = self.landmarks[wr_idx][0] - self.landmarks[el_idx][0]\n", - " dy2 = self.landmarks[wr_idx][1] - self.landmarks[el_idx][1]\n", - " dz2 = np.sqrt(max(0, L_fore**2 - (dx2**2 + dy2**2)))\n", - " # Z-coordinate is cumulative\n", - " wr_3d = np.array([self.landmarks[wr_idx][0], self.landmarks[wr_idx][1], dz1 + dz2])\n", - "\n", - " return sh_3d, el_3d, wr_3d\n", - "\n", - " def __call__(self) -> float:\n", - " def get_angle(a, b, c) -> float:\n", - " ba, bc = a - b, c - b\n", - " cosine = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))\n", - " return np.degrees(np.arccos(np.clip(cosine, -1.0, 1.0)))\n", - "\n", - " ref_len = self._ref_len()\n", - " \n", - " # Calculate elbow angle for both arms\n", - " l_sh, l_el, l_wr = self._uplift_arm_to_3d(COCO.L_SHOULDER.value, COCO.L_ELBOW.value, COCO.L_WRIST.value, ref_len)\n", - " r_sh, r_el, r_wr = self._uplift_arm_to_3d(COCO.R_SHOULDER.value, COCO.R_ELBOW.value, COCO.R_WRIST.value, ref_len)\n", - "\n", - " l_angle = get_angle(l_sh, l_el, l_wr)\n", - " r_angle = get_angle(r_sh, r_el, r_wr)\n", - "\n", - " # Use average angle for robustness (handles side-on views better)\n", - " avg_angle = (l_angle + r_angle) / 2\n", - " return avg_angle" - ] - }, - { - "cell_type": "markdown", - "id": "402a2666", - "metadata": {}, - "source": [ - "### Adhoc Code" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "bfcc310e", - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "def plot_angles_with_moving_averages(angles, title=\"Elbow Angles Over Time\"):\n", - " \"\"\"\n", - " Plots raw elbow angle data along with 5 different moving averages.\n", - "\n", - " Args:\n", - " angles (np.ndarray or list): A 1D array or list of elbow angles.\n", - " title (str): The title for the plot.\n", - " \"\"\"\n", - " if not isinstance(angles, np.ndarray):\n", - " angles = np.array(angles)\n", - " angles = np.squeeze(angles)\n", - "\n", - " # Define different window sizes for moving averages\n", - " window_sizes = [2, 3, 4, 5, 7] # Example window sizes\n", - "\n", - " plt.figure(figsize=(15, 7))\n", - "\n", - " # Plot raw data\n", - " plt.plot(angles, label='Raw Angles', alpha=0.7, color='lightgray')\n", - "\n", - " # Plot moving averages\n", - " for window in window_sizes:\n", - " # Ensure window size is not greater than the data length\n", - " if window <= len(angles):\n", - " moving_avg = pd.Series(angles).rolling(window=window).mean()\n", - " plt.plot(moving_avg, label=f'MA ({window} frames)')\n", - " else:\n", - " print(f\"Warning: Window size {window} is larger than data length. Skipping MA.\")\n", - "\n", - " plt.title(title)\n", - " plt.xlabel('Frame Number')\n", - " plt.ylabel('Elbow Angle (degrees)')\n", - " plt.legend()\n", - " plt.grid(True)\n", - " plt.show()\n", - "\n", - "\n", - "def plot_angles_with_moving_median(angles, title=\"Elbow Angles Over Time\"):\n", - " \"\"\"\n", - " Plots raw elbow angle data along with 5 different moving averages.\n", - "\n", - " Args:\n", - " angles (np.ndarray or list): A 1D array or list of elbow angles.\n", - " title (str): The title for the plot.\n", - " \"\"\"\n", - " def rolling_median(data, window_size=5):\n", - " \"\"\"Robust noise reduction without scipy.\"\"\"\n", - " result = np.zeros_like(data)\n", - " for i in range(len(data)):\n", - " start = max(0, i - window_size // 2)\n", - " end = min(len(data), i + window_size // 2 + 1)\n", - " result[i] = np.median(data[start:end])\n", - " return result\n", - " \n", - " def moving_median(data, window):\n", - " return np.array([np.median(data[max(0, i-window//2):min(len(data), i+window//2+1)]) \n", - " for i in range(len(data))])\n", - "\n", - " if not isinstance(angles, np.ndarray):\n", - " angles = np.array(angles)\n", - " angles = np.squeeze(angles)\n", - "\n", - " # Define different window sizes for moving averages\n", - " window_sizes = [2, 3, 4, 5, 7] # Example window sizes\n", - "\n", - " plt.figure(figsize=(15, 7))\n", - "\n", - " # Plot raw data\n", - " plt.plot(angles, label='Raw Angles', alpha=0.7, color='lightgray')\n", - "\n", - " # Plot moving averages\n", - " for window in window_sizes:\n", - " # Ensure window size is not greater than the data length\n", - " if window <= len(angles):\n", - " moving_med = rolling_median(angles, window)\n", - " moving_med = moving_median(angles, window)\n", - " mean = np.mean(moving_med)\n", - " std = np.std(moving_med) + 1e-6\n", - " moving_med = (moving_med - mean) / std\n", - " plt.plot(moving_med, label=f'MM ({window} frames)')\n", - " else:\n", - " print(f\"Warning: Window size {window} is larger than data length. Skipping MA.\")\n", - "\n", - " plt.title(title)\n", - " plt.xlabel('Frame Number')\n", - " plt.ylabel('Elbow Angle (degrees)')\n", - " plt.legend()\n", - " plt.grid(True)\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "273bea44", - "metadata": {}, - "source": [ - "## Loader" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "id": "4c58edbd", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "source": [ + "# Import the required libraries\n", + "import torch\n", + "import torch.nn as nn\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from huggingface_hub import hf_hub_download\n", + "import boto3\n", + "from botocore import UNSIGNED\n", + "from botocore.config import Config\n", + "import os\n", + "import cv2\n", + "import numpy as np\n", + "from tqdm import tqdm\n", + "import time" + ], + "metadata": { + "id": "mtIQ989lQOOH" + }, + "id": "mtIQ989lQOOH", + "execution_count": 2, + "outputs": [] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train: 63 videos, Val: 15 videos\n", - "\n" - ] - } - ], - "source": [ - "import gc\n", - "import torch\n", - "import torch.nn as nn\n", - "from torch.utils.data import Dataset, DataLoader, random_split, Subset, WeightedRandomSampler\n", - "import os\n", - "import cv2\n", - "import numpy as np\n", - "import PIL.Image # Import PIL\n", - "import torchvision.transforms as T # Keep this for T.ToTensor() in else branch\n", - "\n", - "\n", - "class VideoDataset(Dataset):\n", - " \"\"\"Dataset for loading videos from a folder, calculating elbow angles.\"\"\"\n", - "\n", - " def __init__(self, video_dir, transform=None, feature_dir=None, signal_transform=None):\n", - " self.video_dir = video_dir\n", - " self.transform = transform # Store transform\n", - " self.feature_dir = feature_dir\n", - " self.signal_transform = signal_transform\n", - "\n", - " self.video_files = [\n", - " f for f in os.listdir(video_dir)\n", - " if f.endswith(('.mp4', '.avi', '.mov'))\n", - " ]\n", - "\n", - " self.labels = [\n", - " int(f.split('_')[0]) for f in self.video_files\n", - " ]\n", - "\n", - " self.lengths = [0] * len(self.video_files)\n", - "\n", - " def __len__(self):\n", - " return len(self.video_files)\n", - "\n", - " def __getitem__(self, idx):\n", - " if self.feature_dir:\n", - " feature_path = os.path.join(self.feature_dir, self.video_files[idx] + \".pt\")\n", - " if os.path.exists(feature_path):\n", - " data = torch.load(feature_path, weights_only=False)\n", - " angles = data['angles']\n", - " self.lengths[idx] = data['length'] \n", - " if self.signal_transform:\n", - " angles = self.signal_transform(angles)\n", - " return angles, data['label'], self.lengths[idx]\n", - "\n", - " video_path = os.path.join(self.video_dir, self.video_files[idx])\n", - "\n", - " list_of_pil_frames = [] # Collect PIL images first\n", - " cap = cv2.VideoCapture(video_path)\n", - " while True:\n", - " ret, frame = cap.read()\n", - " if not ret:\n", - " break\n", - " # Convert frame from BGR to RGB numpy array, then to PIL Image\n", - " rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n", - " list_of_pil_frames.append(PIL.Image.fromarray(rgb_frame))\n", - " cap.release()\n", - "\n", - " if not list_of_pil_frames:\n", - " # Handle empty video or no frames\n", - " return torch.tensor([]), self.labels[idx]\n", - "\n", - " frames_for_yolo = self.__get_frames_for_yolo(list_of_pil_frames)\n", - "\n", - "\n", - " # Use YOLO to track on all frames at once. \"trackers\" only exists once you have called the model\n", - " pose_model = YOLO(YOLO_MODEL_FILE, task='pose', verbose=False).to(DEVICE)\n", - " if hasattr(pose_model, \"trackers\") and pose_model.predictor:\n", - " pose_model.predictor.trackers[0].reset()\n", - " results_generator = pose_model.track(frames_for_yolo, verbose=False, device=DEVICE, persist=True, vid_stride=VID_STRIDE, show=False, tracker=YOLO_TRACKER_FILE)\n", - "\n", - " # Calculate angles using landmarks\n", - " angles = self.__calculate_angles(results_generator)\n", - " angles_tensor = torch.tensor(angles, dtype=torch.float32)\n", - " signal_cleanser = SignalMedianator()\n", - " angles_tensor = signal_cleanser(angles_tensor)\n", - "\n", - " # clean up\n", - " del frames_for_yolo\n", - " del results_generator\n", - " del pose_model\n", - " torch.cuda.empty_cache()\n", - " gc.collect()\n", - "\n", - " return angles_tensor, self.labels[idx], angles_tensor.shape[0]\n", - "\n", - " def __get_frames_for_yolo(self, list_of_pil_frames):\n", - " frames_for_yolo = []\n", - " if self.transform:\n", - " # Our custom VideoTransform expects a list of PIL images\n", - " if isinstance(self.transform, VideoTransform):\n", - " frames_for_yolo = self.transform(list_of_pil_frames)\n", - " else:\n", - " # If a different transform is provided (e.g., a torchvision.transforms.Compose\n", - " # that expects single images), apply it to each image individually.\n", - " transformed_frames_tensor = []\n", - " for img_pil in list_of_pil_frames:\n", - " # Apply the transform (which might return another PIL image or a tensor)\n", - " transformed_img = self.transform(img_pil)\n", - " transformed_frames_tensor.append(transformed_img)\n", - " frames_for_yolo = transformed_frames_tensor\n", - " else:\n", - " frames_for_yolo = list_of_pil_frames\n", - " return frames_for_yolo\n", - "\n", - " @staticmethod\n", - " def __calculate_angles(results_generator):\n", - " angles = []\n", - " # max_num_humans_in_any_frame = 0 # To report max humans in any frame\n", - "\n", - " for frame_idx, results in enumerate(results_generator): # results_generator yields one result object per frame\n", - " current_frame_angle = 0.0 # Default if no person detected or angle cannot be calculated\n", - "\n", - " # Filter for detections that are persons (class 0)\n", - " person_mask = (results.boxes.cls == 0)\n", - " person_boxes = results.boxes[person_mask]\n", - " num_persons_in_frame = len(person_boxes)\n", - "\n", - " # max_num_humans_in_any_frame = max(max_num_humans_in_any_frame, num_persons_in_frame)\n", - "\n", - " if num_persons_in_frame == 0:\n", - " angles.append(current_frame_angle)\n", - " del results # Explicitly clear results from GPU/memory\n", - " continue\n", - "\n", - " # Find the index of the most confident person within the filtered person_boxes\n", - " max_conf_person_idx_in_filtered = person_boxes.conf.argmax().item()\n", - "\n", - " # Get the actual index of this most confident person in the original results.boxes\n", - " # This maps the index from the filtered list back to the original list\n", - " original_indices_of_persons = person_mask.nonzero(as_tuple=True)[0]\n", - " original_index_of_most_confident_person = original_indices_of_persons[max_conf_person_idx_in_filtered]\n", - "\n", - " # Get the Keypoints object for this specific person\n", - " most_confident_person_keypoints_obj = results.keypoints[original_index_of_most_confident_person]\n", - "\n", - " if num_persons_in_frame > 1:\n", - " # Removed print statement for verbosity during dataloading\n", - " pass # Or uncomment: print(f\"Multiple Humans in Frame {frame_idx}: {num_persons_in_frame} detected. Selecting most confident.\")\n", - "\n", - " # Access keypoint data directly from the returned human (which is a Keypoints object for one person)\n", - " if most_confident_person_keypoints_obj.xy.shape[0] > 0: # Check if keypoints exist for the human\n", - " landmarks_tensor = most_confident_person_keypoints_obj.xy[0] # Already (num_keypoints, 3)\n", - " landmarks_np = landmarks_tensor.cpu().numpy()\n", - "\n", - " if landmarks_np.shape[0] > max(COCO.R_WRIST.value, COCO.L_WRIST.value):\n", - " calculator = AngleCalculator(landmarks_np)\n", - " try:\n", - " angle = calculator()\n", - " if 0 <= angle <= 180:\n", - " current_frame_angle = angle\n", - " except Exception as e:\n", - " pass\n", - " angles.append(current_frame_angle)\n", - " del results # Explicitly clear results from GPU/memory\n", - "\n", - " # Now, after processing all frames, perform normalization\n", - " if not angles: # If no angles were calculated (e.g., empty video or no detections)\n", - " return []\n", - "\n", - " angles_np = np.array(angles, dtype=np.float32)\n", - " min_angle, max_angle = np.min(angles_np), np.max(angles_np)\n", - " if max_angle > 0:\n", - " angles_np = (angles_np - min_angle) / (max_angle - min_angle) # Normalize to [0, 1]\n", - "\n", - " return angles_np.tolist() # Return as list or keep as np array based on preference.\n", - "\n", - "\n", - "def collate_fn(batch):\n", - " \"\"\"Pad all sequences of angles to a target length.\"\"\"\n", - " angles_list, labels, lengths = zip(*batch)\n", - "\n", - " padded_angles = []\n", - " for angle_tensor, current_length in zip(angles_list, lengths):\n", - " angle_tensor = angle_tensor.flatten()\n", - " if current_length < MAX_FRAMES:\n", - " # Pad with zeros at the end\n", - " padding = torch.zeros(MAX_FRAMES - current_length, dtype=torch.float32)\n", - " angles = torch.cat([angle_tensor.flatten(), padding], dim=0)\n", - " elif current_length > MAX_FRAMES:\n", - " # Truncate if longer\n", - " angles = angle_tensor[:MAX_FRAMES]\n", - " else:\n", - " angles = angle_tensor\n", - " padded_angles.append(angles)\n", - "\n", - " angles_batch = torch.stack(padded_angles, dim=0)\n", - " labels_batch = torch.tensor(labels)\n", - " lengths_batch = torch.tensor(lengths)\n", - "\n", - " return angles_batch, labels_batch, lengths_batch\n", - "\n", - "\n", - "def get_dataloaders(video_dir, batch_size=4, val_split=0.2, transform=None, feature_dir=None, signal_transform=None):\n", - " \"\"\"Create train and validation dataloaders.\"\"\"\n", - "\n", - " full_dataset = VideoDataset(video_dir, transform=transform, feature_dir=feature_dir, signal_transform=signal_transform)\n", - "\n", - " val_size = int(len(full_dataset) * val_split)\n", - " train_size = len(full_dataset) - val_size\n", - "\n", - " train_dataset, val_dataset = random_split(\n", - " full_dataset,\n", - " [train_size, val_size],\n", - " generator=torch.Generator().manual_seed(42)\n", - " )\n", - "\n", - " train_loader = DataLoader(\n", - " train_dataset,\n", - " batch_size=batch_size,\n", - " shuffle=True,\n", - " num_workers=0, # Changed from 2 to 0 to avoid multiprocessing issues with YOLO model\n", - " collate_fn=collate_fn\n", - " )\n", - "\n", - " val_loader = DataLoader(\n", - " val_dataset,\n", - " batch_size=batch_size,\n", - " shuffle=False,\n", - " num_workers=0, # Changed from 2 to 0\n", - " collate_fn=collate_fn\n", - " )\n", - "\n", - " print(f\"Train: {len(train_dataset)} videos, Val: {len(val_dataset)} videos\\n\")\n", - "\n", - " return train_loader, val_loader\n", - "\n", - "\n", - "def get_balanced_dataloaders(video_dir, batch_size=4, val_split=0.2, transform=None, feature_dir=None, signal_transform=None):\n", - " \"\"\"Create balanced train and validation dataloaders using WeightedRandomSampler.\"\"\"\n", - "\n", - " # 1. Initialize the full dataset\n", - " full_dataset = VideoDataset(video_dir, transform=transform, feature_dir=feature_dir, signal_transform=signal_transform)\n", - "\n", - " # 2. Manual Index Split (to keep track of labels for the sampler)\n", - " dataset_size = len(full_dataset)\n", - " indices = list(range(dataset_size))\n", - " split = int(np.floor(val_split * dataset_size))\n", - "\n", - " # Shuffle indices to ensure random distribution before splitting\n", - " np.random.seed(42)\n", - " np.random.shuffle(indices)\n", - "\n", - " train_indices, val_indices = indices[split:], indices[:split]\n", - "\n", - " # 3. Calculate Weights for the Training Set ONLY\n", - " # We pull the labels corresponding to our training indices\n", - " train_labels = [full_dataset.labels[i] for i in train_indices]\n", - " train_labels = np.array(train_labels).astype(int)\n", - "\n", - " # Count occurrences of each push-up count (class)\n", - " class_sample_count = np.bincount(train_labels)\n", - " # Avoid division by zero for classes that might not exist in the subset\n", - " class_sample_count[class_sample_count == 0] = 1\n", - "\n", - " weight = 1. / class_sample_count\n", - "\n", - " # Assign a weight to every sample in the training set\n", - " samples_weight = torch.from_numpy(weight[train_labels]).double()\n", - "\n", - " # 4. Create the Sampler\n", - " # replacement=True is required to oversample rare classes (like 1s, 6s, 7s)\n", - " sampler = WeightedRandomSampler(samples_weight, len(samples_weight), replacement=True)\n", - "\n", - " # 5. Create Subsets and DataLoaders\n", - " train_dataset = Subset(full_dataset, train_indices)\n", - " val_dataset = Subset(full_dataset, val_indices)\n", - "\n", - " train_loader = DataLoader(\n", - " train_dataset,\n", - " batch_size=batch_size,\n", - " sampler=sampler, # SHUFFLE must be False when using a Sampler\n", - " num_workers=0,\n", - " collate_fn=collate_fn\n", - " )\n", - "\n", - " val_loader = DataLoader(\n", - " val_dataset,\n", - " batch_size=batch_size,\n", - " shuffle=False,\n", - " num_workers=0,\n", - " collate_fn=collate_fn\n", - " )\n", - "\n", - " print(f\"Dataset Balanced: Oversampling rare labels to match common labels.\")\n", - " print(f\"Train: {len(train_dataset)} videos, Val: {len(val_dataset)} videos\\n\")\n", - "\n", - " return train_loader, val_loader\n", - "\n", - "\n", - "# Run pre-computation once. This will take time but saves hours during training.\n", - "def precompute_features(video_dir, output_dir, transform=None):\n", - " os.makedirs(output_dir, exist_ok=True)\n", - " # Create a temporary dataset without transforms for extraction\n", - " ds = VideoDataset(video_dir, transform=transform)\n", - " for i in range(len(ds)):\n", - " filename = ds.video_files[i]\n", - " save_path = os.path.join(output_dir, filename + \".pt\")\n", - " if os.path.exists(save_path):\n", - " continue\n", - " print(f\"Extracting features for {filename} ({i+1}/{len(ds)})...\")\n", - " angles, label, length = ds[i]\n", - " torch.save({'angles': angles, 'length': length, 'label': label}, save_path)\n", - " if DEBUG:\n", - " plot_angles_with_moving_median(angles, title=f\"Expected Pushups: {label}\")\n", - "\n", - "precompute_features(DOWNLOAD_DIR, CACHE_DIR, RESIZER)\n", - "\n", - "\n", - "train_loader, val_loader = get_dataloaders( # get_balanced_dataloaders\n", - " DOWNLOAD_DIR, \n", - " batch_size=4, \n", - " val_split=0.2, \n", - " transform=RESIZER, \n", - " feature_dir=CACHE_DIR, \n", - " signal_transform=None\n", - ")\n", - "\n", - "if DEBUG:\n", - " for angles, labels, lengths in train_loader:\n", - " print(f\"Angles shape: {angles.shape}\") # (B, 1000)\n", - " print(f\"Lengths: {lengths}\")\n", - " print(f\"Labels: {labels}\")\n", - " for a, l in zip(angles, labels):\n", - " plot_angles_with_moving_median(a, title=f\"Expected Pushups: {l}\")" - ] - }, - { - "cell_type": "markdown", - "id": "37b44192", - "metadata": {}, - "source": [ - "## Model" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "e35ebb62", - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torch.nn as nn\n", - "from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence\n", - "import torch.nn.init as init\n", - "\n", - "class PushupCounterSingleOutput(nn.Module):\n", - " def __init__(self, input_size=1, hidden_size=64):\n", - " super().__init__()\n", - " self.bn = nn.BatchNorm1d(input_size)\n", - " self.lstm = nn.LSTM(\n", - " input_size,\n", - " hidden_size,\n", - " bidirectional=True,\n", - " batch_first=True\n", - " )\n", - " \n", - " # Regression head to map the 'essence' of the video to a count\n", - " self.regressor = nn.Sequential(\n", - " nn.Linear(hidden_size * 2, 64),\n", - " nn.ReLU(),\n", - " nn.Linear(64, 1) # Output: Single scalar\n", - " )\n", - "\n", - " # Apply custom initialization\n", - " self.apply(self._init_weights)\n", - "\n", - " def _init_weights(self, module):\n", - " if isinstance(module, nn.Linear):\n", - " # He initialization for Linear layers\n", - " init.kaiming_normal_(module.weight, mode='fan_out', nonlinearity='relu')\n", - " if module.bias is not None:\n", - " init.constant_(module.bias, 0)\n", - " \n", - " elif isinstance(module, nn.LSTM):\n", - " # Orthogonal initialization for recurrent weights\n", - " for name, param in module.named_parameters():\n", - " if 'weight_ih' in name:\n", - " init.xavier_uniform_(param.data)\n", - " elif 'weight_hh' in name:\n", - " init.orthogonal_(param.data)\n", - " elif 'bias' in name:\n", - " init.constant_(param.data, 0)\n", - " # Forget gate bias initialization (standard trick for LSTMs)\n", - " n = param.size(0)\n", - " param.data[n//4:n//2].fill_(1.0)\n", - " \n", - " elif isinstance(module, nn.BatchNorm1d):\n", - " # Standard BN initialization\n", - " init.constant_(module.weight, 1)\n", - " init.constant_(module.bias, 0)\n", - "\n", - " def forward(self, data, lengths):\n", - " # If input is (Batch, SeqLen), turn it into (Batch, SeqLen, 1)\n", - " if data.dim() == 2:\n", - " data = data.unsqueeze(-1)\n", - "\n", - " # 1. Normalize (ignoring camera angle effects)\n", - " data = data.transpose(1, 2)\n", - " data = self.bn(data)\n", - " data = data.transpose(1, 2)\n", - " \n", - " # 2. Pack the padded sequence\n", - " packed_x = pack_padded_sequence(data, lengths.cpu(), batch_first=True, enforce_sorted=False)\n", - " packed_out, (hn, cn) = self.lstm(packed_x)\n", - " \n", - " # 3. Use the Final Hidden State\n", - " # In a Bi-LSTM, the final context is the concatenation of:\n", - " # - The last hidden state of the forward pass\n", - " # - The first hidden state of the backward pass\n", - " # This represents the 'summary' of the entire erratic video.\n", - " \n", - " # hn shape: (num_layers * num_directions, batch, hidden_size)\n", - " # Extract the last layer's forward and backward hidden states\n", - " h_forward = hn[-2, :, :]\n", - " h_backward = hn[-1, :, :]\n", - " combined = torch.cat((h_forward, h_backward), dim=1) # (Batch, hidden_size * 2)\n", - " \n", - " # 4. Predict the final count\n", - " count = self.regressor(combined)\n", - " return count\n" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "id": "255983ec", - "metadata": {}, - "outputs": [], - "source": [ - "from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence\n", - "\n", - "class PushupCounterMaxPool(nn.Module):\n", - " def __init__(self, input_size=1, hidden_size=64):\n", - " super().__init__()\n", - " self.bn = nn.BatchNorm1d(input_size)\n", - " self.lstm = nn.LSTM(\n", - " input_size,\n", - " hidden_size,\n", - " bidirectional=True,\n", - " batch_first=True)\n", - " \n", - " self.regressor = nn.Sequential(\n", - " nn.Linear(hidden_size * 2, 64),\n", - " nn.ReLU(),\n", - " nn.Linear(64, 1)\n", - " )\n", - " # Apply custom weight initialization\n", - " self.apply(self._init_weights)\n", - "\n", - " def _init_weights(self, module):\n", - " \"\"\"\n", - " Professional initialization strategy:\n", - " - Linear: Kaiming (He) Normal for ReLU activation.\n", - " - LSTM: Orthogonal for recurrent weights to prevent gradient issues.\n", - " - BatchNorm: Constant 1 for weights, 0 for biases.\n", - " \"\"\"\n", - " if isinstance(module, nn.Linear):\n", - " init.kaiming_normal_(module.weight, mode='fan_out', nonlinearity='relu')\n", - " if module.bias is not None:\n", - " init.constant_(module.bias, 0)\n", - " \n", - " elif isinstance(module, nn.LSTM):\n", - " for name, param in module.named_parameters():\n", - " if 'weight_ih' in name:\n", - " init.xavier_uniform_(param.data)\n", - " elif 'weight_hh' in name:\n", - " # Orthogonal init is critical for stable LSTM training\n", - " init.orthogonal_(param.data)\n", - " elif 'bias' in name:\n", - " init.constant_(param.data, 0)\n", - " # Set forget gate bias to 1.0 (standard LSTM trick)\n", - " n = param.size(0)\n", - " param.data[n//4:n//2].fill_(1.0)\n", - " \n", - " elif isinstance(module, nn.BatchNorm1d):\n", - " init.constant_(module.weight, 1)\n", - " init.constant_(module.bias, 0)\n", - "\n", - " def forward(self, data, lengths):\n", - " # If input is (Batch, SeqLen), turn it into (Batch, SeqLen, 1)\n", - " if data.dim() == 2:\n", - " data = data.unsqueeze(-1)\n", - "\n", - " # 1. Normalize\n", - " data = data.transpose(1, 2)\n", - " data = self.bn(data)\n", - " data = data.transpose(1, 2)\n", - " \n", - " # 2. LSTM Pass\n", - " packed_x = pack_padded_sequence(data, lengths.cpu(), batch_first=True, enforce_sorted=False)\n", - " packed_out, _ = self.lstm(packed_x)\n", - " \n", - " # Unpack back to (Batch, SeqLen, Hidden*2)\n", - " out, _ = pad_packed_sequence(packed_out, batch_first=True)\n", - " \n", - " # --- GLOBAL MAX POOLING ---\n", - " # We must mask the padded areas before max pooling so the model \n", - " # doesn't pick up '0' as a maximum if the real features are negative.\n", - " mask = torch.arange(out.size(1)).expand(len(lengths), out.size(1)).to(out.device) >= lengths.unsqueeze(1).to(out.device)\n", - " # Fill padded areas with a very small number\n", - " out.masked_fill_(mask.unsqueeze(-1), -1e9)\n", - " \n", - " # Max pool over the time dimension (dim 1)\n", - " # Result: (Batch, Hidden*2)\n", - " pooled, _ = torch.max(out, dim=1)\n", - " \n", - " # 3. Predict single count\n", - " return self.regressor(pooled)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "a1893719", - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torch.nn as nn\n", - "import torch.nn.init as init\n", - "import math\n", - "\n", - "class PositionalEncoding(nn.Module):\n", - " \"\"\"Injects information about the relative or absolute position of the tokens in the sequence.\"\"\"\n", - " def __init__(self, d_model, max_len=5000):\n", - " super().__init__()\n", - " pe = torch.zeros(max_len, d_model)\n", - " position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)\n", - " div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))\n", - " pe[:, 0::2] = torch.sin(position * div_term)\n", - " pe[:, 1::2] = torch.cos(position * div_term)\n", - " self.register_buffer('pe', pe.unsqueeze(0))\n", - "\n", - " def forward(self, x):\n", - " # x shape: (batch_size, seq_len, d_model)\n", - " return x + self.pe[:, :x.size(1), :]\n", - "\n", - "class PushupCounterSingleOutputWithTransformer(nn.Module):\n", - " def __init__(self, input_size=1, d_model=64, nhead=4, num_layers=2, dim_feedforward=128, dropout=0.1):\n", - " super().__init__()\n", - " \n", - " # 1. Normalization (applied to the raw input feature)\n", - " self.bn = nn.BatchNorm1d(input_size)\n", - " \n", - " # 2. Linear Projection: Transformers work better in a higher-dimensional space (d_model)\n", - " self.embedding = nn.Linear(input_size, d_model)\n", - " \n", - " # 3. Positional Encoding: Essential since Transformers don't have recurrence\n", - " self.pos_encoder = PositionalEncoding(d_model)\n", - " \n", - " # 4. Transformer Encoder\n", - " encoder_layer = nn.TransformerEncoderLayer(\n", - " d_model=d_model,\n", - " nhead=nhead,\n", - " dim_feedforward=dim_feedforward,\n", - " dropout=dropout,\n", - " batch_first=True # Keeps shape as (Batch, Seq, Feature)\n", - " )\n", - " self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)\n", - " \n", - " # 5. Regression head\n", - " # The input to the first linear layer is d_model (the size of the pooled sequence)\n", - " self.regressor = nn.Sequential(\n", - " nn.Linear(d_model, 64),\n", - " nn.ReLU(),\n", - " nn.Linear(64, 1)\n", - " )\n", - "\n", - " # Apply custom initialization\n", - " self.apply(self._init_weights)\n", - "\n", - " def _init_weights(self, module):\n", - " if isinstance(module, nn.Linear):\n", - " init.kaiming_normal_(module.weight, mode='fan_out', nonlinearity='relu')\n", - " if module.bias is not None:\n", - " init.constant_(module.bias, 0)\n", - " elif isinstance(module, nn.BatchNorm1d):\n", - " init.constant_(module.weight, 1)\n", - " init.constant_(module.bias, 0)\n", - "\n", - " def forward(self, data, lengths):\n", - " # Ensure data is (Batch, SeqLen, input_size)\n", - " if data.dim() == 2:\n", - " data = data.unsqueeze(-1)\n", - "\n", - " # 1. Normalize\n", - " data = data.transpose(1, 2)\n", - " data = self.bn(data)\n", - " data = data.transpose(1, 2)\n", - " \n", - " # 2. Project to d_model and add Positional Encoding\n", - " x = self.embedding(data) \n", - " x = self.pos_encoder(x)\n", - " \n", - " # 3. Create Padding Mask\n", - " # Transformer needs to know which parts of the sequence are padding.\n", - " # Mask shape: (Batch, SeqLen), True values are ignored by attention.\n", - " batch_size, seq_len, _ = x.shape\n", - " mask = torch.arange(seq_len, device=x.device).expand(batch_size, seq_len) >= lengths.unsqueeze(1)\n", - " \n", - " # 4. Transformer Forward Pass\n", - " # encoded shape: (Batch, SeqLen, d_model)\n", - " encoded = self.transformer_encoder(x, src_key_padding_mask=mask)\n", - " \n", - " # 5. Global Average Pooling (Handling variable lengths)\n", - " # Instead of taking the last hidden state, we average all non-padded tokens.\n", - " mask_expanded = mask.unsqueeze(-1).expand_as(encoded)\n", - " encoded_masked = encoded.masked_fill(mask_expanded, 0.0)\n", - " \n", - " # Sum across the sequence and divide by actual lengths\n", - " sum_encoded = torch.sum(encoded_masked, dim=1)\n", - " mean_encoded = sum_encoded / lengths.unsqueeze(1).float()\n", - " \n", - " # 6. Predict the final count\n", - " count = self.regressor(mean_encoded)\n", - " return count\n" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "id": "c41798f4", - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torch.nn as nn\n", - "import torch.nn.init as init\n", - "\n", - "class PushupCounterSingleOutputLight(nn.Module):\n", - " def __init__(self, input_size=1, hidden_size=32, stride=2):\n", - " super().__init__()\n", - " \n", - " # 1. Convolutional Stem to implement 'Stride'\n", - " # This reduces the sequence length by the stride factor and \n", - " # projects the input_size to hidden_size.\n", - " self.stride = stride\n", - " self.conv_stem = nn.Conv1d(\n", - " in_channels=input_size, \n", - " out_channels=hidden_size, \n", - " kernel_size=3, \n", - " stride=stride, \n", - " padding=1\n", - " )\n", - " \n", - " self.bn = nn.BatchNorm1d(hidden_size)\n", - " \n", - " # 2. Lightweight LSTM - smaller hidden_size makes this much lighter\n", - " self.lstm = nn.LSTM(\n", - " hidden_size,\n", - " hidden_size,\n", - " bidirectional=True, \n", - " batch_first=True\n", - " )\n", - " \n", - " # 3. Slimmed Regression head\n", - " self.regressor = nn.Sequential(\n", - " nn.Linear(hidden_size, 32),\n", - " nn.ReLU(),\n", - " nn.Linear(32, 1)\n", - " )\n", - "\n", - " self.apply(self._init_weights)\n", - "\n", - " def _init_weights(self, module):\n", - " if isinstance(module, (nn.Linear, nn.Conv1d)):\n", - " init.kaiming_normal_(module.weight, mode='fan_out', nonlinearity='relu')\n", - " if module.bias is not None:\n", - " init.constant_(module.bias, 0)\n", - " elif isinstance(module, nn.LSTM):\n", - " for name, param in module.named_parameters():\n", - " if 'weight_ih' in name:\n", - " init.xavier_uniform_(param.data)\n", - " elif 'weight_hh' in name:\n", - " init.orthogonal_(param.data)\n", - " elif 'bias' in name:\n", - " init.constant_(param.data, 0)\n", - "\n", - " def forward(self, data, lengths):\n", - " # Ensure data is (Batch, SeqLen, input_size)\n", - " if data.dim() == 2:\n", - " data = data.unsqueeze(-1)\n", - "\n", - " # 1. Apply Stride via Conv1d\n", - " # Conv1d expects (Batch, Channels, SeqLen)\n", - " x = data.transpose(1, 2)\n", - " x = self.conv_stem(x)\n", - " x = self.bn(x)\n", - " x = x.transpose(1, 2) # Back to (Batch, NewSeqLen, hidden_size)\n", - " \n", - " # 2. Adjust lengths for the stride\n", - " # Since we used a Conv1d with stride, the sequence length is shorter\n", - " new_lengths = torch.div(lengths, self.stride, rounding_mode='floor')\n", - " # Ensure length is at least 1 to avoid packing errors\n", - " new_lengths = torch.clamp(new_lengths, min=1)\n", - " \n", - " # 3. LSTM Processing\n", - " packed_x = nn.utils.rnn.pack_padded_sequence(\n", - " x, new_lengths.cpu(), batch_first=True, enforce_sorted=False\n", - " )\n", - " _, (hn, _) = self.lstm(packed_x)\n", - " \n", - " # hn shape: (num_layers * num_directions, batch, hidden_size)\n", - " # Since it's unidirectional, we just take the last layer\n", - " combined = hn[-1, :, :] \n", - " \n", - " # 4. Predict\n", - " count = self.regressor(combined)\n", - " return count\n" - ] - }, - { - "cell_type": "markdown", - "id": "d482fc69", - "metadata": {}, - "source": [ - "## Training and Testing" - ] - }, - { - "cell_type": "markdown", - "id": "e7f08201", - "metadata": {}, - "source": [ - "### Training" - ] - }, - { - "cell_type": "markdown", - "id": "fe58ddc9", - "metadata": {}, - "source": [ - "#### Run per Epoch" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "8f3bc7db", - "metadata": {}, - "outputs": [], - "source": [ - "def run_epoch(model, loader, criterion, optimizer=None, device='cpu', debug=False):\n", - " is_train = optimizer is not None\n", - " model.train() if is_train else model.eval()\n", - "\n", - " total_diffs = 0\n", - " total_loss = 0\n", - " total_abs_error = 0\n", - " total_samples = 0\n", - "\n", - " context = torch.enable_grad() if is_train else torch.no_grad()\n", - "\n", - " with context:\n", - " for batch_x, batch_y, lengths in loader:\n", - " # 1. Prepare Data\n", - " batch_x = batch_x.to(device)\n", - " batch_y = batch_y.to(device).float() # Labels must be float for MSE/Huber loss\n", - "\n", - " if is_train:\n", - " optimizer.zero_grad()\n", - "\n", - " # 2. Forward Pass\n", - " # outputs shape: (Batch, 1)\n", - " outputs = model(batch_x, lengths)\n", - " outputs = outputs.squeeze(-1) # Match batch_y shape: (Batch,)\n", - "\n", - " # 3. Loss Calculation\n", - " loss = criterion(outputs, batch_y)\n", - "\n", - " if is_train:\n", - " loss.backward()\n", - " optimizer.step()\n", - "\n", - " total_loss += loss.item()\n", - "\n", - " # 4. Metrics: Round the predicted float to the nearest whole pushup\n", - " preds = torch.round(outputs)\n", - "\n", - " # Calculate Absolute Error (e.g., predicted 5.2, actual 5 -> error 0.2)\n", - " # We use absolute error to track how many pushups we are off by\n", - " total_diffs += (preds != batch_y).sum().item()\n", - " total_abs_error += torch.abs(preds - batch_y).sum().item()\n", - " total_samples += batch_y.size(0)\n", - "\n", - " # Debug Printing\n", - " if debug:\n", - " print(f\"Expected Counts: {batch_y.cpu().numpy()}\")\n", - " print(f\"outputs : {outputs}\")\n", - " print(f\"Predicted Counts: {preds.detach().cpu().numpy()}\")\n", - "\n", - " avg_loss = total_loss / len(loader)\n", - " # This represents 'Mean Absolute Error' - Average pushups missed per video\n", - " mae = total_abs_error / total_samples\n", - " acc = (total_samples - total_diffs) / total_samples\n", - "\n", - " return avg_loss, mae, acc" - ] - }, - { - "cell_type": "markdown", - "id": "0f55b94e", - "metadata": {}, - "source": [ - "#### Actual Training" - ] - }, - { - "cell_type": "code", - "execution_count": 130, - "id": "01258d83", - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torch.optim as optim\n", - "\n", - "def train_model(model, epochs=MAX_EPOCHS):\n", - " outputs = {\n", - " \"train_loss\": [],\n", - " \"train_mae\": [],\n", - " \"train_acc\": [],\n", - " \"val_loss\": [],\n", - " \"val_mae\": [],\n", - " \"val_acc\": [],\n", - " \"model\": None\n", - " }\n", - " # Hyperparameters\n", - " base_lr = 1e-3\n", - " warmup_epochs = 5\n", - " # Stuff for Training\n", - " criterion = nn.HuberLoss()\n", - " # Use pos_weight if 'rep completion' is rare (e.g., 1 frame in 100)\n", - " optimizer = optim.Adam(model.parameters(), lr=base_lr)\n", - "\n", - " # Warmup Scheduler: Linearly increases LR from 0 to base_lr\n", - " # The lambda function returns a multiplier for the base_lr\n", - " lr_lambda = lambda epoch: (epoch + 1) / warmup_epochs if epoch < warmup_epochs else 1\n", - " warmup_scheduler = optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lr_lambda)\n", - "\n", - " # Main Scheduler: Reduces LR when validation loss stalls\n", - " # mode='min': we want to minimize validation loss\n", - " # factor=0.5: cut LR in half when stalled\n", - " # patience=5: wait 5 epochs of no improvement before cutting\n", - " plateau_scheduler = optim.lr_scheduler.ReduceLROnPlateau(\n", - " optimizer, \n", - " mode='min', \n", - " factor=0.5, \n", - " patience=5\n", - " )\n", - "\n", - " # Tracking variables before the loop\n", - " best_val_loss = float('inf')\n", - " model_name = type(model).__name__\n", - " save_path = os.path.join(WEIGHTS_DIR, f\"best_model_weights_{model_name}.pth\")\n", - "\n", - " for epoch in range(epochs):\n", - " # Train and Validate\n", - " train_loss, train_mae, train_acc = run_epoch(model, train_loader, criterion, optimizer, DEVICE)\n", - " val_loss, val_mae, val_acc = run_epoch(model, val_loader, criterion, None, DEVICE)\n", - " # --- Scheduler Step Logic ---\n", - " if epoch < warmup_epochs:\n", - " # During warmup, we step the warmup scheduler every epoch\n", - " warmup_scheduler.step()\n", - " current_lr = optimizer.param_groups[0]['lr']\n", - " print(f\"Epoch {epoch+1}: Warmup Phase - LR: {current_lr:.6f}\")\n", - " else:\n", - " # After warmup, we switch to the plateau scheduler\n", - " plateau_scheduler.step(val_loss)\n", - " current_lr = optimizer.param_groups[0]['lr']\n", - " print(f\"Epoch {epoch+1}: Plateau Phase - LR: {current_lr:.6f}\")\n", - "\n", - " print(f\"Epoch [{epoch+1:>3d}/{epochs}] | \"\n", - " f\"Train Loss: {train_loss:.4f} | Train MAE: {train_mae:.4f} | Train Acc: {train_acc:.4f} |\"\n", - " f\"Val Loss: {val_loss:.4f} | Val MAE: {val_mae:.4f} | Val Acc: {val_acc:.4f}\")\n", - " outputs[\"train_loss\"].append(train_loss)\n", - " outputs[\"train_mae\"].append(train_mae)\n", - " outputs[\"train_acc\"].append(train_acc)\n", - " outputs[\"val_loss\"].append(val_loss)\n", - " outputs[\"val_mae\"].append(val_mae)\n", - " outputs[\"val_acc\"].append(val_acc)\n", - "\n", - " # 2. Check if this is the best model we've seen so far\n", - " if val_loss < best_val_loss:\n", - " best_val_loss = val_loss\n", - "\n", - " # 3. Save the state_dict (the weights)\n", - " torch.save({\n", - " 'epoch': epoch,\n", - " 'model_state_dict': model.state_dict(),\n", - " 'optimizer_state_dict': optimizer.state_dict(),\n", - " 'loss': val_loss,\n", - " }, save_path)\n", - "\n", - " print(f\"--> Best model saved with Val Loss: {val_loss:.4f}\")\n", - " outputs[\"model\"] = model\n", - " return outputs" - ] - }, - { - "cell_type": "markdown", - "id": "bf52fb55", - "metadata": {}, - "source": [ - "#### Let's Do It!" - ] - }, - { - "cell_type": "code", - "execution_count": 131, - "id": "f21b0cf1", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 3, + "id": "9ba61cb6", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9ba61cb6", + "outputId": "11dc637c-e17f-4c79-c317-ce60b75720f1" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Device: cuda\n", + "Training Start Time (UNIX): 1767564156\n" + ] + } + ], + "source": [ + "# Admin =================================================================================\n", + "import os\n", + "import time\n", + "DOWNLOAD_DIR = './training-data'\n", + "CACHE_DIR = './cache-data'\n", + "WEIGHTS_DIR = './model-weights'\n", + "os.makedirs(DOWNLOAD_DIR, exist_ok=True)\n", + "os.makedirs(CACHE_DIR, exist_ok=True)\n", + "os.makedirs(WEIGHTS_DIR, exist_ok=True)\n", + "\n", + "# To GPU or not to GPU =================================================================\n", + "import torch\n", + "DEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", + "print(f\"Device: {DEVICE}\")\n", + "\n", + "# Landmark Extraction ==================================================================\n", + "from ultralytics import YOLO\n", + "YOLO_DIR = './yolo-weights'\n", + "os.makedirs(YOLO_DIR, exist_ok=True)\n", + "YOLO_DIR\n", + "YOLO_MODEL = \"yolov8s\"\n", + "YOLO_MODEL_FILE = os.path.join(YOLO_DIR, f\"{YOLO_MODEL}-pose.pt\")\n", + "# assert os.path.exists(YOLO_MODEL_FILE)\n", + "YOLO_TRACKER = \"bytetrack.yaml\"\n", + "YOLO_TRACKER_FILE = os.path.join(YOLO_DIR, YOLO_TRACKER)\n", + "# assert os.path.exists(YOLO_TRACKER_FILE)\n", + "\n", + "# Model Stuff ===========================================================================\n", + "DEBUG = False\n", + "RAND_SEED = 711\n", + "VID_STRIDE = 2\n", + "MAX_FRAMES = 1000\n", + "MAX_EPOCHS = 200\n", + "MAX_FRAME_LENGTH = 640\n", + "\n", + "# Mandatory timestamps for the 5-hour limit\n", + "print(f\"Training Start Time (UNIX): {int(time.time())}\")" + ] + }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\Users\\drmaatt\\miniconda3\\envs\\openpifpaf_env\\Lib\\site-packages\\torch\\optim\\lr_scheduler.py:62: UserWarning: The verbose parameter is deprecated. Please use get_last_lr() to access the learning rate.\n", - " warnings.warn(\n" - ] + "cell_type": "markdown", + "id": "397089dc", + "metadata": { + "id": "397089dc" + }, + "source": [ + "## Download Training Videos" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1: Warmup Phase - LR: 0.000400\n", - "Epoch [ 1/10] | Train Loss: 4.6234 | Train MAE: 5.0952 | Train Acc: 0.1111 |Val Loss: 1.0114 | Val MAE: 1.4000 | Val Acc: 0.2667\n", - "--> Best model saved with Val Loss: 1.0114\n", - "Epoch 2: Warmup Phase - LR: 0.000600\n", - "Epoch [ 2/10] | Train Loss: 1.4606 | Train MAE: 1.9206 | Train Acc: 0.2063 |Val Loss: 1.3579 | Val MAE: 1.8667 | Val Acc: 0.1333\n", - "Epoch 3: Warmup Phase - LR: 0.000800\n", - "Epoch [ 3/10] | Train Loss: 0.7846 | Train MAE: 1.1270 | Train Acc: 0.2698 |Val Loss: 0.7335 | Val MAE: 1.2667 | Val Acc: 0.2667\n", - "--> Best model saved with Val Loss: 0.7335\n", - "Epoch 4: Warmup Phase - LR: 0.001000\n", - "Epoch [ 4/10] | Train Loss: 0.5255 | Train MAE: 0.8889 | Train Acc: 0.3175 |Val Loss: 0.5114 | Val MAE: 0.7333 | Val Acc: 0.4000\n", - "--> Best model saved with Val Loss: 0.5114\n", - "Epoch 5: Warmup Phase - LR: 0.001000\n", - "Epoch [ 5/10] | Train Loss: 0.5526 | Train MAE: 0.8571 | Train Acc: 0.3968 |Val Loss: 0.5579 | Val MAE: 1.0000 | Val Acc: 0.2000\n", - "Epoch 6: Plateau Phase - LR: 0.001000\n", - "Epoch [ 6/10] | Train Loss: 0.4798 | Train MAE: 0.7460 | Train Acc: 0.4603 |Val Loss: 0.7175 | Val MAE: 1.2667 | Val Acc: 0.1333\n", - "Epoch 7: Plateau Phase - LR: 0.001000\n", - "Epoch [ 7/10] | Train Loss: 0.4128 | Train MAE: 0.7460 | Train Acc: 0.4603 |Val Loss: 0.5253 | Val MAE: 0.8000 | Val Acc: 0.4000\n", - "Epoch 8: Plateau Phase - LR: 0.001000\n", - "Epoch [ 8/10] | Train Loss: 0.3891 | Train MAE: 0.7143 | Train Acc: 0.4127 |Val Loss: 0.4651 | Val MAE: 0.8667 | Val Acc: 0.4000\n", - "--> Best model saved with Val Loss: 0.4651\n", - "Epoch 9: Plateau Phase - LR: 0.001000\n", - "Epoch [ 9/10] | Train Loss: 0.3735 | Train MAE: 0.6349 | Train Acc: 0.5238 |Val Loss: 0.5769 | Val MAE: 1.1333 | Val Acc: 0.1333\n", - "Epoch 10: Plateau Phase - LR: 0.001000\n", - "Epoch [ 10/10] | Train Loss: 0.3806 | Train MAE: 0.6349 | Train Acc: 0.5079 |Val Loss: 0.6549 | Val MAE: 1.1333 | Val Acc: 0.1333\n" - ] - } - ], - "source": [ - "# setting a manual seed for reproducibility\n", - "RAND_SEED = 711\n", - "torch.manual_seed(RAND_SEED)\n", - "model = PushupCounterSingleOutputLight().to(DEVICE)\n", - "outputs = train_model(model, epochs=10)" - ] - }, - { - "cell_type": "markdown", - "id": "a836629b", - "metadata": {}, - "source": [ - "### Performance Plots" - ] - }, - { - "cell_type": "code", - "execution_count": 132, - "id": "83473ef3", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 4, + "id": "21717985", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "21717985", + "outputId": "188a3fa8-285a-43fb-fc2c-0592553ca96d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "File already exists, skipping: 1_dksksjfwijf.mp4\n", + "File already exists, skipping: 2_dfsaeklnvvalkej.mp4\n", + "File already exists, skipping: 2_difficult_2.mp4\n", + "File already exists, skipping: 2_difficult_sdafkljsalkfj.mp4\n", + "File already exists, skipping: 2_dkdjwkndkfw.mp4\n", + "File already exists, skipping: 2_dkdmkejkeimdh.mp4\n", + "File already exists, skipping: 2_dkjd823kjf.mp4\n", + "File already exists, skipping: 2_dsalkfjalwkenlke.mp4\n", + "File already exists, skipping: 2_kling_20251205_Text_to_Video_On_a_sandy_4976_0.mp4\n", + "File already exists, skipping: 2_kling_20251206_Text_to_Video_Generate_a_71_1.mp4\n", + "File already exists, skipping: 2_sadfasjldkfjaseifj.mp4\n", + "File already exists, skipping: 2_sdafkjaslkclaksdjkas.mp4\n", + "File already exists, skipping: 2_sdfkjsaleijflaskdjf.mp4\n", + "File already exists, skipping: 2_sdjfhafsldkjhjk.mp4\n", + "File already exists, skipping: 2_sdkjdsflkjfwa.mp4\n", + "File already exists, skipping: 2_sdlfjlewlkjkj.mp4\n", + "File already exists, skipping: 2_sdlkjsaelijfksdjf.mp4\n", + "File already exists, skipping: 3_asldkfjalwieaskdfaskdf.mp4\n", + "File already exists, skipping: 3_dkk873lkjlksajdf.mp4\n", + "File already exists, skipping: 3_dsjlaeijlksjdfie.mp4\n", + "File already exists, skipping: 3_dsksdfjbvsdkj.mp4\n", + "File already exists, skipping: 3_dslkaldskjflakjs.mp4\n", + "File already exists, skipping: 3_ewdfkjwaeoihjlkasdjf.mp4\n", + "File already exists, skipping: 3_kling_20251205_Text_to_Video_In_a_grass_4697_0.mp4\n", + "File already exists, skipping: 3_kling_20251205_Text_to_Video_On_a_playg_5028_0.mp4\n", + "File already exists, skipping: 3_kling_20251205_Text_to_Video_On_a_playg_5064_0.mp4\n", + "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_17_0.mp4\n", + "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_315_0.mp4\n", + "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_315_2.mp4\n", + "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_712_3.mp4\n", + "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_71_0.mp4\n", + "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_71_2.mp4\n", + "File already exists, skipping: 3_kling_20251206_Text_to_Video_Generate_a_71_3.mp4\n", + "File already exists, skipping: 3_kling_20251209_Image_to_Video_Generate_a_613_1.mp4\n", + "File already exists, skipping: 3_kling_20251209_Image_to_Video_Generate_a_635_0.mp4\n", + "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_190_1.mp4\n", + "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_403_1.mp4\n", + "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_491_0.mp4\n", + "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_491_1.mp4\n", + "File already exists, skipping: 3_kling_20251209_Text_to_Video_Generate_a_491_2.mp4\n", + "File already exists, skipping: 3_kling_dskfseu.mp4\n", + "File already exists, skipping: 3_kling_kdjflaskdjf.mp4\n", + "File already exists, skipping: 3_sadklfjasbnlkjlfkj.mp4\n", + "File already exists, skipping: 3_sadlfkjasldkfjasleijlkjfd.mp4\n", + "File already exists, skipping: 3_sadlfkjawelnflksdjf.mp4\n", + "File already exists, skipping: 3_sdfjwaiejflkasjdf.mp4\n", + "File already exists, skipping: 3_sdflkjliejkjdf.mp4\n", + "File already exists, skipping: 3_sdlkfjaleknaksej.mp4\n", + "File already exists, skipping: 3_sdlkfjalkjejafe.mp4\n", + "File already exists, skipping: 3_sdlkjfaslkjfalskjdf.mp4\n", + "File already exists, skipping: 3_sdlkjslndflkseijlkjef.mp4\n", + "File already exists, skipping: 4_20251209_Text_to_Video_Generate_a_561_0.mp4\n", + "File already exists, skipping: 4_asdlkfjalsflnekj.mp4\n", + "File already exists, skipping: 4_aslkcasckmwlejk.mp4\n", + "File already exists, skipping: 4_aslkjasmcalkewjlkje.mp4\n", + "File already exists, skipping: 4_dssalsdkfjweijf.mp4\n", + "File already exists, skipping: 4_kling_20251206_Text_to_Video_Generate_a_28_0.mp4\n", + "File already exists, skipping: 4_kling_20251206_Text_to_Video_Generate_a_315_3.mp4\n", + "File already exists, skipping: 4_kling_20251206_Text_to_Video_Generate_a_58_0.mp4\n", + "File already exists, skipping: 4_kling_20251207_Text_to_Video_Generate_a_521_1.mp4\n", + "File already exists, skipping: 4_kling_20251209_Image_to_Video_Generate_a_635_1.mp4\n", + "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_190_0.mp4\n", + "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_218_0.mp4\n", + "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_263_1.mp4\n", + "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_377_1.mp4\n", + "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_452_0.mp4\n", + "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_452_1.mp4\n", + "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_561_1.mp4\n", + "File already exists, skipping: 4_kling_20251209_Text_to_Video_Generate_a_588_2.mp4\n", + "File already exists, skipping: 4_pushup_1f2da596-7619-4d55-9376-069e15a42a1a_h264.mp4\n", + "File already exists, skipping: 4_sadflkjasldkjfalseij.mp4\n", + "File already exists, skipping: 4_sadlfkjlknewkjejk.mp4\n", + "File already exists, skipping: 5_sadfjhaslfkjasdlkfjsa.mp4\n", + "File already exists, skipping: 5_sdfkljweoijlkjdsflkjweaij.mp4\n", + "File already exists, skipping: 6_dfjewaijsldkjfsaef.mp4\n", + "File already exists, skipping: 6_kling_20251209_Text_to_Video_Generate_a_218_1.mp4\n", + "File already exists, skipping: 7_sadkjfkljekj.mp4\n", + "\n", + "==================================================\n", + "Downloaded videos:\n", + "==================================================\n", + "1_dksksjfwijf.mp4\n", + "2_dfsaeklnvvalkej.mp4\n", + "2_difficult_2.mp4\n", + "2_difficult_sdafkljsalkfj.mp4\n", + "2_dkdjwkndkfw.mp4\n", + "2_dkdmkejkeimdh.mp4\n", + "2_dkjd823kjf.mp4\n", + "2_dsalkfjalwkenlke.mp4\n", + "2_kling_20251205_Text_to_Video_On_a_sandy_4976_0.mp4\n", + "2_kling_20251206_Text_to_Video_Generate_a_71_1.mp4\n", + "2_sadfasjldkfjaseifj.mp4\n", + "2_sdafkjaslkclaksdjkas.mp4\n", + "2_sdfkjsaleijflaskdjf.mp4\n", + "2_sdjfhafsldkjhjk.mp4\n", + "2_sdkjdsflkjfwa.mp4\n", + "2_sdlfjlewlkjkj.mp4\n", + "2_sdlkjsaelijfksdjf.mp4\n", + "3_asldkfjalwieaskdfaskdf.mp4\n", + "3_dkk873lkjlksajdf.mp4\n", + "3_dsjlaeijlksjdfie.mp4\n", + "3_dsksdfjbvsdkj.mp4\n", + "3_dslkaldskjflakjs.mp4\n", + "3_ewdfkjwaeoihjlkasdjf.mp4\n", + "3_kling_20251205_Text_to_Video_In_a_grass_4697_0.mp4\n", + "3_kling_20251205_Text_to_Video_On_a_playg_5028_0.mp4\n", + "3_kling_20251205_Text_to_Video_On_a_playg_5064_0.mp4\n", + "3_kling_20251206_Text_to_Video_Generate_a_17_0.mp4\n", + "3_kling_20251206_Text_to_Video_Generate_a_315_0.mp4\n", + "3_kling_20251206_Text_to_Video_Generate_a_315_2.mp4\n", + "3_kling_20251206_Text_to_Video_Generate_a_712_3.mp4\n", + "3_kling_20251206_Text_to_Video_Generate_a_71_0.mp4\n", + "3_kling_20251206_Text_to_Video_Generate_a_71_2.mp4\n", + "3_kling_20251206_Text_to_Video_Generate_a_71_3.mp4\n", + "3_kling_20251209_Image_to_Video_Generate_a_613_1.mp4\n", + "3_kling_20251209_Image_to_Video_Generate_a_635_0.mp4\n", + "3_kling_20251209_Text_to_Video_Generate_a_190_1.mp4\n", + "3_kling_20251209_Text_to_Video_Generate_a_403_1.mp4\n", + "3_kling_20251209_Text_to_Video_Generate_a_491_0.mp4\n", + "3_kling_20251209_Text_to_Video_Generate_a_491_1.mp4\n", + "3_kling_20251209_Text_to_Video_Generate_a_491_2.mp4\n", + "3_kling_dskfseu.mp4\n", + "3_kling_kdjflaskdjf.mp4\n", + "3_sadklfjasbnlkjlfkj.mp4\n", + "3_sadlfkjasldkfjasleijlkjfd.mp4\n", + "3_sadlfkjawelnflksdjf.mp4\n", + "3_sdfjwaiejflkasjdf.mp4\n", + "3_sdflkjliejkjdf.mp4\n", + "3_sdlkfjaleknaksej.mp4\n", + "3_sdlkfjalkjejafe.mp4\n", + "3_sdlkjfaslkjfalskjdf.mp4\n", + "3_sdlkjslndflkseijlkjef.mp4\n", + "4_20251209_Text_to_Video_Generate_a_561_0.mp4\n", + "4_asdlkfjalsflnekj.mp4\n", + "4_aslkcasckmwlejk.mp4\n", + "4_aslkjasmcalkewjlkje.mp4\n", + "4_dssalsdkfjweijf.mp4\n", + "4_kling_20251206_Text_to_Video_Generate_a_28_0.mp4\n", + "4_kling_20251206_Text_to_Video_Generate_a_315_3.mp4\n", + "4_kling_20251206_Text_to_Video_Generate_a_58_0.mp4\n", + "4_kling_20251207_Text_to_Video_Generate_a_521_1.mp4\n", + "4_kling_20251209_Image_to_Video_Generate_a_635_1.mp4\n", + "4_kling_20251209_Text_to_Video_Generate_a_190_0.mp4\n", + "4_kling_20251209_Text_to_Video_Generate_a_218_0.mp4\n", + "4_kling_20251209_Text_to_Video_Generate_a_263_1.mp4\n", + "4_kling_20251209_Text_to_Video_Generate_a_377_1.mp4\n", + "4_kling_20251209_Text_to_Video_Generate_a_452_0.mp4\n", + "4_kling_20251209_Text_to_Video_Generate_a_452_1.mp4\n", + "4_kling_20251209_Text_to_Video_Generate_a_561_1.mp4\n", + "4_kling_20251209_Text_to_Video_Generate_a_588_2.mp4\n", + "4_pushup_1f2da596-7619-4d55-9376-069e15a42a1a_h264.mp4\n", + "4_sadflkjasldkjfalseij.mp4\n", + "4_sadlfkjlknewkjejk.mp4\n", + "5_sadfjhaslfkjasdlkfjsa.mp4\n", + "5_sdfkljweoijlkjdsflkjweaij.mp4\n", + "6_dfjewaijsldkjfsaef.mp4\n", + "6_kling_20251209_Text_to_Video_Generate_a_218_1.mp4\n", + "7_sadkjfkljekj.mp4\n", + "\n", + "Total: 77 files\n" + ] + } + ], + "source": [ + "import boto3\n", + "from botocore import UNSIGNED\n", + "from botocore.config import Config\n", + "import os\n", + "\n", + "# Connect to S3 without authentication (public bucket)\n", + "s3 = boto3.client('s3', config=Config(signature_version=UNSIGNED))\n", + "\n", + "bucket_name = 'prism-mvta'\n", + "prefix = 'training-and-validation-data/'\n", + "\n", + "# List all objects in the S3 path\n", + "paginator = s3.get_paginator('list_objects_v2')\n", + "pages = paginator.paginate(Bucket=bucket_name, Prefix=prefix)\n", + "\n", + "video_names = []\n", + "\n", + "for page in pages:\n", + " if 'Contents' not in page:\n", + " print(\"No files found at the specified path! Go and complain to the TAs!\")\n", + " break\n", + "\n", + " for obj in page['Contents']:\n", + " key = obj['Key']\n", + " filename = os.path.basename(key)\n", + "\n", + " if not filename:\n", + " continue\n", + "\n", + " video_names.append(filename)\n", + "\n", + " remote_path = os.path.join(DOWNLOAD_DIR, filename)\n", + " if os.path.exists(remote_path):\n", + " print(f\"File already exists, skipping: {filename}\")\n", + " continue\n", + " print(f\"Downloading: {filename}\")\n", + " s3.download_file(bucket_name, key, remote_path)\n", + "\n", + "print(\"\\n\" + \"=\"*50)\n", + "print(\"Downloaded videos:\")\n", + "print(\"=\"*50)\n", + "for name in video_names:\n", + " print(name)\n", + "\n", + "print(f\"\\nTotal: {len(video_names)} files\")" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "==============================\n", - " TOP 5 PERFORMANCE TABLE\n", - "==============================\n", - " train_loss train_mae train_acc val_loss val_mae val_acc model\n", - "Epoch \n", - "8 0.389123 0.714286 0.412698 0.465053 0.866667 0.400000 PushupCounterSingleOutputLight(\\n (conv_stem): Conv1d(1, 32, kernel_size=(3,), stride=(2,), padding=(1,))\\n (bn): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(32, 32, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=32, out_features=32, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=32, out_features=1, bias=True)\\n )\\n)\n", - "4 0.525525 0.888889 0.317460 0.511391 0.733333 0.400000 PushupCounterSingleOutputLight(\\n (conv_stem): Conv1d(1, 32, kernel_size=(3,), stride=(2,), padding=(1,))\\n (bn): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(32, 32, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=32, out_features=32, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=32, out_features=1, bias=True)\\n )\\n)\n", - "7 0.412846 0.746032 0.460317 0.525343 0.800000 0.400000 PushupCounterSingleOutputLight(\\n (conv_stem): Conv1d(1, 32, kernel_size=(3,), stride=(2,), padding=(1,))\\n (bn): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(32, 32, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=32, out_features=32, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=32, out_features=1, bias=True)\\n )\\n)\n", - "5 0.552618 0.857143 0.396825 0.557888 1.000000 0.200000 PushupCounterSingleOutputLight(\\n (conv_stem): Conv1d(1, 32, kernel_size=(3,), stride=(2,), padding=(1,))\\n (bn): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(32, 32, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=32, out_features=32, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=32, out_features=1, bias=True)\\n )\\n)\n", - "9 0.373527 0.634921 0.523810 0.576881 1.133333 0.133333 PushupCounterSingleOutputLight(\\n (conv_stem): Conv1d(1, 32, kernel_size=(3,), stride=(2,), padding=(1,))\\n (bn): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(32, 32, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=32, out_features=32, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=32, out_features=1, bias=True)\\n )\\n)\n", - "==============================\n", - "\n" - ] + "cell_type": "markdown", + "id": "c5b3333e", + "metadata": { + "id": "c5b3333e" + }, + "source": [ + "## Secret Sauce" + ] }, { - "data": { - "image/png": "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7PPPP2dNmzZlTk5OLCAggE2dOpWlp6cbfE5ubi5btGgRCwkJYU5OTiwyMpKtW7eOJSQkmMyl9HKWVtH19v333+t9Vv/+/YW2itamTZv0punXr5/e6xXdfktvN8Zu2mUu/f779++zSZMmscDAQObk5MRatmxp9H8MU3mZWoelcyzr+7V0+UtvN6WVt52lpqayF154gdWoUUPYd27btq1C+85Hjx6xGTNmsKCgIObo6MgaN26s93vTUu0PxhijTgCESEjpL6KhQ4cK9z///HPGmGbH4+HhwQCwli1b6n0Bl244HTlyRO9HeembXC5nH3/8sd57MjIyWOPGjY1OP3DgQJNflHl5eXoH4Yzd5s2bV+byWqsTQElJCRs1alSZZYuIiGBJSUnCe2JiYpirq2uZ79mzZ48wfXkNr/bt25u1bIwx1q1bN+F9a9euNXjdkvXk3LlzevNas2aN2eWsbCcAxhhr3bq1ycYMIYQQYg8s3S47fvw48/f3N9lW8PLyYv/884/eez777LMy2xcymcxgP6r7A9zPz49FREQYfe8bb7xR4XWi+8fnM888w+bOnSs8rlGjhtGDabrtto4dOzJfX1+jbdJt27YJ73n48CELCAgoc9nXrVun9znz5s0rc/patWoZHKQRqxNAZepCWaraCaBBgwasZs2aemUw1gmga9euBuXUqur679ixo8Ef8OV1AsjPzxc6lgIo9+Bl6e04JiaGMcbYwYMHheeGDRtmNF9dp06d0ptmz549evW19G8eLd33VKQTAGNMr76Ud1CMEFv56aef9Or1iRMnmFKpFB5/+umnRt/3zTff6G27pW+6f5rm5+cbHIcofdN+V1jqj5fS33XaTgC7d+8usxwA2FtvvWWwvG+99RaTyWQm36P9vl2xYoXwXHBwMCspKdGbj+535kcffWRWRhU9tmDOb/NTp04xBwcH4T3aPwr27t0rPCeTyfT+ELXmurNFJwDGGBs5cqTe6/fv3zd4n7+/v8HxNG19vnbtGgsLCzNZRicnJ722EGOVPz5X1h+8p0+fNtjn696GDBnCGLNcJ4Cqtg/atWun972iu76MdQjNysrSqzPmHGc0txNAbGwsq127dpnTlv5Tv3SbsvT3S1U7AeTk5OjN78knnxReKysXU3WkosdCdet/QEAAa9WqldH3lP7dYYlOANqOGKU/q/TviqSkJL06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Ly9XYWFhwKPD/iotLR1yPbTi4mKNHz+e66QZcumll+r444/XD37wA5199tl65ZVXdPfdd+vuu+8OemjIkDPOOEPf//73NXnyZM2aNUtvvPGGbrnlFn35y18OemgYpp07d+q9995L/Lx27VotX75c48aN0+TJk3XJJZfohhtu0PTp0zV16lRdffXVqqur08KFC4MbNLCPqDPto9a0jzrTPupMe6gzEQbUmfZRZ9pHnWkfdaY91Jmjm+N5nhf0IDC6OI6Tcvl9992n8847b2QHgxFx0kkn6YgjjtCtt94a9FCQQU888YS++93vas2aNZo6daouu+wyXXDBBUEPCxnS3t6uq6++Wo888oi2bNmiuro6nXvuubrmmmuUl5cX9PAwDM8995xOPvnkIcsXL16sX/ziF/I8T9dee63uvvtutbS06IQTTtAdd9yhj3zkIwGMFhge6sxwota0hzrTNupMe6gzEQbUmeFEnWkPdaZt1Jn2UGeObjQBAAAAAAAAAAAAAABgRGTvmwAAAAAAAAAAAAAAgLGAJgAAAAAAAAAAAAAAAIygCQAAAAAAAAAAAAAAACNoAgAAAAAAAAAAAAAAwAiaAAAAAAAAAAAAAAAAMIImAAAAAAAAAAAAAAAAjKAJAAAAAAAAAAAAAAAAI2gCAAAAAAAAAAAAAADACJoAAGAUcxxHjz76aNDDAAAAgDHUmQAAAMgG6kwAGB1oAgCANM477zw5jjPkdtpppwU9NAAAAIxh1JkAAADIBupMAMAuOUEPAABGs9NOO0333Xdf0rL8/PyARgMAAAArqDMBAACQDdSZAACJmQAAYI/y8/NVU1OTdKusrJTkT21155136vTTT1dhYaGmTZum3/72t0nPX7FihT7+8Y+rsLBQ48eP19e+9jXt3LkzaZt7771Xs2bNUn5+vmpra3XRRRclrW9ubtZnPvMZFRUVafr06Xr88cez+6YBAACQddSZAAAAyAbqTACARBMAAOyXq6++WmeeeabefPNNLVq0SOecc47efvttSVJHR4dOPfVUVVZWatmyZXr44Yf1u9/9LqkovvPOO7VkyRJ97Wtf04oVK/T444/r4IMPTvod1113nc4++2y99dZb+ru/+zstWrRI27dvH9H3CQAAgJFFnQkAAIBsoM4EgHBwPM/zgh4EAIxG5513nu6//34VFBQkLb/yyit15ZVXynEcXXjhhbrzzjsT64477jgdddRRuuOOO/Tzn/9c3/nOd7RhwwYVFxdLkp588kmdccYZamhoUHV1terr63X++efrhhtuSDkGx3F01VVX6frrr5fkF+IlJSV66qmnuJYXAADAGEWdCQAAgGygzgQA7JIT9AAAYDQ7+eSTk4piSRo3blzi8bx585LWzZs3T8uXL5ckvf3225ozZ06iYJak+fPny3VdvfPOO3IcRw0NDTrllFP2OIbZs2cnHhcXF6usrExbtmwZ7lsCAADAKECdCQAAgGygzgQASDQBAMAeFRcXD5nOKlMKCws/1Ha5ublJPzuOI9d1szEkAAAAjBDqTAAAAGQDdSYAQJIiQQ8AAMayl156acjPM2fOlCTNnDlTb775pjo6OhLrX3jhBUUiER1yyCEqLS3VlClTtHTp0hEdMwAAAEY/6kwAAABkA3UmAIQDMwEAwB709PSoqakpaVlOTo4mTJggSXr44Yc1d+5cnXDCCXrggQf0yiuv6J577pEkLVq0SNdee60WL16s733ve9q6dau+8Y1v6Itf/KKqq6slSd/73vd04YUXqqqqSqeffrra29v1wgsv6Bvf+MbIvlEAAACMKOpMAAAAZAN1JgBAogkAAPbo6aefVm1tbdKyQw45RKtXr5YkXXfddXrooYf09a9/XbW1tfrVr36lQw89VJJUVFSk//7v/9bFF1+sY445RkVFRTrzzDN1yy23JF5r8eLF6u7u1r/927/p8ssv14QJE/TZz3525N4gAAAAAkGdCQAAgGygzgQASJLjeZ4X9CAAYCxyHEePPPKIFi5cGPRQAAAAYAh1JgAAALKBOhMAwiMS9AAAAAAAAAAAAAAAAEBm0AQAAAAAAAAAAAAAAIARXA4AAAAAAAAAAAAAAAAjmAkAAAAAAAAAAAAAAAAjaAIAAAAAAAAAAAAAAMAImgAAAAAAAAAAAAAAADCCJgAAAAAAAAAAAAAAAIygCQAAAAAAAAAAAAAAACNoAgAAAAAAAAAAAAAAwAiaAAAAAAAAAAAAAAAAMIImAAAAAAAAAAAAAAAAjKAJAAAAAAAAAAAAAAAAI/4/B0dKdDu+VQYAAAAASUVORK5CYII=", - "text/plain": [ - "
" + "cell_type": "markdown", + "source": [ + "### Sprinkle Seeds" + ], + "metadata": { + "id": "AL_ItrXgO5o2" + }, + "id": "AL_ItrXgO5o2" + }, + { + "cell_type": "code", + "source": [ + "import time\n", + "import torch\n", + "import numpy as np\n", + "import random\n", + "\n", + "def set_seed(seed):\n", + " random.seed(seed)\n", + " np.random.seed(seed)\n", + " torch.manual_seed(seed)\n", + " torch.cuda.manual_seed_all(seed)\n", + " # Essential for preventing algorithm-switching mid-training\n", + " # torch.backends.cudnn.deterministic = True\n", + " # torch.backends.cudnn.benchmark = False\n", + " print(f\"Seed set to: {seed}\")\n", + "\n", + "set_seed(RAND_SEED)" + ], + "metadata": { + "id": "Bl88s3O2O-Pq", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c87588b1-7db2-435e-b40e-b2d30927f807" + }, + "id": "Bl88s3O2O-Pq", + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Seed set to: 711\n" + ] + } ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "\n", - "def plot_training_performance(history):\n", - " \"\"\"\n", - " Generates a summary table of the best epochs and plots learning curves.\n", - " \n", - " Args:\n", - " history (dict): A dictionary containing lists of metrics. \n", - " Expected keys: 'train_loss', 'val_loss', 'train_mae', 'val_mae'.\n", - " Optional keys: 'train_acc', 'val_acc'.\n", - " \"\"\"\n", - " # Convert history to a DataFrame for easy manipulation\n", - " df = pd.DataFrame(history)\n", - " df.index.name = 'Epoch'\n", - " df.index += 1 # Shift index to start from Epoch 1\n", - "\n", - " # 1. Display the Performance Table (Top 5 Epochs by Validation Loss)\n", - " print(\"\\n\" + \"=\"*30)\n", - " print(\" TOP 5 PERFORMANCE TABLE\")\n", - " print(\"=\"*30)\n", - " # Sorting by val_loss to find the most stable models\n", - " top_epochs = df.sort_values(by='val_loss').head(5)\n", - " print(top_epochs.to_string())\n", - " print(\"=\"*30 + \"\\n\")\n", - "\n", - " # 2. Create Plots\n", - " fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(20, 6))\n", - "\n", - " # Loss Plot (MSE)\n", - " ax1.plot(df.index, df['train_loss'], label='Train Loss', color='#1f77b4', linewidth=2)\n", - " ax1.plot(df.index, df['val_loss'], label='Val Loss', color='#ff7f0e', linewidth=2, linestyle='--')\n", - " ax1.set_title('Model Loss (MSE)', fontsize=14, fontweight='bold')\n", - " ax1.set_ylim(bottom=0)\n", - " ax1.set_xlabel('Epoch')\n", - " ax1.set_ylabel('Loss')\n", - " ax1.legend()\n", - " ax1.grid(True, linestyle=':', alpha=0.6)\n", - "\n", - " # MAE Plot (Mean Absolute Error)\n", - " ax2.plot(df.index, df['train_mae'], label='Train MAE', color='#2ca02c', linewidth=2)\n", - " ax2.plot(df.index, df['val_mae'], label='Val MAE', color='#d62728', linewidth=2, linestyle='--')\n", - " ax2.set_title('Mean Absolute Error (MAE)', fontsize=14, fontweight='bold')\n", - " ax2.set_ylim(bottom=0)\n", - " ax2.set_xlabel('Epoch')\n", - " ax2.set_ylabel('MAE (Pushup Count Error)')\n", - " ax2.legend()\n", - " ax2.grid(True, linestyle=':', alpha=0.6)\n", - "\n", - " # Accuracy Plot\n", - " ax3.plot(df.index, df['train_acc'], label='Train Acc', color=\"#2842a8\", linewidth=2)\n", - " ax3.plot(df.index, df['val_acc'], label='Val Acc', color=\"#b1197c\", linewidth=2, linestyle='--')\n", - "\n", - " # Admin\n", - " model = outputs['model']\n", - " model_name = type(model).__name__\n", - " ax3.set_title(f'Accuracy (Exact Prediction) for {model_name}', fontsize=14, fontweight='bold')\n", - " ax3.set_ylim(bottom=0)\n", - " ax3.set_xlabel('Epoch')\n", - " ax3.set_ylabel('Accuracy')\n", - " ax3.legend()\n", - " ax3.grid(True, linestyle=':', alpha=0.6)\n", - "\n", - " plt.ylim(bottom=0)\n", - " plt.tight_layout()\n", - " plt.show()\n", - "\n", - "plot_training_performance(outputs)" - ] - }, - { - "cell_type": "markdown", - "id": "8319211b", - "metadata": {}, - "source": [ - "### Testing" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "id": "f2746ae5", - "metadata": {}, - "outputs": [ + }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\drmaatt\\AppData\\Local\\Temp\\ipykernel_20896\\4048378969.py:26: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n", - " checkpoint = torch.load(save_path)\n" - ] + "cell_type": "markdown", + "id": "86fa605d", + "metadata": { + "id": "86fa605d" + }, + "source": [ + "### Transformation" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "[Video Load] Elapsed time: 1.2626 seconds\n", - "[Video Transformation] Elapsed time: 1.5617 seconds\n", - "[Feature Extraction] Elapsed time: 5.0483 seconds\n", - "[Featurn Engineering 1] Elapsed time: 0.0180 seconds\n", - "[Featurn Engineering 2] Elapsed time: 0.0030 seconds\n", - "[Prediction] Elapsed time: 0.0239 seconds\n", - "Predicted pushups: 2\n" - ] - } - ], - "source": [ - "# Inference Code\n", - "import torch\n", - "import cv2\n", - "import numpy as np\n", - "import PIL.Image\n", - "from ultralytics import YOLO\n", - "import time\n", - "\n", - "class Timer:\n", - " def __init__(self, name=\"Timer\"):\n", - " self.name = name\n", - "\n", - " def __enter__(self):\n", - " self.start = time.time()\n", - " return self # optional, if you want to access it\n", - "\n", - " def __exit__(self, exc_type, exc_val, exc_tb):\n", - " self.end = time.time()\n", - " elapsed = self.end - self.start\n", - " print(f\"[{self.name}] Elapsed time: {elapsed:.4f} seconds\")\n", - "\n", - "# Load the trained model\n", - "model = outputs[\"model\"]\n", - "model_name = type(model).__name__\n", - "save_path = os.path.join(WEIGHTS_DIR, f\"best_model_weights_{model_name}.pth\")\n", - "checkpoint = torch.load(save_path)\n", - "model.load_state_dict(checkpoint['model_state_dict'])\n", - "model.eval()\n", - "\n", - "def predict_pushups(video_path):\n", - " # 1. Extract angles from video\n", - " list_of_pil_frames = []\n", - " with Timer(\"Video Load\"):\n", - " cap = cv2.VideoCapture(video_path)\n", - " while True:\n", - " ret, frame = cap.read()\n", - " if not ret:\n", - " break\n", - " rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n", - " list_of_pil_frames.append(PIL.Image.fromarray(rgb_frame))\n", - " cap.release()\n", - "\n", - " if not list_of_pil_frames:\n", - " return 0\n", - "\n", - " # Resize frames\n", - " with Timer(\"Video Transformation\"):\n", - " resizer = VideoResizer(MAX_FRAME_LENGTH)\n", - " frames_for_yolo = resizer(list_of_pil_frames)\n", - "\n", - " # YOLO pose\n", - " with Timer(\"Feature Extraction\"):\n", - " pose_model = YOLO(YOLO_MODEL_FILE, task='pose', verbose=False)\n", - " if hasattr(pose_model, \"trackers\") and pose_model.predictor:\n", - " pose_model.predictor.trackers[0].reset()\n", - " results_generator = pose_model.track(frames_for_yolo, verbose=False, device=DEVICE, persist=True, vid_stride=VID_STRIDE, show=False, tracker=YOLO_TRACKER_FILE)\n", - "\n", - " # Calculate angles\n", - " angles = []\n", - " with Timer(\"Featurn Engineering 1\"):\n", - " for results in results_generator:\n", - " current_frame_angle = 0.0\n", - " person_mask = (results.boxes.cls == 0)\n", - " person_boxes = results.boxes[person_mask]\n", - " if len(person_boxes) > 0:\n", - " max_conf_idx = person_boxes.conf.argmax().item()\n", - " original_indices = person_mask.nonzero(as_tuple=True)[0]\n", - " original_idx = original_indices[max_conf_idx]\n", - " keypoints_obj = results.keypoints[original_idx]\n", - " if keypoints_obj.xy.shape[0] > 0:\n", - " landmarks_np = keypoints_obj.xy[0].cpu().numpy()\n", - " if landmarks_np.shape[0] > max(COCO.R_WRIST.value, COCO.L_WRIST.value):\n", - " calculator = AngleCalculator(landmarks_np)\n", - " try:\n", - " angle = calculator()\n", - " if 0 <= angle <= 180:\n", - " current_frame_angle = angle\n", - " except:\n", - " pass\n", - " angles.append(current_frame_angle)\n", - " del results\n", - "\n", - " if not angles:\n", - " return 0\n", - "\n", - " with Timer(\"Featurn Engineering 2\"):\n", - " angles_np = np.array(angles, dtype=np.float32)\n", - " min_angle, max_angle = np.min(angles_np), np.max(angles_np)\n", - " if max_angle > min_angle:\n", - " angles_np = (angles_np - min_angle) / (max_angle - min_angle)\n", - "\n", - " angles_tensor = torch.tensor(angles_np, dtype=torch.float32)\n", - " signal_cleanser = SignalMedianator()\n", - " angles_tensor = signal_cleanser(angles_tensor)\n", - "\n", - " # Pad/truncate\n", - " current_length = angles_tensor.shape[0]\n", - " if current_length < MAX_FRAMES:\n", - " padding = torch.zeros(MAX_FRAMES - current_length, dtype=torch.float32)\n", - " angles_tensor = torch.cat([angles_tensor, padding], dim=0)\n", - " elif current_length > MAX_FRAMES:\n", - " angles_tensor = angles_tensor[:MAX_FRAMES]\n", - "\n", - " # Prepare for model\n", - " angles_tensor = angles_tensor.unsqueeze(0).to(DEVICE) # (1, MAX_FRAMES)\n", - " lengths = torch.tensor([min(current_length, MAX_FRAMES)], dtype=torch.long).to(DEVICE)\n", - "\n", - " # Predict\n", - " with Timer(\"Prediction\"):\n", - " with torch.no_grad():\n", - " output = model(angles_tensor, lengths)\n", - " predicted_count = torch.round(output.squeeze()).item()\n", - "\n", - " return int(predicted_count), angles_tensor, lengths\n", - "\n", - "# Example usage\n", - "predicted, angles_tensor, lengths = predict_pushups(os.path.join(DOWNLOAD_DIR, \"1_dksksjfwijf.mp4\"))\n", - "print(f\"Predicted pushups: {predicted}\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "ded002ff", - "metadata": {}, - "source": [ - "### Evaluation Code" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "id": "4e6511d3", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 6, + "id": "4c884713", + "metadata": { + "id": "4c884713" + }, + "outputs": [], + "source": [ + "import torchvision.transforms.functional as TF\n", + "import random\n", + "import torch # Needed for TF.to_tensor which uses torch internally\n", + "\n", + "\n", + "class VideoResizerSingle:\n", + " def __init__(self, largest_dim):\n", + " # resize such that aspect ratio is retained\n", + " self.largest_dim = largest_dim\n", + "\n", + " def __call__(self, single_frame):\n", + " original_width, original_height = single_frame.size\n", + " scale = max(self.largest_dim/original_width, self.largest_dim/original_height)\n", + " new_width = int(original_width * scale)\n", + " new_height = int(original_height * scale)\n", + " single_frame = TF.resize(single_frame, (new_height, new_width))\n", + " return single_frame\n", + "\n", + "\n", + "class VideoResizer:\n", + " def __init__(self, largest_dim):\n", + " self.largest_dim = largest_dim\n", + "\n", + " def __call__(self, frames_list_pil):\n", + " if not frames_list_pil:\n", + " return []\n", + "\n", + " transformed_frames_pil = []\n", + " helper = VideoResizerSingle(self.largest_dim)\n", + " for img_pil in frames_list_pil:\n", + " img_pil = helper(img_pil)\n", + " transformed_frames_pil.append(img_pil)\n", + " return transformed_frames_pil\n", + "\n", + "\n", + "class VideoTransform:\n", + " def __init__(self, rotation_degrees, hflip_p, vflip_p, color_jitter_params, resize_dims=None):\n", + " self.rotation_degrees = rotation_degrees\n", + " self.hflip_p = hflip_p\n", + " self.vflip_p = vflip_p\n", + " self.color_jitter_params = color_jitter_params # (brightness, contrast, saturation, hue)\n", + " self.resize_dims = resize_dims # (height, width)\n", + "\n", + " def __call__(self, frames_list_pil):\n", + " if not frames_list_pil:\n", + " return []\n", + "\n", + " # Sample parameters once per video\n", + " angle = random.uniform(-self.rotation_degrees, self.rotation_degrees)\n", + " h_flip = random.random() < self.hflip_p\n", + " v_flip = random.random() < self.vflip_p\n", + "\n", + " # Manually compute ColorJitter factors for consistency across frames\n", + " brightness_param = self.color_jitter_params[0]\n", + " contrast_param = self.color_jitter_params[1]\n", + " saturation_param = self.color_jitter_params[2]\n", + " hue_param = self.color_jitter_params[3]\n", + "\n", + " brightness_factor = random.uniform(max(0, 1 - brightness_param), 1 + brightness_param)\n", + " contrast_factor = random.uniform(max(0, 1 - contrast_param), 1 + contrast_param)\n", + " saturation_factor = random.uniform(max(0, 1 - saturation_param), 1 + saturation_param)\n", + " hue_factor = random.uniform(-hue_param, hue_param)\n", + "\n", + "\n", + " transformed_frames_pil = [] # Changed variable name to reflect return type\n", + " for img_pil in frames_list_pil:\n", + " # Apply same random parameters to each frame\n", + " img_pil = TF.rotate(img_pil, angle)\n", + " if h_flip:\n", + " img_pil = TF.hflip(img_pil)\n", + " if v_flip:\n", + " img_pil = TF.vflip(img_pil)\n", + " img_pil = TF.adjust_brightness(img_pil, brightness_factor)\n", + " img_pil = TF.adjust_contrast(img_pil, contrast_factor)\n", + " img_pil = TF.adjust_saturation(img_pil, saturation_factor)\n", + " img_pil = TF.adjust_hue(img_pil, hue_factor)\n", + "\n", + " # Resize while maintaining aspect ratio\n", + " if self.resize_dims:\n", + " original_width, original_height = img_pil.size\n", + " target_height, target_width = self.resize_dims\n", + "\n", + " # Calculate new dimensions to fit within target while maintaining aspect ratio\n", + " scale_w = target_width / original_width\n", + " scale_h = target_height / original_height\n", + " scale = min(scale_w, scale_h)\n", + "\n", + " new_width = int(original_width * scale)\n", + " new_height = int(original_height * scale)\n", + "\n", + " img_pil = TF.resize(img_pil, (new_height, new_width))\n", + "\n", + " # Pad if necessary to reach target_dims\n", + " pad_left = (target_width - new_width) // 2\n", + " pad_right = target_width - new_width - pad_left\n", + " pad_top = (target_height - new_height) // 2\n", + " pad_bottom = target_height - new_height - pad_top\n", + "\n", + " img_pil = TF.pad(img_pil, (pad_left, pad_top, pad_right, pad_bottom))\n", + "\n", + " transformed_frames_pil.append(img_pil) # Append PIL image directly, remove TF.to_tensor\n", + "\n", + " return transformed_frames_pil # Return list of PIL images\n", + "\n", + "TRANSFORMATIONS = VideoTransform(\n", + " rotation_degrees=180,\n", + " hflip_p=0.5,\n", + " vflip_p=0.5,\n", + " color_jitter_params=(0.2, 0.2, 0.2, 0.2),\n", + " resize_dims=(640, 640) # Example: resize to 224x224\n", + ")\n", + "\n", + "RESIZER = VideoResizerSingle(MAX_FRAME_LENGTH)" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using device: cpu\n", - "\n", - "Running inference on 78 test videos...\n", - "\n", - "\n", - "✗ pred=2 true=1 | 23.1ms | 1_dksksjfwijf.mp4\n", - "✗ pred=1 true=2 | 18.9ms | 2_dfsaeklnvvalkej.mp4\n", - "✓ pred=2 true=2 | 25.0ms | 2_difficult_2.mp4\n", - "✓ pred=2 true=2 | 17.6ms | 2_difficult_sdafkljsalkfj.mp4\n", - "✓ pred=2 true=2 | 31.2ms | 2_dkdjwkndkfw.mp4\n", - "✗ pred=4 true=2 | 22.1ms | 2_dkdmkejkeimdh.mp4\n", - "✓ pred=2 true=2 | 30.2ms | 2_dkjd823kjf.mp4\n", - "\n", - "==================================================\n", - "SUMMARY\n", - "==================================================\n", - "Total videos: 7\n", - "Correct: [4]\n", - "Incorrect: [3]\n", - "\n", - "ACCURACY: 57.14%\n", - "\n", - "Total time: 67.00s\n", - "Avg per video: 24.0ms\n", - "Min latency: 17.6ms\n", - "Max latency: 31.2ms\n", - "==================================================\n" - ] - } - ], - "source": [ - "def evaluate(model, test_loader, dataset, device):\n", - " model.eval()\n", - " correct = 0\n", - " total = 0\n", - "\n", - " all_preds = []\n", - " all_labels = []\n", - " all_times = []\n", - "\n", - " print(\"\\n\")\n", - "\n", - " with torch.no_grad():\n", - " for idx, (angles, labels, lengths) in enumerate(test_loader):\n", - " angles, labels = angles.to(device), labels.to(device)\n", - "\n", - " # Time the forward pass\n", - " start_time = time.time()\n", - " outputs = model(angles, lengths)\n", - " if device.type == 'cuda':\n", - " torch.cuda.synchronize() # wait for GPU to finish\n", - " end_time = time.time()\n", - "\n", - " inference_time = (end_time - start_time) * 1000 # ms\n", - " all_times.append(inference_time)\n", - "\n", - " preds = outputs\n", - "\n", - " for i in range(labels.size(0)):\n", - " batch_idx = idx * test_loader.batch_size + i\n", - " video_name = dataset.video_files[batch_idx]\n", - " pred = int(torch.round(preds[i]).item())\n", - " true_label = labels[i].item()\n", - " is_correct = \"✓\" if pred == true_label else \"✗\"\n", - "\n", - " print(f\"{is_correct} pred={pred} true={true_label} | {inference_time:>7.1f}ms | {video_name}\")\n", - " correct += pred == true_label\n", - "\n", - " # correct += preds.eq(labels).sum().item()\n", - " total += labels.size(0)\n", - "\n", - " all_preds.extend(preds.cpu().numpy())\n", - " all_labels.extend(labels.cpu().numpy())\n", - "\n", - " accuracy = correct / total\n", - " return accuracy, all_preds, all_labels, all_times\n", - "\n", - "\n", - "# =============================================================================\n", - "# RUN INFERENCE\n", - "# =============================================================================\n", - "\n", - "def run_inference(model):\n", - " device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", - " print(f\"Using device: {device}\")\n", - "\n", - " # Download test data\n", - " test_dir = DOWNLOAD_DIR\n", - "\n", - " model = model.to(device)\n", - "\n", - " # Create dataloader\n", - " test_dataset = VideoDataset(test_dir)\n", - " test_loader = DataLoader(\n", - " test_dataset,\n", - " batch_size=1,\n", - " shuffle=False,\n", - " num_workers=0,\n", - " collate_fn=collate_fn\n", - " )\n", - "\n", - " print(f\"\\nRunning inference on {len(test_dataset)} test videos...\")\n", - "\n", - " # Warmup (optional, helps get consistent GPU timings)\n", - " if device.type == 'cuda':\n", - " dummy_data = torch.randn(1, MAX_FRAMES, device=device) # (Batch, SeqLen)\n", - " dummy_lengths = torch.tensor([MAX_FRAMES], dtype=torch.long, device=device) # (Batch,)\n", - " with torch.no_grad():\n", - " _ = model(dummy_data, dummy_lengths)\n", - " torch.cuda.synchronize()\n", - "\n", - " total_start = time.time()\n", - " accuracy, preds, labels, times = evaluate(model, test_loader, test_dataset, device)\n", - " total_end = time.time()\n", - "\n", - " # Summary\n", - " preds = np.round(preds).astype(int)\n", - " num_correct = sum(p == l for p, l in zip(preds.astype(int), labels))\n", - " num_wrong = len(preds) - num_correct\n", - "\n", - " print(\"\\n\" + \"=\"*50)\n", - " print(\"SUMMARY\")\n", - " print(\"=\"*50)\n", - " print(f\"Total videos: {len(preds)}\")\n", - " print(f\"Correct: {num_correct}\")\n", - " print(f\"Incorrect: {num_wrong}\")\n", - " print(f\"\")\n", - " print(f\"ACCURACY: {accuracy*100:.2f}%\")\n", - " print(f\"\")\n", - " print(f\"Total time: {total_end - total_start:.2f}s\")\n", - " print(f\"Avg per video: {sum(times) / len(times):.1f}ms\")\n", - " print(f\"Min latency: {min(times):.1f}ms\")\n", - " print(f\"Max latency: {max(times):.1f}ms\")\n", - " print(\"=\"*50)\n", - " return accuracy, preds, labels\n", - "\n", - "\n", - "\n", - "model_weights = os.path.join(WEIGHTS_DIR, f\"final_model_weights_PushupCounterSingleOutput.pth\")\n", - "model = PushupCounterSingleOutput()\n", - "checkpoint = torch.load(model_weights, map_location='cpu', weights_only=False)\n", - "model.load_state_dict(checkpoint['model_state_dict'])\n", - "_, _, _ = run_inference(model)" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "id": "e488cd0a", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "aabf9bdb", + "metadata": { + "id": "aabf9bdb" + }, + "source": [ + "### Signal Calculators and Utils" + ] + }, { - "ename": "NameError", - "evalue": "name 'preds' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[121]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mpreds\u001b[49m\n", - "\u001b[31mNameError\u001b[39m: name 'preds' is not defined" - ] - } - ], - "source": [ - "preds" - ] - }, - { - "cell_type": "markdown", - "id": "2937be7d", - "metadata": {}, - "source": [ - "## Hugging Face" - ] - }, - { - "cell_type": "markdown", - "id": "9a1cf00c", - "metadata": {}, - "source": [ - "### Command Lines" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6a527bea", - "metadata": {}, - "outputs": [], - "source": [ - "!pip install huggingface_hub" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6cfc8a81", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 7, + "id": "b1f96bf6", + "metadata": { + "id": "b1f96bf6" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import torch\n", + "import torch.nn as nn\n", + "import numpy as np\n", + "\n", + "class SignalPerturbator:\n", + " @staticmethod\n", + " def __call__(self, signals):\n", + " \"\"\"Applies dynamic 1D augmentation to the signal sequence.\"\"\"\n", + " # Add Gaussian noise\n", + " noise = torch.randn_like(signals) * 0.01\n", + " # Random scaling (simulates different range of motion)\n", + " scale = random.uniform(0.9, 1.1)\n", + " # Random baseline shift\n", + " shift = random.uniform(-0.05, 0.05)\n", + " return torch.clamp(signals * scale + noise + shift, 0, 1)\n", + "\n", + "\n", + "class SignalAverager:\n", + " @staticmethod\n", + " def __call__(signal_tensor, window_size=3):\n", + " \"\"\"\n", + " Applies a moving average to smooth signals.\n", + " \"\"\"\n", + " # 1. Ensure the tensor is at least 2D (Batch, Length)\n", + " if signal_tensor.dim() == 1:\n", + " signal_tensor = signal_tensor.unsqueeze(0)\n", + "\n", + " # 2. Reshape to (Batch, Channels, Length) for avg_pool1d\n", + " # We treat the elbow angle as a single channel\n", + " x = signal_tensor.unsqueeze(1)\n", + "\n", + " # 3. Apply average pooling\n", + " # stride=1 keeps the resolution the same\n", + " # padding=1 ensures the output length matches the input length\n", + " smoothed = nn.functional.avg_pool1d(x, kernel_size=window_size, stride=1, padding=window_size//2)\n", + "\n", + " # 4. Remove the extra channel dimension and return\n", + " return smoothed.squeeze(1)\n", + "\n", + "class SignalMedianator:\n", + " @staticmethod\n", + " def __call__(signal_tensor, window_size=3):\n", + " \"\"\"\n", + " Applies a moving media to smooth the signals.\n", + " Good for bring out local signals dwarfed by global normalization\n", + " \"\"\"\n", + " def moving_median(data, window):\n", + " return np.array([np.median(data[max(0, i-window//2):min(len(data), i+window//2+1)])\n", + " for i in range(len(data))])\n", + " smoothed = moving_median(signal_tensor, window_size)\n", + " mean = np.mean(smoothed)\n", + " std = np.std(smoothed) + 1e-6\n", + " smoothed = (smoothed - mean) / std\n", + " return torch.tensor(smoothed, dtype=torch.float32)" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "^C\n" - ] - } - ], - "source": [ - "!hf auth login" - ] - }, - { - "cell_type": "markdown", - "id": "1c7806b8", - "metadata": {}, - "source": [ - "### Code" - ] - }, - { - "cell_type": "markdown", - "id": "d4a13690", - "metadata": {}, - "source": [ - "#### Admin" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "466d51ad", - "metadata": {}, - "outputs": [], - "source": [ - "import tqdm\n", - "import os\n", - "from huggingface_hub import HfApi, hf_hub_download, login as HfLogin, logout as HfLogout\n", - "\n", - "class HugMyFace:\n", - " def __init__(self, username, repo_id):\n", - " self.username = username\n", - " self.repo_id = repo_id\n", - " self.api = HfApi()\n", - "\n", - " def login(self):\n", - " try:\n", - " user_info = self.api.whoami()\n", - " print(f\"Logged in as: {user_info['name']}\")\n", - " except Exception:\n", - " print(\"Logging in.\")\n", - " HfLogin()\n", - "\n", - " def logout(self):\n", - " try:\n", - " user_info = self.api.whoami()\n", - " print(f\"Logging out: {user_info['name']}\")\n", - " HfLogout()\n", - " except Exception:\n", - " print(\"Not logged in.\")\n", - "\n", - " def whoami(self):\n", - " user_info = self.api.whoami()\n", - " print(f\"{user_info}\")\n", - "\n", - " def create_repo(self):\n", - " # Create the repo first (if it already exists, this will just skip)\n", - " self.api.create_repo(\n", - " repo_id=self.repo_id,\n", - " repo_type=\"model\",\n", - " exist_ok=True, # Don't error if it already exists\n", - " private=False, # Make it public so TAs can access\n", - " )\n", - " \n", - " def list_repo(self):\n", - " repo_info = self.api.repo_info(repo_id=self.repo_id)\n", - " print(f\"[{[f.rfilename for f in repo_info.siblings]}]\")\n", - "\n", - " def upload_to_hub(self, local_path, commit_msg=None, commit_desc=None):\n", - " if os.path.isfile(local_path):\n", - " self.api.upload_file(\n", - " path_or_fileobj=local_path,\n", - " path_in_repo=local_path,\n", - " repo_id=self.repo_id,\n", - " repo_type=\"model\", # can be \"model\", \"dataset\", or \"space\"\n", - " commit_message=commit_msg,\n", - " commit_description=commit_desc\n", - " )\n", - " elif os.path.isdir(local_path):\n", - " # Upload an entire folder (e.g., weights + config + scripts)\n", - " self.api.upload_folder(\n", - " folder_path=local_path,\n", - " path_in_repo=local_path,\n", - " repo_id=self.repo_id,\n", - " repo_type=\"model\",\n", - " commit_message=commit_msg,\n", - " commit_description=commit_desc\n", - " )\n", - " else:\n", - " raise RuntimeError(f\"Ivalid Object {local_path}\")\n", - "\n", - " def delete_file(self, remote_path, is_folder, commit_msg):\n", - " if is_folder:\n", - " self.api.delete_folder(\n", - " path_in_repo=remote_path,\n", - " repo_id=self.repo_id,\n", - " commit_message=commit_msg\n", - " )\n", - " else:\n", - " self.api.delete_file(\n", - " path_in_repo=remote_path,\n", - " repo_id=self.repo_id,\n", - " repo_type=\"model\", # can also be \"dataset\" or \"space\"\n", - " commit_message=commit_msg\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "d38b8e1b", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "0739d1f9", + "metadata": { + "id": "0739d1f9" + }, + "source": [ + "### Elbow Calculation" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Logged in as: maatt4face\n" - ] - } - ], - "source": [ - "HF_USERNAME = 'maatt4face'\n", - "HF_REPO_ID = f\"{HF_USERNAME}/mv-final-assignment\"\n", - "HF = HugMyFace(HF_USERNAME, HF_REPO_ID)\n", - "HF.login()" - ] - }, - { - "cell_type": "markdown", - "id": "99d882c8", - "metadata": {}, - "source": [ - "#### Repo Interactions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fc3da1cb", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 8, + "id": "bd0ed587", + "metadata": { + "id": "bd0ed587" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from enum import Enum\n", + "\n", + "\n", + "class COCO(Enum):\n", + " R_SHOULDER = 5\n", + " L_SHOULDER = 6\n", + " R_ELBOW = 7\n", + " L_ELBOW = 8\n", + " R_WRIST = 9\n", + " L_WRIST = 10\n", + " L_HIP = 11\n", + " R_HIP = 12\n", + " L_KNEE = 13\n", + " R_KNEE = 14\n", + "\n", + "\n", + "class AngleCalculator:\n", + " \"\"\"Calculates the elbow angle of a person from landmarks.\"\"\"\n", + " def __init__(self, landmarks) -> None:\n", + " # landmarks as returned by Ultralytics: np.ndarray[np._AnyShape, np.dtype[np.Any]] | np.Any\n", + " self.landmarks = landmarks\n", + "\n", + " def _ref_len(self):\n", + " # Determine Scale Reference (Hips or Fallback to Shoulder Width)\n", + " if self.landmarks[COCO.L_HIP.value].any() and self.landmarks[COCO.R_HIP.value].any():\n", + " ref_len = np.linalg.norm(self.landmarks[COCO.L_SHOULDER.value] - self.landmarks[COCO.L_HIP.value])\n", + " else:\n", + " ref_len = np.linalg.norm(self.landmarks[COCO.L_SHOULDER.value] - self.landmarks[COCO.R_SHOULDER.value]) / 0.75\n", + " return ref_len\n", + "\n", + " def _uplift_arm_to_3d(self, sh_idx, el_idx, wr_idx, ref_len):\n", + " \"\"\"Uplifts 2D keypoints to 3D using Da Vinci's ratios\"\"\"\n", + " # Ratios (relative to torso length)\n", + " R_UPPER_ARM = 0.45\n", + " R_FOREARM = 0.42\n", + "\n", + " # 1. Shoulder is the root (z=0)\n", + " sh_3d = np.array([self.landmarks[sh_idx][0], self.landmarks[sh_idx][1], 0.0])\n", + "\n", + " # 2. Lift Elbow (Relative to Shoulder)\n", + " L_upper = R_UPPER_ARM * ref_len\n", + " dx1 = self.landmarks[el_idx][0] - self.landmarks[sh_idx][0]\n", + " dy1 = self.landmarks[el_idx][1] - self.landmarks[sh_idx][1]\n", + " dz1 = np.sqrt(max(0, L_upper**2 - (dx1**2 + dy1**2)))\n", + " el_3d = np.array([self.landmarks[el_idx][0], self.landmarks[el_idx][1], dz1])\n", + "\n", + " # 3. Lift Wrist (Relative to Elbow)\n", + " L_fore = R_FOREARM * ref_len\n", + " dx2 = self.landmarks[wr_idx][0] - self.landmarks[el_idx][0]\n", + " dy2 = self.landmarks[wr_idx][1] - self.landmarks[el_idx][1]\n", + " dz2 = np.sqrt(max(0, L_fore**2 - (dx2**2 + dy2**2)))\n", + " # Z-coordinate is cumulative\n", + " wr_3d = np.array([self.landmarks[wr_idx][0], self.landmarks[wr_idx][1], dz1 + dz2])\n", + "\n", + " return sh_3d, el_3d, wr_3d\n", + "\n", + " def __call__(self) -> float:\n", + " def get_angle(a, b, c) -> float:\n", + " ba, bc = a - b, c - b\n", + " cosine = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))\n", + " return np.degrees(np.arccos(np.clip(cosine, -1.0, 1.0)))\n", + "\n", + " ref_len = self._ref_len()\n", + "\n", + " # Calculate elbow angle for both arms\n", + " l_sh, l_el, l_wr = self._uplift_arm_to_3d(COCO.L_SHOULDER.value, COCO.L_ELBOW.value, COCO.L_WRIST.value, ref_len)\n", + " r_sh, r_el, r_wr = self._uplift_arm_to_3d(COCO.R_SHOULDER.value, COCO.R_ELBOW.value, COCO.R_WRIST.value, ref_len)\n", + "\n", + " l_angle = get_angle(l_sh, l_el, l_wr)\n", + " r_angle = get_angle(r_sh, r_el, r_wr)\n", + "\n", + " # Use average angle for robustness (handles side-on views better)\n", + " avg_angle = (l_angle + r_angle) / 2\n", + " return avg_angle" + ] + }, { - "ename": "NameError", - "evalue": "name 'os' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# HF.create_repo()\u001b[39;00m\n\u001b[32m 2\u001b[39m \n\u001b[32m 3\u001b[39m \u001b[38;5;66;03m# Training File and Model Weights\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m4\u001b[39m \u001b[43mHF\u001b[49m\u001b[43m.\u001b[49m\u001b[43mupload_to_hub\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mFinal_Training.ipynb\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommit_msg\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mClean up\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 5\u001b[39m \u001b[38;5;66;03m# HF.upload_to_hub(WEIGHTS_DIR, commit_msg=\"Model weights\")\u001b[39;00m\n\u001b[32m 6\u001b[39m \u001b[38;5;66;03m# upload_to_hub(\"best_model_weights_PushupCounterSingleOutput_v01.pth\", commit_msg=\"PushupCounterSingleOutput model weights\")\u001b[39;00m\n\u001b[32m 7\u001b[39m \u001b[38;5;66;03m# upload_to_hub(\"best_model_weights_PushupCounterSingleOutput.pth\", commit_msg=\"PushupCounterSingleOutput model weights\")\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 13\u001b[39m \u001b[38;5;66;03m# delete_file(\"bytetrack.yaml\", is_folder=False, commit_msg=\"Real Estate Organization\")\u001b[39;00m\n\u001b[32m 14\u001b[39m \u001b[38;5;66;03m# delete_file(\"yolo11n-pose.pt\", is_folder=False, commit_msg=\"Real Estate Organization\")\u001b[39;00m\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 44\u001b[39m, in \u001b[36mHugMyFace.upload_to_hub\u001b[39m\u001b[34m(self, local_path, commit_msg, commit_desc)\u001b[39m\n\u001b[32m 43\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mupload_to_hub\u001b[39m(\u001b[38;5;28mself\u001b[39m, local_path, commit_msg=\u001b[38;5;28;01mNone\u001b[39;00m, commit_desc=\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[32m---> \u001b[39m\u001b[32m44\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mos\u001b[49m.path.isfile(local_path):\n\u001b[32m 45\u001b[39m \u001b[38;5;28mself\u001b[39m.api.upload_file(\n\u001b[32m 46\u001b[39m path_or_fileobj=local_path,\n\u001b[32m 47\u001b[39m path_in_repo=local_path,\n\u001b[32m (...)\u001b[39m\u001b[32m 51\u001b[39m commit_description=commit_desc\n\u001b[32m 52\u001b[39m )\n\u001b[32m 53\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m os.path.isdir(local_path):\n\u001b[32m 54\u001b[39m \u001b[38;5;66;03m# Upload an entire folder (e.g., weights + config + scripts)\u001b[39;00m\n", - "\u001b[31mNameError\u001b[39m: name 'os' is not defined" - ] - } - ], - "source": [ - "# HF.create_repo()\n", - "\n", - "# Training File and Model Weights\n", - "HF.upload_to_hub(\"Final_Training.ipynb\", commit_msg=\"Clean up\")\n", - "# HF.upload_to_hub(WEIGHTS_DIR, commit_msg=\"Model weights\")\n", - "# upload_to_hub(\"best_model_weights_PushupCounterSingleOutput_v01.pth\", commit_msg=\"PushupCounterSingleOutput model weights\")\n", - "# upload_to_hub(\"best_model_weights_PushupCounterSingleOutput.pth\", commit_msg=\"PushupCounterSingleOutput model weights\")\n", - "# upload_to_hub(\"best_model_weights_PushupCounterMaxPool.pth\", commit_msg=\"PushupCounterMaxPool model weights\")\n", - "\n", - "# YOLO Weights\n", - "# HF.upload_to_hub(YOLO_DIR, commit_msg=\"landpark detection weights\")\n", - "# delete_file(\"botsort.yaml\", is_folder=False, commit_msg=\"Real Estate Organization\")\n", - "# delete_file(\"bytetrack.yaml\", is_folder=False, commit_msg=\"Real Estate Organization\")\n", - "# delete_file(\"yolo11n-pose.pt\", is_folder=False, commit_msg=\"Real Estate Organization\")" - ] - }, - { - "cell_type": "markdown", - "id": "606affc6", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "892ba310", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "3aa64d74", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eed737e3", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "402a2666", + "metadata": { + "id": "402a2666" + }, + "source": [ + "### Adhoc Code" + ] + }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\drmaatt\\AppData\\Local\\Temp\\ipykernel_47360\\2981320948.py:26: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n", - " checkpoint = torch.load(save_path)\n" - ] + "cell_type": "code", + "execution_count": 9, + "id": "bfcc310e", + "metadata": { + "id": "bfcc310e" + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "def plot_angles_with_moving_averages(angles, title=\"Elbow Angles Over Time\"):\n", + " \"\"\"\n", + " Plots raw elbow angle data along with 5 different moving averages.\n", + "\n", + " Args:\n", + " angles (np.ndarray or list): A 1D array or list of elbow angles.\n", + " title (str): The title for the plot.\n", + " \"\"\"\n", + " if not isinstance(angles, np.ndarray):\n", + " angles = np.array(angles)\n", + " angles = np.squeeze(angles)\n", + "\n", + " # Define different window sizes for moving averages\n", + " window_sizes = [2, 3, 4, 5, 7] # Example window sizes\n", + "\n", + " plt.figure(figsize=(15, 7))\n", + "\n", + " # Plot raw data\n", + " plt.plot(angles, label='Raw Angles', alpha=0.7, color='lightgray')\n", + "\n", + " # Plot moving averages\n", + " for window in window_sizes:\n", + " # Ensure window size is not greater than the data length\n", + " if window <= len(angles):\n", + " moving_avg = pd.Series(angles).rolling(window=window).mean()\n", + " plt.plot(moving_avg, label=f'MA ({window} frames)')\n", + " else:\n", + " print(f\"Warning: Window size {window} is larger than data length. Skipping MA.\")\n", + "\n", + " plt.title(title)\n", + " plt.xlabel('Frame Number')\n", + " plt.ylabel('Elbow Angle (degrees)')\n", + " plt.legend()\n", + " plt.grid(True)\n", + " plt.show()\n", + "\n", + "\n", + "def plot_angles_with_moving_median(angles, title=\"Elbow Angles Over Time\"):\n", + " \"\"\"\n", + " Plots raw elbow angle data along with 5 different moving averages.\n", + "\n", + " Args:\n", + " angles (np.ndarray or list): A 1D array or list of elbow angles.\n", + " title (str): The title for the plot.\n", + " \"\"\"\n", + " def rolling_median(data, window_size=5):\n", + " \"\"\"Robust noise reduction without scipy.\"\"\"\n", + " result = np.zeros_like(data)\n", + " for i in range(len(data)):\n", + " start = max(0, i - window_size // 2)\n", + " end = min(len(data), i + window_size // 2 + 1)\n", + " result[i] = np.median(data[start:end])\n", + " return result\n", + "\n", + " def moving_median(data, window):\n", + " return np.array([np.median(data[max(0, i-window//2):min(len(data), i+window//2+1)])\n", + " for i in range(len(data))])\n", + "\n", + " if not isinstance(angles, np.ndarray):\n", + " angles = np.array(angles)\n", + " angles = np.squeeze(angles)\n", + "\n", + " # Define different window sizes for moving averages\n", + " window_sizes = [2, 3, 4, 5, 7] # Example window sizes\n", + "\n", + " plt.figure(figsize=(15, 7))\n", + "\n", + " # Plot raw data\n", + " plt.plot(angles, label='Raw Angles', alpha=0.7, color='lightgray')\n", + "\n", + " # Plot moving averages\n", + " for window in window_sizes:\n", + " # Ensure window size is not greater than the data length\n", + " if window <= len(angles):\n", + " moving_med = rolling_median(angles, window)\n", + " moving_med = moving_median(angles, window)\n", + " mean = np.mean(moving_med)\n", + " std = np.std(moving_med) + 1e-6\n", + " moving_med = (moving_med - mean) / std\n", + " plt.plot(moving_med, label=f'MM ({window} frames)')\n", + " else:\n", + " print(f\"Warning: Window size {window} is larger than data length. Skipping MA.\")\n", + "\n", + " plt.title(title)\n", + " plt.xlabel('Frame Number')\n", + " plt.ylabel('Elbow Angle (degrees)')\n", + " plt.legend()\n", + " plt.grid(True)\n", + " plt.show()" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "[Video Load] Elapsed time: 1.0888 seconds\n", - "[Video Transformation] Elapsed time: 1.0897 seconds\n", - "[Feature Extraction] Elapsed time: 3.5884 seconds\n", - "[Featurn Engineering 1] Elapsed time: 0.0095 seconds\n", - "[Featurn Engineering 2] Elapsed time: 0.0015 seconds\n", - "[Prediction] Elapsed time: 0.0180 seconds\n", - "Predicted pushups: 3\n" - ] - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "738ea760", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "source": [ + "import os\n", + "\n", + "def ls_r():\n", + " for root, dirs, files in os.walk(os.getcwd()):\n", + " if DOWNLOAD_DIR not in root and CACHE_DIR not in root:\n", + " for file in files:\n", + " # Create the full path by joining the directory path and file name\n", + " full_path = os.path.join(root, file)\n", + " print(full_path)\n", + "\n", + "def clear_cache():\n", + " for root, dirs, files in os.walk(os.getcwd()):\n", + " if CACHE_DIR in root:\n", + " for file in files:\n", + " # Create the full path by joining the directory path and file name\n", + " full_path = os.path.join(root, file)\n", + " print(f\"Removing: {full_path}\")\n", + " os.remove(full_path)\n", + "\n", + "def hug_a_face(repo_id):\n", + " from huggingface_hub import hf_hub_download\n", + " yolo_model_file = hf_hub_download(repo_id=repo_id, filename=f\"{YOLO_MODEL_FILE}\", local_dir=os.getcwd())\n", + " yolo_tracker_file = hf_hub_download(repo_id=repo_id, filename=f\"{YOLO_TRACKER_FILE}\", local_dir=os.getcwd())\n", + "# ls_r()\n", + "clear_cache()\n", + "HUGGING_FACE_REPO_ID = f\"maatt4face/mv-final-assignment\"\n", + "hug_a_face(HUGGING_FACE_REPO_ID)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "oIyiVkS4_3za", + "outputId": "7c4c6642-bf77-4ef7-e04b-35b252004e0c" + }, + "id": "oIyiVkS4_3za", + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: \n", + "The secret `HF_TOKEN` does not exist in your Colab secrets.\n", + "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n", + "You will be able to reuse this secret in all of your notebooks.\n", + "Please note that authentication is recommended but still optional to access public models or datasets.\n", + " warnings.warn(\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "id": "273bea44", + "metadata": { + "id": "273bea44" + }, + "source": [ + "## Loader" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4c58edbd", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4c58edbd", + "outputId": "4286753d-5959-4976-8503-f469bdce66fa" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Extracting features for 6_kling_20251209_Text_to_Video_Generate_a_218_1.mp4 (20/77)...\n", + "Extracting features for 2_dkdjwkndkfw.mp4 (21/77)...\n", + "Extracting features for 3_sdlkjslndflkseijlkjef.mp4 (22/77)...\n", + "Extracting features for 2_sdkjdsflkjfwa.mp4 (23/77)...\n", + "Extracting features for 4_aslkjasmcalkewjlkje.mp4 (24/77)...\n", + "Extracting features for 4_kling_20251206_Text_to_Video_Generate_a_28_0.mp4 (25/77)...\n", + "Extracting features for 3_sdlkjfaslkjfalskjdf.mp4 (26/77)...\n", + "Extracting features for 3_kling_20251209_Text_to_Video_Generate_a_491_2.mp4 (27/77)...\n", + "Extracting features for 3_kling_20251206_Text_to_Video_Generate_a_712_3.mp4 (28/77)...\n", + "Extracting features for 4_20251209_Text_to_Video_Generate_a_561_0.mp4 (29/77)...\n", + "Extracting features for 3_kling_20251206_Text_to_Video_Generate_a_71_2.mp4 (30/77)...\n", + "Extracting features for 4_kling_20251209_Image_to_Video_Generate_a_635_1.mp4 (31/77)...\n", + "Extracting features for 4_pushup_1f2da596-7619-4d55-9376-069e15a42a1a_h264.mp4 (32/77)...\n", + "Extracting features for 4_kling_20251209_Text_to_Video_Generate_a_263_1.mp4 (33/77)...\n", + "Extracting features for 3_dslkaldskjflakjs.mp4 (34/77)...\n", + "Extracting features for 3_sdfjwaiejflkasjdf.mp4 (35/77)...\n", + "Extracting features for 4_kling_20251209_Text_to_Video_Generate_a_452_0.mp4 (36/77)...\n", + "Extracting features for 2_dfsaeklnvvalkej.mp4 (37/77)...\n", + "Extracting features for 4_aslkcasckmwlejk.mp4 (38/77)...\n", + "Extracting features for 2_difficult_2.mp4 (39/77)...\n", + "Extracting features for 3_sdlkfjalkjejafe.mp4 (40/77)...\n", + "Extracting features for 2_sdafkjaslkclaksdjkas.mp4 (41/77)...\n", + "Extracting features for 3_kling_20251209_Text_to_Video_Generate_a_491_0.mp4 (42/77)...\n", + "Extracting features for 2_kling_20251205_Text_to_Video_On_a_sandy_4976_0.mp4 (43/77)...\n", + "Extracting features for 2_sdlkjsaelijfksdjf.mp4 (44/77)...\n", + "Extracting features for 3_sdflkjliejkjdf.mp4 (45/77)...\n", + "Extracting features for 3_kling_20251209_Image_to_Video_Generate_a_613_1.mp4 (46/77)...\n", + "Extracting features for 3_kling_20251206_Text_to_Video_Generate_a_71_0.mp4 (47/77)...\n", + "Extracting features for 3_dsksdfjbvsdkj.mp4 (48/77)...\n", + "Extracting features for 3_sadklfjasbnlkjlfkj.mp4 (49/77)...\n", + "Extracting features for 2_sdfkjsaleijflaskdjf.mp4 (50/77)...\n", + "Extracting features for 3_asldkfjalwieaskdfaskdf.mp4 (51/77)...\n", + "Extracting features for 2_dkdmkejkeimdh.mp4 (52/77)...\n", + "Extracting features for 2_sdlfjlewlkjkj.mp4 (53/77)...\n", + "Extracting features for 2_dsalkfjalwkenlke.mp4 (54/77)...\n", + "Extracting features for 2_dkjd823kjf.mp4 (55/77)...\n", + "Extracting features for 3_kling_20251209_Text_to_Video_Generate_a_190_1.mp4 (56/77)...\n", + "Extracting features for 2_sdjfhafsldkjhjk.mp4 (57/77)...\n", + "Extracting features for 3_sadlfkjasldkfjasleijlkjfd.mp4 (58/77)...\n", + "Extracting features for 4_kling_20251209_Text_to_Video_Generate_a_218_0.mp4 (59/77)...\n", + "Extracting features for 4_kling_20251206_Text_to_Video_Generate_a_315_3.mp4 (60/77)...\n", + "Extracting features for 3_dsjlaeijlksjdfie.mp4 (61/77)...\n", + "Extracting features for 3_dkk873lkjlksajdf.mp4 (62/77)...\n", + "Extracting features for 2_kling_20251206_Text_to_Video_Generate_a_71_1.mp4 (63/77)...\n", + "Extracting features for 4_dssalsdkfjweijf.mp4 (64/77)...\n", + "Extracting features for 5_sdfkljweoijlkjdsflkjweaij.mp4 (65/77)...\n", + "Extracting features for 2_sadfasjldkfjaseifj.mp4 (66/77)...\n", + "Extracting features for 4_kling_20251209_Text_to_Video_Generate_a_190_0.mp4 (67/77)...\n", + "Extracting features for 3_kling_20251206_Text_to_Video_Generate_a_315_0.mp4 (68/77)...\n", + "Extracting features for 3_kling_20251206_Text_to_Video_Generate_a_17_0.mp4 (69/77)...\n", + "Extracting features for 5_sadfjhaslfkjasdlkfjsa.mp4 (70/77)...\n", + "Extracting features for 3_kling_20251209_Text_to_Video_Generate_a_403_1.mp4 (71/77)...\n", + "Extracting features for 3_kling_20251205_Text_to_Video_On_a_playg_5064_0.mp4 (72/77)...\n", + "Extracting features for 4_sadflkjasldkjfalseij.mp4 (73/77)...\n", + "Extracting features for 3_kling_20251205_Text_to_Video_In_a_grass_4697_0.mp4 (74/77)...\n", + "Extracting features for 4_kling_20251207_Text_to_Video_Generate_a_521_1.mp4 (75/77)...\n", + "Extracting features for 7_sadkjfkljekj.mp4 (76/77)...\n", + "Extracting features for 4_kling_20251206_Text_to_Video_Generate_a_58_0.mp4 (77/77)...\n", + "Train: 62 videos, Val: 15 videos\n", + "\n" + ] + } + ], + "source": [ + "import gc\n", + "import torch\n", + "import torch.nn as nn\n", + "from torch.utils.data import Dataset, DataLoader, random_split, Subset, WeightedRandomSampler\n", + "import os\n", + "import cv2\n", + "import numpy as np\n", + "import PIL.Image # Import PIL\n", + "import torchvision.transforms as T # Keep this for T.ToTensor() in else branch\n", + "\n", + "\n", + "class VideoDataset(Dataset):\n", + " \"\"\"Dataset for loading videos from a folder, calculating elbow angles.\"\"\"\n", + "\n", + " def __init__(self, video_dir, transform=None, feature_dir=None, signal_transform=None):\n", + " self.video_dir = video_dir\n", + " self.transform = transform # Store transform\n", + " self.feature_dir = feature_dir\n", + " self.signal_transform = signal_transform\n", + "\n", + " self.video_files = [\n", + " f for f in os.listdir(video_dir)\n", + " if f.endswith(('.mp4', '.avi', '.mov'))\n", + " ]\n", + "\n", + " self.labels = [\n", + " int(f.split('_')[0]) for f in self.video_files\n", + " ]\n", + "\n", + " self.lengths = [0] * len(self.video_files)\n", + "\n", + " def __len__(self):\n", + " return len(self.video_files)\n", + "\n", + " def __getitem__(self, idx):\n", + " if self.feature_dir:\n", + " feature_path = os.path.join(self.feature_dir, self.video_files[idx] + \".pt\")\n", + " if os.path.exists(feature_path):\n", + " data = torch.load(feature_path, weights_only=False)\n", + " angles = data['angles']\n", + " self.lengths[idx] = data['length']\n", + " if self.signal_transform:\n", + " angles = self.signal_transform(angles)\n", + " return angles, data['label'], self.lengths[idx]\n", + "\n", + " video_path = os.path.join(self.video_dir, self.video_files[idx])\n", + "\n", + " list_of_pil_frames = [] # Collect PIL images first\n", + " cap = cv2.VideoCapture(video_path)\n", + " while True:\n", + " ret, frame = cap.read()\n", + " if not ret:\n", + " break\n", + " # Convert frame from BGR to RGB numpy array, then to PIL Image\n", + " rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n", + " list_of_pil_frames.append(PIL.Image.fromarray(rgb_frame))\n", + " cap.release()\n", + "\n", + " if not list_of_pil_frames:\n", + " # Handle empty video or no frames\n", + " return torch.tensor([]), self.labels[idx]\n", + "\n", + " frames_for_yolo = self.__get_frames_for_yolo(list_of_pil_frames)\n", + "\n", + "\n", + " # Use YOLO to track on all frames at once. \"trackers\" only exists once you have called the model\n", + " pose_model = YOLO(YOLO_MODEL_FILE, task='pose', verbose=False).to(DEVICE)\n", + " if hasattr(pose_model, \"trackers\") and pose_model.predictor:\n", + " pose_model.predictor.trackers[0].reset()\n", + " results_generator = pose_model.track(frames_for_yolo, verbose=False, device=DEVICE, persist=True, vid_stride=VID_STRIDE, show=False, tracker=YOLO_TRACKER_FILE)\n", + "\n", + " # Calculate angles using landmarks\n", + " angles = self.__calculate_angles(results_generator)\n", + " angles_tensor = torch.tensor(angles, dtype=torch.float32)\n", + " signal_cleanser = SignalMedianator()\n", + " angles_tensor = signal_cleanser(angles_tensor)\n", + "\n", + " # clean up\n", + " del frames_for_yolo\n", + " del results_generator\n", + " del pose_model\n", + " torch.cuda.empty_cache()\n", + " gc.collect()\n", + "\n", + " return angles_tensor, self.labels[idx], angles_tensor.shape[0]\n", + "\n", + " def __get_frames_for_yolo(self, list_of_pil_frames):\n", + " frames_for_yolo = []\n", + " if self.transform:\n", + " # Our custom VideoTransform expects a list of PIL images\n", + " if isinstance(self.transform, VideoTransform):\n", + " frames_for_yolo = self.transform(list_of_pil_frames)\n", + " else:\n", + " # If a different transform is provided (e.g., a torchvision.transforms.Compose\n", + " # that expects single images), apply it to each image individually.\n", + " transformed_frames_tensor = []\n", + " for img_pil in list_of_pil_frames:\n", + " # Apply the transform (which might return another PIL image or a tensor)\n", + " transformed_img = self.transform(img_pil)\n", + " transformed_frames_tensor.append(transformed_img)\n", + " frames_for_yolo = transformed_frames_tensor\n", + " else:\n", + " frames_for_yolo = list_of_pil_frames\n", + " return frames_for_yolo\n", + "\n", + " @staticmethod\n", + " def __calculate_angles(results_generator):\n", + " angles = []\n", + " # max_num_humans_in_any_frame = 0 # To report max humans in any frame\n", + "\n", + " for frame_idx, results in enumerate(results_generator): # results_generator yields one result object per frame\n", + " current_frame_angle = 0.0 # Default if no person detected or angle cannot be calculated\n", + "\n", + " # Filter for detections that are persons (class 0)\n", + " person_mask = (results.boxes.cls == 0)\n", + " person_boxes = results.boxes[person_mask]\n", + " num_persons_in_frame = len(person_boxes)\n", + "\n", + " # max_num_humans_in_any_frame = max(max_num_humans_in_any_frame, num_persons_in_frame)\n", + "\n", + " if num_persons_in_frame == 0:\n", + " angles.append(current_frame_angle)\n", + " del results # Explicitly clear results from GPU/memory\n", + " continue\n", + "\n", + " # Find the index of the most confident person within the filtered person_boxes\n", + " max_conf_person_idx_in_filtered = person_boxes.conf.argmax().item()\n", + "\n", + " # Get the actual index of this most confident person in the original results.boxes\n", + " # This maps the index from the filtered list back to the original list\n", + " original_indices_of_persons = person_mask.nonzero(as_tuple=True)[0]\n", + " original_index_of_most_confident_person = original_indices_of_persons[max_conf_person_idx_in_filtered]\n", + "\n", + " # Get the Keypoints object for this specific person\n", + " most_confident_person_keypoints_obj = results.keypoints[original_index_of_most_confident_person]\n", + "\n", + " if num_persons_in_frame > 1:\n", + " # Removed print statement for verbosity during dataloading\n", + " pass # Or uncomment: print(f\"Multiple Humans in Frame {frame_idx}: {num_persons_in_frame} detected. Selecting most confident.\")\n", + "\n", + " # Access keypoint data directly from the returned human (which is a Keypoints object for one person)\n", + " if most_confident_person_keypoints_obj.xy.shape[0] > 0: # Check if keypoints exist for the human\n", + " landmarks_tensor = most_confident_person_keypoints_obj.xy[0] # Already (num_keypoints, 3)\n", + " landmarks_np = landmarks_tensor.cpu().numpy()\n", + "\n", + " if landmarks_np.shape[0] > max(COCO.R_WRIST.value, COCO.L_WRIST.value):\n", + " calculator = AngleCalculator(landmarks_np)\n", + " try:\n", + " angle = calculator()\n", + " if 0 <= angle <= 180:\n", + " current_frame_angle = angle\n", + " except Exception as e:\n", + " pass\n", + " angles.append(current_frame_angle)\n", + " del results # Explicitly clear results from GPU/memory\n", + "\n", + " # Now, after processing all frames, perform normalization\n", + " if not angles: # If no angles were calculated (e.g., empty video or no detections)\n", + " return []\n", + "\n", + " angles_np = np.array(angles, dtype=np.float32)\n", + " min_angle, max_angle = np.min(angles_np), np.max(angles_np)\n", + " if max_angle > 0:\n", + " angles_np = (angles_np - min_angle) / (max_angle - min_angle) # Normalize to [0, 1]\n", + "\n", + " return angles_np.tolist() # Return as list or keep as np array based on preference.\n", + "\n", + "\n", + "def collate_fn(batch):\n", + " \"\"\"Pad all sequences of angles to a target length.\"\"\"\n", + " angles_list, labels, lengths = zip(*batch)\n", + "\n", + " padded_angles = []\n", + " for angle_tensor, current_length in zip(angles_list, lengths):\n", + " angle_tensor = angle_tensor.flatten()\n", + " if current_length < MAX_FRAMES:\n", + " # Pad with zeros at the end\n", + " padding = torch.zeros(MAX_FRAMES - current_length, dtype=torch.float32)\n", + " angles = torch.cat([angle_tensor.flatten(), padding], dim=0)\n", + " elif current_length > MAX_FRAMES:\n", + " # Truncate if longer\n", + " angles = angle_tensor[:MAX_FRAMES]\n", + " else:\n", + " angles = angle_tensor\n", + " padded_angles.append(angles)\n", + "\n", + " angles_batch = torch.stack(padded_angles, dim=0)\n", + " labels_batch = torch.tensor(labels)\n", + " lengths_batch = torch.tensor(lengths)\n", + "\n", + " return angles_batch, labels_batch, lengths_batch\n", + "\n", + "\n", + "def get_dataloaders(video_dir, batch_size=4, val_split=0.2, transform=None, feature_dir=None, signal_transform=None):\n", + " \"\"\"Create train and validation dataloaders.\"\"\"\n", + "\n", + " full_dataset = VideoDataset(video_dir, transform=transform, feature_dir=feature_dir, signal_transform=signal_transform)\n", + "\n", + " val_size = int(len(full_dataset) * val_split)\n", + " train_size = len(full_dataset) - val_size\n", + "\n", + " train_dataset, val_dataset = random_split(\n", + " full_dataset,\n", + " [train_size, val_size],\n", + " generator=torch.Generator().manual_seed(RAND_SEED)\n", + " )\n", + "\n", + " train_loader = DataLoader(\n", + " train_dataset,\n", + " batch_size=batch_size,\n", + " shuffle=True,\n", + " num_workers=0, # Changed from 2 to 0 to avoid multiprocessing issues with YOLO model\n", + " collate_fn=collate_fn\n", + " )\n", + "\n", + " val_loader = DataLoader(\n", + " val_dataset,\n", + " batch_size=batch_size,\n", + " shuffle=False,\n", + " num_workers=0, # Changed from 2 to 0\n", + " collate_fn=collate_fn\n", + " )\n", + "\n", + " print(f\"Train: {len(train_dataset)} videos, Val: {len(val_dataset)} videos\\n\")\n", + "\n", + " return train_loader, val_loader\n", + "\n", + "\n", + "def get_balanced_dataloaders(video_dir, batch_size=4, val_split=0.2, transform=None, feature_dir=None, signal_transform=None):\n", + " \"\"\"Create balanced train and validation dataloaders using WeightedRandomSampler.\"\"\"\n", + "\n", + " # 1. Initialize the full dataset\n", + " full_dataset = VideoDataset(video_dir, transform=transform, feature_dir=feature_dir, signal_transform=signal_transform)\n", + "\n", + " # 2. Manual Index Split (to keep track of labels for the sampler)\n", + " dataset_size = len(full_dataset)\n", + " indices = list(range(dataset_size))\n", + " split = int(np.floor(val_split * dataset_size))\n", + "\n", + " # Shuffle indices to ensure random distribution before splitting\n", + " np.random.seed(RAND_SEED)\n", + " np.random.shuffle(indices)\n", + "\n", + " train_indices, val_indices = indices[split:], indices[:split]\n", + "\n", + " # 3. Calculate Weights for the Training Set ONLY\n", + " # We pull the labels corresponding to our training indices\n", + " train_labels = [full_dataset.labels[i] for i in train_indices]\n", + " train_labels = np.array(train_labels).astype(int)\n", + "\n", + " # Count occurrences of each push-up count (class)\n", + " class_sample_count = np.bincount(train_labels)\n", + " # Avoid division by zero for classes that might not exist in the subset\n", + " class_sample_count[class_sample_count == 0] = 1\n", + "\n", + " weight = 1. / class_sample_count\n", + "\n", + " # Assign a weight to every sample in the training set\n", + " samples_weight = torch.from_numpy(weight[train_labels]).double()\n", + "\n", + " # 4. Create the Sampler\n", + " # replacement=True is required to oversample rare classes (like 1s, 6s, 7s)\n", + " sampler = WeightedRandomSampler(samples_weight, len(samples_weight), replacement=True)\n", + "\n", + " # 5. Create Subsets and DataLoaders\n", + " train_dataset = Subset(full_dataset, train_indices)\n", + " val_dataset = Subset(full_dataset, val_indices)\n", + "\n", + " train_loader = DataLoader(\n", + " train_dataset,\n", + " batch_size=batch_size,\n", + " sampler=sampler, # SHUFFLE must be False when using a Sampler\n", + " num_workers=0,\n", + " collate_fn=collate_fn\n", + " )\n", + "\n", + " val_loader = DataLoader(\n", + " val_dataset,\n", + " batch_size=batch_size,\n", + " shuffle=False,\n", + " num_workers=0,\n", + " collate_fn=collate_fn\n", + " )\n", + "\n", + " print(f\"Dataset Balanced: Oversampling rare labels to match common labels.\")\n", + " print(f\"Train: {len(train_dataset)} videos, Val: {len(val_dataset)} videos\\n\")\n", + "\n", + " return train_loader, val_loader\n", + "\n", + "\n", + "# Run pre-computation once. This will take time but saves hours during training.\n", + "def precompute_features(video_dir, output_dir, transform=None):\n", + " os.makedirs(output_dir, exist_ok=True)\n", + " # Create a temporary dataset without transforms for extraction\n", + " ds = VideoDataset(video_dir, transform=transform)\n", + " for i in range(len(ds)):\n", + " filename = ds.video_files[i]\n", + " save_path = os.path.join(output_dir, filename + \".pt\")\n", + " if os.path.exists(save_path):\n", + " continue\n", + " print(f\"Extracting features for {filename} ({i+1}/{len(ds)})...\")\n", + " angles, label, length = ds[i]\n", + " torch.save({'angles': angles, 'length': length, 'label': label}, save_path)\n", + " if DEBUG:\n", + " plot_angles_with_moving_median(angles, title=f\"Expected Pushups: {label}\")\n", + "\n", + "precompute_features(DOWNLOAD_DIR, CACHE_DIR, RESIZER)\n", + "\n", + "\n", + "train_loader, val_loader = get_dataloaders( # get_balanced_dataloaders\n", + " DOWNLOAD_DIR,\n", + " batch_size=4,\n", + " val_split=0.2,\n", + " transform=RESIZER,\n", + " feature_dir=CACHE_DIR,\n", + " signal_transform=None\n", + ")\n", + "\n", + "if DEBUG:\n", + " for angles, labels, lengths in train_loader:\n", + " print(f\"Angles shape: {angles.shape}\") # (B, 1000)\n", + " print(f\"Lengths: {lengths}\")\n", + " print(f\"Labels: {labels}\")\n", + " for a, l in zip(angles, labels):\n", + " plot_angles_with_moving_median(a, title=f\"Expected Pushups: {l}\")" + ] + }, + { + "cell_type": "markdown", + "id": "37b44192", + "metadata": { + "id": "37b44192" + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e35ebb62", + "metadata": { + "id": "e35ebb62" + }, + "outputs": [], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence\n", + "import torch.nn.init as init\n", + "\n", + "class PushupCounterSingleOutput(nn.Module):\n", + " def __init__(self, input_size=1, hidden_size=64):\n", + " super().__init__()\n", + " self.bn = nn.BatchNorm1d(input_size)\n", + " self.lstm = nn.LSTM(\n", + " input_size,\n", + " hidden_size,\n", + " bidirectional=True,\n", + " batch_first=True\n", + " )\n", + "\n", + " # Regression head to map the 'essence' of the video to a count\n", + " self.regressor = nn.Sequential(\n", + " nn.Linear(hidden_size * 2, 64),\n", + " nn.ReLU(),\n", + " nn.Linear(64, 1) # Output: Single scalar\n", + " )\n", + "\n", + " # Apply custom initialization\n", + " self.apply(self._init_weights)\n", + "\n", + " def _init_weights(self, module):\n", + " if isinstance(module, nn.Linear):\n", + " # He initialization for Linear layers\n", + " init.kaiming_normal_(module.weight, mode='fan_out', nonlinearity='relu')\n", + " if module.bias is not None:\n", + " init.constant_(module.bias, 0)\n", + "\n", + " elif isinstance(module, nn.LSTM):\n", + " # Orthogonal initialization for recurrent weights\n", + " for name, param in module.named_parameters():\n", + " if 'weight_ih' in name:\n", + " init.xavier_uniform_(param.data)\n", + " elif 'weight_hh' in name:\n", + " init.orthogonal_(param.data)\n", + " elif 'bias' in name:\n", + " init.constant_(param.data, 0)\n", + " # Forget gate bias initialization (standard trick for LSTMs)\n", + " n = param.size(0)\n", + " param.data[n//4:n//2].fill_(1.0)\n", + "\n", + " elif isinstance(module, nn.BatchNorm1d):\n", + " # Standard BN initialization\n", + " init.constant_(module.weight, 1)\n", + " init.constant_(module.bias, 0)\n", + "\n", + " def forward(self, data, lengths):\n", + " # If input is (Batch, SeqLen), turn it into (Batch, SeqLen, 1)\n", + " if data.dim() == 2:\n", + " data = data.unsqueeze(-1)\n", + "\n", + " # 1. Normalize (ignoring camera angle effects)\n", + " data = data.transpose(1, 2)\n", + " data = self.bn(data)\n", + " data = data.transpose(1, 2)\n", + "\n", + " # 2. Pack the padded sequence\n", + " packed_x = pack_padded_sequence(data, lengths.cpu(), batch_first=True, enforce_sorted=False)\n", + " packed_out, (hn, cn) = self.lstm(packed_x)\n", + "\n", + " # 3. Use the Final Hidden State\n", + " # In a Bi-LSTM, the final context is the concatenation of:\n", + " # - The last hidden state of the forward pass\n", + " # - The first hidden state of the backward pass\n", + " # This represents the 'summary' of the entire erratic video.\n", + "\n", + " # hn shape: (num_layers * num_directions, batch, hidden_size)\n", + " # Extract the last layer's forward and backward hidden states\n", + " h_forward = hn[-2, :, :]\n", + " h_backward = hn[-1, :, :]\n", + " combined = torch.cat((h_forward, h_backward), dim=1) # (Batch, hidden_size * 2)\n", + "\n", + " # 4. Predict the final count\n", + " count = self.regressor(combined)\n", + " return count\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "255983ec", + "metadata": { + "id": "255983ec" + }, + "outputs": [], + "source": [ + "from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence\n", + "\n", + "class PushupCounterMaxPool(nn.Module):\n", + " def __init__(self, input_size=1, hidden_size=64):\n", + " super().__init__()\n", + " self.bn = nn.BatchNorm1d(input_size)\n", + " self.lstm = nn.LSTM(\n", + " input_size,\n", + " hidden_size,\n", + " bidirectional=True,\n", + " batch_first=True)\n", + "\n", + " self.regressor = nn.Sequential(\n", + " nn.Linear(hidden_size * 2, 64),\n", + " nn.ReLU(),\n", + " nn.Linear(64, 1)\n", + " )\n", + " # Apply custom weight initialization\n", + " self.apply(self._init_weights)\n", + "\n", + " def _init_weights(self, module):\n", + " \"\"\"\n", + " Professional initialization strategy:\n", + " - Linear: Kaiming (He) Normal for ReLU activation.\n", + " - LSTM: Orthogonal for recurrent weights to prevent gradient issues.\n", + " - BatchNorm: Constant 1 for weights, 0 for biases.\n", + " \"\"\"\n", + " if isinstance(module, nn.Linear):\n", + " init.kaiming_normal_(module.weight, mode='fan_out', nonlinearity='relu')\n", + " if module.bias is not None:\n", + " init.constant_(module.bias, 0)\n", + "\n", + " elif isinstance(module, nn.LSTM):\n", + " for name, param in module.named_parameters():\n", + " if 'weight_ih' in name:\n", + " init.xavier_uniform_(param.data)\n", + " elif 'weight_hh' in name:\n", + " # Orthogonal init is critical for stable LSTM training\n", + " init.orthogonal_(param.data)\n", + " elif 'bias' in name:\n", + " init.constant_(param.data, 0)\n", + " # Set forget gate bias to 1.0 (standard LSTM trick)\n", + " n = param.size(0)\n", + " param.data[n//4:n//2].fill_(1.0)\n", + "\n", + " elif isinstance(module, nn.BatchNorm1d):\n", + " init.constant_(module.weight, 1)\n", + " init.constant_(module.bias, 0)\n", + "\n", + " def forward(self, data, lengths):\n", + " # If input is (Batch, SeqLen), turn it into (Batch, SeqLen, 1)\n", + " if data.dim() == 2:\n", + " data = data.unsqueeze(-1)\n", + "\n", + " # 1. Normalize\n", + " data = data.transpose(1, 2)\n", + " data = self.bn(data)\n", + " data = data.transpose(1, 2)\n", + "\n", + " # 2. LSTM Pass\n", + " packed_x = pack_padded_sequence(data, lengths.cpu(), batch_first=True, enforce_sorted=False)\n", + " packed_out, _ = self.lstm(packed_x)\n", + "\n", + " # Unpack back to (Batch, SeqLen, Hidden*2)\n", + " out, _ = pad_packed_sequence(packed_out, batch_first=True)\n", + "\n", + " # --- GLOBAL MAX POOLING ---\n", + " # We must mask the padded areas before max pooling so the model\n", + " # doesn't pick up '0' as a maximum if the real features are negative.\n", + " mask = torch.arange(out.size(1)).expand(len(lengths), out.size(1)).to(out.device) >= lengths.unsqueeze(1).to(out.device)\n", + " # Fill padded areas with a very small number\n", + " out.masked_fill_(mask.unsqueeze(-1), -1e9)\n", + "\n", + " # Max pool over the time dimension (dim 1)\n", + " # Result: (Batch, Hidden*2)\n", + " pooled, _ = torch.max(out, dim=1)\n", + "\n", + " # 3. Predict single count\n", + " return self.regressor(pooled)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "a1893719", + "metadata": { + "id": "a1893719" + }, + "outputs": [], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.init as init\n", + "import math\n", + "\n", + "class PositionalEncoding(nn.Module):\n", + " \"\"\"Injects information about the relative or absolute position of the tokens in the sequence.\"\"\"\n", + " def __init__(self, d_model, max_len=5000):\n", + " super().__init__()\n", + " pe = torch.zeros(max_len, d_model)\n", + " position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)\n", + " div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))\n", + " pe[:, 0::2] = torch.sin(position * div_term)\n", + " pe[:, 1::2] = torch.cos(position * div_term)\n", + " self.register_buffer('pe', pe.unsqueeze(0))\n", + "\n", + " def forward(self, x):\n", + " # x shape: (batch_size, seq_len, d_model)\n", + " return x + self.pe[:, :x.size(1), :]\n", + "\n", + "class PushupCounterSingleOutputWithTransformer(nn.Module):\n", + " def __init__(self, input_size=1, d_model=64, nhead=4, num_layers=2, dim_feedforward=128, dropout=0.1):\n", + " super().__init__()\n", + "\n", + " # 1. Normalization (applied to the raw input feature)\n", + " self.bn = nn.BatchNorm1d(input_size)\n", + "\n", + " # 2. Linear Projection: Transformers work better in a higher-dimensional space (d_model)\n", + " self.embedding = nn.Linear(input_size, d_model)\n", + "\n", + " # 3. Positional Encoding: Essential since Transformers don't have recurrence\n", + " self.pos_encoder = PositionalEncoding(d_model)\n", + "\n", + " # 4. Transformer Encoder\n", + " encoder_layer = nn.TransformerEncoderLayer(\n", + " d_model=d_model,\n", + " nhead=nhead,\n", + " dim_feedforward=dim_feedforward,\n", + " dropout=dropout,\n", + " batch_first=True # Keeps shape as (Batch, Seq, Feature)\n", + " )\n", + " self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)\n", + "\n", + " # 5. Regression head\n", + " # The input to the first linear layer is d_model (the size of the pooled sequence)\n", + " self.regressor = nn.Sequential(\n", + " nn.Linear(d_model, 64),\n", + " nn.ReLU(),\n", + " nn.Linear(64, 1)\n", + " )\n", + "\n", + " # Apply custom initialization\n", + " self.apply(self._init_weights)\n", + "\n", + " def _init_weights(self, module):\n", + " if isinstance(module, nn.Linear):\n", + " init.kaiming_normal_(module.weight, mode='fan_out', nonlinearity='relu')\n", + " if module.bias is not None:\n", + " init.constant_(module.bias, 0)\n", + " elif isinstance(module, nn.BatchNorm1d):\n", + " init.constant_(module.weight, 1)\n", + " init.constant_(module.bias, 0)\n", + "\n", + " def forward(self, data, lengths):\n", + " # Ensure data is (Batch, SeqLen, input_size)\n", + " if data.dim() == 2:\n", + " data = data.unsqueeze(-1)\n", + "\n", + " # 1. Normalize\n", + " data = data.transpose(1, 2)\n", + " data = self.bn(data)\n", + " data = data.transpose(1, 2)\n", + "\n", + " # 2. Project to d_model and add Positional Encoding\n", + " x = self.embedding(data)\n", + " x = self.pos_encoder(x)\n", + "\n", + " # 3. Create Padding Mask\n", + " # Transformer needs to know which parts of the sequence are padding.\n", + " # Mask shape: (Batch, SeqLen), True values are ignored by attention.\n", + " batch_size, seq_len, _ = x.shape\n", + " mask = torch.arange(seq_len, device=x.device).expand(batch_size, seq_len) >= lengths.unsqueeze(1)\n", + "\n", + " # 4. Transformer Forward Pass\n", + " # encoded shape: (Batch, SeqLen, d_model)\n", + " encoded = self.transformer_encoder(x, src_key_padding_mask=mask)\n", + "\n", + " # 5. Global Average Pooling (Handling variable lengths)\n", + " # Instead of taking the last hidden state, we average all non-padded tokens.\n", + " mask_expanded = mask.unsqueeze(-1).expand_as(encoded)\n", + " encoded_masked = encoded.masked_fill(mask_expanded, 0.0)\n", + "\n", + " # Sum across the sequence and divide by actual lengths\n", + " sum_encoded = torch.sum(encoded_masked, dim=1)\n", + " mean_encoded = sum_encoded / lengths.unsqueeze(1).float()\n", + "\n", + " # 6. Predict the final count\n", + " count = self.regressor(mean_encoded)\n", + " return count\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c41798f4", + "metadata": { + "id": "c41798f4" + }, + "outputs": [], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.init as init\n", + "\n", + "class PushupCounterSingleOutputLight(nn.Module):\n", + " def __init__(self, input_size=1, hidden_size=32, stride=2):\n", + " super().__init__()\n", + "\n", + " # 1. Convolutional Stem to implement 'Stride'\n", + " # This reduces the sequence length by the stride factor and\n", + " # projects the input_size to hidden_size.\n", + " self.stride = stride\n", + " self.conv_stem = nn.Conv1d(\n", + " in_channels=input_size,\n", + " out_channels=hidden_size,\n", + " kernel_size=3,\n", + " stride=stride,\n", + " padding=1\n", + " )\n", + "\n", + " self.bn = nn.BatchNorm1d(hidden_size)\n", + "\n", + " # 2. Lightweight LSTM - smaller hidden_size makes this much lighter\n", + " self.lstm = nn.LSTM(\n", + " hidden_size,\n", + " hidden_size,\n", + " bidirectional=True,\n", + " batch_first=True\n", + " )\n", + "\n", + " # 3. Slimmed Regression head\n", + " self.regressor = nn.Sequential(\n", + " nn.Linear(hidden_size, 32),\n", + " nn.ReLU(),\n", + " nn.Linear(32, 1)\n", + " )\n", + "\n", + " self.apply(self._init_weights)\n", + "\n", + " def _init_weights(self, module):\n", + " if isinstance(module, (nn.Linear, nn.Conv1d)):\n", + " init.kaiming_normal_(module.weight, mode='fan_out', nonlinearity='relu')\n", + " if module.bias is not None:\n", + " init.constant_(module.bias, 0)\n", + " elif isinstance(module, nn.LSTM):\n", + " for name, param in module.named_parameters():\n", + " if 'weight_ih' in name:\n", + " init.xavier_uniform_(param.data)\n", + " elif 'weight_hh' in name:\n", + " init.orthogonal_(param.data)\n", + " elif 'bias' in name:\n", + " init.constant_(param.data, 0)\n", + "\n", + " def forward(self, data, lengths):\n", + " # Ensure data is (Batch, SeqLen, input_size)\n", + " if data.dim() == 2:\n", + " data = data.unsqueeze(-1)\n", + "\n", + " # 1. Apply Stride via Conv1d\n", + " # Conv1d expects (Batch, Channels, SeqLen)\n", + " x = data.transpose(1, 2)\n", + " x = self.conv_stem(x)\n", + " x = self.bn(x)\n", + " x = x.transpose(1, 2) # Back to (Batch, NewSeqLen, hidden_size)\n", + "\n", + " # 2. Adjust lengths for the stride\n", + " # Since we used a Conv1d with stride, the sequence length is shorter\n", + " new_lengths = torch.div(lengths, self.stride, rounding_mode='floor')\n", + " # Ensure length is at least 1 to avoid packing errors\n", + " new_lengths = torch.clamp(new_lengths, min=1)\n", + "\n", + " # 3. LSTM Processing\n", + " packed_x = nn.utils.rnn.pack_padded_sequence(\n", + " x, new_lengths.cpu(), batch_first=True, enforce_sorted=False\n", + " )\n", + " _, (hn, _) = self.lstm(packed_x)\n", + "\n", + " # hn shape: (num_layers * num_directions, batch, hidden_size)\n", + " # Since it's unidirectional, we just take the last layer\n", + " combined = hn[-1, :, :]\n", + "\n", + " # 4. Predict\n", + " count = self.regressor(combined)\n", + " return count\n" + ] + }, + { + "cell_type": "markdown", + "id": "d482fc69", + "metadata": { + "id": "d482fc69" + }, + "source": [ + "## Training and Testing" + ] + }, + { + "cell_type": "markdown", + "id": "e7f08201", + "metadata": { + "id": "e7f08201" + }, + "source": [ + "### Training" + ] + }, + { + "cell_type": "markdown", + "id": "fe58ddc9", + "metadata": { + "id": "fe58ddc9" + }, + "source": [ + "#### Run per Epoch" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "8f3bc7db", + "metadata": { + "id": "8f3bc7db" + }, + "outputs": [], + "source": [ + "def run_epoch(model, loader, criterion, optimizer=None, device='cpu', debug=False):\n", + " is_train = optimizer is not None\n", + " model.train() if is_train else model.eval()\n", + "\n", + " total_diffs = 0\n", + " total_loss = 0\n", + " total_abs_error = 0\n", + " total_samples = 0\n", + "\n", + " context = torch.enable_grad() if is_train else torch.no_grad()\n", + "\n", + " with context:\n", + " for batch_x, batch_y, lengths in loader:\n", + " # 1. Prepare Data\n", + " batch_x = batch_x.to(device)\n", + " batch_y = batch_y.to(device).float() # Labels must be float for MSE/Huber loss\n", + "\n", + " if is_train:\n", + " optimizer.zero_grad()\n", + "\n", + " # 2. Forward Pass\n", + " # outputs shape: (Batch, 1)\n", + " outputs = model(batch_x, lengths)\n", + " outputs = outputs.squeeze(-1) # Match batch_y shape: (Batch,)\n", + "\n", + " # 3. Loss Calculation\n", + " loss = criterion(outputs, batch_y)\n", + "\n", + " if is_train:\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " total_loss += loss.item()\n", + "\n", + " # 4. Metrics: Round the predicted float to the nearest whole pushup\n", + " preds = torch.round(outputs)\n", + "\n", + " # Calculate Absolute Error (e.g., predicted 5.2, actual 5 -> error 0.2)\n", + " # We use absolute error to track how many pushups we are off by\n", + " total_diffs += (preds != batch_y).sum().item()\n", + " total_abs_error += torch.abs(preds - batch_y).sum().item()\n", + " total_samples += batch_y.size(0)\n", + "\n", + " # Debug Printing\n", + " if debug:\n", + " print(f\"Expected Counts: {batch_y.cpu().numpy()}\")\n", + " print(f\"outputs : {outputs}\")\n", + " print(f\"Predicted Counts: {preds.detach().cpu().numpy()}\")\n", + "\n", + " avg_loss = total_loss / len(loader)\n", + " # This represents 'Mean Absolute Error' - Average pushups missed per video\n", + " mae = total_abs_error / total_samples\n", + " acc = (total_samples - total_diffs) / total_samples\n", + "\n", + " return avg_loss, mae, acc" + ] + }, + { + "cell_type": "markdown", + "id": "0f55b94e", + "metadata": { + "id": "0f55b94e" + }, + "source": [ + "#### Actual Training" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "01258d83", + "metadata": { + "id": "01258d83" + }, + "outputs": [], + "source": [ + "import torch\n", + "import torch.optim as optim\n", + "\n", + "def train_model(model, epochs=MAX_EPOCHS, patience=10):\n", + " outputs = {\n", + " \"train_loss\": [],\n", + " \"train_mae\": [],\n", + " \"train_acc\": [],\n", + " \"val_loss\": [],\n", + " \"val_mae\": [],\n", + " \"val_acc\": [],\n", + " \"model\": None\n", + " }\n", + " # Hyperparameters\n", + " base_lr = 1e-3\n", + " warmup_epochs = 5\n", + " # Stuff for Training\n", + " criterion = nn.HuberLoss()\n", + " # Use pos_weight if 'rep completion' is rare (e.g., 1 frame in 100)\n", + " optimizer = optim.Adam(model.parameters(), lr=base_lr)\n", + "\n", + " # Warmup Scheduler: Linearly increases LR from 0 to base_lr\n", + " # The lambda function returns a multiplier for the base_lr\n", + " lr_lambda = lambda epoch: (epoch + 1) / warmup_epochs if epoch < warmup_epochs else 1\n", + " warmup_scheduler = optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lr_lambda)\n", + "\n", + " # Main Scheduler: Reduces LR when validation loss stalls\n", + " # mode='min': we want to minimize validation loss\n", + " # factor=0.5: cut LR in half when stalled\n", + " # patience=5: wait 5 epochs of no improvement before cutting\n", + " plateau_scheduler = optim.lr_scheduler.ReduceLROnPlateau(\n", + " optimizer,\n", + " mode='min',\n", + " factor=0.5,\n", + " patience=5\n", + " )\n", + "\n", + " # Tracking variables before the loop\n", + " best_val_loss = float('inf')\n", + " model_name = type(model).__name__\n", + " save_path = os.path.join(WEIGHTS_DIR, f\"best_model_weights_{model_name}.pth\")\n", + "\n", + " for epoch in range(epochs):\n", + " # Train and Validate\n", + " train_loss, train_mae, train_acc = run_epoch(model, train_loader, criterion, optimizer, DEVICE)\n", + " val_loss, val_mae, val_acc = run_epoch(model, val_loader, criterion, None, DEVICE)\n", + "\n", + " # --- Scheduler Step Logic ---\n", + " if epoch < warmup_epochs:\n", + " # During warmup, we step the warmup scheduler every epoch\n", + " warmup_scheduler.step()\n", + " current_lr = optimizer.param_groups[0]['lr']\n", + " print(f\"Epoch {epoch+1}: Warmup Phase - LR: {current_lr:.6f}\")\n", + " else:\n", + " # After warmup, we switch to the plateau scheduler\n", + " plateau_scheduler.step(val_loss)\n", + " current_lr = optimizer.param_groups[0]['lr']\n", + " print(f\"Epoch {epoch+1}: Plateau Phase - LR: {current_lr:.6f}\")\n", + "\n", + " print(f\"Epoch [{epoch+1:>3d}/{epochs}] | \"\n", + " f\"Train Loss: {train_loss:.4f} | Train MAE: {train_mae:.4f} | Train Acc: {train_acc:.4f} |\"\n", + " f\"Val Loss: {val_loss:.4f} | Val MAE: {val_mae:.4f} | Val Acc: {val_acc:.4f}\")\n", + " outputs[\"train_loss\"].append(train_loss)\n", + " outputs[\"train_mae\"].append(train_mae)\n", + " outputs[\"train_acc\"].append(train_acc)\n", + " outputs[\"val_loss\"].append(val_loss)\n", + " outputs[\"val_mae\"].append(val_mae)\n", + " outputs[\"val_acc\"].append(val_acc)\n", + "\n", + " # 2. Check if this is the best model we've seen so far\n", + " if val_loss < best_val_loss:\n", + " best_val_loss = val_loss\n", + "\n", + " # 3. Save the state_dict (the weights)\n", + " torch.save({\n", + " 'epoch': epoch,\n", + " 'model_state_dict': model.state_dict(),\n", + " 'optimizer_state_dict': optimizer.state_dict(),\n", + " 'loss': val_loss,\n", + " }, save_path)\n", + "\n", + " print(f\"--> Best model saved with Val Loss: {val_loss:.4f}\")\n", + "\n", + " outputs[\"model\"] = model\n", + " return outputs" + ] + }, + { + "cell_type": "markdown", + "id": "bf52fb55", + "metadata": { + "id": "bf52fb55" + }, + "source": [ + "#### Let's Do It!" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "f21b0cf1", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f21b0cf1", + "outputId": "2ebafe12-c533-4e4e-f55c-cb42e7363f77" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1: Warmup Phase - LR: 0.000400\n", + "Epoch [ 1/120] | Train Loss: 1.4334 | Train MAE: 1.9355 | Train Acc: 0.1774 |Val Loss: 1.0967 | Val MAE: 1.6000 | Val Acc: 0.0667\n", + "--> Best model saved with Val Loss: 1.0967\n", + "Epoch 2: Warmup Phase - LR: 0.000600\n", + "Epoch [ 2/120] | Train Loss: 1.0902 | Train MAE: 1.5161 | Train Acc: 0.0806 |Val Loss: 1.1907 | Val MAE: 1.8667 | Val Acc: 0.0000\n", + "Epoch 3: Warmup Phase - LR: 0.000800\n", + "Epoch [ 3/120] | Train Loss: 0.7728 | Train MAE: 1.0806 | Train Acc: 0.3387 |Val Loss: 0.8256 | Val MAE: 1.2667 | Val Acc: 0.2667\n", + "--> Best model saved with Val Loss: 0.8256\n", + "Epoch 4: Warmup Phase - LR: 0.001000\n", + "Epoch [ 4/120] | Train Loss: 0.8040 | Train MAE: 1.2097 | Train Acc: 0.2097 |Val Loss: 2.0236 | Val MAE: 2.6000 | Val Acc: 0.0667\n", + "Epoch 5: Warmup Phase - LR: 0.001000\n", + "Epoch [ 5/120] | Train Loss: 1.0803 | Train MAE: 1.4839 | Train Acc: 0.2258 |Val Loss: 0.5075 | Val MAE: 0.7333 | Val Acc: 0.4000\n", + "--> Best model saved with Val Loss: 0.5075\n", + "Epoch 6: Plateau Phase - LR: 0.001000\n", + "Epoch [ 6/120] | Train Loss: 0.5821 | Train MAE: 0.9516 | Train Acc: 0.3710 |Val Loss: 0.6215 | Val MAE: 0.8000 | Val Acc: 0.4667\n", + "Epoch 7: Plateau Phase - LR: 0.001000\n", + "Epoch [ 7/120] | Train Loss: 0.5272 | Train MAE: 0.7903 | Train Acc: 0.4516 |Val Loss: 0.6305 | Val MAE: 1.0667 | Val Acc: 0.2667\n", + "Epoch 8: Plateau Phase - LR: 0.001000\n", + "Epoch [ 8/120] | Train Loss: 0.4291 | Train MAE: 0.7097 | Train Acc: 0.4677 |Val Loss: 0.5088 | Val MAE: 0.8667 | Val Acc: 0.2667\n", + "Epoch 9: Plateau Phase - LR: 0.001000\n", + "Epoch [ 9/120] | Train Loss: 0.2364 | Train MAE: 0.4677 | Train Acc: 0.5806 |Val Loss: 0.5926 | Val MAE: 0.9333 | Val Acc: 0.2667\n", + "Epoch 10: Plateau Phase - LR: 0.001000\n", + "Epoch [ 10/120] | Train Loss: 0.2195 | Train MAE: 0.4839 | Train Acc: 0.5484 |Val Loss: 0.4461 | Val MAE: 0.6667 | Val Acc: 0.4000\n", + "--> Best model saved with Val Loss: 0.4461\n", + "Epoch 11: Plateau Phase - LR: 0.001000\n", + "Epoch [ 11/120] | Train Loss: 0.2328 | Train MAE: 0.4677 | Train Acc: 0.6129 |Val Loss: 0.5061 | Val MAE: 0.9333 | Val Acc: 0.3333\n", + "Epoch 12: Plateau Phase - LR: 0.001000\n", + "Epoch [ 12/120] | Train Loss: 0.3485 | Train MAE: 0.6452 | Train Acc: 0.5000 |Val Loss: 0.5057 | Val MAE: 0.8667 | Val Acc: 0.4000\n", + "Epoch 13: Plateau Phase - LR: 0.001000\n", + "Epoch [ 13/120] | Train Loss: 0.2548 | Train MAE: 0.5161 | Train Acc: 0.5323 |Val Loss: 0.5073 | Val MAE: 0.8667 | Val Acc: 0.4000\n", + "Epoch 14: Plateau Phase - LR: 0.001000\n", + "Epoch [ 14/120] | Train Loss: 0.2665 | Train MAE: 0.5323 | Train Acc: 0.5161 |Val Loss: 0.7518 | Val MAE: 1.2000 | Val Acc: 0.0667\n", + "Epoch 15: Plateau Phase - LR: 0.001000\n", + "Epoch [ 15/120] | Train Loss: 0.3119 | Train MAE: 0.6452 | Train Acc: 0.4677 |Val Loss: 0.5888 | Val MAE: 0.9333 | Val Acc: 0.3333\n", + "Epoch 16: Plateau Phase - LR: 0.000500\n", + "Epoch [ 16/120] | Train Loss: 0.2272 | Train MAE: 0.5161 | Train Acc: 0.5161 |Val Loss: 0.4836 | Val MAE: 0.9333 | Val Acc: 0.2000\n", + "Epoch 17: Plateau Phase - LR: 0.000500\n", + "Epoch [ 17/120] | Train Loss: 0.2490 | Train MAE: 0.5000 | Train Acc: 0.5968 |Val Loss: 0.4691 | Val MAE: 0.6667 | Val Acc: 0.4000\n", + "Epoch 18: Plateau Phase - LR: 0.000500\n", + "Epoch [ 18/120] | Train Loss: 0.1378 | Train MAE: 0.3226 | Train Acc: 0.6935 |Val Loss: 0.5086 | Val MAE: 0.8667 | Val Acc: 0.4000\n", + "Epoch 19: Plateau Phase - LR: 0.000500\n", + "Epoch [ 19/120] | Train Loss: 0.1013 | Train MAE: 0.2581 | Train Acc: 0.7419 |Val Loss: 0.4777 | Val MAE: 0.8667 | Val Acc: 0.2667\n", + "Epoch 20: Plateau Phase - LR: 0.000500\n", + "Epoch [ 20/120] | Train Loss: 0.1062 | Train MAE: 0.2742 | Train Acc: 0.7419 |Val Loss: 0.4689 | Val MAE: 0.7333 | Val Acc: 0.4000\n", + "Epoch 21: Plateau Phase - LR: 0.000500\n", + "Epoch [ 21/120] | Train Loss: 0.0858 | Train MAE: 0.1774 | Train Acc: 0.8226 |Val Loss: 0.4385 | Val MAE: 0.6667 | Val Acc: 0.4000\n", + "--> Best model saved with Val Loss: 0.4385\n", + "Epoch 22: Plateau Phase - LR: 0.000500\n", + "Epoch [ 22/120] | Train Loss: 0.0653 | Train MAE: 0.1290 | Train Acc: 0.8710 |Val Loss: 0.4267 | Val MAE: 0.6667 | Val Acc: 0.4000\n", + "--> Best model saved with Val Loss: 0.4267\n", + "Epoch 23: Plateau Phase - LR: 0.000500\n", + "Epoch [ 23/120] | Train Loss: 0.0657 | Train MAE: 0.1613 | Train Acc: 0.8387 |Val Loss: 0.3642 | Val MAE: 0.5333 | Val Acc: 0.5333\n", + "--> Best model saved with Val Loss: 0.3642\n", + "Epoch 24: Plateau Phase - LR: 0.000500\n", + "Epoch [ 24/120] | Train Loss: 0.0555 | Train MAE: 0.0806 | Train Acc: 0.9194 |Val Loss: 0.4534 | Val MAE: 0.8667 | Val Acc: 0.2667\n", + "Epoch 25: Plateau Phase - LR: 0.000500\n", + "Epoch [ 25/120] | Train Loss: 0.0568 | Train MAE: 0.1452 | Train Acc: 0.8548 |Val Loss: 0.4453 | Val MAE: 0.7333 | Val Acc: 0.4000\n", + "Epoch 26: Plateau Phase - LR: 0.000500\n", + "Epoch [ 26/120] | Train Loss: 0.0349 | Train MAE: 0.0645 | Train Acc: 0.9355 |Val Loss: 0.3769 | Val MAE: 0.5333 | Val Acc: 0.5333\n", + "Epoch 27: Plateau Phase - LR: 0.000500\n", + "Epoch [ 27/120] | Train Loss: 0.0253 | Train MAE: 0.0645 | Train Acc: 0.9355 |Val Loss: 0.3729 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 28: Plateau Phase - LR: 0.000500\n", + "Epoch [ 28/120] | Train Loss: 0.0472 | Train MAE: 0.0968 | Train Acc: 0.9032 |Val Loss: 0.4077 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 29: Plateau Phase - LR: 0.000250\n", + "Epoch [ 29/120] | Train Loss: 0.0357 | Train MAE: 0.0645 | Train Acc: 0.9355 |Val Loss: 0.3962 | Val MAE: 0.7333 | Val Acc: 0.3333\n", + "Epoch 30: Plateau Phase - LR: 0.000250\n", + "Epoch [ 30/120] | Train Loss: 0.0272 | Train MAE: 0.0806 | Train Acc: 0.9194 |Val Loss: 0.3985 | Val MAE: 0.5333 | Val Acc: 0.5333\n", + "Epoch 31: Plateau Phase - LR: 0.000250\n", + "Epoch [ 31/120] | Train Loss: 0.0266 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3777 | Val MAE: 0.5333 | Val Acc: 0.5333\n", + "Epoch 32: Plateau Phase - LR: 0.000250\n", + "Epoch [ 32/120] | Train Loss: 0.0180 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.4065 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 33: Plateau Phase - LR: 0.000250\n", + "Epoch [ 33/120] | Train Loss: 0.0291 | Train MAE: 0.0484 | Train Acc: 0.9516 |Val Loss: 0.4106 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 34: Plateau Phase - LR: 0.000250\n", + "Epoch [ 34/120] | Train Loss: 0.0204 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3794 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 35: Plateau Phase - LR: 0.000125\n", + "Epoch [ 35/120] | Train Loss: 0.0188 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3765 | Val MAE: 0.5333 | Val Acc: 0.5333\n", + "Epoch 36: Plateau Phase - LR: 0.000125\n", + "Epoch [ 36/120] | Train Loss: 0.0207 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3725 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 37: Plateau Phase - LR: 0.000125\n", + "Epoch [ 37/120] | Train Loss: 0.0121 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3796 | Val MAE: 0.5333 | Val Acc: 0.5333\n", + "Epoch 38: Plateau Phase - LR: 0.000125\n", + "Epoch [ 38/120] | Train Loss: 0.0160 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3882 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 39: Plateau Phase - LR: 0.000125\n", + "Epoch [ 39/120] | Train Loss: 0.0137 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3744 | Val MAE: 0.5333 | Val Acc: 0.5333\n", + "Epoch 40: Plateau Phase - LR: 0.000125\n", + "Epoch [ 40/120] | Train Loss: 0.0118 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3897 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 41: Plateau Phase - LR: 0.000063\n", + "Epoch [ 41/120] | Train Loss: 0.0111 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3910 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 42: Plateau Phase - LR: 0.000063\n", + "Epoch [ 42/120] | Train Loss: 0.0127 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3865 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 43: Plateau Phase - LR: 0.000063\n", + "Epoch [ 43/120] | Train Loss: 0.0121 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3820 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 44: Plateau Phase - LR: 0.000063\n", + "Epoch [ 44/120] | Train Loss: 0.0099 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3845 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 45: Plateau Phase - LR: 0.000063\n", + "Epoch [ 45/120] | Train Loss: 0.0116 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3817 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 46: Plateau Phase - LR: 0.000063\n", + "Epoch [ 46/120] | Train Loss: 0.0206 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3688 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 47: Plateau Phase - LR: 0.000031\n", + "Epoch [ 47/120] | Train Loss: 0.0107 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3655 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 48: Plateau Phase - LR: 0.000031\n", + "Epoch [ 48/120] | Train Loss: 0.0139 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3673 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 49: Plateau Phase - LR: 0.000031\n", + "Epoch [ 49/120] | Train Loss: 0.0097 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3693 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 50: Plateau Phase - LR: 0.000031\n", + "Epoch [ 50/120] | Train Loss: 0.0088 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3702 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 51: Plateau Phase - LR: 0.000031\n", + "Epoch [ 51/120] | Train Loss: 0.0110 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3714 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 52: Plateau Phase - LR: 0.000031\n", + "Epoch [ 52/120] | Train Loss: 0.0107 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3716 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 53: Plateau Phase - LR: 0.000016\n", + "Epoch [ 53/120] | Train Loss: 0.0084 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3698 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 54: Plateau Phase - LR: 0.000016\n", + "Epoch [ 54/120] | Train Loss: 0.0109 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3693 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 55: Plateau Phase - LR: 0.000016\n", + "Epoch [ 55/120] | Train Loss: 0.0080 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3716 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 56: Plateau Phase - LR: 0.000016\n", + "Epoch [ 56/120] | Train Loss: 0.0151 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3729 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 57: Plateau Phase - LR: 0.000016\n", + "Epoch [ 57/120] | Train Loss: 0.0091 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3736 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 58: Plateau Phase - LR: 0.000016\n", + "Epoch [ 58/120] | Train Loss: 0.0107 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3743 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 59: Plateau Phase - LR: 0.000008\n", + "Epoch [ 59/120] | Train Loss: 0.0111 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3737 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 60: Plateau Phase - LR: 0.000008\n", + "Epoch [ 60/120] | Train Loss: 0.0100 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3726 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 61: Plateau Phase - LR: 0.000008\n", + "Epoch [ 61/120] | Train Loss: 0.0109 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3718 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 62: Plateau Phase - LR: 0.000008\n", + "Epoch [ 62/120] | Train Loss: 0.0103 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3714 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 63: Plateau Phase - LR: 0.000008\n", + "Epoch [ 63/120] | Train Loss: 0.0086 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3735 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 64: Plateau Phase - LR: 0.000008\n", + "Epoch [ 64/120] | Train Loss: 0.0081 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3717 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 65: Plateau Phase - LR: 0.000004\n", + "Epoch [ 65/120] | Train Loss: 0.0156 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3719 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 66: Plateau Phase - LR: 0.000004\n", + "Epoch [ 66/120] | Train Loss: 0.0097 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3729 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 67: Plateau Phase - LR: 0.000004\n", + "Epoch [ 67/120] | Train Loss: 0.0099 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3715 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 68: Plateau Phase - LR: 0.000004\n", + "Epoch [ 68/120] | Train Loss: 0.0086 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3720 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 69: Plateau Phase - LR: 0.000004\n", + "Epoch [ 69/120] | Train Loss: 0.0160 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3714 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 70: Plateau Phase - LR: 0.000004\n", + "Epoch [ 70/120] | Train Loss: 0.0104 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3710 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 71: Plateau Phase - LR: 0.000002\n", + "Epoch [ 71/120] | Train Loss: 0.0084 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3704 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 72: Plateau Phase - LR: 0.000002\n", + "Epoch [ 72/120] | Train Loss: 0.0099 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3696 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 73: Plateau Phase - LR: 0.000002\n", + "Epoch [ 73/120] | Train Loss: 0.0092 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3706 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 74: Plateau Phase - LR: 0.000002\n", + "Epoch [ 74/120] | Train Loss: 0.0079 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3697 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 75: Plateau Phase - LR: 0.000002\n", + "Epoch [ 75/120] | Train Loss: 0.0079 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3707 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 76: Plateau Phase - LR: 0.000002\n", + "Epoch [ 76/120] | Train Loss: 0.0099 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3701 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 77: Plateau Phase - LR: 0.000001\n", + "Epoch [ 77/120] | Train Loss: 0.0100 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3707 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 78: Plateau Phase - LR: 0.000001\n", + "Epoch [ 78/120] | Train Loss: 0.0077 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3708 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 79: Plateau Phase - LR: 0.000001\n", + "Epoch [ 79/120] | Train Loss: 0.0107 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3694 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 80: Plateau Phase - LR: 0.000001\n", + "Epoch [ 80/120] | Train Loss: 0.0080 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3699 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 81: Plateau Phase - LR: 0.000001\n", + "Epoch [ 81/120] | Train Loss: 0.0102 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3707 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 82: Plateau Phase - LR: 0.000001\n", + "Epoch [ 82/120] | Train Loss: 0.0084 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3711 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 83: Plateau Phase - LR: 0.000000\n", + "Epoch [ 83/120] | Train Loss: 0.0083 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3702 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 84: Plateau Phase - LR: 0.000000\n", + "Epoch [ 84/120] | Train Loss: 0.0081 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3710 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 85: Plateau Phase - LR: 0.000000\n", + "Epoch [ 85/120] | Train Loss: 0.0086 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3706 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 86: Plateau Phase - LR: 0.000000\n", + "Epoch [ 86/120] | Train Loss: 0.0094 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3700 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 87: Plateau Phase - LR: 0.000000\n", + "Epoch [ 87/120] | Train Loss: 0.0105 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3684 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 88: Plateau Phase - LR: 0.000000\n", + "Epoch [ 88/120] | Train Loss: 0.0067 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3707 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 89: Plateau Phase - LR: 0.000000\n", + "Epoch [ 89/120] | Train Loss: 0.0069 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3707 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 90: Plateau Phase - LR: 0.000000\n", + "Epoch [ 90/120] | Train Loss: 0.0141 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3709 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 91: Plateau Phase - LR: 0.000000\n", + "Epoch [ 91/120] | Train Loss: 0.0117 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3711 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 92: Plateau Phase - LR: 0.000000\n", + "Epoch [ 92/120] | Train Loss: 0.0184 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3702 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 93: Plateau Phase - LR: 0.000000\n", + "Epoch [ 93/120] | Train Loss: 0.0098 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3700 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 94: Plateau Phase - LR: 0.000000\n", + "Epoch [ 94/120] | Train Loss: 0.0080 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3711 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 95: Plateau Phase - LR: 0.000000\n", + "Epoch [ 95/120] | Train Loss: 0.0106 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3699 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 96: Plateau Phase - LR: 0.000000\n", + "Epoch [ 96/120] | Train Loss: 0.0105 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3705 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 97: Plateau Phase - LR: 0.000000\n", + "Epoch [ 97/120] | Train Loss: 0.0089 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3703 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 98: Plateau Phase - LR: 0.000000\n", + "Epoch [ 98/120] | Train Loss: 0.0087 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3711 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 99: Plateau Phase - LR: 0.000000\n", + "Epoch [ 99/120] | Train Loss: 0.0102 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3708 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 100: Plateau Phase - LR: 0.000000\n", + "Epoch [100/120] | Train Loss: 0.0098 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3701 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 101: Plateau Phase - LR: 0.000000\n", + "Epoch [101/120] | Train Loss: 0.0074 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3689 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 102: Plateau Phase - LR: 0.000000\n", + "Epoch [102/120] | Train Loss: 0.0096 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3693 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 103: Plateau Phase - LR: 0.000000\n", + "Epoch [103/120] | Train Loss: 0.0076 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3693 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 104: Plateau Phase - LR: 0.000000\n", + "Epoch [104/120] | Train Loss: 0.0092 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3695 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 105: Plateau Phase - LR: 0.000000\n", + "Epoch [105/120] | Train Loss: 0.0070 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3701 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 106: Plateau Phase - LR: 0.000000\n", + "Epoch [106/120] | Train Loss: 0.0095 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3695 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 107: Plateau Phase - LR: 0.000000\n", + "Epoch [107/120] | Train Loss: 0.0119 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3697 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 108: Plateau Phase - LR: 0.000000\n", + "Epoch [108/120] | Train Loss: 0.0100 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3698 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 109: Plateau Phase - LR: 0.000000\n", + "Epoch [109/120] | Train Loss: 0.0099 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3703 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 110: Plateau Phase - LR: 0.000000\n", + "Epoch [110/120] | Train Loss: 0.0082 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3710 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 111: Plateau Phase - LR: 0.000000\n", + "Epoch [111/120] | Train Loss: 0.0091 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3703 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 112: Plateau Phase - LR: 0.000000\n", + "Epoch [112/120] | Train Loss: 0.0071 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3698 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 113: Plateau Phase - LR: 0.000000\n", + "Epoch [113/120] | Train Loss: 0.0092 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3710 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 114: Plateau Phase - LR: 0.000000\n", + "Epoch [114/120] | Train Loss: 0.0067 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3700 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 115: Plateau Phase - LR: 0.000000\n", + "Epoch [115/120] | Train Loss: 0.0087 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3709 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 116: Plateau Phase - LR: 0.000000\n", + "Epoch [116/120] | Train Loss: 0.0113 | Train MAE: 0.0161 | Train Acc: 0.9839 |Val Loss: 0.3691 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 117: Plateau Phase - LR: 0.000000\n", + "Epoch [117/120] | Train Loss: 0.0092 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3702 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 118: Plateau Phase - LR: 0.000000\n", + "Epoch [118/120] | Train Loss: 0.0088 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3700 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 119: Plateau Phase - LR: 0.000000\n", + "Epoch [119/120] | Train Loss: 0.0059 | Train MAE: 0.0000 | Train Acc: 1.0000 |Val Loss: 0.3703 | Val MAE: 0.6000 | Val Acc: 0.4667\n", + "Epoch 120: Plateau Phase - LR: 0.000000\n", + "Epoch [120/120] | Train Loss: 0.0131 | Train MAE: 0.0323 | Train Acc: 0.9677 |Val Loss: 0.3704 | Val MAE: 0.6000 | Val Acc: 0.4667\n" + ] + } + ], + "source": [ + "model = PushupCounterSingleOutput().to(DEVICE)\n", + "outputs = train_model(model, epochs=120)" + ] + }, + { + "cell_type": "markdown", + "id": "a836629b", + "metadata": { + "id": "a836629b" + }, + "source": [ + "### Performance Plots" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "83473ef3", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 441 + }, + "id": "83473ef3", + "outputId": "bc33d9e9-ac84-421d-a158-dc95e21cf700" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "==============================\n", + " TOP 5 PERFORMANCE TABLE\n", + "==============================\n", + " train_loss train_mae train_acc val_loss val_mae val_acc model\n", + "Epoch \n", + "23 0.065747 0.161290 0.838710 0.364240 0.533333 0.533333 PushupCounterSingleOutput(\\n (bn): BatchNorm1d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(1, 64, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=128, out_features=64, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=64, out_features=1, bias=True)\\n )\\n)\n", + "47 0.010742 0.000000 1.000000 0.365467 0.600000 0.466667 PushupCounterSingleOutput(\\n (bn): BatchNorm1d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(1, 64, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=128, out_features=64, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=64, out_features=1, bias=True)\\n )\\n)\n", + "48 0.013944 0.016129 0.983871 0.367342 0.600000 0.466667 PushupCounterSingleOutput(\\n (bn): BatchNorm1d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(1, 64, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=128, out_features=64, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=64, out_features=1, bias=True)\\n )\\n)\n", + "87 0.010483 0.016129 0.983871 0.368440 0.600000 0.466667 PushupCounterSingleOutput(\\n (bn): BatchNorm1d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(1, 64, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=128, out_features=64, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=64, out_features=1, bias=True)\\n )\\n)\n", + "46 0.020582 0.016129 0.983871 0.368792 0.600000 0.466667 PushupCounterSingleOutput(\\n (bn): BatchNorm1d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n (lstm): LSTM(1, 64, batch_first=True, bidirectional=True)\\n (regressor): Sequential(\\n (0): Linear(in_features=128, out_features=64, bias=True)\\n (1): ReLU()\\n (2): Linear(in_features=64, out_features=1, bias=True)\\n )\\n)\n", + "==============================\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + } + ], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def plot_training_performance(history):\n", + " \"\"\"\n", + " Generates a summary table of the best epochs and plots learning curves.\n", + "\n", + " Args:\n", + " history (dict): A dictionary containing lists of metrics.\n", + " Expected keys: 'train_loss', 'val_loss', 'train_mae', 'val_mae'.\n", + " Optional keys: 'train_acc', 'val_acc'.\n", + " \"\"\"\n", + " # Convert history to a DataFrame for easy manipulation\n", + " df = pd.DataFrame(history)\n", + " df.index.name = 'Epoch'\n", + " df.index += 1 # Shift index to start from Epoch 1\n", + "\n", + " # 1. Display the Performance Table (Top 5 Epochs by Validation Loss)\n", + " print(\"\\n\" + \"=\"*30)\n", + " print(\" TOP 5 PERFORMANCE TABLE\")\n", + " print(\"=\"*30)\n", + " # Sorting by val_loss to find the most stable models\n", + " top_epochs = df.sort_values(by='val_loss').head(5)\n", + " print(top_epochs.to_string())\n", + " print(\"=\"*30 + \"\\n\")\n", + "\n", + " # 2. Create Plots\n", + " fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(20, 6))\n", + "\n", + " # Loss Plot (MSE)\n", + " ax1.plot(df.index, df['train_loss'], label='Train Loss', color='#1f77b4', linewidth=2)\n", + " ax1.plot(df.index, df['val_loss'], label='Val Loss', color='#ff7f0e', linewidth=2, linestyle='--')\n", + " ax1.set_title('Model Loss (MSE)', fontsize=14, fontweight='bold')\n", + " ax1.set_ylim(bottom=0)\n", + " ax1.set_xlabel('Epoch')\n", + " ax1.set_ylabel('Loss')\n", + " ax1.legend()\n", + " ax1.grid(True, linestyle=':', alpha=0.6)\n", + "\n", + " # MAE Plot (Mean Absolute Error)\n", + " ax2.plot(df.index, df['train_mae'], label='Train MAE', color='#2ca02c', linewidth=2)\n", + " ax2.plot(df.index, df['val_mae'], label='Val MAE', color='#d62728', linewidth=2, linestyle='--')\n", + " ax2.set_title('Mean Absolute Error (MAE)', fontsize=14, fontweight='bold')\n", + " ax2.set_ylim(bottom=0)\n", + " ax2.set_xlabel('Epoch')\n", + " ax2.set_ylabel('MAE (Pushup Count Error)')\n", + " ax2.legend()\n", + " ax2.grid(True, linestyle=':', alpha=0.6)\n", + "\n", + " # Accuracy Plot\n", + " ax3.plot(df.index, df['train_acc'], label='Train Acc', color=\"#2842a8\", linewidth=2)\n", + " ax3.plot(df.index, df['val_acc'], label='Val Acc', color=\"#b1197c\", linewidth=2, linestyle='--')\n", + "\n", + " # Admin\n", + " model = outputs['model']\n", + " model_name = type(model).__name__\n", + " ax3.set_title(f'Accuracy (Exact Prediction) for {model_name}', fontsize=14, fontweight='bold')\n", + " ax3.set_ylim(bottom=0)\n", + " ax3.set_xlabel('Epoch')\n", + " ax3.set_ylabel('Accuracy')\n", + " ax3.legend()\n", + " ax3.grid(True, linestyle=':', alpha=0.6)\n", + "\n", + " plt.ylim(bottom=0)\n", + " plt.tight_layout()\n", + " plt.show()\n", + "\n", + "plot_training_performance(outputs)" + ] + }, + { + "cell_type": "markdown", + "id": "8319211b", + "metadata": { + "id": "8319211b" + }, + "source": [ + "### Testing" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "f2746ae5", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f2746ae5", + "outputId": "37bad5be-4141-4c40-867a-057cbb084edb" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[Video Load] Elapsed time: 2.7275 seconds\n", + "[Video Transformation] Elapsed time: 3.8203 seconds\n", + "[Feature Extraction] Elapsed time: 2.4425 seconds\n", + "[Featurn Engineering 1] Elapsed time: 0.0593 seconds\n", + "[Featurn Engineering 2] Elapsed time: 0.0094 seconds\n", + "[Prediction] Elapsed time: 0.0046 seconds\n", + "Predicted pushups: 6\n" + ] + } + ], + "source": [ + "# Inference Code\n", + "import torch\n", + "import cv2\n", + "import numpy as np\n", + "import PIL.Image\n", + "from ultralytics import YOLO\n", + "import time\n", + "\n", + "class Timer:\n", + " def __init__(self, name=\"Timer\"):\n", + " self.name = name\n", + "\n", + " def __enter__(self):\n", + " self.start = time.time()\n", + " return self # optional, if you want to access it\n", + "\n", + " def __exit__(self, exc_type, exc_val, exc_tb):\n", + " self.end = time.time()\n", + " elapsed = self.end - self.start\n", + " print(f\"[{self.name}] Elapsed time: {elapsed:.4f} seconds\")\n", + "\n", + "# Load the trained model\n", + "model = outputs[\"model\"]\n", + "model_name = type(model).__name__\n", + "save_path = os.path.join(WEIGHTS_DIR, f\"best_model_weights_{model_name}.pth\")\n", + "checkpoint = torch.load(save_path)\n", + "model.load_state_dict(checkpoint['model_state_dict'])\n", + "model.eval()\n", + "\n", + "def predict_pushups(video_path):\n", + " # 1. Extract angles from video\n", + " list_of_pil_frames = []\n", + " with Timer(\"Video Load\"):\n", + " cap = cv2.VideoCapture(video_path)\n", + " while True:\n", + " ret, frame = cap.read()\n", + " if not ret:\n", + " break\n", + " rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n", + " list_of_pil_frames.append(PIL.Image.fromarray(rgb_frame))\n", + " cap.release()\n", + "\n", + " if not list_of_pil_frames:\n", + " return 0\n", + "\n", + " # Resize frames\n", + " with Timer(\"Video Transformation\"):\n", + " resizer = VideoResizer(MAX_FRAME_LENGTH)\n", + " frames_for_yolo = resizer(list_of_pil_frames)\n", + "\n", + " # YOLO pose\n", + " with Timer(\"Feature Extraction\"):\n", + " pose_model = YOLO(YOLO_MODEL_FILE, task='pose', verbose=False)\n", + " if hasattr(pose_model, \"trackers\") and pose_model.predictor:\n", + " pose_model.predictor.trackers[0].reset()\n", + " results_generator = pose_model.track(frames_for_yolo, verbose=False, device=DEVICE, persist=True, vid_stride=VID_STRIDE, show=False, tracker=YOLO_TRACKER_FILE)\n", + "\n", + " # Calculate angles\n", + " angles = []\n", + " with Timer(\"Featurn Engineering 1\"):\n", + " for results in results_generator:\n", + " current_frame_angle = 0.0\n", + " person_mask = (results.boxes.cls == 0)\n", + " person_boxes = results.boxes[person_mask]\n", + " if len(person_boxes) > 0:\n", + " max_conf_idx = person_boxes.conf.argmax().item()\n", + " original_indices = person_mask.nonzero(as_tuple=True)[0]\n", + " original_idx = original_indices[max_conf_idx]\n", + " keypoints_obj = results.keypoints[original_idx]\n", + " if keypoints_obj.xy.shape[0] > 0:\n", + " landmarks_np = keypoints_obj.xy[0].cpu().numpy()\n", + " if landmarks_np.shape[0] > max(COCO.R_WRIST.value, COCO.L_WRIST.value):\n", + " calculator = AngleCalculator(landmarks_np)\n", + " try:\n", + " angle = calculator()\n", + " if 0 <= angle <= 180:\n", + " current_frame_angle = angle\n", + " except:\n", + " pass\n", + " angles.append(current_frame_angle)\n", + " del results\n", + "\n", + " if not angles:\n", + " return 0\n", + "\n", + " with Timer(\"Featurn Engineering 2\"):\n", + " angles_np = np.array(angles, dtype=np.float32)\n", + " min_angle, max_angle = np.min(angles_np), np.max(angles_np)\n", + " if max_angle > min_angle:\n", + " angles_np = (angles_np - min_angle) / (max_angle - min_angle)\n", + "\n", + " angles_tensor = torch.tensor(angles_np, dtype=torch.float32)\n", + " signal_cleanser = SignalMedianator()\n", + " angles_tensor = signal_cleanser(angles_tensor)\n", + "\n", + " # Pad/truncate\n", + " current_length = angles_tensor.shape[0]\n", + " if current_length < MAX_FRAMES:\n", + " padding = torch.zeros(MAX_FRAMES - current_length, dtype=torch.float32)\n", + " angles_tensor = torch.cat([angles_tensor, padding], dim=0)\n", + " elif current_length > MAX_FRAMES:\n", + " angles_tensor = angles_tensor[:MAX_FRAMES]\n", + "\n", + " # Prepare for model\n", + " angles_tensor = angles_tensor.unsqueeze(0).to(DEVICE) # (1, MAX_FRAMES)\n", + " lengths = torch.tensor([min(current_length, MAX_FRAMES)], dtype=torch.long).to(DEVICE)\n", + "\n", + " # Predict\n", + " with Timer(\"Prediction\"):\n", + " with torch.no_grad():\n", + " output = model(angles_tensor, lengths)\n", + " predicted_count = torch.round(output.squeeze()).item()\n", + "\n", + " return int(predicted_count), angles_tensor, lengths\n", + "\n", + "# Example usage\n", + "predicted, angles_tensor, lengths = predict_pushups(os.path.join(DOWNLOAD_DIR, \"7_sadkjfkljekj.mp4\"))\n", + "print(f\"Predicted pushups: {predicted}\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ded002ff", + "metadata": { + "id": "ded002ff" + }, + "source": [ + "### Evaluation Code" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "4e6511d3", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4e6511d3", + "outputId": "db466059-8541-4771-c25c-19606bd9b0a4" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Using device: cuda\n", + "\n", + "Running inference on 77 test videos...\n", + "\n", + "\n", + "✓ pred=4 true=4 | 5.9ms | 4_kling_20251209_Text_to_Video_Generate_a_588_2.mp4\n", + "✓ pred=3 true=3 | 5.0ms | 3_kling_20251206_Text_to_Video_Generate_a_315_2.mp4\n", + "✓ pred=6 true=6 | 4.3ms | 6_dfjewaijsldkjfsaef.mp4\n", + "✓ pred=4 true=4 | 5.5ms | 4_kling_20251209_Text_to_Video_Generate_a_561_1.mp4\n", + "✓ pred=1 true=1 | 3.7ms | 1_dksksjfwijf.mp4\n", + "✓ pred=3 true=3 | 5.4ms | 3_kling_20251209_Image_to_Video_Generate_a_635_0.mp4\n", + "✓ pred=3 true=3 | 4.8ms | 3_sdlkfjaleknaksej.mp4\n", + "✓ pred=2 true=2 | 4.5ms | 2_difficult_sdafkljsalkfj.mp4\n", + "✓ pred=4 true=4 | 4.9ms | 4_sadlfkjlknewkjejk.mp4\n", + "✓ pred=3 true=3 | 5.0ms | 3_kling_kdjflaskdjf.mp4\n", + "✓ pred=3 true=3 | 4.9ms | 3_kling_20251206_Text_to_Video_Generate_a_71_3.mp4\n", + "✓ pred=3 true=3 | 5.2ms | 3_kling_dskfseu.mp4\n", + "✗ pred=4 true=3 | 3.4ms | 3_sadlfkjawelnflksdjf.mp4\n", + "✓ pred=3 true=3 | 4.5ms | 3_kling_20251205_Text_to_Video_On_a_playg_5028_0.mp4\n", + "✓ pred=3 true=3 | 8.0ms | 3_kling_20251209_Text_to_Video_Generate_a_491_1.mp4\n", + "✓ pred=4 true=4 | 5.0ms | 4_asdlkfjalsflnekj.mp4\n", + "✓ pred=4 true=4 | 6.0ms | 4_kling_20251209_Text_to_Video_Generate_a_377_1.mp4\n", + "✓ pred=3 true=3 | 4.6ms | 3_ewdfkjwaeoihjlkasdjf.mp4\n", + "✓ pred=4 true=4 | 5.4ms | 4_kling_20251209_Text_to_Video_Generate_a_452_1.mp4\n", + "✓ pred=6 true=6 | 5.4ms | 6_kling_20251209_Text_to_Video_Generate_a_218_1.mp4\n", + "✗ pred=3 true=2 | 4.6ms | 2_dkdjwkndkfw.mp4\n", + "✗ pred=4 true=3 | 4.5ms | 3_sdlkjslndflkseijlkjef.mp4\n", + "✓ pred=2 true=2 | 4.6ms | 2_sdkjdsflkjfwa.mp4\n", + "✓ pred=4 true=4 | 4.6ms | 4_aslkjasmcalkewjlkje.mp4\n", + "✓ pred=4 true=4 | 5.3ms | 4_kling_20251206_Text_to_Video_Generate_a_28_0.mp4\n", + "✗ pred=4 true=3 | 5.0ms | 3_sdlkjfaslkjfalskjdf.mp4\n", + "✗ pred=4 true=3 | 5.4ms | 3_kling_20251209_Text_to_Video_Generate_a_491_2.mp4\n", + "✓ pred=3 true=3 | 5.4ms | 3_kling_20251206_Text_to_Video_Generate_a_712_3.mp4\n", + "✗ pred=3 true=4 | 5.4ms | 4_20251209_Text_to_Video_Generate_a_561_0.mp4\n", + "✓ pred=3 true=3 | 3.3ms | 3_kling_20251206_Text_to_Video_Generate_a_71_2.mp4\n", + "✓ pred=4 true=4 | 5.3ms | 4_kling_20251209_Image_to_Video_Generate_a_635_1.mp4\n", + "✓ pred=4 true=4 | 7.2ms | 4_pushup_1f2da596-7619-4d55-9376-069e15a42a1a_h264.mp4\n", + "✓ pred=4 true=4 | 5.3ms | 4_kling_20251209_Text_to_Video_Generate_a_263_1.mp4\n", + "✓ pred=3 true=3 | 4.6ms | 3_dslkaldskjflakjs.mp4\n", + "✓ pred=3 true=3 | 4.1ms | 3_sdfjwaiejflkasjdf.mp4\n", + "✓ pred=4 true=4 | 5.3ms | 4_kling_20251209_Text_to_Video_Generate_a_452_0.mp4\n", + "✗ pred=3 true=2 | 3.8ms | 2_dfsaeklnvvalkej.mp4\n", + "✓ pred=4 true=4 | 5.0ms | 4_aslkcasckmwlejk.mp4\n", + "✓ pred=2 true=2 | 3.8ms | 2_difficult_2.mp4\n", + "✓ pred=3 true=3 | 7.1ms | 3_sdlkfjalkjejafe.mp4\n", + "✓ pred=2 true=2 | 2.8ms | 2_sdafkjaslkclaksdjkas.mp4\n", + "✗ pred=4 true=3 | 5.5ms | 3_kling_20251209_Text_to_Video_Generate_a_491_0.mp4\n", + "✓ pred=2 true=2 | 3.5ms | 2_kling_20251205_Text_to_Video_On_a_sandy_4976_0.mp4\n", + "✓ pred=2 true=2 | 6.4ms | 2_sdlkjsaelijfksdjf.mp4\n", + "✗ pred=4 true=3 | 4.5ms | 3_sdflkjliejkjdf.mp4\n", + "✓ pred=3 true=3 | 5.6ms | 3_kling_20251209_Image_to_Video_Generate_a_613_1.mp4\n", + "✗ pred=4 true=3 | 3.4ms | 3_kling_20251206_Text_to_Video_Generate_a_71_0.mp4\n", + "✓ pred=3 true=3 | 4.2ms | 3_dsksdfjbvsdkj.mp4\n", + "✓ pred=3 true=3 | 4.4ms | 3_sadklfjasbnlkjlfkj.mp4\n", + "✗ pred=3 true=2 | 4.1ms | 2_sdfkjsaleijflaskdjf.mp4\n", + "✓ pred=3 true=3 | 4.8ms | 3_asldkfjalwieaskdfaskdf.mp4\n", + "✗ pred=4 true=2 | 7.9ms | 2_dkdmkejkeimdh.mp4\n", + "✓ pred=2 true=2 | 5.1ms | 2_sdlfjlewlkjkj.mp4\n", + "✓ pred=2 true=2 | 4.1ms | 2_dsalkfjalwkenlke.mp4\n", + "✓ pred=2 true=2 | 4.5ms | 2_dkjd823kjf.mp4\n", + "✓ pred=3 true=3 | 5.2ms | 3_kling_20251209_Text_to_Video_Generate_a_190_1.mp4\n", + "✓ pred=2 true=2 | 4.3ms | 2_sdjfhafsldkjhjk.mp4\n", + "✗ pred=2 true=3 | 4.4ms | 3_sadlfkjasldkfjasleijlkjfd.mp4\n", + "✓ pred=4 true=4 | 5.3ms | 4_kling_20251209_Text_to_Video_Generate_a_218_0.mp4\n", + "✓ pred=4 true=4 | 5.4ms | 4_kling_20251206_Text_to_Video_Generate_a_315_3.mp4\n", + "✓ pred=3 true=3 | 4.0ms | 3_dsjlaeijlksjdfie.mp4\n", + "✓ pred=3 true=3 | 4.9ms | 3_dkk873lkjlksajdf.mp4\n", + "✓ pred=2 true=2 | 3.0ms | 2_kling_20251206_Text_to_Video_Generate_a_71_1.mp4\n", + "✗ pred=5 true=4 | 3.7ms | 4_dssalsdkfjweijf.mp4\n", + "✓ pred=5 true=5 | 4.6ms | 5_sdfkljweoijlkjdsflkjweaij.mp4\n", + "✓ pred=2 true=2 | 4.3ms | 2_sadfasjldkfjaseifj.mp4\n", + "✓ pred=4 true=4 | 7.1ms | 4_kling_20251209_Text_to_Video_Generate_a_190_0.mp4\n", + "✓ pred=3 true=3 | 5.4ms | 3_kling_20251206_Text_to_Video_Generate_a_315_0.mp4\n", + "✓ pred=3 true=3 | 4.5ms | 3_kling_20251206_Text_to_Video_Generate_a_17_0.mp4\n", + "✓ pred=5 true=5 | 4.4ms | 5_sadfjhaslfkjasdlkfjsa.mp4\n", + "✓ pred=3 true=3 | 5.5ms | 3_kling_20251209_Text_to_Video_Generate_a_403_1.mp4\n", + "✓ pred=3 true=3 | 4.7ms | 3_kling_20251205_Text_to_Video_On_a_playg_5064_0.mp4\n", + "✗ pred=5 true=4 | 4.0ms | 4_sadflkjasldkjfalseij.mp4\n", + "✓ pred=3 true=3 | 4.9ms | 3_kling_20251205_Text_to_Video_In_a_grass_4697_0.mp4\n", + "✓ pred=4 true=4 | 5.5ms | 4_kling_20251207_Text_to_Video_Generate_a_521_1.mp4\n", + "✗ pred=6 true=7 | 6.5ms | 7_sadkjfkljekj.mp4\n", + "✓ pred=4 true=4 | 5.3ms | 4_kling_20251206_Text_to_Video_Generate_a_58_0.mp4\n", + "\n", + "==================================================\n", + "SUMMARY\n", + "==================================================\n", + "Total videos: 77\n", + "Correct: [61]\n", + "Incorrect: [16]\n", + "\n", + "ACCURACY: 79.22%\n", + "\n", + "Total time: 512.60s\n", + "Avg per video: 4.9ms\n", + "Min latency: 2.8ms\n", + "Max latency: 8.0ms\n", + "==================================================\n" + ] + } + ], + "source": [ + "def evaluate(model, test_loader, dataset, device):\n", + " model.eval()\n", + " correct = 0\n", + " total = 0\n", + "\n", + " all_preds = []\n", + " all_labels = []\n", + " all_times = []\n", + "\n", + " print(\"\\n\")\n", + "\n", + " with torch.no_grad():\n", + " for idx, (angles, labels, lengths) in enumerate(test_loader):\n", + " angles, labels = angles.to(device), labels.to(device)\n", + "\n", + " # Time the forward pass\n", + " start_time = time.time()\n", + " outputs = model(angles, lengths)\n", + " if device.type == 'cuda':\n", + " torch.cuda.synchronize() # wait for GPU to finish\n", + " end_time = time.time()\n", + "\n", + " inference_time = (end_time - start_time) * 1000 # ms\n", + " all_times.append(inference_time)\n", + "\n", + " preds = outputs\n", + "\n", + " for i in range(labels.size(0)):\n", + " batch_idx = idx * test_loader.batch_size + i\n", + " video_name = dataset.video_files[batch_idx]\n", + " pred = int(torch.round(preds[i]).item())\n", + " true_label = labels[i].item()\n", + " is_correct = \"✓\" if pred == true_label else \"✗\"\n", + "\n", + " print(f\"{is_correct} pred={pred} true={true_label} | {inference_time:>7.1f}ms | {video_name}\")\n", + " correct += pred == true_label\n", + "\n", + " # correct += preds.eq(labels).sum().item()\n", + " total += labels.size(0)\n", + "\n", + " all_preds.extend(preds.cpu().numpy())\n", + " all_labels.extend(labels.cpu().numpy())\n", + "\n", + " accuracy = correct / total\n", + " return accuracy, all_preds, all_labels, all_times\n", + "\n", + "\n", + "# =============================================================================\n", + "# RUN INFERENCE\n", + "# =============================================================================\n", + "\n", + "def run_inference(model):\n", + " device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", + " print(f\"Using device: {device}\")\n", + "\n", + " # Download test data\n", + " test_dir = DOWNLOAD_DIR\n", + "\n", + " model = model.to(device)\n", + "\n", + " # Create dataloader\n", + " test_dataset = VideoDataset(test_dir)\n", + " test_loader = DataLoader(\n", + " test_dataset,\n", + " batch_size=1,\n", + " shuffle=False,\n", + " num_workers=0,\n", + " collate_fn=collate_fn\n", + " )\n", + "\n", + " print(f\"\\nRunning inference on {len(test_dataset)} test videos...\")\n", + "\n", + " # Warmup (optional, helps get consistent GPU timings)\n", + " if device.type == 'cuda':\n", + " dummy_data = torch.randn(1, MAX_FRAMES, device=device) # (Batch, SeqLen)\n", + " dummy_lengths = torch.tensor([MAX_FRAMES], dtype=torch.long, device=device) # (Batch,)\n", + " with torch.no_grad():\n", + " _ = model(dummy_data, dummy_lengths)\n", + " torch.cuda.synchronize()\n", + "\n", + " total_start = time.time()\n", + " accuracy, preds, labels, times = evaluate(model, test_loader, test_dataset, device)\n", + " total_end = time.time()\n", + "\n", + " # Summary\n", + " preds = np.round(preds).astype(int)\n", + " num_correct = sum(p == l for p, l in zip(preds.astype(int), labels))\n", + " num_wrong = len(preds) - num_correct\n", + "\n", + " print(\"\\n\" + \"=\"*50)\n", + " print(\"SUMMARY\")\n", + " print(\"=\"*50)\n", + " print(f\"Total videos: {len(preds)}\")\n", + " print(f\"Correct: {num_correct}\")\n", + " print(f\"Incorrect: {num_wrong}\")\n", + " print(f\"\")\n", + " print(f\"ACCURACY: {accuracy*100:.2f}%\")\n", + " print(f\"\")\n", + " print(f\"Total time: {total_end - total_start:.2f}s\")\n", + " print(f\"Avg per video: {sum(times) / len(times):.1f}ms\")\n", + " print(f\"Min latency: {min(times):.1f}ms\")\n", + " print(f\"Max latency: {max(times):.1f}ms\")\n", + " print(\"=\"*50)\n", + " return accuracy, preds, labels\n", + "\n", + "\n", + "\n", + "# model_weights = os.path.join(WEIGHTS_DIR, f\"final_model_weights_PushupCounterSingleOutput.pth\")\n", + "# model = PushupCounterSingleOutput()\n", + "# checkpoint = torch.load(model_weights, map_location='cpu', weights_only=False)\n", + "# model.load_state_dict(checkpoint['model_state_dict'])\n", + "_, _, _ = run_inference(model)" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[KDownloading https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov8n-pose.pt to 'yolov8n-pose.pt': 100% ━━━━━━━━━━━━ 6.5MB 10.2MB/s 0.6s.6s<0.0s\n" - ] + "cell_type": "code", + "source": [ + "import gc\n", + "import torch\n", + "\n", + "gc.collect()\n", + "torch.cuda.empty_cache()\n", + "del checkpoint" + ], + "metadata": { + "id": "RIK6Ll4kgbJ7" + }, + "id": "RIK6Ll4kgbJ7", + "execution_count": 22, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "e488cd0a", + "metadata": { + "id": "e488cd0a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 127 + }, + "outputId": "8e44cb91-13a2-496e-e156-6950535391f7" + }, + "outputs": [ + { + "output_type": "error", + "ename": "SyntaxError", + "evalue": "invalid syntax (ipython-input-1184596467.py, line 1)", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"/tmp/ipython-input-1184596467.py\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m torch.cuda.empty_cache()print(f\"Training Stop Time (UNIX): {int(time.time())}\")\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "torch.cuda.empty_cache()print(f\"Training Stop Time (UNIX): {int(time.time())}\")\n", + "raise RuntimeError(\"Stop Here\")" + ] + }, + { + "cell_type": "code", + "source": [ + "# repo_id = f\"{hf_username}/mv-final-assignment\"\n", + "# yolo_model_file = hf_hub_download(repo_id=repo_id, filename=f\"{YOLO_MODEL_FILE}\", local_dir=os.getcwd())\n", + "# yolo_tracker_file = hf_hub_download(repo_id=repo_id, filename=f\"{YOLO_TRACKER_FILE}\", local_dir=os.getcwd())\n", + "#print(yolo_model_file)\n", + "#print(yolo_tracker_file)\n", + "import os\n", + "def ls_r():\n", + " for root, dirs, files in os.walk(os.getcwd()):\n", + " if 'cache-data' in root:\n", + " for file in files:\n", + " # Create the full path by joining the directory path and file name\n", + " full_path = os.path.join(root, file)\n", + " print(full_path)\n", + " os.remove(full_path)\n", + "ls_r()" + ], + "metadata": { + "id": "JFNrlEusXUZ1" + }, + "id": "JFNrlEusXUZ1", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "2937be7d", + "metadata": { + "id": "2937be7d" + }, + "source": [ + "## Hugging Face" + ] + }, + { + "cell_type": "markdown", + "id": "9a1cf00c", + "metadata": { + "id": "9a1cf00c" + }, + "source": [ + "### Command Lines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a527bea", + "metadata": { + "id": "6a527bea" + }, + "outputs": [], + "source": [ + "!pip install huggingface_hub" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6cfc8a81", + "metadata": { + "id": "6cfc8a81" + }, + "outputs": [], + "source": [ + "!hf auth login" + ] + }, + { + "cell_type": "markdown", + "id": "1c7806b8", + "metadata": { + "id": "1c7806b8" + }, + "source": [ + "### Code" + ] + }, + { + "cell_type": "markdown", + "id": "d4a13690", + "metadata": { + "id": "d4a13690" + }, + "source": [ + "#### Admin" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "466d51ad", + "metadata": { + "id": "466d51ad" + }, + "outputs": [], + "source": [ + "import tqdm\n", + "import os\n", + "from huggingface_hub import HfApi, hf_hub_download, login as HfLogin, logout as HfLogout\n", + "\n", + "class HugMyFace:\n", + " def __init__(self, username, repo_id):\n", + " self.username = username\n", + " self.repo_id = repo_id\n", + " self.api = HfApi()\n", + "\n", + " def login(self):\n", + " try:\n", + " user_info = self.api.whoami()\n", + " print(f\"Logged in as: {user_info['name']}\")\n", + " except Exception:\n", + " print(\"Logging in.\")\n", + " HfLogin()\n", + "\n", + " def logout(self):\n", + " try:\n", + " user_info = self.api.whoami()\n", + " print(f\"Logging out: {user_info['name']}\")\n", + " HfLogout()\n", + " except Exception:\n", + " print(\"Not logged in.\")\n", + "\n", + " def whoami(self):\n", + " user_info = self.api.whoami()\n", + " print(f\"{user_info}\")\n", + "\n", + " def create_repo(self):\n", + " # Create the repo first (if it already exists, this will just skip)\n", + " self.api.create_repo(\n", + " repo_id=self.repo_id,\n", + " repo_type=\"model\",\n", + " exist_ok=True, # Don't error if it already exists\n", + " private=False, # Make it public so TAs can access\n", + " )\n", + "\n", + " def list_repo(self):\n", + " repo_info = self.api.repo_info(repo_id=self.repo_id)\n", + " print(f\"[{[f.rfilename for f in repo_info.siblings]}]\")\n", + "\n", + " def upload_to_hub(self, local_path, commit_msg=None, commit_desc=None):\n", + " if os.path.isfile(local_path):\n", + " self.api.upload_file(\n", + " path_or_fileobj=local_path,\n", + " path_in_repo=local_path,\n", + " repo_id=self.repo_id,\n", + " repo_type=\"model\", # can be \"model\", \"dataset\", or \"space\"\n", + " commit_message=commit_msg,\n", + " commit_description=commit_desc\n", + " )\n", + " elif os.path.isdir(local_path):\n", + " # Upload an entire folder (e.g., weights + config + scripts)\n", + " self.api.upload_folder(\n", + " folder_path=local_path,\n", + " path_in_repo=local_path,\n", + " repo_id=self.repo_id,\n", + " repo_type=\"model\",\n", + " commit_message=commit_msg,\n", + " commit_description=commit_desc\n", + " )\n", + " else:\n", + " raise RuntimeError(f\"Ivalid Object {local_path}\")\n", + "\n", + " def delete_file(self, remote_path, is_folder, commit_msg):\n", + " if is_folder:\n", + " self.api.delete_folder(\n", + " path_in_repo=remote_path,\n", + " repo_id=self.repo_id,\n", + " commit_message=commit_msg\n", + " )\n", + " else:\n", + " self.api.delete_file(\n", + " path_in_repo=remote_path,\n", + " repo_id=self.repo_id,\n", + " repo_type=\"model\", # can also be \"dataset\" or \"space\"\n", + " commit_message=commit_msg\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d38b8e1b", + "metadata": { + "id": "d38b8e1b" + }, + "outputs": [], + "source": [ + "HF_USERNAME = 'maatt4face'\n", + "HF_REPO_ID = f\"{HF_USERNAME}/mv-final-assignment\"\n", + "HF = HugMyFace(HF_USERNAME, HF_REPO_ID)\n", + "HF.login()" + ] + }, + { + "cell_type": "markdown", + "id": "99d882c8", + "metadata": { + "id": "99d882c8" + }, + "source": [ + "#### Repo Interactions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc3da1cb", + "metadata": { + "id": "fc3da1cb" + }, + "outputs": [], + "source": [ + "# HF.create_repo()\n", + "\n", + "# Training File and Model Weights\n", + "# HF.upload_to_hub(\"Final_Training.ipynb\", commit_msg=\"Clean up\")\n", + "# HF.upload_to_hub(WEIGHTS_DIR, commit_msg=\"Model weights\")\n", + "# upload_to_hub(\"best_model_weights_PushupCounterSingleOutput_v01.pth\", commit_msg=\"PushupCounterSingleOutput model weights\")\n", + "# upload_to_hub(\"best_model_weights_PushupCounterSingleOutput.pth\", commit_msg=\"PushupCounterSingleOutput model weights\")\n", + "# upload_to_hub(\"best_model_weights_PushupCounterMaxPool.pth\", commit_msg=\"PushupCounterMaxPool model weights\")\n", + "\n", + "# YOLO Weights\n", + "# HF.upload_to_hub(YOLO_DIR, commit_msg=\"landpark detection weights\")\n", + "# delete_file(\"botsort.yaml\", is_folder=False, commit_msg=\"Real Estate Organization\")\n", + "# delete_file(\"bytetrack.yaml\", is_folder=False, commit_msg=\"Real Estate Organization\")\n", + "# delete_file(\"yolo11n-pose.pt\", is_folder=False, commit_msg=\"Real Estate Organization\")" + ] + }, + { + "cell_type": "markdown", + "id": "606affc6", + "metadata": { + "id": "606affc6" + }, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "892ba310", + "metadata": { + "id": "892ba310" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3aa64d74", + "metadata": { + "id": "3aa64d74" + }, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eed737e3", + "metadata": { + "id": "eed737e3" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "738ea760", + "metadata": { + "id": "738ea760" + }, + "outputs": [], + "source": [ + "model = YOLO('yolov8n-pose.pt')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aaedcb40", + "metadata": { + "id": "aaedcb40" + }, + "outputs": [], + "source": [] } - ], - "source": [ - "model = YOLO('yolov8n-pose.pt')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "aaedcb40", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openpifpaf_env", - "language": "python", - "name": "python3" + ], + "metadata": { + "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.12" + }, + "colab": { + "provenance": [], + "collapsed_sections": [ + "397089dc", + "AL_ItrXgO5o2", + "86fa605d", + "aabf9bdb", + "0739d1f9", + "273bea44", + "37b44192", + "e7f08201", + "2937be7d", + "9a1cf00c", + "1c7806b8", + "d4a13690" + ], + "gpuType": "T4" + }, + "accelerator": "GPU" }, - "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.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file