{ "cells": [ { "cell_type": "markdown", "id": "4ff51042", "metadata": {}, "source": [ "\n", "\n", " \n", " \n", " \n", " \n", "
\n", " \n", " \n", " Try in Google Colab\n", " \n", " \n", " \n", " \n", " Share via nbviewer\n", " \n", " \n", " \n", " \n", " View on GitHub\n", " \n", " \n", " \n", " \n", " Download notebook\n", " \n", "
\n" ] }, { "cell_type": "markdown", "id": "55bf7ef9-74c4-43f9-b2ad-300608bb4264", "metadata": {}, "source": [ "# Working With Video and Tracking Datasets in FiftyOne" ] }, { "cell_type": "markdown", "id": "2d16d64d-fd49-49b9-b8b4-56275b9c8988", "metadata": {}, "source": [ "In this tutorial, we’ll work with a video dataset and tackle a pedestrian tracking problem within FiftyOne. Video computer vision datasets require specialized workflows and can present specific challenges for machine learning and analysis. Fortunately, FiftyOne provides native support for video in both the UI and SDK. Let’s dive in and take a look!\n", "\n", "We will consider the problem of tracking multiple pedestrians in a street scene. For our dataset, we’ll explore the [Multiple Object Tracking (MOT17) dataset](https://motchallenge.net/) . When it comes time to do some of\n", "our own tracking, we’ll perform two-stage object tracking combining [Yolov8](https://github.com/ultralytics/ultralytics) with [BoT-SORT](https://github.com/NirAharon/BoT-SORT). FiftyOne’s built-in evaluation methods and embeddings view will give us insight into our tracking quality and help us search for identity swaps.\n", "\n", "The objectives of this tutorial are Encoding video data in image stacks into FiftyOne-friendly movies\n", "- Loading a video dataset with detections and trajectories into FiftyOne\n", "- Computing, storing, and analyzing per-frame trajectory statistics\n", "- Visualizing interesting object trajectories\n", "- Running a pedestrian tracker on the dataset and loading the results\n", "- Assessing our tracking using FiftyOne’s evaluation methods and embeddings visualization\n", "\n", "**So, what’s the takeaway?** As video-enabled devices proliferate, video data will continue to comprise a significant portion of computer vision, with its own workflows and challenges. FiftyOne’s large toolkit provides built-in support, so load up those video datasets!" ] }, { "cell_type": "markdown", "id": "7ac69f36-b79a-48ff-afbe-3038ef89886b", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "markdown", "id": "4505b4fc-874e-4095-89f3-9c3e9401a107", "metadata": {}, "source": [ "To get started, you need to install [FiftyOne](https://voxel51.com/docs/FiftyOne/getting_started/install.html) :" ] }, { "cell_type": "code", "execution_count": null, "id": "7909a767-77fa-4009-b31f-dbe669f0851c", "metadata": {}, "outputs": [], "source": [ "!pip install FiftyOne" ] }, { "cell_type": "code", "execution_count": 3, "id": "f01528c2-3a43-4d45-9749-237ccd008a7e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Your FO version is: 0.23.0\n" ] } ], "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "import fiftyone as fo\n", "import fiftyone.utils.video as fouv\n", "import fiftyone.zoo as foz\n", "import fiftyone.brain as fob\n", "from fiftyone import ViewField as F\n", "print(f'Your FO version is: {fo.__version__}')" ] }, { "cell_type": "markdown", "id": "5a758413-c9a1-403f-b11e-2b61b0e114a8", "metadata": {}, "source": [ "## Dataset" ] }, { "cell_type": "markdown", "id": "1561fd4c-e1c8-49ac-8480-5875455fad7e", "metadata": {}, "source": [ "Download the [data (5.5GB)](https://motchallenge.net/data/MOT17.zip) for the [MOT17 dataset](https://motchallenge.net/data/MOT17/) . This data comprises seven videos with object detections from three different models." ] }, { "cell_type": "code", "execution_count": null, "id": "adca5d48-c989-4ea3-be24-3ba92bfb6ee6", "metadata": {}, "outputs": [], "source": [ "# Download the data to a data directory\n", "DATA_DIR = os.path.join(os.getcwd(),'mot17data')\n", "!wget -P {DATA_DIR} https://motchallenge.net/data/MOT17.zip" ] }, { "cell_type": "code", "execution_count": null, "id": "1bdd86bf-f4f9-4d61-b659-3c2b235816d6", "metadata": {}, "outputs": [], "source": [ "# Unzip the data\n", "!unzip {os.path.join(DATA_DIR,'MOT17.zip')}" ] }, { "cell_type": "markdown", "id": "c6d59fe0-0c64-4997-9349-845eca44f3fa", "metadata": {}, "source": [ "## Encode the Movies" ] }, { "cell_type": "markdown", "id": "ecad9300-2827-40da-9c3d-f42d65833716", "metadata": {}, "source": [ "This dataset comes as image stacks. We will encode these image stacks into movies for use with FiftyOne. (In the future, FiftyOne will support image-stacks-as-video natively.)\n", "\n", "How movies are encoded is an important consideration when working with video datasets. This is especially true in computer vision, where frame-level consistency in playback and alignment with annotations is crucial. Some encodings may work well on some platforms or with certain software, but not others. In general, it is a good idea to experiment with and test your encodings across all\n", "platforms and software packages used by your team and in your organization." ] }, { "cell_type": "code", "execution_count": 2, "id": "5ba2400f-e753-4ab7-a267-253544f7ebde", "metadata": {}, "outputs": [], "source": [ "DATA_DIR = \"./MOT17\"" ] }, { "cell_type": "code", "execution_count": 3, "id": "0222a509-c371-414d-9052-4f99cf0e3f2e", "metadata": {}, "outputs": [], "source": [ "# Create a directory to hold encoded movies\n", "mp4_dir = os.path.join(DATA_DIR,'movies')\n", "!mkdir -p {mp4_dir}" ] }, { "cell_type": "markdown", "id": "200ec702-e7b7-4071-8710-9fe12f8b6ffc", "metadata": {}, "source": [ "FiftyOne provides utilities to [reencode videos](https://docs.voxel51.com/api/FiftyOne.utils.video.html?highlight=reencode#FiftyOne.utils.video.reencode_video) for compatibility with FiftyOne. By default, this re-encoding uses the [ffmpeg](https://ffmpeg.org/) library, which accepts image stacks as input.\n", "\n", "\n", "In this tutorial, we will encode and work with two of the videos in the MOTS17 dataset." ] }, { "cell_type": "code", "execution_count": 4, "id": "039b1e5d-95f3-4c9e-a724-a32615fa6b84", "metadata": {}, "outputs": [], "source": [ "MOV_NUMS = [2,9]" ] }, { "cell_type": "code", "execution_count": 5, "id": "04ad38ca-6dfd-4239-b555-7f99af043061", "metadata": {}, "outputs": [], "source": [ "for movi in MOV_NUMS:\n", " mov_in = os.path.join(DATA_DIR,'train',f'MOT17-{movi:02}-FRCNN/img1/%06d.jpg')\n", " mov_out = os.path.join(mp4_dir,f'MOT17-{movi:02}.mp4')\n", " fouv.reencode_video(mov_in,mov_out)" ] }, { "cell_type": "markdown", "id": "c1c09167-ec2b-4261-a948-c0e69af29f95", "metadata": {}, "source": [ "## Create a FiftyOne Video Dataset" ] }, { "cell_type": "markdown", "id": "3b9bfdc0-7955-4fb2-b277-397a05eab8ff", "metadata": {}, "source": [ "With our video data encoded into movies, it’s a snap to create a video dataset in FiftyOne using the `Dataset.from_dir` function.\n", "\n", "Calling `ensure_frames` pre-populates the `.frames` property for every video frame in each sample in the dataset. This is not mandatory, but is useful for being able to easily see how many frames\n", "are contained in each sample." ] }, { "cell_type": "code", "execution_count": 6, "id": "981d3967-5443-4319-aaab-580e1acf68ca", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 100% |█████████████████████| 2/2 [26.4ms elapsed, 0s remaining, 75.8 samples/s] \n", "Computing metadata...\n", " 100% |█████████████████████| 2/2 [243.2ms elapsed, 0s remaining, 8.2 samples/s] \n" ] } ], "source": [ "dataset = fo.Dataset.from_dir(dataset_dir=mp4_dir,dataset_type=fo.types.VideoDirectory)\n", "dataset.ensure_frames()" ] }, { "cell_type": "markdown", "id": "b95fa866-b5b3-44c5-bc7e-8284a50740e9", "metadata": {}, "source": [ "Let’s name our dataset and persist it so we can load it next time." ] }, { "cell_type": "code", "execution_count": 7, "id": "c7120d72-6a71-4291-adb5-d156d3d759f2", "metadata": {}, "outputs": [], "source": [ "dataset.name = 'mots17'\n", "dataset.persistent = True" ] }, { "cell_type": "markdown", "id": "ea681377-54aa-403b-9f81-c1426f19fc52", "metadata": {}, "source": [ "Printing the first sample in our dataset shows us metadata for the first video. The frames attribute is an ordered dictionary containing Frame objects keyed by frame number." ] }, { "cell_type": "code", "execution_count": 11, "id": "a50bddae-414a-4840-ac4d-08f25cfd0a4a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ",\n", " 'frames': ,\n", "}>\n" ] } ], "source": [ "sample = dataset.first()\n", "print(sample)" ] }, { "cell_type": "markdown", "id": "ca1c61bd-adc4-4de5-be0d-5f2cfbf5434a", "metadata": {}, "source": [ "When indexing frames , make sure to use 1-based frame numbers." ] }, { "cell_type": "code", "execution_count": 12, "id": "50af7021-d8b5-4f4f-8e8f-e29498c78869", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print(sample.frames[1])" ] }, { "cell_type": "markdown", "id": "fe19064d-356a-48bc-8550-188b7eef2458", "metadata": {}, "source": [ "## Loading Detections" ] }, { "cell_type": "markdown", "id": "c6d89a96-8de4-469c-93fd-5355c8bca90f", "metadata": {}, "source": [ "Let’s load some detections! The MOTS17 dataset contains ground truth annotations in csv files for each movie. These annotations include bounding box detections, classes, and identity IDs.\n", "\n", "The identity IDs make this problem a tracking problem and not just an object detection problem. Detections must be associated across frames as belonging to a particular individual or trajectory.\n", "\n", "The columns in the provided csv files, as well as the list of classes used, are as described in this [paper](https://arxiv.org/abs/1603.00831). We are primarily interested in people, so we set some of the other class labels to “na”. We also replace the “Static person” class with simply “person” as we will not distinguish the two classes here." ] }, { "cell_type": "code", "execution_count": 13, "id": "0764802f-7e96-4ef9-a39d-61b1a3934eaa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loading gt detections for /home/dan/Documents/track/MOT17/movies/MOT17-02.mp4\n", "frame 100\n", "frame 200\n", "frame 300\n", "frame 400\n", "frame 500\n", "frame 600\n", "Loading gt detections for /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4\n", "frame 100\n", "frame 200\n", "frame 300\n", "frame 400\n", "frame 500\n" ] } ], "source": [ "GT_COLUMNS = ['frame','id','x0','y0','w','h','flag','class','visibility']\n", "GT_CLASSES = ['na','person','na','na','na','na','vehicle','person', \\\n", "'na','na','na','occluded','na','crowd']\n", "\n", "def read_detections(df, frame):\n", " '''\n", " Parse detections from MOTS17 csv/dataframe\n", " df: dataframe containing GT detections\n", " frame: frame (1-based) of interest\n", " '''\n", " \n", " df_frame = df[df.frame==frame]\n", " bbox_arr = df_frame[ ['x0','y0','w','h'] ].to_numpy().astype(np.float64)\n", " bboxes = bbox_arr.tolist()\n", " \n", " frame_rel = range(0,len(bboxes))\n", " ids = df_frame['id'].to_list()\n", " vis = df_frame['visibility'].to_list()\n", " classes = df_frame['class'].to_list()\n", " classes = [GT_CLASSES[i] for i in classes]\n", " return zip(bboxes, ids, vis, classes, frame_rel)\n", "\n", "for movi, samp in zip(MOV_NUMS,dataset):\n", " print(f'Loading gt detections for {samp.filepath}')\n", " # The ground-truth csv files are located under a particular detection method (like FRCNN),\n", " # but are identical across the different detection types. We won't actually use the FRCNN detections.\n", " gt_csv = os.path.join(DATA_DIR,'train',f'MOT17-{movi:02}-FRCNN/gt/gt.txt')\n", " df_gt = pd.read_csv(gt_csv,names=GT_COLUMNS)\n", " \n", " imw = samp.metadata.frame_width\n", " imh = samp.metadata.frame_height\n", " df_gt[['x0','w']] /= imw\n", " df_gt[['y0','h']] /= imh\n", " \n", " for frame_no, frame in samp.frames.items():\n", " dets_gt = []\n", " for bb, id, vis, cls, frm_rel in read_detections(df_gt, frame_no):\n", " det = fo.Detection(bounding_box=bb, index=str(id), label=cls, visibility=vis)\n", " dets_gt.append(det)\n", " \n", " frame['gt'] = fo.Detections(detections=dets_gt)\n", " \n", " if frame_no % 100 == 0:\n", " print(f'frame {frame_no}')\n", " \n", " samp.save()" ] }, { "cell_type": "code", "execution_count": 4, "id": "ce2ef3d5-752a-48be-b45a-c0844020e97d", "metadata": {}, "outputs": [], "source": [ "import fiftyone as fo\n", "\n", "dataset = fo.load_dataset(\"mots17\")" ] }, { "cell_type": "code", "execution_count": 5, "id": "59a8dfc9-1d0c-4a38-ae47-ff7234d99e88", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "session = fo.launch_app(dataset)" ] }, { "cell_type": "markdown", "id": "36b2a6b2-4646-4df4-9417-2194db2ab377", "metadata": {}, "source": [ "Let’s do some basic exploration of our trajectories. We’ll focus on the first movie by creating a view. The `index` field in our detections captures the trajectory identity; using the `count_values` aggregation gives us a count of the number of frames for each trajectory index:" ] }, { "cell_type": "code", "execution_count": 6, "id": "c95b1746-c268-4f9e-a9ea-78268a0a9eea", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are 83 trajectories with min/max lengths of 1/600\n", "{39: 376, 50: 528, 69: 280, 65: 580, 58: 303, 26: 600, 36: 516, 25: 600, 49: 218, 74: 68, 63: 111, 81: 1, 64: 111, 28: 448, 57: 467, 22: 39, 21: 80, 45: 491, 37: 279, 29: 537, 76: 155, 31: 600, 33: 266, 11: 530, 34: 248, 46: 600, 2: 56, 18: 600, 62: 304, 79: 52, 3: 575, 5: 600, 77: 12, 44: 370, 67: 349, 60: 402, 30: 600, 23: 586, 7: 581, 83: 1, 47: 600, 24: 600, 59: 323, 66: 600, 61: 550, 6: 600, 38: 351, 35: 230, 71: 60, 16: 62, 43: 479, 32: 298, 73: 121, 75: 62, 56: 278, 1: 600, 20: 322, 55: 43, 40: 529, 78: 25, 15: 600, 9: 600, 41: 373, 82: 1, 13: 526, 10: 600, 53: 498, 54: 369, 72: 152, 8: 43, 27: 570, 48: 251, 14: 306, 80: 4, 19: 549, 4: 600, 70: 206, 17: 600, 51: 600, 12: 493, 52: 533, 42: 361, 68: 315}\n" ] } ], "source": [ "view = dataset.limit(1)\n", "traj_counts = view.count_values('frames.gt.detections.index')\n", "num_trajs = len(traj_counts)\n", "traj_lens = traj_counts.values()\n", "print(f'There are {num_trajs} trajectories with min/max lengths of {min(traj_lens)}/{max(traj_lens)}')\n", "print(traj_counts)" ] }, { "cell_type": "markdown", "id": "a98561b7-9e96-4566-818c-c5513ab9a01d", "metadata": {}, "source": [ "Let’s compute a basic statistic like the speed of a trajectory and add it to our dataset. We’ll compute this speed using the centroid of our detection boxes. We can also add this centroid to our dataset as a keypoint label so that these centroids can be visualized.\n", "\n", "We’ll filter our dataset first so that we only perform this computation for the `person` label." ] }, { "cell_type": "code", "execution_count": 7, "id": "4e57866b-4a26-4fb5-b9f9-aa31e63cf177", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Working on /home/dan/Documents/track/MOT17/movies/MOT17-02.mp4\n", " frame 100\n", " frame 200\n", " frame 300\n", " frame 400\n", " frame 500\n", " frame 600\n", "Working on /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4\n", " frame 100\n", " frame 200\n", " frame 300\n", " frame 400\n", " frame 500\n" ] } ], "source": [ "def centroid(bb):\n", " # Compute the centroid of a FiftyOne-style bounding box (in normalized image coordinates)\n", " x = bb[0] + bb[2]/2.0\n", " y = bb[1] + bb[3]/2.0\n", " return x,y\n", " \n", "for samp in dataset.filter_labels('frames.gt',F('label')=='person').iter_samples(autosave=True):\n", " print(f'Working on {samp.filepath}')\n", " imw = samp.metadata.frame_width\n", " imh = samp.metadata.frame_height\n", " last_seen = {}\n", " for fno,frame in samp.frames.items():\n", " dets = frame.gt.detections\n", " kps = [fo.Keypoint(points=[centroid(x.bounding_box)],label=x.label,index=x.index) for x in dets]\n", " for kp in kps:\n", " if fno>1 and kp.index in last_seen:\n", " pts0 = last_seen[kp.index]\n", " pts1 = kp.points[0]\n", " dx_px = imw * (pts1[0]-pts0[0])\n", " dy_px = imh * (pts1[1]-pts0[1])\n", " vel = np.hypot( dx_px, dy_px )\n", " kp['speed'] = vel\n", " else:\n", " kp['speed'] = None\n", " \n", " last_seen = {x.index: x.points[0] for x in kps}\n", " frame['gt_kps'] = fo.Keypoints(keypoints=kps)\n", " frame.save()\n", " \n", " if fno % 100 ==0:\n", " print(f' frame {fno}')" ] }, { "cell_type": "markdown", "id": "5b994265-b3ad-4dda-8730-4fe7d8a9d866", "metadata": {}, "source": [ "To visualize our new frame-level field `speed` in the FiftyOne App, let’s call `add_dynamic_frame_fields` on our dataset. This adds `speed` to our dataset’s schema." ] }, { "cell_type": "code", "execution_count": 8, "id": "a4ce8784-5c2b-4273-9f4f-6ab8bbb48aa2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dataset.add_dynamic_frame_fields()\n", "session.dataset = dataset" ] }, { "cell_type": "markdown", "id": "b5c3efae-3b7b-4ac1-b33a-717046b9604d", "metadata": {}, "source": [ "We can now filter by `speed` in the sidebar for visualization of detection centroids. We can also view a histogram of speeds across all frames." ] }, { "cell_type": "markdown", "id": "23b3752c-a4e9-4ed3-b91a-fae7f83bd118", "metadata": {}, "source": [ "With the per-frame speeds saved on our detections, we can compute statistics like the average or maximum speed for each individual. To this, we’ll filter for each trajectory and use the `values` aggregation to obtain a list of speeds over all frames in its lifetime.\n", "\n", "Who’s moving quickly and who’s moving slowly? Let’s use our view to take a look at the first movie:" ] }, { "cell_type": "code", "execution_count": 9, "id": "fda3ec4a-2265-4c52-9a14-1510bd8c4e19", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(min av speed is 0.00, achieved by traj 1\n", "(max speed achieved is 59.54, achieved by traj 16\n" ] } ], "source": [ "traj_indices = view.distinct('frames.gt.detections.index')\n", "traj_avspeeds = []\n", "traj_maxspeeds = []\n", "for idx in traj_indices:\n", " speeds = view.filter_labels('frames.gt_kps',F('index')==idx).values('frames[].gt_kps.keypoints[].speed')\n", " speeds = speeds[1:] # clip off leading None\n", " if len(speeds)==0:\n", " speeds = [np.nan]\n", " traj_avspeeds.append(np.mean(speeds))\n", " traj_maxspeeds.append(np.max(speeds))\n", " \n", "idx = np.nanargmin(traj_avspeeds)\n", "print(f'(min av speed is {traj_avspeeds[idx]:.2f}, achieved by traj {traj_indices[idx]}')\n", "index_minavspeed = traj_indices[idx]\n", "\n", "idx = np.nanargmax(traj_maxspeeds)\n", "print(f'(max speed achieved is {traj_maxspeeds[idx]:.2f}, achieved by traj {traj_indices[idx]}')\n", "index_maxspeed = traj_indices[idx]" ] }, { "cell_type": "markdown", "id": "d0638a42-ca6d-465b-8fd8-0be783da4cd0", "metadata": {}, "source": [ "Let’s take a look at these two trajectories in the video! To do this, we can use `to_trajectories` to generate a [clip view](https://docs.voxel51.com/user_guide/using_views.html?highlight=clips%20view#clip-views) focusing on single trajectories:" ] }, { "cell_type": "code", "execution_count": 10, "id": "24d53691-7f78-4abf-b56f-ae3c58a524ff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset: mots17\n", "Media type: video\n", "Num clips: 2\n", "Clip fields:\n", " id: fiftyone.core.fields.ObjectIdField\n", " sample_id: fiftyone.core.fields.ObjectIdField\n", " filepath: fiftyone.core.fields.StringField\n", " support: fiftyone.core.fields.FrameSupportField\n", " tags: fiftyone.core.fields.ListField(fiftyone.core.fields.StringField)\n", " metadata: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.metadata.VideoMetadata)\n", " gt: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.odm.embedded_document.DynamicEmbeddedDocument)\n", "Frame fields:\n", " id: fiftyone.core.fields.ObjectIdField\n", " frame_number: fiftyone.core.fields.FrameNumberField\n", " gt: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.labels.Detections)\n", "View stages:\n", " 1. Limit(limit=1)\n", " 2. FilterLabels(field='frames.gt', filter={'$in': ['$$this.index', [...]]}, only_matches=True, trajectories=False)\n", " 3. ToTrajectories(field='frames.gt', config=None)\n" ] } ], "source": [ "# Create a trajectories view for the vehicles in the dataset\n", "trajectories = (\n", "view\n", ".filter_labels(\"frames.gt\", F(\"index\").is_in([index_minavspeed, index_maxspeed]) )\n", ".to_trajectories(\"frames.gt\")\n", ")\n", "print(trajectories)" ] }, { "cell_type": "code", "execution_count": 11, "id": "cbd9e31d-7a74-4d7e-b58e-322b6bded7be", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "session.view = trajectories" ] }, { "cell_type": "markdown", "id": "9a469dfa-2be5-49da-8519-2e199ae19f5b", "metadata": {}, "source": [ "The slowest trajectory is a person who is sitting down! In retrospect, this is not so surprising. In the original ground-truth labels, this person was probably labeled as ‘Person static’.\n", "The fastest pedestrian speeds by the camera in the foreground." ] }, { "cell_type": "markdown", "id": "e09c4ef5-0039-4a70-9367-9c4739ccd3e5", "metadata": {}, "source": [ "## Tracking with YOLOv8 + BoT-SORT" ] }, { "cell_type": "markdown", "id": "b0d43de3-33ff-4da0-92b7-a1a249c7f6a0", "metadata": {}, "source": [ "Let’s do some tracking! We’ll use [Ultralytics tracking](https://docs.ultralytics.com/modes/track) to generate some object tracking predictions. This combines object detection using YOLOv8 with a second stage where detections are associated into trajectories.\n", "\n", "First, we’ll install the ultralytics package. Note that you may need to install `python3.x-dev` on your system in order to complete this installation." ] }, { "cell_type": "code", "execution_count": 44, "id": "e24eae5f-d784-412d-b999-d12da8f4dc99", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: ultralytics in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (8.0.203)\n", "Requirement already satisfied: matplotlib>=3.3.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (3.5.2)\n", "Requirement already satisfied: numpy>=1.22.2 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (1.24.4)\n", "Requirement already satisfied: opencv-python>=4.6.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (4.8.1.78)\n", "Requirement already satisfied: pillow>=7.1.2 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (10.0.1)\n", "Requirement already satisfied: pyyaml>=5.3.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (6.0.1)\n", "Requirement already satisfied: requests>=2.23.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (2.31.0)\n", "Requirement already satisfied: scipy>=1.4.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (1.9.1)\n", "Requirement already satisfied: torch>=1.8.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (2.1.0)\n", "Requirement already satisfied: torchvision>=0.9.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (0.16.0)\n", "Requirement already satisfied: tqdm>=4.64.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (4.66.1)\n", "Requirement already satisfied: pandas>=1.1.4 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (2.1.2)\n", "Requirement already satisfied: seaborn>=0.11.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (0.13.0)\n", "Requirement already satisfied: psutil in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (5.9.6)\n", "Requirement already satisfied: py-cpuinfo in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (9.0.0)\n", "Requirement already satisfied: thop>=0.1.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from ultralytics) (0.1.1.post2209072238)\n", "Requirement already satisfied: cycler>=0.10 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from matplotlib>=3.3.0->ultralytics) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from matplotlib>=3.3.0->ultralytics) (4.43.1)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from matplotlib>=3.3.0->ultralytics) (1.4.5)\n", "Requirement already satisfied: packaging>=20.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from matplotlib>=3.3.0->ultralytics) (23.2)\n", "Requirement already satisfied: pyparsing>=2.2.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from matplotlib>=3.3.0->ultralytics) (3.1.1)\n", "Requirement already satisfied: python-dateutil>=2.7 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from matplotlib>=3.3.0->ultralytics) (2.8.2)\n", "Requirement already satisfied: pytz>=2020.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from pandas>=1.1.4->ultralytics) (2022.1)\n", "Requirement already satisfied: tzdata>=2022.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from pandas>=1.1.4->ultralytics) (2023.3)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from requests>=2.23.0->ultralytics) (3.3.1)\n", "Requirement already satisfied: idna<4,>=2.5 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from requests>=2.23.0->ultralytics) (3.4)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from requests>=2.23.0->ultralytics) (1.26.18)\n", "Requirement already satisfied: certifi>=2017.4.17 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from requests>=2.23.0->ultralytics) (2023.7.22)\n", "Requirement already satisfied: filelock in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (3.13.1)\n", "Requirement already satisfied: typing-extensions in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (4.8.0)\n", "Requirement already satisfied: sympy in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (1.12)\n", "Requirement already satisfied: networkx in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (3.2.1)\n", "Requirement already satisfied: jinja2 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (3.0.3)\n", "Requirement already satisfied: fsspec in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (2023.10.0)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (12.1.105)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (12.1.105)\n", "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (12.1.105)\n", "Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (8.9.2.26)\n", "Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (12.1.3.1)\n", "Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (11.0.2.54)\n", "Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (10.3.2.106)\n", "Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (11.4.5.107)\n", "Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (12.1.0.106)\n", "Requirement already satisfied: nvidia-nccl-cu12==2.18.1 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (2.18.1)\n", "Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (12.1.105)\n", "Requirement already satisfied: triton==2.1.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from torch>=1.8.0->ultralytics) (2.1.0)\n", "Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics) (12.3.52)\n", "Requirement already satisfied: six>=1.5 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics) (1.16.0)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from jinja2->torch>=1.8.0->ultralytics) (2.1.3)\n", "Requirement already satisfied: mpmath>=0.19 in /home/dan/anaconda3/envs/dev/lib/python3.9/site-packages (from sympy->torch>=1.8.0->ultralytics) (1.3.0)\n" ] } ], "source": [ "!pip install ultralytics" ] }, { "cell_type": "code", "execution_count": 12, "id": "5dd0c1a1-1dec-4f31-910e-fbf5a3eb33b3", "metadata": {}, "outputs": [], "source": [ "import ultralytics" ] }, { "cell_type": "code", "execution_count": 13, "id": "737caa9d-0140-4e4b-9c0c-03e9137d54e9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tracking movie /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "\n", "WARNING ⚠️ inference results will accumulate in RAM unless `stream=True` is passed, causing potential out-of-memory\n", "errors for large sources or long-running streams and videos. See https://docs.ultralytics.com/modes/predict/ for help.\n", "\n", "Example:\n", " results = model(source=..., stream=True) # generator of Results objects\n", " for r in results:\n", " boxes = r.boxes # Boxes object for bbox outputs\n", " masks = r.masks # Masks object for segment masks outputs\n", " probs = r.probs # Class probabilities for classification outputs\n", "\n", "video 1/1 (1/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 89.8ms\n", "video 1/1 (2/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.0ms\n", "video 1/1 (3/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (4/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.9ms\n", "video 1/1 (5/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 4.9ms\n", "video 1/1 (6/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 4.3ms\n", "video 1/1 (7/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 4.5ms\n", "video 1/1 (8/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 5.1ms\n", "video 1/1 (9/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (10/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (11/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 4.7ms\n", "video 1/1 (12/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 5.1ms\n", "video 1/1 (13/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.7ms\n", "video 1/1 (14/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 5.1ms\n", "video 1/1 (15/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 5.5ms\n", "video 1/1 (16/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 4.5ms\n", "video 1/1 (17/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 4.8ms\n", "video 1/1 (18/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 5.1ms\n", "video 1/1 (19/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (20/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.0ms\n", "video 1/1 (21/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.1ms\n", "video 1/1 (22/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.4ms\n", "video 1/1 (23/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (24/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.3ms\n", "video 1/1 (25/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (26/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (27/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.8ms\n", "video 1/1 (28/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (29/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (30/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.7ms\n", "video 1/1 (31/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.9ms\n", "video 1/1 (32/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 4.5ms\n", "video 1/1 (33/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 4.9ms\n", "video 1/1 (34/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 3 persons, 5.1ms\n", "video 1/1 (35/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.5ms\n", "video 1/1 (36/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.4ms\n", "video 1/1 (37/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (38/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.6ms\n", "video 1/1 (39/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.0ms\n", "video 1/1 (40/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.6ms\n", "video 1/1 (41/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.1ms\n", "video 1/1 (42/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.7ms\n", "video 1/1 (43/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (44/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (45/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.0ms\n", "video 1/1 (46/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.9ms\n", "video 1/1 (47/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (48/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.6ms\n", "video 1/1 (49/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.8ms\n", "video 1/1 (50/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (51/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.7ms\n", "video 1/1 (52/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.5ms\n", "video 1/1 (53/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (54/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 6.1ms\n", "video 1/1 (55/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.1ms\n", "video 1/1 (56/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.5ms\n", "video 1/1 (57/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.7ms\n", "video 1/1 (58/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (59/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (60/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.5ms\n", "video 1/1 (61/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (62/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (63/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.9ms\n", "video 1/1 (64/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (65/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (66/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (67/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.7ms\n", "video 1/1 (68/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.9ms\n", "video 1/1 (69/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.4ms\n", "video 1/1 (70/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (71/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.3ms\n", "video 1/1 (72/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.2ms\n", "video 1/1 (73/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.5ms\n", "video 1/1 (74/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (75/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 1 handbag, 5.0ms\n", "video 1/1 (76/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 1 handbag, 4.2ms\n", "video 1/1 (77/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 1 handbag, 4.2ms\n", "video 1/1 (78/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 1 backpack, 5.4ms\n", "video 1/1 (79/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.4ms\n", "video 1/1 (80/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (81/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 1 backpack, 4.9ms\n", "video 1/1 (82/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.6ms\n", "video 1/1 (83/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (84/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (85/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 1 handbag, 4.7ms\n", "video 1/1 (86/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 1 handbag, 5.4ms\n", "video 1/1 (87/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.6ms\n", "video 1/1 (88/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.9ms\n", "video 1/1 (89/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (90/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (91/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.3ms\n", "video 1/1 (92/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.8ms\n", "video 1/1 (93/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (94/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (95/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.6ms\n", "video 1/1 (96/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.9ms\n", "video 1/1 (97/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.4ms\n", "video 1/1 (98/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (99/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.3ms\n", "video 1/1 (100/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 1 handbag, 4.2ms\n", "video 1/1 (101/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.6ms\n", "video 1/1 (102/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 6.1ms\n", "video 1/1 (103/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.6ms\n", "video 1/1 (104/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (105/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 1 handbag, 4.2ms\n", "video 1/1 (106/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.8ms\n", "video 1/1 (107/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.8ms\n", "video 1/1 (108/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (109/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.6ms\n", "video 1/1 (110/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.6ms\n", "video 1/1 (111/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (112/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (113/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (114/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.6ms\n", "video 1/1 (115/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.0ms\n", "video 1/1 (116/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.4ms\n", "video 1/1 (117/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (118/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 6.3ms\n", "video 1/1 (119/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.9ms\n", "video 1/1 (120/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (121/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (122/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.5ms\n", "video 1/1 (123/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.1ms\n", "video 1/1 (124/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (125/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (126/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.7ms\n", "video 1/1 (127/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.9ms\n", "video 1/1 (128/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (129/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.4ms\n", "video 1/1 (130/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.0ms\n", "video 1/1 (131/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.2ms\n", "video 1/1 (132/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (133/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (134/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 6.2ms\n", "video 1/1 (135/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.3ms\n", "video 1/1 (136/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (137/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.2ms\n", "video 1/1 (138/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.2ms\n", "video 1/1 (139/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.8ms\n", "video 1/1 (140/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (141/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (142/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.8ms\n", "video 1/1 (143/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.0ms\n", "video 1/1 (144/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (145/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (146/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (147/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 7.0ms\n", "video 1/1 (148/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 7.8ms\n", "video 1/1 (149/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (150/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 6.1ms\n", "video 1/1 (151/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.9ms\n", "video 1/1 (152/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 1 handbag, 4.4ms\n", "video 1/1 (153/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.8ms\n", "video 1/1 (154/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 6.0ms\n", "video 1/1 (155/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (156/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 6.6ms\n", "video 1/1 (157/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (158/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.7ms\n", "video 1/1 (159/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.4ms\n", "video 1/1 (160/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (161/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.6ms\n", "video 1/1 (162/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (163/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.5ms\n", "video 1/1 (164/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (165/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.5ms\n", "video 1/1 (166/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (167/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (168/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.7ms\n", "video 1/1 (169/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (170/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.5ms\n", "video 1/1 (171/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (172/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.5ms\n", "video 1/1 (173/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.9ms\n", "video 1/1 (174/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.2ms\n", "video 1/1 (175/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.1ms\n", "video 1/1 (176/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.4ms\n", "video 1/1 (177/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.0ms\n", "video 1/1 (178/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (179/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.1ms\n", "video 1/1 (180/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.2ms\n", "video 1/1 (181/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.8ms\n", "video 1/1 (182/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.4ms\n", "video 1/1 (183/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (184/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.6ms\n", "video 1/1 (185/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.8ms\n", "video 1/1 (186/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.1ms\n", "video 1/1 (187/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.8ms\n", "video 1/1 (188/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.7ms\n", "video 1/1 (189/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.2ms\n", "video 1/1 (190/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.2ms\n", "video 1/1 (191/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.7ms\n", "video 1/1 (192/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.6ms\n", "video 1/1 (193/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (194/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (195/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.9ms\n", "video 1/1 (196/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.9ms\n", "video 1/1 (197/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (198/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.2ms\n", "video 1/1 (199/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.3ms\n", "video 1/1 (200/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.0ms\n", "video 1/1 (201/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.8ms\n", "video 1/1 (202/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.6ms\n", "video 1/1 (203/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.9ms\n", "video 1/1 (204/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.2ms\n", "video 1/1 (205/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.2ms\n", "video 1/1 (206/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (207/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.1ms\n", "video 1/1 (208/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.5ms\n", "video 1/1 (209/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 1 tv, 4.2ms\n", "video 1/1 (210/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.6ms\n", "video 1/1 (211/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.7ms\n", "video 1/1 (212/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.2ms\n", "video 1/1 (213/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.2ms\n", "video 1/1 (214/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (215/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.1ms\n", "video 1/1 (216/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.2ms\n", "video 1/1 (217/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 10 persons, 4.3ms\n", "video 1/1 (218/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 10 persons, 6.7ms\n", "video 1/1 (219/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 10 persons, 4.6ms\n", "video 1/1 (220/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.2ms\n", "video 1/1 (221/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.5ms\n", "video 1/1 (222/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.2ms\n", "video 1/1 (223/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.8ms\n", "video 1/1 (224/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 1 umbrella, 4.3ms\n", "video 1/1 (225/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 1 umbrella, 4.1ms\n", "video 1/1 (226/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.5ms\n", "video 1/1 (227/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.1ms\n", "video 1/1 (228/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.3ms\n", "video 1/1 (229/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.6ms\n", "video 1/1 (230/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.9ms\n", "video 1/1 (231/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 10 persons, 4.4ms\n", "video 1/1 (232/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 10 persons, 4.4ms\n", "video 1/1 (233/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 11 persons, 5.2ms\n", "video 1/1 (234/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 11 persons, 5.6ms\n", "video 1/1 (235/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 10 persons, 6.1ms\n", "video 1/1 (236/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.9ms\n", "video 1/1 (237/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 6.1ms\n", "video 1/1 (238/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.5ms\n", "video 1/1 (239/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.5ms\n", "video 1/1 (240/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.8ms\n", "video 1/1 (241/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.2ms\n", "video 1/1 (242/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.1ms\n", "video 1/1 (243/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.7ms\n", "video 1/1 (244/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.8ms\n", "video 1/1 (245/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.5ms\n", "video 1/1 (246/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.4ms\n", "video 1/1 (247/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.0ms\n", "video 1/1 (248/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.2ms\n", "video 1/1 (249/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.4ms\n", "video 1/1 (250/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 6.1ms\n", "video 1/1 (251/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.6ms\n", "video 1/1 (252/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (253/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.6ms\n", "video 1/1 (254/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.1ms\n", "video 1/1 (255/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.2ms\n", "video 1/1 (256/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.2ms\n", "video 1/1 (257/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.7ms\n", "video 1/1 (258/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.0ms\n", "video 1/1 (259/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.3ms\n", "video 1/1 (260/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.3ms\n", "video 1/1 (261/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.6ms\n", "video 1/1 (262/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.4ms\n", "video 1/1 (263/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.2ms\n", "video 1/1 (264/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.8ms\n", "video 1/1 (265/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 5.0ms\n", "video 1/1 (266/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 4.2ms\n", "video 1/1 (267/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 5.4ms\n", "video 1/1 (268/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 5.1ms\n", "video 1/1 (269/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 5.8ms\n", "video 1/1 (270/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 5.0ms\n", "video 1/1 (271/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 6.7ms\n", "video 1/1 (272/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (273/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.9ms\n", "video 1/1 (274/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.8ms\n", "video 1/1 (275/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.4ms\n", "video 1/1 (276/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (277/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.9ms\n", "video 1/1 (278/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (279/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 6.2ms\n", "video 1/1 (280/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.2ms\n", "video 1/1 (281/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (282/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.5ms\n", "video 1/1 (283/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.6ms\n", "video 1/1 (284/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.4ms\n", "video 1/1 (285/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.6ms\n", "video 1/1 (286/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.5ms\n", "video 1/1 (287/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.9ms\n", "video 1/1 (288/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (289/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.1ms\n", "video 1/1 (290/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.3ms\n", "video 1/1 (291/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.7ms\n", "video 1/1 (292/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.4ms\n", "video 1/1 (293/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.4ms\n", "video 1/1 (294/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.2ms\n", "video 1/1 (295/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 6.4ms\n", "video 1/1 (296/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.8ms\n", "video 1/1 (297/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.6ms\n", "video 1/1 (298/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.3ms\n", "video 1/1 (299/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.2ms\n", "video 1/1 (300/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (301/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (302/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.9ms\n", "video 1/1 (303/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 6.0ms\n", "video 1/1 (304/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.3ms\n", "video 1/1 (305/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.8ms\n", "video 1/1 (306/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.3ms\n", "video 1/1 (307/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.7ms\n", "video 1/1 (308/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (309/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (310/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.6ms\n", "video 1/1 (311/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 6.6ms\n", "video 1/1 (312/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 6.0ms\n", "video 1/1 (313/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.1ms\n", "video 1/1 (314/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.1ms\n", "video 1/1 (315/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (316/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.6ms\n", "video 1/1 (317/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.7ms\n", "video 1/1 (318/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (319/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 6.4ms\n", "video 1/1 (320/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.5ms\n", "video 1/1 (321/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.4ms\n", "video 1/1 (322/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.9ms\n", "video 1/1 (323/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.2ms\n", "video 1/1 (324/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.5ms\n", "video 1/1 (325/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (326/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 6.5ms\n", "video 1/1 (327/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (328/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 6.0ms\n", "video 1/1 (329/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.9ms\n", "video 1/1 (330/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 1 handbag, 4.5ms\n", "video 1/1 (331/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (332/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 1 handbag, 6.3ms\n", "video 1/1 (333/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 1 handbag, 4.3ms\n", "video 1/1 (334/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (335/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.8ms\n", "video 1/1 (336/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.0ms\n", "video 1/1 (337/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (338/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (339/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 1 handbag, 5.9ms\n", "video 1/1 (340/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (341/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (342/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.6ms\n", "video 1/1 (343/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (344/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.6ms\n", "video 1/1 (345/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.6ms\n", "video 1/1 (346/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (347/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (348/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (349/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.9ms\n", "video 1/1 (350/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.6ms\n", "video 1/1 (351/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 6.0ms\n", "video 1/1 (352/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.9ms\n", "video 1/1 (353/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (354/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (355/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (356/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.9ms\n", "video 1/1 (357/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (358/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 1 handbag, 4.6ms\n", "video 1/1 (359/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.7ms\n", "video 1/1 (360/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 6.2ms\n", "video 1/1 (361/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (362/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (363/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.0ms\n", "video 1/1 (364/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (365/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (366/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.2ms\n", "video 1/1 (367/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.9ms\n", "video 1/1 (368/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 1 handbag, 5.0ms\n", "video 1/1 (369/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 1 handbag, 4.4ms\n", "video 1/1 (370/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 2 handbags, 5.5ms\n", "video 1/1 (371/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 1 handbag, 4.6ms\n", "video 1/1 (372/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (373/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.3ms\n", "video 1/1 (374/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.9ms\n", "video 1/1 (375/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (376/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.8ms\n", "video 1/1 (377/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.7ms\n", "video 1/1 (378/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (379/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 1 handbag, 4.4ms\n", "video 1/1 (380/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.2ms\n", "video 1/1 (381/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.6ms\n", "video 1/1 (382/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 1 handbag, 4.3ms\n", "video 1/1 (383/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 1 handbag, 7.0ms\n", "video 1/1 (384/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 1 handbag, 4.3ms\n", "video 1/1 (385/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.6ms\n", "video 1/1 (386/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.7ms\n", "video 1/1 (387/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.4ms\n", "video 1/1 (388/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (389/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.1ms\n", "video 1/1 (390/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 1 handbag, 5.7ms\n", "video 1/1 (391/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (392/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.8ms\n", "video 1/1 (393/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.9ms\n", "video 1/1 (394/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (395/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (396/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.2ms\n", "video 1/1 (397/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.9ms\n", "video 1/1 (398/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (399/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (400/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.2ms\n", "video 1/1 (401/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (402/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.4ms\n", "video 1/1 (403/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 1 handbag, 4.6ms\n", "video 1/1 (404/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.8ms\n", "video 1/1 (405/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (406/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 1 handbag, 4.4ms\n", "video 1/1 (407/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.0ms\n", "video 1/1 (408/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 2 handbags, 4.7ms\n", "video 1/1 (409/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 2 handbags, 4.2ms\n", "video 1/1 (410/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.0ms\n", "video 1/1 (411/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.2ms\n", "video 1/1 (412/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (413/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.5ms\n", "video 1/1 (414/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (415/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.1ms\n", "video 1/1 (416/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (417/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.0ms\n", "video 1/1 (418/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.5ms\n", "video 1/1 (419/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.5ms\n", "video 1/1 (420/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 1 handbag, 6.3ms\n", "video 1/1 (421/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.4ms\n", "video 1/1 (422/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 6.2ms\n", "video 1/1 (423/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.2ms\n", "video 1/1 (424/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (425/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.8ms\n", "video 1/1 (426/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (427/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (428/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (429/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.6ms\n", "video 1/1 (430/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.3ms\n", "video 1/1 (431/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (432/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (433/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 1 handbag, 4.8ms\n", "video 1/1 (434/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.6ms\n", "video 1/1 (435/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.2ms\n", "video 1/1 (436/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.0ms\n", "video 1/1 (437/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 1 handbag, 5.0ms\n", "video 1/1 (438/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (439/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.6ms\n", "video 1/1 (440/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.1ms\n", "video 1/1 (441/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (442/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (443/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 1 handbag, 5.3ms\n", "video 1/1 (444/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 2 handbags, 4.9ms\n", "video 1/1 (445/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (446/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.7ms\n", "video 1/1 (447/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.3ms\n", "video 1/1 (448/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.5ms\n", "video 1/1 (449/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.7ms\n", "video 1/1 (450/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.3ms\n", "video 1/1 (451/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.8ms\n", "video 1/1 (452/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.1ms\n", "video 1/1 (453/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.4ms\n", "video 1/1 (454/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.8ms\n", "video 1/1 (455/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 5.6ms\n", "video 1/1 (456/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (457/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.3ms\n", "video 1/1 (458/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.9ms\n", "video 1/1 (459/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.7ms\n", "video 1/1 (460/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.3ms\n", "video 1/1 (461/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.0ms\n", "video 1/1 (462/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.8ms\n", "video 1/1 (463/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.4ms\n", "video 1/1 (464/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.4ms\n", "video 1/1 (465/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.3ms\n", "video 1/1 (466/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (467/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.7ms\n", "video 1/1 (468/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.9ms\n", "video 1/1 (469/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.9ms\n", "video 1/1 (470/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (471/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.7ms\n", "video 1/1 (472/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 9 persons, 5.2ms\n", "video 1/1 (473/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.9ms\n", "video 1/1 (474/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (475/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.6ms\n", "video 1/1 (476/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.4ms\n", "video 1/1 (477/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.6ms\n", "video 1/1 (478/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.0ms\n", "video 1/1 (479/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.8ms\n", "video 1/1 (480/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.7ms\n", "video 1/1 (481/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 6.2ms\n", "video 1/1 (482/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.4ms\n", "video 1/1 (483/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.3ms\n", "video 1/1 (484/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.6ms\n", "video 1/1 (485/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.6ms\n", "video 1/1 (486/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.5ms\n", "video 1/1 (487/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.5ms\n", "video 1/1 (488/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.9ms\n", "video 1/1 (489/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.5ms\n", "video 1/1 (490/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (491/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.2ms\n", "video 1/1 (492/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.0ms\n", "video 1/1 (493/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.9ms\n", "video 1/1 (494/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.1ms\n", "video 1/1 (495/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 4.5ms\n", "video 1/1 (496/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.1ms\n", "video 1/1 (497/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.1ms\n", "video 1/1 (498/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.6ms\n", "video 1/1 (499/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.2ms\n", "video 1/1 (500/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.7ms\n", "video 1/1 (501/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.6ms\n", "video 1/1 (502/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.2ms\n", "video 1/1 (503/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 4.4ms\n", "video 1/1 (504/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.3ms\n", "video 1/1 (505/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (506/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.8ms\n", "video 1/1 (507/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.1ms\n", "video 1/1 (508/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.4ms\n", "video 1/1 (509/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (510/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.7ms\n", "video 1/1 (511/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.8ms\n", "video 1/1 (512/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.3ms\n", "video 1/1 (513/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.7ms\n", "video 1/1 (514/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 5.5ms\n", "video 1/1 (515/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (516/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (517/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 4 persons, 4.9ms\n", "video 1/1 (518/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 8 persons, 5.0ms\n", "video 1/1 (519/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.2ms\n", "video 1/1 (520/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 7 persons, 4.2ms\n", "video 1/1 (521/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 5 persons, 5.4ms\n", "video 1/1 (522/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.2ms\n", "video 1/1 (523/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.3ms\n", "video 1/1 (524/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 5.4ms\n", "video 1/1 (525/525) /home/dan/Documents/track/MOT17/movies/MOT17-09.mp4: 384x640 6 persons, 4.7ms\n", "Speed: 1.5ms preprocess, 5.0ms inference, 1.5ms postprocess per image at shape (1, 3, 384, 640)\n" ] } ], "source": [ "view = dataset.skip(1)\n", "mov_track = view.first().filepath\n", "print(f'Tracking movie {mov_track}')\n", "model = ultralytics.YOLO('yolov8n.pt')\n", "results = model.track(mov_track,show=False)" ] }, { "cell_type": "markdown", "id": "9cf6ffd4-1710-44e2-8fdc-42b91709e129", "metadata": {}, "source": [ "Let’s load our tracking results! The tracker has output detections in a csv and we will load them as we did with the groundtruth trajectories." ] }, { "cell_type": "code", "execution_count": 14, "id": "5dd50598-a739-4853-8ecc-5ca38c551d8e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "frame 0, 5 detections\n", "frame 50, 6 detections\n", "frame 100, 5 detections\n", "frame 150, 5 detections\n", "frame 200, 8 detections\n", "frame 250, 7 detections\n", "frame 300, 6 detections\n", "frame 350, 4 detections\n", "frame 400, 5 detections\n", "frame 450, 6 detections\n", "frame 500, 7 detections\n" ] } ], "source": [ "imw = view.first().metadata.frame_width\n", "imh = view.first().metadata.frame_height\n", "\n", "for frm,resobj in enumerate(results):\n", " f = view.first().frames[frm+1]\n", " try:\n", " if f.yolo8 is None:\n", " f.yolo8 = fo.Detections()\n", " except AttributeError:\n", " f['yolo8'] = fo.Detections()\n", " \n", " boxes = resobj.boxes\n", " is_person = boxes.cls.numpy() == 0\n", " bxs = boxes.data.numpy()[is_person]\n", " for b in bxs:\n", " bb = b[:4].tolist()\n", " bb = [bb[0]/imw, bb[1]/imh, (bb[2]-bb[0])/imw, (bb[3]-bb[1])/imh]\n", " idx = int(b[4])\n", " conf = float(b[5])\n", " det = fo.Detection(label='person',bounding_box=bb,index=idx,confidence=conf)\n", " f.yolo8.detections.append(det)\n", " f.save()\n", " \n", " if frm % 50==0:\n", " print(f'frame {frm}, {len(bxs)} detections')" ] }, { "cell_type": "code", "execution_count": 24, "id": "e1c0ff4c-28c7-4fa5-8391-7d489f1464e9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "session.view = view" ] }, { "cell_type": "markdown", "id": "2abd7417-475a-43aa-8ca4-d978a65723a2", "metadata": {}, "source": [ "## Evaluate Our Tracking" ] }, { "cell_type": "markdown", "id": "dd6a7566-cd5f-4b4e-b93f-bc4bcaa12215", "metadata": {}, "source": [ "The tracker has generated detections and also stitched them into trajectories, typically by utilizing some combination of a motion and appearance/reID model. How can we gain insight into the quality of the tracking?\n", "\n", "One step is to evaluate false positive and false negative detections. This can be done using FiftyOne’s built-in evaluate_detections method, which supports video datasets and will compute evaluation statistics on frame-level detections.\n", "\n", "For multiple object tracking in video, false positive and false negative detections do not tell the whole story. Various metrics (see eg [TrackEval](https://github.com/JonathonLuiten/TrackEval) can be defined to assess different aspects of this problem. We’ll leave a deep dive into this type of evaluation for another time. Here, we focus on finding identity swaps in the tracking. One type of identity swap occurs when a predicted trajectory jumps from one individual to another. This can occur when two trajectories cross paths and occlude each other, for example. (We use the term “identity swap” informally; more careful definitions can be made, eg in [this article](https://link.springer.com/article/10.1007/s11263-020-01375-2)).\n", "\n", "One of FiftyOne’s strengths when working with video is that it is easy to switch between data modalities. We can convert full videos to individual clips, for instance, or from videos to images. In this next analysis, we’ll convert our tracked video to individual frames and work with image samples.\n", "\n", "Since we only included people during tracking, we’ll filter our view to include only the `person` class from the ground_truth.\n", "\n", "Then, we’ll call `to_frames` which will convert our view to an image/frame-based dataset." ] }, { "cell_type": "code", "execution_count": 17, "id": "455eeaa4-9f24-4b75-b502-494368427b8b", "metadata": {}, "outputs": [], "source": [ "from fiftyone import ViewField as F\n", "\n", "view_frames = view.to_frames(sample_frames=True) \\\n", " .filter_labels('gt',F('label').is_in(['person','person_static']))\n", "ds_frames = view_frames.clone()\n", "ds_frames.name = view_frames.dataset_name + '_frames_yt'\n", "ds_frames.persistent = True" ] }, { "cell_type": "markdown", "id": "eb6529fb-e266-48f0-a03b-da312a417616", "metadata": {}, "source": [ "As a sanity check, how many trajectories do we have?" ] }, { "cell_type": "code", "execution_count": 18, "id": "70cd0fb9-a38c-45ab-8458-b68b75d40685", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "27\n", "11\n" ] } ], "source": [ "print(len(ds_frames.distinct('gt.detections.index')))\n", "print(len(ds_frames.distinct('yolo8.detections.index')))" ] }, { "cell_type": "markdown", "id": "1b5d4f98-8f0b-4d6f-b4e6-b7da378de0f3", "metadata": {}, "source": [ "To investigate identity swaps, predicted and ground truth trajectories must be associated with each other, as their trajectory indices have been generated independently. We’ll do a very simple greedy matching process for illustrative purposes. A more [rigorous approach](https://link.springer.com/article/10.1007/s11263-020-01375-2) might use the [Hungarian algorithm](https://en.wikipedia.org/wiki/Hungarian_algorithm) to match detections, or even entire trajectories.\n", "\n", "We’ll take the midpoint of each predicted trajectory and look for the ground truth bounding box that minimizes an L2 distance with the predicted bounding box in that frame. We assign that ground truth index to the predicted trajectory for all of its frames. We use the midpoint of the trajectory rather than its endpoints, as trajectory endpoints may involve more noise due to occlusions\n", "or people entering/exiting the scene." ] }, { "cell_type": "code", "execution_count": 19, "id": "11a3eb04-5775-423e-a86b-330c4eab8180", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frame 263: Yolo index 1 -> GT index 29, dist is 0.01\n", "Frame 263: Yolo index 2 -> GT index 13, dist is 0.01\n", "Frame 263: Yolo index 3 -> GT index 8, dist is 0.02\n", "Frame 269: Yolo index 4 -> GT index 13, dist is 0.02\n", "Frame 263: Yolo index 5 -> GT index 12, dist is 0.01\n", "Frame 281: Yolo index 6 -> GT index 18, dist is 0.01\n", "Frame 266: Yolo index 7 -> GT index 21, dist is 0.01\n", "Frame 249: Yolo index 8 -> GT index 22, dist is 0.01\n", "Frame 243: Yolo index 9 -> GT index 22, dist is 0.01\n", "Frame 232: Yolo index 10 -> GT index 62, dist is 0.11\n", "Frame 234: Yolo index 11 -> GT index 62, dist is 0.18\n" ] } ], "source": [ "yolo_to_gt = {}\n", "idxs = ds_frames.distinct('yolo8.detections.index')\n", "for idx in idxs:\n", " frms = ds_frames.filter_labels('yolo8',F('index')==idx,only_matches=True) \\\n", " .values('frame_number')\n", " mid_idx = len(frms) // 2\n", " frm_mid = frms[mid_idx]\n", " \n", " samp_mid = ds_frames.match(F('frame_number')==frm_mid)\n", " assert len(samp_mid)==1\n", " \n", " gt_bbs,gt_idxs = samp_mid.values(['gt.detections.bounding_box', 'gt.detections.index'])\n", " gt_bbs = gt_bbs[0]\n", " gt_idxs = gt_idxs[0]\n", " bbs_gt = np.array(gt_bbs)\n", " bbs_gt[:,2] += bbs_gt[:,0]\n", " bbs_gt[:,3] += bbs_gt[:,1]\n", " \n", " bb_pred = samp_mid.filter_labels('yolo8',F('index')==idx).values('yolo8.detections.bounding_box')\n", " assert len(bb_pred)==1\n", " bb = np.array(bb_pred[0])\n", " bb[:,2] += bb[:,0]\n", " bb[:,3] += bb[:,1]\n", " \n", " dists = np.linalg.norm(bbs_gt-bb,axis=1)\n", " gt_idx_argmin = np.argmin(dists)\n", " gt_idx = gt_idxs[gt_idx_argmin]\n", " yolo_to_gt[idx] = gt_idx\n", " print(f'Frame {frm_mid}: Yolo index {idx} -> GT index {gt_idx}, dist is {dists[gt_idx_argmin]:.2f}')" ] }, { "cell_type": "markdown", "id": "b73a02e3-6513-4aea-a07a-f999e0f3278d", "metadata": {}, "source": [ "We now update our labels to account for the trajectory index. In effect, we create classes like `person00` , `person01` , etc based on the tracked individuals. With the classes updated in this way, we can run FiftyOne’s object detection evaluation out of the box." ] }, { "cell_type": "code", "execution_count": 20, "id": "e71a17bd-2fcf-4b84-bbc4-7c61161f8829", "metadata": {}, "outputs": [], "source": [ "for s in ds_frames:\n", " for det in s.gt.detections:\n", " det.label = f'{det.label}{det.index:02}'\n", " for det in s.yolo8.detections:\n", " new_index = yolo_to_gt[det.index]\n", " det.label = f'{det.label}{new_index:02}'\n", " s.save()" ] }, { "cell_type": "code", "execution_count": 21, "id": "a3447414-36b8-472a-bc93-5b8915a1f979", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluating detections...\n", " 100% |█████████████████| 525/525 [6.4s elapsed, 0s remaining, 80.2 samples/s] \n" ] } ], "source": [ "eval_res = ds_frames.evaluate_detections('yolo8',gt_field='gt',eval_key='eval')" ] }, { "cell_type": "markdown", "id": "1bfe7b1d-79f9-4935-bb38-abc860ab4f10", "metadata": {}, "source": [ "In the [evaluation patches view](https://docs.voxel51.com/user_guide/app.html#viewing-evaluation-patches), false positives often represent an identity swap where the assigned and ground truth individuals (classes) do not match.\n", "\n", "Let’s examine evaluation patches that are false positives. For simplicity we focus on large detections where the bounding box exceeds a certain size." ] }, { "cell_type": "code", "execution_count": 22, "id": "5798baf9-31af-4580-81dc-db716447e61f", "metadata": {}, "outputs": [], "source": [ "view_eval = ds_frames.to_evaluation_patches(eval_key='eval',config=None)\n", "bbox_area = F('bounding_box')[2] * F('bounding_box')[3]\n", "large_boxes = F('yolo8.detections').filter(bbox_area>0.05)\n", "view_eval_fps_large = view_eval.match(F('type')=='fp').match(large_boxes.length()>0)" ] }, { "cell_type": "code", "execution_count": 23, "id": "bbc08c9d-1d8e-41ab-9d73-437e333a8c37", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "session.view = view_eval_fps_large" ] }, { "cell_type": "code", "execution_count": 28, "id": "cee43540-8798-46ab-883b-92b632325403", "metadata": {}, "outputs": [], "source": [ "SUSP_YOLO_IDXS = [1,29,69] # Indices identified browsing in the FiftyOne App. Tracking results may be stochastic to some extent\n", "trajectories = view.filter_labels(\"frames.yolo8\", F(\"index\").is_in(SUSP_YOLO_IDXS)).to_trajectories(\"frames.yolo8\")" ] }, { "cell_type": "code", "execution_count": 29, "id": "094c32d4-9cdb-46f5-8612-9ee76b900868", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "session.view = trajectories" ] }, { "cell_type": "code", "execution_count": null, "id": "4b8c9f65-34a0-4a5c-9b6e-1e6fde348c45", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" } }, "nbformat": 4, "nbformat_minor": 5 }