{ "cells": [ { "cell_type": "markdown", "id": "60a7e08e-93c6-4370-9778-3bb102dce78b", "metadata": {}, "source": [ "Copyright (c) Meta Platforms, Inc. and affiliates." ] }, { "cell_type": "markdown", "id": "3081cd8f-f6f9-4a1a-8c36-8a857b0c3b03", "metadata": {}, "source": [ "\n", " \"Open\n", "" ] }, { "cell_type": "markdown", "id": "f9f3240f-0354-4802-b8b5-9070930fc957", "metadata": {}, "source": [ "# CoTracker: It is Better to Track Together\n", "This is a demo for CoTracker, a model that can track any point in a video." ] }, { "cell_type": "markdown", "id": "36ff1fd0-572e-47fb-8221-1e73ac17cfd1", "metadata": {}, "source": [ "\"Logo\"" ] }, { "cell_type": "markdown", "id": "88c6db31", "metadata": {}, "source": [ "Don't forget to turn on GPU support if you're running this demo in Colab. \n", "\n", "**Runtime** -> **Change runtime type** -> **Hardware accelerator** -> **GPU**\n", "\n", "Let's install dependencies for Colab:" ] }, { "cell_type": "code", "execution_count": null, "id": "278876a7", "metadata": {}, "outputs": [], "source": [ "!git clone https://github.com/facebookresearch/co-tracker\n", "%cd co-tracker\n", "!pip install -e .\n", "!pip install opencv-python einops timm matplotlib moviepy flow_vis\n", "!mkdir checkpoints\n", "%cd checkpoints\n", "!wget https://huggingface.co/facebook/cotracker/resolve/main/cotracker2.pth" ] }, { "cell_type": "code", "execution_count": 2, "id": "1745a859-71d4-4ec3-8ef3-027cabe786d4", "metadata": {}, "outputs": [], "source": [ "%cd ..\n", "import os\n", "import torch\n", "\n", "from base64 import b64encode\n", "from cotracker.utils.visualizer import Visualizer, read_video_from_path\n", "from IPython.display import HTML" ] }, { "cell_type": "markdown", "id": "7894bd2d-2099-46fa-8286-f0c56298ecd1", "metadata": {}, "source": [ "Read a video from CO3D:" ] }, { "cell_type": "code", "execution_count": 3, "id": "f1f9ca4d-951e-49d2-8844-91f7bcadfecd", "metadata": {}, "outputs": [], "source": [ "video = read_video_from_path('./assets/apple.mp4')\n", "video = torch.from_numpy(video).permute(0, 3, 1, 2)[None].float()" ] }, { "cell_type": "code", "execution_count": 4, "id": "fb4c2e9d-0e85-4c10-81a2-827d0759bf87", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def show_video(video_path):\n", " video_file = open(video_path, \"r+b\").read()\n", " video_url = f\"data:video/mp4;base64,{b64encode(video_file).decode()}\"\n", " return HTML(f\"\"\"\"\"\")\n", " \n", "show_video(\"./assets/apple.mp4\")" ] }, { "cell_type": "markdown", "id": "6f89ae18-54d0-4384-8a79-ca9247f5f31a", "metadata": {}, "source": [ "Import CoTrackerPredictor and create an instance of it. We'll use this object to estimate tracks:" ] }, { "cell_type": "code", "execution_count": 5, "id": "d59ac40b-bde8-46d4-bd57-4ead939f22ca", "metadata": {}, "outputs": [], "source": [ "from cotracker.predictor import CoTrackerPredictor\n", "\n", "model = CoTrackerPredictor(\n", " checkpoint=os.path.join(\n", " './checkpoints/cotracker2.pth'\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "id": "3f2a4485", "metadata": {}, "outputs": [], "source": [ "if torch.cuda.is_available():\n", " model = model.cuda()\n", " video = video.cuda()" ] }, { "cell_type": "markdown", "id": "e8398155-6dae-4ff0-95f3-dbb52ac70d20", "metadata": {}, "source": [ "Track points sampled on a regular grid of size 30\\*30 on the first frame:" ] }, { "cell_type": "code", "execution_count": 7, "id": "17fcaae9-7b3c-474c-977a-cce08a09d580", "metadata": {}, "outputs": [], "source": [ "pred_tracks, pred_visibility = model(video, grid_size=30)" ] }, { "cell_type": "markdown", "id": "50a58521-a9ba-4f8b-be02-cfdaf79613a2", "metadata": {}, "source": [ "Visualize and save the result: " ] }, { "cell_type": "code", "execution_count": 8, "id": "7e793ce0-7b77-46ca-a629-155a6a146000", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (1496, 920) to (1504, 928) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n", "[swscaler @ 0x5e9d040] Warning: data is not aligned! This can lead to a speed loss\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Video saved to ./videos/teaser.mp4\n" ] } ], "source": [ "vis = Visualizer(save_dir='./videos', pad_value=100)\n", "vis.visualize(video=video, tracks=pred_tracks, visibility=pred_visibility, filename='teaser');" ] }, { "cell_type": "code", "execution_count": 9, "id": "2d0733ba-8fe1-4cd4-b963-2085202fba13", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_video(\"./videos/teaser.mp4\")" ] }, { "cell_type": "markdown", "id": "73d88a5f-057c-4b9f-828d-ee0b97d1e72f", "metadata": {}, "source": [ "## Tracking manually selected points" ] }, { "cell_type": "markdown", "id": "a75bca85-b872-4f4e-be19-ff16f0984037", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "We will start by tracking points queried manually.\n", "We define a queried point as: [time, x coord, y coord] \n", "\n", "So, the code below defines points with different x and y coordinates sampled on frames 0, 10, 20, and 30:" ] }, { "cell_type": "code", "execution_count": 10, "id": "c6422e7c-8c6f-4269-92c3-245344afe35b", "metadata": {}, "outputs": [], "source": [ "queries = torch.tensor([\n", " [0., 400., 350.], # point tracked from the first frame\n", " [10., 600., 500.], # frame number 10\n", " [20., 750., 600.], # ...\n", " [30., 900., 200.]\n", "])\n", "if torch.cuda.is_available():\n", " queries = queries.cuda()" ] }, { "cell_type": "markdown", "id": "13697a2a-7304-4d18-93be-bfbebf3dc12a", "metadata": {}, "source": [ "That's what our queried points look like:" ] }, { "cell_type": "code", "execution_count": 11, "id": "d7141079-d7e0-40b3-b031-a28879c4bd6d", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAn4AAAHVCAYAAABv4/bQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABH7klEQVR4nO3de3SU5b3+/2uSkCEYJiHBnCDBqAhFUBEkRgXr13xBSj0UPGxKleIBq9FCUb6IW6HSLbC11lMV7V5usFsrikWtbGxXBEQtkZOgHDSCG0zEHBTMBJScP78/+OXZjAlKyJA5PO/XWrOa3M89M/fdJ17rYo4eMzMBAAAg6sWEegEAAADoHBQ/AAAAl6D4AQAAuATFDwAAwCUofgAAAC5B8QMAAHAJih8AAIBLUPwAAABcguIHAADgEhQ/AAAAl6D4oUMWLVokj8fT5uWuu+4K9fKCpq6uTjNmzFBWVpYSEhKUl5enoqKiUC8LQJC4IcsOHDig2bNn65JLLlFKSoo8Ho8WLVp0xPkfffSRLrnkEiUmJiolJUXXXnutvvzyy85bMI6LuFAvANFhzpw5ys3NDRgbOHBgiFYTfL/85S/18ssva+rUqerbt68WLVqkn/zkJ1q1apUuuOCCUC8PQJBEc5Z99dVXmjNnjnJycnTmmWfqrbfeOuLczz//XCNGjFBSUpLmzp2rAwcO6Pe//722bNmidevWKT4+vvMWjqCi+CEoRo8eraFDhx7V3NraWsXHxysmJjIecF63bp0WL16sBx98UHfeeack6brrrtPAgQP1//7f/9OaNWtCvEIAwRLNWZaZmany8nJlZGRow4YNOuecc444d+7cufrmm2+0ceNG5eTkSJKGDRum//t//68WLVqkyZMnd9ayEWSR8deKiPXWW2/J4/Fo8eLFuueee9SrVy9169ZNNTU12rdvn+68804NGjRIiYmJ8vl8Gj16tD744IM2b+Oll17Sfffdp169eql79+668sor5ff7VVdXp6lTpyotLU2JiYmaNGmS6urqWq3lueee05AhQ5SQkKCUlBT9y7/8i8rKyn5wDy+//LJiY2MDgq5r16664YYbVFxcfFS3ASCyRUOWeb1eZWRkHNV+//rXv+qnP/2pU/okqaCgQKeddppeeumlo7oNhCce8UNQ+P1+ffXVVwFjPXv2dH7+3e9+p/j4eN15552qq6tTfHy8tm/frldffVVXXXWVcnNzVVlZqaeffloXXnihtm/frqysrIDbmzdvnhISEnTXXXdp586devzxx9WlSxfFxMTo66+/1m9/+1u99957WrRokXJzczVr1iznuvfff7/uvfdeXX311brxxhv15Zdf6vHHH9eIESO0adMmJScnH3FvmzZt0mmnnSafzxcwPmzYMEnS5s2blZ2dfaz/1wEII9GcZUdrz549qqqqavORz2HDhmn58uUdvg+EkAEdsHDhQpPU5sXMbNWqVSbJTj75ZPv2228DrltbW2tNTU0BY7t27TKv12tz5sxxxlpuY+DAgVZfX++Mjx8/3jwej40ePTrgNvLz861Pnz7O77t377bY2Fi7//77A+Zt2bLF4uLiWo1/1+mnn27/5//8n1bj27ZtM0n21FNPfe/1AYQ/N2TZ4davX2+SbOHChUc89uc//7nVsenTp5skq62tPer7QnjhqV4ExRNPPKGioqKAy+EmTpyohISEgDGv1+u8NqapqUl79+5VYmKi+vXrp/fff7/VfVx33XXq0qWL83teXp7MTNdff33AvLy8PJWVlamxsVGStHTpUjU3N+vqq6/WV1995VwyMjLUt29frVq16nv3dvDgQXm93lbjXbt2dY4DiA7RnGVHqyXTyL3oxFO9CIphw4Z97wuiv/suOUlqbm7Wo48+qieffFK7du1SU1OTcyw1NbXV/MNfayJJSUlJktTqadakpCQ1NzfL7/crNTVVO3bskJmpb9++ba7t8ABuS0JCQpuvs6mtrXWOA4gO0ZxlR6sl08i96ETxQ6doKyTmzp2re++9V9dff71+97vfKSUlRTExMZo6daqam5tbzY+NjW3zto80bmaSDoWyx+PRG2+80ebcxMTE7117Zmam9uzZ02q8vLxcklq9fgdA9IrkLDtamZmZkv434w5XXl6ulJSUNh8NRGSg+CFkXn75ZV100UV65plnAsarq6sDXkzdUaeccorMTLm5uTrttNPaff2zzjpLq1atUk1NTcAbPNauXescB+BekZJlR6tXr1468cQTtWHDhlbH1q1bR+ZFOF7jh5CJjY11/iXbYsmSJW0+utYRY8eOVWxsrO67775W92dm2rt37/de/8orr1RTU5P+9Kc/OWN1dXVauHCh8vLyeEcv4HKRkmXtMW7cOC1btizgY2JWrFihTz75RFdddVXQ7gedj0f8EDI//elPNWfOHE2aNEnnnXeetmzZoueff14nn3xyUO/nlFNO0b/9279p5syZ2r17t6644gp1795du3bt0iuvvKLJkyc7H8zclry8PF111VWaOXOmqqqqdOqpp+rZZ5/V7t27W/0LH4D7REqWSdIf//hHVVdX64svvpAkvf766/r8888lSbfffrvzesO7775bS5Ys0UUXXaQpU6bowIEDevDBBzVo0CBNmjQpqPtC56L4IWTuvvtuffPNN/rLX/6iF198UWeffbb++7//+7h8L+Zdd92l0047TQ8//LDuu+8+SYdeSD1y5EhddtllP3j9P//5z7r33nv1X//1X/r66691xhlnaNmyZRoxYkTQ1wogskRSlv3+97/XZ5995vy+dOlSLV26VJL0i1/8IuCNJqtXr9a0adN01113KT4+XmPGjNFDDz3E6/sinMe++3gxAAAAohKv8QMAAHAJih8AAIBLUPwAAABcImTF74knntBJJ52krl27Ki8vT+vWrQvVUgAg6Mg4AOEoJMXvxRdf1LRp0zR79my9//77OvPMMzVq1ChVVVWFYjkAEFRkHIBwFZJ39ebl5emcc87RH//4R0mHvoYmOztbt99+e5tvf6+rqwv4zsDm5mbt27dPqamp8ng8nbZuAOHLzLR//35lZWUpJia0r2Ih4wAEU1DzzTpZXV2dxcbG2iuvvBIwft1119lll13W5nVmz55tkrhw4cLlBy9lZWWdkGRHRsZx4cLleF2CkW+d/gHOX331lZqampSenh4wnp6ero8//rjN68ycOVPTpk1zfvf7/crJyVFZWVnAd6cCcK+amhplZ2ere/fuIV0HGQcg2IKZbxHxzR1er7fNTwr3+XyEIoAAkfjUKBkH4GgEI986/YUwPXv2VGxsrCorKwPGKysrlZGR0dnLAYCgIuMAhLNOL37x8fEaMmSIVqxY4Yw1NzdrxYoVys/P7+zlAEBQkXEAwllInuqdNm2aJk6cqKFDh2rYsGF65JFH9M0332jSpEmhWA4ABBUZByBchaT4XXPNNfryyy81a9YsVVRU6KyzztLf//73Vi+GBoBIRMYBCFch+Ry/jqqpqVFSUpL8fj8vfAYgKbpyIZr2AqDjgpkJfFcvAACAS1D8AAAAXILiBwAA4BIUPwAAAJeg+AEAALgExQ8AAMAlKH4AAAAuQfED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LbURI0ZYSkqKeb1eO/XUU2369OkBn6lkZrZ7924bPXq0JSQkWM+ePe2OO+6whoaGTt3LNddcY5mZmRYfH2+9evWya665xnbu3OkcP3jwoN16663Wo0cP69atm/3sZz+z8vLysNuHmdk//vEPk2QlJSUB4+F+PlatWtXm39PEiRPN7NBHHtx7772Wnp5uXq/XLr744lZ73Lt3r40fP94SExPN5/PZpEmTbP/+/QFzPvjgA7vgggvM6/Var169bP78+Z22j127dh3xv5uWzyHbuHGj5eXlWVJSknXt2tV+9KMf2dy5c622trZT99EZwjnfzKIn46Ip38wiM+OiJd9+aC/hlnEeM7Ojf3wQAAAAkSqiXuMHAACAY0fxAwAAcAmKHwAAgEtQ/AAAAFyC4gcAAOASFD8AAACXoPgBAAC4BMUPAADAJSh+AAAALkHxAwAAcAmKHwAAgEtQ/AAAAFyC4gcAAOASFD8AAACXoPgBAAC4BMUPAADAJSh+AAAALkHxAwAAcAmKH47aokWL5PF42rzcddddoV5eUKxfv1633XabTj/9dJ1wwgnKycnR1VdfrU8++aTN+R999JEuueQSJSYmKiUlRddee62+/PLLTl41gI5yQ75t27ZNV111lU4++WR169ZNPXv21IgRI/T666+3OZ98i05xoV4AIs+cOXOUm5sbMDZw4MAQrSa4/v3f/13//Oc/ddVVV+mMM85QRUWF/vjHP+rss8/We++9F7DPzz//XCNGjFBSUpLmzp2rAwcO6Pe//722bNmidevWKT4+PoQ7AXAsojnfPvvsM+3fv18TJ05UVlaWvv32W/31r3/VZZddpqefflqTJ0925pJvUcyAo7Rw4UKTZOvXrz/q6xw8eNCampqO46qC65///KfV1dUFjH3yySfm9XptwoQJAeO33HKLJSQk2GeffeaMFRUVmSR7+umnO2W9AILDDfnWlsbGRjvzzDOtX79+AePkW/TiqV4EzVtvvSWPx6PFixfrnnvuUa9evdStWzfV1NRo3759uvPOOzVo0CAlJibK5/Np9OjR+uCDD9q8jZdeekn33XefevXqpe7du+vKK6+U3+9XXV2dpk6dqrS0NCUmJmrSpEmqq6trtZbnnntOQ4YMUUJCglJSUvQv//IvKisr+8E9nHfeea3+Jdu3b1+dfvrp+uijjwLG//rXv+qnP/2p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mZmZSkhIUEFBgXbs2BFwG/v27dOECRPk8/mUnJysG264QQcOHOj4boBjtXSpdNJJ0kUXST//+aH/PemkQ+NwDfINQLRrV/H7+uuvdf7556tLly564403tH37dj300EPq0aOHM+eBBx7QY489pqeeekpr167VCSecoFGjRqm2ttaZM2HCBG3btk1FRUVatmyZ3n77bU2ePDl4uwLaY+lS6corpc8/Dxzfs+fQOOXPFcg3AK5g7TBjxgy74IILjni8ubnZMjIy7MEHH3TGqqurzev12gsvvGBmZtu3bzdJtn79emfOG2+8YR6Px/bs2XNU6/D7/SbJ/H5/e5YPtNbYaNa7t5nU9sXjMcvOPjQPYa2juRAu+WZGxgEIFMxMaNcjfn/72980dOhQXXXVVUpLS9PgwYP1H//xH87xXbt2qaKiQgUFBc5YUlKS8vLyVFxcLEkqLi5WcnKyhg4d6swpKChQTEyM1q5d2+b91tXVqaamJuACBMU777R+pO9wZlJZ2aF5iGqhyjeJjAPQedpV/P7nf/5HCxYsUN++ffWPf/xDt9xyi37961/r2WeflSRVVFRIktLT0wOul56e7hyrqKhQWlpawPG4uDilpKQ4c75r3rx5SkpKci7Z2dntWTZwZOXlwZ2HiBWqfJPIOACdp13Fr7m5WWeffbbmzp2rwYMHa/Lkybrpppv01FNPHa/1SZJmzpwpv9/vXMrKyo7r/cFFMjODOw8RK1T5JpFxADpPu4pfZmamBgwYEDD2ox/9SKWlpZKkjIwMSVJlZWXAnMrKSudYRkaGqqqqAo43NjZq3759zpzv8nq98vl8ARcgKIYPl3r3ljyeto97PFJ29qF5iGqhyjeJjAPQedpV/M4//3yVlJQEjH3yySfq06ePJCk3N1cZGRlasWKFc7ympkZr165Vfn6+JCk/P1/V1dXauHGjM2flypVqbm5WXl7eMW8EOCaxsdKjjx76+bvlr+X3Rx7h8/xcgHwD4ArteSfIunXrLC4uzu6//37bsWOHPf/889atWzd77rnnnDnz58+35ORke+211+zDDz+0yy+/3HJzc+3gwYPOnEsuucQGDx5sa9eutXfffdf69u1r48ePP+p18I43BN1f/9r63b3Z2YfGERE6mgvhkm/B2AuA6BLMTGhX8TMze/31123gwIHm9Xqtf//+9qc//SngeHNzs917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tmnTJuedYPPnz7fk5GR77bXX7MMPP7TLL7+8zY87GDx4sK1du9beffdd69u3b8DHHVRXV1t6erpde+21tnXrVlu8eLF169YtqB938H37qK+vt8suu8x69+5tmzdvDvjvpuXda2vWrLGHH37YNm/ebJ9++qk999xzduKJJ9p1113Xqfs43sI938yiJ+OiKd/MIjPjoiXffmgv4ZZxEVf8zMwef/xxy8nJsfj4eBs2bJi99957oV6SQ1Kbl4ULF5qZWWlpqY0YMcJSUlLM6/XaqaeeatOnTw/4TCUzs927d9vo0aMtISHBevbsaXfccYc1NDR06l6uueYay8zMtPj4eOvVq5ddc801tnPnTuf4wYMH7dZbb7UePXpYt27d7Gc/+5mVl5eH3T7MzP7xj3+YJCspKQkYD/fzsWrVqjb/niZOnGhmhz7y4N5777X09HTzer128cUXt9rj3r17bfz48ZaYmGg+n88mTZpk+/fvD5jzwQcf2AUXXGBer9d69epl8+fP77R97Nq164j/3bR8DtnGjRstLy/PkpKSrGvXrvajH/3I5s6da7W1tZ26j84QzvlmFj0ZF035ZhaZGRct+fZDewm3jPOYmR3944MAAACIVBH1Gj8AAAAcO4ofAACAS1D8AAAAXILiBwAA4BIUPwAAAJeg+AEAALgExQ8AAMAlKH4AAAAuQfEDAABwCYofAACAS1D8AAAAXOL/A7YON29ebq6AAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "# Create a list of frame numbers corresponding to each point\n", "frame_numbers = queries[:,0].int().tolist()\n", "\n", "fig, axs = plt.subplots(2, 2)\n", "axs = axs.flatten()\n", "\n", "for i, (query, frame_number) in enumerate(zip(queries, frame_numbers)):\n", " ax = axs[i]\n", " ax.plot(query[1].item(), query[2].item(), 'ro') \n", " \n", " ax.set_title(\"Frame {}\".format(frame_number))\n", " ax.set_xlim(0, video.shape[4])\n", " ax.set_ylim(0, video.shape[3])\n", " ax.invert_yaxis()\n", " \n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "aec7693b-9d74-48b3-b612-360290ff1e7a", "metadata": {}, "source": [ "We pass these points as input to the model and track them:" ] }, { "cell_type": "code", "execution_count": 12, "id": "09008ca9-6a87-494f-8b05-6370cae6a600", "metadata": {}, "outputs": [], "source": [ "pred_tracks, pred_visibility = model(video, queries=queries[None])" ] }, { "cell_type": "markdown", "id": "b00d2a35-3daf-482d-b40b-b6d4f548ca40", "metadata": {}, "source": [ "Finally, we visualize the results with tracks leaving traces from the frame where the tracking starts.\n", "Color encodes time:" ] }, { "cell_type": "code", "execution_count": 13, "id": "01467f8d-667c-4f41-b418-93132584c659", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Video saved to ./videos/queries.mp4\n" ] } ], "source": [ "vis = Visualizer(\n", " save_dir='./videos',\n", " linewidth=6,\n", " mode='cool',\n", " tracks_leave_trace=-1\n", ")\n", "vis.visualize(\n", " video=video,\n", " tracks=pred_tracks,\n", " visibility=pred_visibility,\n", " filename='queries');" ] }, { "cell_type": "code", "execution_count": 14, "id": "fe23d210-ed90-49f1-8311-b7e354c7a9f6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_video(\"./videos/queries.mp4\")" ] }, { "cell_type": "markdown", "id": "199ecb50-f707-406a-bc64-94bfded827a8", "metadata": {}, "source": [ "Notice that points queried at frames 10, 20, and 30 are tracked **incorrectly** before the query frame. This is because CoTracker is an online algorithm and only tracks points in one direction. However, we can also run it backward from the queried point to track in both directions. Let's correct this:" ] }, { "cell_type": "code", "execution_count": 15, "id": "b40775f2-6ab0-4bc6-9099-f903935657c9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Video saved to ./videos/queries_backward.mp4\n" ] } ], "source": [ "pred_tracks, pred_visibility = model(video, queries=queries[None], backward_tracking=True)\n", "vis.visualize(\n", " video=video,\n", " tracks=pred_tracks,\n", " visibility=pred_visibility,\n", " filename='queries_backward');" ] }, { "cell_type": "code", "execution_count": 16, "id": "d3120f31-9365-4867-8c85-5638b0708edc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_video(\"./videos/queries_backward.mp4\")" ] }, { "cell_type": "markdown", "id": "87f2a3b4-a8b3-4aeb-87d2-28f056c624ba", "metadata": {}, "source": [ "## Points on a regular grid" ] }, { "cell_type": "markdown", "id": "a9aac679-19f8-4b78-9cc9-d934c6f83b01", "metadata": {}, "source": [ "### Tracking forward from the frame number x" ] }, { "cell_type": "markdown", "id": "0aeabca9-cc34-4d0f-8b2d-e6a6f797cb20", "metadata": {}, "source": [ "Let's now sample points on a regular grid and start tracking from the frame number 20 with a grid of 30\\*30. " ] }, { "cell_type": "code", "execution_count": 17, "id": "c880f3ca-cf42-4f64-9df6-a0e8de6561dc", "metadata": {}, "outputs": [], "source": [ "grid_size = 30\n", "grid_query_frame = 20" ] }, { "cell_type": "code", "execution_count": 18, "id": "3cd58820-7b23-469e-9b6d-5fa81257981f", "metadata": {}, "outputs": [], "source": [ "pred_tracks, pred_visibility = model(video, grid_size=grid_size, grid_query_frame=grid_query_frame)" ] }, { "cell_type": "code", "execution_count": 19, "id": "25a85a1d-dce0-4e6b-9f7a-aaf31ade0600", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (1496, 920) to (1504, 928) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n", "[swscaler @ 0x6363e40] Warning: data is not aligned! This can lead to a speed loss\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Video saved to ./videos/grid_query_20.mp4\n" ] } ], "source": [ "vis = Visualizer(save_dir='./videos', pad_value=100)\n", "vis.visualize(\n", " video=video,\n", " tracks=pred_tracks,\n", " visibility=pred_visibility,\n", " filename='grid_query_20',\n", " query_frame=grid_query_frame);" ] }, { "cell_type": "markdown", "id": "ce0fb5b8-d249-4f4e-b59a-51b4f03972c4", "metadata": {}, "source": [ "Note that tracking starts only from points sampled on a frame in the middle of the video. This is different from the grid in the first example:" ] }, { "cell_type": "code", "execution_count": 20, "id": "f0b01d51-9222-472b-a714-188c38d83ad9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_video(\"./videos/grid_query_20.mp4\")" ] }, { "cell_type": "markdown", "id": "10baad8f-0cb8-4118-9e69-3fb24575715c", "metadata": {}, "source": [ "### Tracking forward **and backward** from the frame number x" ] }, { "cell_type": "code", "execution_count": 21, "id": "506233dc-1fb3-4a3c-b9eb-5cbd5df49128", "metadata": {}, "outputs": [], "source": [ "grid_size = 30\n", "grid_query_frame = 20" ] }, { "cell_type": "markdown", "id": "495b5fb4-9050-41fe-be98-d757916d0812", "metadata": {}, "source": [ "Let's activate backward tracking:" ] }, { "cell_type": "code", "execution_count": 22, "id": "677cf34e-6c6a-49e3-a21b-f8a4f718f916", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (1496, 920) to (1504, 928) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n", "[swscaler @ 0x5734e40] Warning: data is not aligned! This can lead to a speed loss\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Video saved to ./videos/grid_query_20_backward.mp4\n" ] } ], "source": [ "pred_tracks, pred_visibility = model(video, grid_size=grid_size, grid_query_frame=grid_query_frame, backward_tracking=True)\n", "vis.visualize(\n", " video=video,\n", " tracks=pred_tracks,\n", " visibility=pred_visibility,\n", " filename='grid_query_20_backward');" ] }, { "cell_type": "markdown", "id": "585a0afa-2cfc-4a07-a6f0-f65924b9ebce", "metadata": {}, "source": [ "As you can see, we are now tracking points queried in the middle from the first frame:" ] }, { "cell_type": "code", "execution_count": 23, "id": "c8d64ab0-7e92-4238-8e7d-178652fc409c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_video(\"./videos/grid_query_20_backward.mp4\")" ] }, { "cell_type": "markdown", "id": "fb55fb01-6d8e-4e06-9346-8b2e9ef489c2", "metadata": {}, "source": [ "## Regular grid + Segmentation mask" ] }, { "cell_type": "markdown", "id": "e93a6b0a-b173-46fa-a6d2-1661ae6e6779", "metadata": {}, "source": [ "Let's now sample points on a grid and filter them with a segmentation mask.\n", "This allows us to track points sampled densely on an object because we consume less GPU memory." ] }, { "cell_type": "code", "execution_count": 24, "id": "b759548d-1eda-473e-9c90-99e5d3197e20", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from PIL import Image\n", "grid_size = 100" ] }, { "cell_type": "code", "execution_count": 25, "id": "14ae8a8b-fec7-40d1-b6f2-10e333b75db4", "metadata": {}, "outputs": [], "source": [ "input_mask = './assets/apple_mask.png'\n", "segm_mask = np.array(Image.open(input_mask))" ] }, { "cell_type": "markdown", "id": "4e3a1520-64bf-4a0d-b6e9-639430e31940", "metadata": {}, "source": [ "That's a segmentation mask for the first frame:" ] }, { "cell_type": "code", "execution_count": 26, "id": "4d2efd4e-22df-4833-b9a0-a0763d59ee22", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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22zevFkURZHjx49fUD+i0agAYLFYLBaLlYcVjUbP+1mf0xWUd999F5MmTcLMmTNRVlaGCRMm4LXXXjOPHz58GOFwGNXV1eZrXq8XVVVVCIVCAIBQKASfz4dJkyaZbaqrq6GqKpqams75c+PxOGKxWFYRERHR0JVTQPnqq69QX1+PsWPH4r333sMTTzyBp556Cq+//joAIBwOAwD8fn/W9/n9fvNYOBxGWVlZ1nG73Y6rrrrKbNPX8uXL4fV6zRo5cmQu3SYiIqI8k1NA0XUdt9xyC1544QVMmDABjz/+OB577DG88sorl6p/AIDFixcjGo2adezYsUv684iIiGhw5RRQhg8fjnHjxmW9dsMNN6CtrQ0AEAgEAADt7e1Zbdrb281jgUAAHR0dWcdTqRROnTpltunL5XLB4/FkFREREQ1dOQWUyZMno7W1Neu1L774AqNGjQIAjBkzBoFAAI2NjebxWCyGpqYmBINBAEAwGEQkEkFzc7PZZuvWrdB1HVVVVRd9IkRERDSEXNCymbQdO3aI3W6XZcuWyaFDh2TNmjVSWFgoq1evNtusWLFCfD6fvPPOO7J371655557ZMyYMdLV1WW2ueuuu2TChAnS1NQk27dvl7Fjx8qsWbMuuB9cxcNisVgsVv7WhaziySmgiIhs2LBBxo8fLy6XSyoqKuTVV1/NOq7ruixZskT8fr+4XC6ZMmWKtLa2ZrU5efKkzJo1S4qKisTj8cjDDz8snZ2dF9wHBhQWi8VisfK3LiSgKCIiyDOxWAxer3ewu0FEREQXIRqNnnc+KZ/FQ0RERJbDgEJERESWw4BCRERElsOAQkRERJbDgEJERESWw4BCRERElsOAQkRERJbDgEJERESWw4BCRERElsOAQkRERJbDgEJERESWw4BCRERElsOAQkRERJbDgEJERESWw4BCRERElsOAQkRERJbDgEJERESWw4BCRERElsOAQkRERJbDgEJERESWw4BCRERElsOAQkRERJbDgEJERESWw4BCRERElsOAQkRERJbDgEJERESWw4BCRERElpNTQBk9ejQURTmr6urqAADd3d2oq6tDSUkJioqKcO+996K9vT3rPdra2lBTU4PCwkKUlZVh4cKFSKVS/XdGRERElPdyCig7d+7EiRMnzGpoaAAAzJw5EwDw9NNPY8OGDVi/fj0++ugjfP3115gxY4b5/ZqmoaamBolEAp988glef/11rFq1CkuXLu3HUyIiIqK8J9/DvHnz5LrrrhNd1yUSiYjD4ZD169ebxz/77DMBIKFQSERENm3aJKqqSjgcNtvU19eLx+OReDx+wT83Go0KABaLxWKxWHlY0Wj0vJ/1Fz0HJZFIYPXq1XjkkUegKAqam5uRTCZRXV1ttqmoqEB5eTlCoRAAIBQKobKyEn6/32wzdepUxGIxHDhw4Ft/VjweRywWyyoiIiIaui46oLz99tuIRCJ46KGHAADhcBhOpxM+ny+rnd/vRzgcNtv0DieZ45lj32b58uXwer1mjRw58mK7TURERHngogPK3/72N0ybNg0jRozoz/6c0+LFixGNRs06duzYJf+ZRERENHjsF/NNR48exfvvv48333zTfC0QCCCRSCASiWRdRWlvb0cgEDDb7NixI+u9Mqt8Mm3OxeVyweVyXUxXiYiIKA9d1BWUlStXoqysDDU1NeZrEydOhMPhQGNjo/laa2sr2traEAwGAQDBYBD79u1DR0eH2aahoQEejwfjxo272HMgIiKioSaHRTsiIqJpmpSXl8uiRYvOOjZnzhwpLy+XrVu3yq5duyQYDEowGDSPp1IpGT9+vNx5553S0tIiW7ZskWHDhsnixYtz6gNX8bBYLBaLlb91Iat4cg4o7733ngCQ1tbWs451dXXJk08+KcXFxVJYWCjTp0+XEydOZLU5cuSITJs2Tdxut5SWlsqCBQskmUzm1AcGFBaLxWKx8rcuJKAoIiLIM9Fo9KzVQkRERJQfIpEIvF7vd7bJy2fxnDx5crC7QERERBeps7PzvG0uahXPYLvqqqsAGM/1OV8CI0MsFsPIkSNx7NgxeDyewe6O5XG8cscxyw3HK3ccs9xZbcxEBJ2dnRe0RUleBhRVNS78eL1eSwx4PvF4PByzHHC8cscxyw3HK3ccs9xZacwu9MJCXt7iISIioqGNAYWIiIgsJy8DisvlwvPPP8/dZXPAMcsNxyt3HLPccLxyxzHLXT6PWV4uMyYiIqKhLS+voBAREdHQxoBCRERElsOAQkRERJbDgEJERESWw4BCRERElpOXAeXPf/4zRo8ejYKCAlRVVWHHjh2D3aVBsXz5cvzoRz/ClVdeibKyMvziF79Aa2trVpvu7m7U1dWhpKQERUVFuPfee9He3p7Vpq2tDTU1NSgsLERZWRkWLlyIVCo1kKcyKFasWAFFUTB//nzzNY7X2Y4fP477778fJSUlcLvdqKysxK5du8zjIoKlS5di+PDhcLvdqK6uxqFDh7Le49SpU6itrYXH44HP58Ojjz6K06dPD/SpXHKapmHJkiUYM2YM3G43rrvuOvzud79D78WSl/t4bdu2DT//+c8xYsQIKIqCt99+O+t4f43P3r17cccdd6CgoAAjR47Eiy++eKlP7ZL5rjFLJpNYtGgRKisrccUVV2DEiBF48MEH8fXXX2e9R16O2Xmfd2wx69atE6fTKX//+9/lwIED8thjj4nP55P29vbB7tqAmzp1qqxcuVL2798vLS0t8rOf/UzKy8vl9OnTZps5c+bIyJEjpbGxUXbt2iU//vGP5bbbbjOPp1IpGT9+vFRXV8vu3btl06ZNUlpaKosXLx6MUxowO3bskNGjR8tNN90k8+bNM1/neGU7deqUjBo1Sh566CFpamqSr776St577z358ssvzTYrVqwQr9crb7/9tuzZs0fuvvtuGTNmjHR1dZlt7rrrLrn55pvl008/lX//+9/ygx/8QGbNmjUYp3RJLVu2TEpKSmTjxo1y+PBhWb9+vRQVFckf//hHs83lPl6bNm2S5557Tt58800BIG+99VbW8f4Yn2g0Kn6/X2pra2X//v2ydu1acbvd8te//nWgTrNffdeYRSIRqa6uln/+85/y+eefSygUkltvvVUmTpyY9R75OGZ5F1BuvfVWqaurM7/WNE1GjBghy5cvH8ReWUNHR4cAkI8++khEjF9ch8Mh69evN9t89tlnAkBCoZCIGL/4qqpKOBw229TX14vH45F4PD6wJzBAOjs7ZezYsdLQ0CA//elPzYDC8TrbokWL5Pbbb//W47quSyAQkJdeesl8LRKJiMvlkrVr14qIyMGDBwWA7Ny502yzefNmURRFjh8/fuk6PwhqamrkkUceyXptxowZUltbKyIcr776ftj21/j85S9/keLi4qy/yUWLFsn1119/ic/o0jtXqOtrx44dAkCOHj0qIvk7Znl1iyeRSKC5uRnV1dXma6qqorq6GqFQaBB7Zg3RaBRAz9Oem5ubkUwms8aroqIC5eXl5niFQiFUVlbC7/ebbaZOnYpYLIYDBw4MYO8HTl1dHWpqarLGBeB4ncu7776LSZMmYebMmSgrK8OECRPw2muvmccPHz6McDicNWZerxdVVVVZY+bz+TBp0iSzTXV1NVRVRVNT08CdzAC47bbb0NjYiC+++AIAsGfPHmzfvh3Tpk0DwPE6n/4an1AohJ/85CdwOp1mm6lTp6K1tRXffPPNAJ3N4IlGo1AUBT6fD0D+jllePc34f//7HzRNy/pwAAC/34/PP/98kHplDbquY/78+Zg8eTLGjx8PAAiHw3A6neYvaYbf70c4HDbbnGs8M8eGmnXr1uE///kPdu7cedYxjtfZvvrqK9TX1+OZZ57Bb37zG+zcuRNPPfUUnE4nZs+ebZ7zucak95iVlZVlHbfb7bjqqquG3Jg9++yziMViqKiogM1mg6ZpWLZsGWprawGA43Ue/TU+4XAYY8aMOes9MseKi4svSf+toLu7G4sWLcKsWbPMpxfn65jlVUChb1dXV4f9+/dj+/btg90Vyzp27BjmzZuHhoYGFBQUDHZ38oKu65g0aRJeeOEFAMCECROwf/9+vPLKK5g9e/Yg98563njjDaxZswb/+Mc/cOONN6KlpQXz58/HiBEjOF50ySWTSfzyl7+EiKC+vn6wu/O95dUtntLSUthstrNWVbS3tyMQCAxSrwbf3LlzsXHjRnzwwQe45pprzNcDgQASiQQikUhW+97jFQgEzjmemWNDSXNzMzo6OnDLLbfAbrfDbrfjo48+wssvvwy73Q6/38/x6mP48OEYN25c1ms33HAD2traAPSc83f9TQYCAXR0dGQdT6VSOHXq1JAbs4ULF+LZZ5/Fr371K1RWVuKBBx7A008/jeXLlwPgeJ1Pf43P5fZ3CvSEk6NHj6KhocG8egLk75jlVUBxOp2YOHEiGhsbzdd0XUdjYyOCweAg9mxwiAjmzp2Lt956C1u3bj3r8tzEiRPhcDiyxqu1tRVtbW3meAWDQezbty/rlzfzy933gynfTZkyBfv27UNLS4tZkyZNQm1trflvjle2yZMnn7V0/YsvvsCoUaMAAGPGjEEgEMgas1gshqampqwxi0QiaG5uNtts3boVuq6jqqpqAM5i4Jw5cwaqmv2/VZvNBl3XAXC8zqe/xicYDGLbtm1IJpNmm4aGBlx//fVD8vZOJpwcOnQI77//PkpKSrKO5+2YDdr03Iu0bt06cblcsmrVKjl48KA8/vjj4vP5slZVXC6eeOIJ8Xq98uGHH8qJEyfMOnPmjNlmzpw5Ul5eLlu3bpVdu3ZJMBiUYDBoHs8sm73zzjulpaVFtmzZIsOGDRuyy2b76r2KR4Tj1deOHTvEbrfLsmXL5NChQ7JmzRopLCyU1atXm21WrFghPp9P3nnnHdm7d6/cc88951wWOmHCBGlqapLt27fL2LFjh8yy2d5mz54tV199tbnM+M0335TS0lL59a9/bba53Mers7NTdu/eLbt37xYA8oc//EF2795trjjpj/GJRCLi9/vlgQcekP3798u6deuksLAwb5cZf9eYJRIJufvuu+Waa66RlpaWrM+C3ity8nHM8i6giIj86U9/kvLycnE6nXLrrbfKp59+OthdGhQAzlkrV64023R1dcmTTz4pxcXFUlhYKNOnT5cTJ05kvc+RI0dk2rRp4na7pbS0VBYsWCDJZHKAz2Zw9A0oHK+zbdiwQcaPHy8ul0sqKirk1VdfzTqu67osWbJE/H6/uFwumTJlirS2tma1OXnypMyaNUuKiorE4/HIww8/LJ2dnQN5GgMiFovJvHnzpLy8XAoKCuTaa6+V5557LuuD4nIfrw8++OCc/9+aPXu2iPTf+OzZs0duv/12cblccvXVV8uKFSsG6hT73XeN2eHDh7/1s+CDDz4w3yMfx0wR6bXFIREREZEF5NUcFCIiIro8MKAQERGR5TCgEBERkeUwoBAREZHlMKAQERGR5TCgEBERkeUwoBAREZHlMKAQERGR5TCgEBERkeUwoBAREZHlMKAQERGR5fw/NVFPs8GYmzIAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow((segm_mask[...,None]/255.*video[0,0].permute(1,2,0).cpu().numpy()/255.))" ] }, { "cell_type": "code", "execution_count": 27, "id": "b42dce24-7952-4660-8298-4c362d6913cf", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (1496, 920) to (1504, 928) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n", "[swscaler @ 0x7227e40] Warning: data is not aligned! This can lead to a speed loss\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Video saved to ./videos/segm_grid.mp4\n" ] } ], "source": [ "pred_tracks, pred_visibility = model(video, grid_size=grid_size, segm_mask=torch.from_numpy(segm_mask)[None, None])\n", "vis = Visualizer(\n", " save_dir='./videos',\n", " pad_value=100,\n", " linewidth=2,\n", ")\n", "vis.visualize(\n", " video=video,\n", " tracks=pred_tracks,\n", " visibility=pred_visibility,\n", " filename='segm_grid');" ] }, { "cell_type": "markdown", "id": "5a386308-0d20-4ba3-bbb9-98ea79823a47", "metadata": {}, "source": [ "We are now only tracking points on the object (and around):" ] }, { "cell_type": "code", "execution_count": 28, "id": "1810440f-00f4-488a-a174-36be05949e42", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_video(\"./videos/segm_grid.mp4\")" ] }, { "cell_type": "markdown", "id": "a63e89e4-8890-4e1b-91ec-d5dfa3f93309", "metadata": {}, "source": [ "## Dense Tracks" ] }, { "cell_type": "markdown", "id": "4ae764d8-db7c-41c2-a712-1876e7b4372d", "metadata": {}, "source": [ "### Tracking forward **and backward** from the frame number x" ] }, { "cell_type": "markdown", "id": "0dde3237-ecad-4c9b-b100-28b1f1b3cbe6", "metadata": {}, "source": [ "CoTracker also has a mode to track **every pixel** in a video in a **dense** manner but it is much slower than in previous examples. Let's downsample the video in order to make it faster: " ] }, { "cell_type": "code", "execution_count": 29, "id": "379557d9-80ea-4316-91df-4da215193b41", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 50, 3, 720, 1296])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "video.shape" ] }, { "cell_type": "code", "execution_count": 30, "id": "c6db5cc7-351d-4d9e-9b9d-3a40f05b077a", "metadata": {}, "outputs": [], "source": [ "import torch.nn.functional as F\n", "video_interp = F.interpolate(video[0], [200, 360], mode=\"bilinear\")[None]" ] }, { "cell_type": "markdown", "id": "7ba32cb3-97dc-46f5-b2bd-b93a094dc819", "metadata": {}, "source": [ "The video now has a much lower resolution:" ] }, { "cell_type": "code", "execution_count": 31, "id": "0918f246-5556-43b8-9f6d-88013d5a487e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 50, 3, 200, 360])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "video_interp.shape" ] }, { "cell_type": "code", "execution_count": 32, "id": "e4451ae5-c132-4ef2-9329-133b31305db7", "metadata": {}, "outputs": [], "source": [ "grid_query_frame=20" ] }, { "cell_type": "markdown", "id": "bc7d3a2c-5e87-4c8d-ad10-1f9c6d2ffbed", "metadata": {}, "source": [ "Again, let's track points in both directions. This will only take a couple of minutes:" ] }, { "cell_type": "code", "execution_count": 33, "id": "3b852606-5229-4abd-b166-496d35da1009", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "step 0 / 4\n", "step 1 / 4\n", "step 2 / 4\n", "step 3 / 4\n" ] } ], "source": [ "pred_tracks, pred_visibility = model(video_interp, grid_query_frame=grid_query_frame, backward_tracking=True)" ] }, { "cell_type": "markdown", "id": "4143ab14-810e-4e65-93f1-5775957cf4da", "metadata": {}, "source": [ "Visualization with an optical flow color encoding:" ] }, { "cell_type": "code", "execution_count": 36, "id": "5394b0ba-1fc7-4843-91d5-6113a6e86bdf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Video saved to ./videos/dense.mp4\n" ] } ], "source": [ "vis = Visualizer(\n", " save_dir='./videos',\n", " pad_value=20,\n", " linewidth=1,\n", " mode='optical_flow'\n", ")\n", "vis.visualize(\n", " video=video_interp,\n", " tracks=pred_tracks,\n", " visibility=pred_visibility,\n", " filename='dense');" ] }, { "cell_type": "code", "execution_count": 37, "id": "9113c2ac-4d25-4ef2-8951-71a1c1be74dd", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_video(\"./videos/dense.mp4\")" ] }, { "cell_type": "markdown", "id": "95e9bce0-382b-4d18-9316-7f92093ada1d", "metadata": {}, "source": [ "That's all, now you can use CoTracker in your projects!" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" }, "vscode": { "interpreter": { "hash": "5c3af07c9b62e9e5a46520c50c603ac08cca123627f098bd5ae6d6af0e7d15f9" } } }, "nbformat": 4, "nbformat_minor": 5 }