{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from utils.motif import init_repro\n", "\n", "init_repro(42, deterministic=True)\n", "\n", "import sys\n", "import os\n", "sys.path.append(os.path.abspath(\"./utils\"))\n", "\n", "from utils.explanations import (\n", " render_explained_video_small_tl,\n", " explain_instance,\n", " plot_attention_heatmaps,\n", " print_explanation_with_labels,\n", ")\n", "import matplotlib.pyplot as plt\n", "\n", "import pickle\n", "import io\n", "\n", "import clip\n", "import torch\n", "\n", "# Helper function to load pickle files on CPU-only devices\n", "def load_pickle_cpu(file_path):\n", " \"\"\"Load a pickle file, mapping all CUDA tensors to CPU.\"\"\"\n", " # Temporarily patch torch's default_restore_location to map CUDA to CPU\n", " original_restore = torch.serialization.default_restore_location\n", " \n", " def cpu_restore_location(storage, location):\n", " # Map any CUDA device to CPU (handle both string and torch.device)\n", " if isinstance(location, str) and location.startswith('cuda'):\n", " location = 'cpu'\n", " elif isinstance(location, torch.device) and location.type == 'cuda':\n", " location = torch.device('cpu')\n", " return original_restore(storage, location)\n", " \n", " # Apply the patch\n", " torch.serialization.default_restore_location = cpu_restore_location\n", " \n", " try:\n", " with open(file_path, \"rb\") as f:\n", " obj = pickle.load(f)\n", " return obj\n", " finally:\n", " # Restore original function\n", " torch.serialization.default_restore_location = original_restore" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading of MoTIF Checkpoint" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded existing MoTIF model from ./Models/checkpoint_pe-l14_Breakfast.pkl\n" ] } ], "source": [ "dataset = \"breakfast\"\n", "\n", "clip_model = \"pe-l14\" # res50, b16, b32, l14, siglip, clip4clip\n", "\n", "if dataset == \"breakfast\":\n", " dataset_name = \"Breakfast\"\n", "elif dataset == \"ucf101\":\n", " dataset_name = \"UCF101\"\n", "elif dataset == \"hmdb51\":\n", " dataset_name = \"HMDB\"\n", "elif dataset == \"something2\":\n", " dataset_name = \"Something2\"\n", "else:\n", " print(f\"{dataset} not found\")\n", "\n", "model_name = f\"./Models/checkpoint_{clip_model}_{dataset_name}.pkl\"\n", "\n", "if os.path.exists(model_name):\n", " try:\n", " # Use CPU-compatible loading for CPU-only devices\n", " cbm_model = load_pickle_cpu(model_name)\n", " # Ensure model and all tensors are on CPU\n", " if hasattr(cbm_model, 'model') and cbm_model.model is not None:\n", " cbm_model.model = cbm_model.model.cpu()\n", " if hasattr(cbm_model, 'device'):\n", " cbm_model.device = torch.device('cpu')\n", " print(\"Loaded existing MoTIF model from\", model_name)\n", " except FileNotFoundError:\n", " print(\"MoTIF file not found, creating a new one.\")\n", " except Exception as e:\n", " print(f\"Error loading model: {e}\")\n", " print(\"Trying alternative loading method...\")\n", " # Fallback: try with torch.load if it's a torch checkpoint\n", " try:\n", " import torch\n", " cbm_model = torch.load(model_name, map_location='cpu', weights_only=False)\n", " if hasattr(cbm_model, 'model') and cbm_model.model is not None:\n", " cbm_model.model = cbm_model.model.cpu()\n", " if hasattr(cbm_model, 'device'):\n", " cbm_model.device = torch.device('cpu')\n", " print(\"Loaded existing MoTIF model from\", model_name, \"(using torch.load)\")\n", " except Exception as e2:\n", " print(f\"Failed to load model: {e2}\")\n", " raise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Print Global and Local top-k Explanations" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted: 4 (milk) | True: 4 (milk)\n", "Target class: 4\n", "\n", "Top concepts (global):\n", " stir +1.382 ████████████████████\n", " scrub +1.086 ████████████████····\n", " measuringcup +0.906 █████████████·······\n", " juice +0.709 ██████████··········\n", "\n", "Important time steps:\n", " t=[00:42.67 - 00:44.73] time_importance=0.254 TI[████████████████████] Score[████████████████████]\n", " - stir +1.505 ████████████████████\n", " - scrub +1.222 ████████████████····\n", " - measuringcup +0.997 █████████████·······\n", " - sugar +0.734 ██████████··········\n", " t=[00:44.80 - 00:46.87] time_importance=0.245 TI[███████████████████·] Score[████████████████████]\n", " - stir +1.689 ████████████████████\n", " - scrub +1.123 █████████████·······\n", " - measuringcup +1.041 ████████████········\n", " - sugar +0.764 █████████···········\n", " t=[00:46.93 - 00:49.00] time_importance=0.230 TI[██████████████████··] Score[████████████████████]\n", " - stir +1.857 ████████████████████\n", " - scrub +1.169 █████████████·······\n", " - measuringcup +0.976 ███████████·········\n", " - juice +0.807 █████████···········\n", " t=[00:40.53 - 00:42.60] time_importance=0.129 TI[██████████··········] Score[██████████████████··]\n", " - scrub +1.096 ████████████████████\n", " - measuringcup +1.036 ███████████████████·\n", " - coffee +0.768 ██████████████······\n", " - sugar +0.751 ██████████████······\n", " t=[00:49.07 - 00:51.13] time_importance=0.025 TI[██··················] Score[██████████████······]\n", " - place +1.033 ████████████████████\n", " - scrub +0.911 ██████████████████··\n", " - coffee +0.804 ████████████████····\n", " - adjust +0.676 █████████████·······\n" ] } ], "source": [ "# Build once from your training cell\n", "label_decoder = cbm_model.encoder # the fitted LabelEncoder\n", "\n", "# Pick an example\n", "i = 500 # define a number in the test set\n", "video = cbm_model.X_test[i] # you can also switch to the train set\n", "true_idx = cbm_model.y_test[i]\n", "vid_path = cbm_model.paths_test[i]\n", "\n", "# Explain\n", "res = explain_instance(cbm_model.model, video)\n", "print_explanation_with_labels(\n", " res,\n", " cbm_model.video_spans[vid_path],\n", " label_decoder=label_decoder,\n", " true_label_idx=true_idx,\n", " concepts_list=cbm_model.concepts.text_concepts,\n", " top_k_times=5, # how many local concept windows\n", " top_k_concepts=4, # how many top-k concepts per window\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Temporal Dependency Plot" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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Z6ILV29mGIaJPG7UY0LOBhMbBgh5MkUpORer5yIUrcNwAxWiaN8PsaLBK+H7gV9QixPuL774gooX1qpVi5IWUZ/prLPOEl27dhVff/21SBRgePbt20fSPNEyQDfccAPJzkUTlDZZs2YNJbpCKg7noqh/8M2bNxeTJk0S0SQzM1Ns3769wINP/i0qoF07fvx4EU34foid+4EJPy632013s/9NLY3AxRdfLCZPnixq1qwpiivIcdyyZYtYtWoVuYOR7oHqEQj+0YnIhhtE2SLo6KuvvhLR4tZbbyWh3UWLFpHALTT7IEAOIXEpHh5pOnToQB6JL7/8UkQLpAZt2LCB0n9w38MQPf3006JKlSpF1oZYOA98P8TO/cBEBld6eroBIwfx6bJly9LMQ4cOkVDpwoUL6c0HF/rXX3/NV+1GjxE/gHfffVfEO23btiVZnkceeUTMnTtX/PTTT1QdAvUDhwwZQvJvkTaCMH4oczJ9+nT6jCoYaJN8yywKF3X79u3pmqI8CnrBr732moB3AF4BFANGtQyzinukzgPagO8F5qodRYVsQ79+/agKyZtvvinmzZsnTjvtNKovCeHeSIsqx8J54Pshdu4HJoKYxUr9wbIXXnjBKFGihHHJJZfQPAiZInL0zDPPNOKdDz/80LjiiisCjnnYsGF0jJjGjx+fv8zn84W9De3btzc6duyY/zkackk//fST0ahRowLzcnNzjXfeeceoX78+SeA9+OCDxj///BOxNkCgvFOnTrbOg9frjUgbpk+fbjRt2jTgPDz77LNGpUqVjFNOOcV49dVXjf379xuRom3btsb1118f1fPA90Ps3A9MZLGlBfrrr78aKSkpxtdff01VGmAYevToYcQ7I0eOpB96Tk6OkZeXV2DZxIkT840gfviR4L777jPKlSuX//nYsWP5/0b1C7x83HXXXcbUqVONv/76y4gUH3zwgYGqIOYfuXywfP/998bll19uJCcnG4888oixa9euiFwHPFjlQ878sMNLyuOPP04vCX379jU2bNhgRIrRo0cb//vf//I/474AuDdwP6AqCRTv33jjjXxF+3Dy0EMPFTA8mZmZ+f/+/PPPjeHDhxu9e/c2Ro0aZfz7779GpOD7ITbuByby2BbDvv/++41bbrnFuO666+jmR1mheEX25FDOo3r16saePXvyb2zz2yQeBDCAGCeF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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "[
]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def get_id(list, text):\n", " for i, item in enumerate(list):\n", " if item == text:\n", " return i\n", " print(\"Concept not included!\")\n", " return 0\n", "\n", "\n", "concept_idx = get_id(\n", " cbm_model.concepts.text_concepts, \"stir\"\n", ") # change concept name to find index in concept set\n", "\n", "plot_attention_heatmaps(\n", " res,\n", " concept_idx=concept_idx,\n", " concept_names=cbm_model.concepts.text_concepts,\n", " layer_agg=\"mean\",\n", " show_seconds=True,\n", " savepath=None,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## (Optional) Save Video\n", "\n", "**Important**: This only works if you have correctly defined all paths and saved the videos as mp4 in the Dataset folder. Please follow our instructions." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Video path does not exist: ./Datasets/Breakfast/Video_data/P51/webcam02/P51_milk.mp4\n" ] } ], "source": [ "video = cbm_model.X_test[i] \n", "true_idx = cbm_model.y_test[i]\n", "vid_path = cbm_model.paths_test[i].replace(\"../\", \"./\")\n", "\n", "if os.path.exists(vid_path):\n", " # Explain (same as your code)\n", " res = explain_instance(cbm_model.model, video)\n", " out_mp4 = render_explained_video_small_tl(\n", " vid_path=vid_path,\n", " out_path=f\"./Videos/{dataset}_{i}.mp4\",\n", " res=res,\n", " fps_frame_seconds=cbm_model.video_spans[vid_path],\n", " label_decoder=label_decoder,\n", " true_label_idx=true_idx,\n", " concepts_list=cbm_model.concepts.text_concepts,\n", " up_scale=2.0, # 2x upscaling\n", " top_k_times=0, \n", " top_k_concepts=5,\n", " )\n", " print(\"Wrote:\", out_mp4)\n", "else:\n", " print(\"Video path does not exist:\", vid_path)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "motif", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" } }, "nbformat": 4, "nbformat_minor": 2 }