From 67b4b3e762571e70beadf940a64ed62d9481dafe Mon Sep 17 00:00:00 2001 From: sheridana Date: Fri, 3 Jun 2022 10:47:54 -0700 Subject: [PATCH] Update tracking docs (#761) * Convert gui and proofreading rst files to md * Add section in proofreading for culling target instances * Add propagate track labels docs to gui and proofreading Co-authored-by: Arlo Sheridan <38435167+sheridana@users.noreply.github.com> --- .github/workflows/website.yml | 2 +- docs/_static/set-instance-count.jpg | Bin 0 -> 53524 bytes docs/guides/{gui.rst => gui.md} | 123 ++++++++------- .../{proofreading.rst => proofreading.md} | 141 ++++++++++-------- 4 files changed, 142 insertions(+), 124 deletions(-) create mode 100644 docs/_static/set-instance-count.jpg rename docs/guides/{gui.rst => gui.md} (84%) rename docs/guides/{proofreading.rst => proofreading.md} (56%) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index b3a6032ea..3cf229300 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -8,7 +8,7 @@ on: # 'main' triggers updates to 'sleap.ai', 'develop' to 'sleap.ai/develop' - main - develop - - liezl/discussion_links + - arlo/fix_tracking_docs paths: - "docs/**" - "README.rst" diff --git a/docs/_static/set-instance-count.jpg b/docs/_static/set-instance-count.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab3db4b4a533f88bca0175ba99f5ac6e3c2313b2 GIT binary patch literal 53524 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 literal 0 HcmV?d00001 diff --git a/docs/guides/gui.rst b/docs/guides/gui.md similarity index 84% rename from docs/guides/gui.rst rename to docs/guides/gui.md index bb5b9e8dd..88cf3f656 100644 --- a/docs/guides/gui.rst +++ b/docs/guides/gui.md @@ -1,28 +1,18 @@ -.. _gui: +(gui)= -GUI -==== +# GUI -The SLEAP labeling interface is accessible via the :code:`sleap_label` command (see :ref:`cli`). +The SLEAP labeling interface is accessible via the {code}`sleap_label` command (see {ref}`cli`). - - -Menus ------ +## Menus Note that many of the menu command have keyboard shortcuts which can be configured from "**Keyboard Reference**" in the "**Help**" menu. -File ----- +## File "**New...**", "**Open...**", "Save, and "**Save As...**" have their usual behavior. -"**Import...**" allows you to import the data external formats into a new SLEAP dataset. This includes COCO_ keypoint detection (:code:`.json` files), DeepLabCut_ (:code:`.csv`), DeepPoseKit_ (:code:`.h5`), and LEAP_ (:code:`.mat`). - -.. _COCO: http://cocodataset.org/#format-data -.. _DeepPoseKit: http://deepposekit.org -.. _DeepLabCut: http://deeplabcut.org -.. _LEAP: https://github.com/talmo/leap +"**Import...**" allows you to import the data external formats into a new SLEAP dataset. This includes [COCO] keypoint detection ({code}`.json` files), [DeepLabCut] ({code}`.csv`), [DeepPoseKit] ({code}`.h5`), and [LEAP] ({code}`.mat`). "**Merge Data From...**" allows you to copy labels and/or predictions from another SLEAP dataset into the currently open project. This is useful because you can only train on data from a single SLEAP dataset, so you may need to import data before training. For instance, suppose you've trained a model and use it to get predictions on another video. You then open the predictions file in the GUI and realize that you'd like to correct some of the predictions and add those corrections to your training data. You can do this by importing data from the predictions file into the SLEAP project which has your training data. @@ -30,8 +20,7 @@ File "**Replace Videos...**" allows you to *swap* the videos currently in your project with other videos. This is useful if you want to have your project access copies of the videos at a different path, e.g., if you copy the videos between a network drive and a local drive and want to change which is used by your project. This can also be used if you want to replace you videos with copies that have been re-encoded, cropped, or edited in some other way that doesn't affect the frame numbers (since your annotations will be placed directly on the corresponding frames of the new video). -Go --- +## Go "**Next Labeled Frame**" will take you to the next frame of the video which has any labeled data—either labels added by the user or predictions. @@ -47,20 +36,17 @@ Go "**Select to Frame...**" allows you to select the clip from the current frame to a specified frame. If you want to select from frames X to Y, you can use **Go to** to go to X then **Select to** to select from X to Y. -.. _view: +(view)= -View ----- +## View "**Color Predicted Instances**" allows you to toggle whether *predicted* instances are all shown in yellow, or whether to apply distinct colors to (e.g.) track identities. You should turn this on when proofreading predictions for a video. "**Color Palette**" allows you to choose the palette which will be used for coloring instances. Most of the palettes cycle colors, so that if there are five colors in the palette, the sixth item to color will be the same as the first. A few things to know: - The "alphabet" palette has 26 visually distinct colors, which can be useful when there are many items to color. - - If the palette name ends with "+", the colors won't cycle and everything beyond the number of colors in the palette will use the last color in the palette. This is especially useful for proofreading when you're trying to merge all the track identities in the first few tracks (assuming you have a small number of instances in each frame). In particular, the "five+" palette will show any instance in the fourth or subsequent track as orange. - -- Color palettes can be customized by modifying the :code:`colors.yaml` file that SLEAP creates inside the :code:`.sleap` directory in your home directory. You can add your own palette or modify those already present in the file. Each color in a palette is listed on it's own line as r,g,b values (between 0 and 255). +- Color palettes can be customized by modifying the {code}`colors.yaml` file that SLEAP creates inside the {code}`.sleap` directory in your home directory. You can add your own palette or modify those already present in the file. Each color in a palette is listed on it's own line as r,g,b values (between 0 and 255). "**Apply Distinct Colors To**" allows you to determine whether distinct colors are used for distinct tracks (instance identities), nodes, or edges. Try it! @@ -72,7 +58,7 @@ View "**Show Edges**" allows you to toggle the visibility of the edges which connect the nodes. This can be useful when you have lots of edges which make it hard to see the features of animals in your video. -"**Edge Style**" controls whether edges are drawn as thin lines or as wedges which indicate the :ref:`orientation` of the instance (as well as the direction of the part affinity field which would be used to predict the connection between nodes when using a "bottom-up" approach). +"**Edge Style**" controls whether edges are drawn as thin lines or as wedges which indicate the {ref}`orientation` of the instance (as well as the direction of the part affinity field which would be used to predict the connection between nodes when using a "bottom-up" approach). "**Trail Length**" allows you to show a trail of where each instance was located in prior frames (the length of the trail is the number of prior frames). This can be useful when proofreading predictions since it can help you detect swaps in the identities of animals across frames. @@ -82,8 +68,7 @@ View "**Videos**", "**Skeleton**", "**Instances**", and "**Labeling Suggestions**" allow you to toggle which information windows are shown (by default these are docked to the right side of the main GUI window). -Labels ------- +## Labels "**Add Instance**" will add an instance to the current frame. You can also add an instance by right-clicking within the frame. For predicted instances, you can also "convert" the predicted instance to a regular, editable instance by double-clicking on the predicted instance (the predictions are still there, but they won't be shown unless you delete the editable instance you just created). @@ -93,6 +78,8 @@ Labels "**Set Instance Track**" sets the track for the currently selected instance. If the new track already has an instance assigned to it, then the tracks are swapped (the other instance is assigned to the track currently assigned to the selected instance). These changes are applied to instances in the same tracks in every subsequent frame, not just the current frame. +"**Propagate Track Labels**" propagates manual track selection (via proofreading) for the entirety of the selected instance's track. If selected, the track switch of an instance in the current frame will be applied in all subsequent frames. Otherwise, the track switch of an instance will only be applied in the current frame. + "**Transpose Instance Tracks**" swaps the tracks assigned to two instances. If there are only two instances in the current frame, then this command will be applied to those. If there are more then two instances, then you'll be prompted to select the two instances in sequence. (This has the same functionality as selecting an instance and using "**Set Instance Track**" with the track of the other instance). "**Delete Instance and Track**" deletes all instances in the track of the currently selected instance. This applied to *all* frames in the current video. @@ -103,8 +90,8 @@ Labels "**Clear Selection**" allows you to deselect the selected instance. -Predict -------- +## Predict + "**Run Training...**" allows you to train a set of models from the data in your open project, and then optionally predict on some frames in the project. "**Run Inference...**" allows you to generate predictions using a pre-trained set of models. Any trained models in the `models` directory next to your current project will be listed, and you also have the option to select models saved elsewhere. @@ -127,27 +114,29 @@ Predict "**Export Video with Visual Annotations...**" allows you to export a video clip with any instances drawn on the frame (much as you can see in the GUI). If you select a clip in the seekbar, just those frames will be included in the new video; otherwise the whole (current) video will be used. -Help ----- +## Help + "**Keyboard Shortcuts**" allows you to view and change keyboard shortcuts for common menu and GUI actions. -Application GUI ---------------- +## Application GUI + +## Mouse + +**Mouse wheel** on image: zoom in / out -Mouse ------ +**Left-click (hold) + drag** on image: drag image **Right-click** (or control + click) on node: Toggle visibility **Right-click** (or control + click) elsewhere on image: Add instance (with pop-up menu) -**Alt + drag**: Zoom into region +**Alt + left-click (hold) + drag** on image: Zoom into region **Alt + double-click**: Zoom out -**Alt + drag** on node (or node label): Move entire instance +**Alt + left-click (hold) + drag** on node (or node label): Move entire instance -**Alt + click and hold** on node (or node label) **+ mouse wheel**: Rotate entire instance +**Alt + left-click (hold) + mouse wheel** on node (or node label): Rotate entire instance (On a Mac, substitute **Option** for **Alt**.) @@ -159,53 +148,56 @@ Mouse **Click** elsewhere on image: Clear selection -Navigation Keys ---------------- +## Navigation Keys -**Right arrow** key: Move one frame forward +**Right arrow**: Move one frame forward -**Left arrow** key: Move one frame back +**Left arrow**: Move one frame back -**Down arrow** key: Move a *medium* step forward (4 frames by default) +**Control + Right arrow**: Move a *medium* step forward (4 frames by default) -**Up arrow** key: Move a *medium* step backward (4 frames by default) +**Control + Left arrow**: Move a *medium* step backward (4 frames by default) -**Space** key: Move a *large* step forward (100 frames by default) +**Control + Alt + Right arrow**: Move a *large* step forward (100 frames by default) -**/** key: Move a *large* step backward (100 frames by default) +**Control + Alt + Left arrow**: Move a *large* step backward (100 frames by default) -**Home** key: Move to the first frame of the video +**Home**: Move to the first frame of the video -**End** key: Move to the last frame of the video +**End**: Move to the last frame of the video **Shift** + *any navigation key*: Select the frames over which you've moved -.. note:: +:::{note} +These keys are the defaults; you can configure them with **Keyboard Shortcuts** in the **Help** menu. +::: - These keys are the defaults; you can configure them with **Keyboard Shortcuts** in the **Help** menu. +(selection_keys)= -Selection Keys --------------- +## Selection Keys -*Number* (e.g., **2**) key: Select the instance corresponding to that number +*Number* (e.g., **2**): Select the instance corresponding to that number -**Escape** key: Deselect all instances +**Control (hold)** while instance is selected: Show color-coded list of numbered +tracks (**Show tracks legend** key) -Seekbar -------- +(On a Mac, substitute **Control** for **Command**.) + +**Escape**: Deselect all instances + +## Seekbar **Shift + drag**: Select a range of frames -**Shift + click**: Clear frame selection +**Shift + left-click**: Clear frame selection -**Alt + drag**: Zoom into a range of frames +**Alt + left-click (hold) + drag**: Zoom into a range of frames -**Alt + click**: Zoom out so that all frames are visible in seekbar +**Alt + left-click**: Zoom out so that all frames are visible in seekbar -.. _suggestion-methods: +(suggestion-methods)= -Labeling Suggestions ---------------------- +## Labeling Suggestions There are various methods to generate a list "suggested" frames for labeling or proofreading. @@ -215,4 +207,9 @@ The **image feature** method uses various algorithms to give you visually distin The **prediction score** method will identify frames which have more than some number of instances predicted and where the instance prediction score is below some threshold. This method can be useful when proofreading frame-by-frame prediction results. The instance score depends on your specific skeleton so you'll need to look at the instance scores you're getting to decide an appropriate threshold. -The **velocity** method will identify frames where a predicted instance appears to move more than is typical in the video. This is based on the tracking results, so it can be useful for finding frames where the tracker incorrectly matched up two identities (since this will make the identity "jump"). \ No newline at end of file +The **velocity** method will identify frames where a predicted instance appears to move more than is typical in the video. This is based on the tracking results, so it can be useful for finding frames where the tracker incorrectly matched up two identities (since this will make the identity "jump"). + +[coco]: http://cocodataset.org/#format-data +[deeplabcut]: http://deeplabcut.org +[deepposekit]: http://deepposekit.org +[leap]: https://github.com/talmo/leap diff --git a/docs/guides/proofreading.rst b/docs/guides/proofreading.md similarity index 56% rename from docs/guides/proofreading.rst rename to docs/guides/proofreading.md index f73796b05..fea1c5ebc 100644 --- a/docs/guides/proofreading.rst +++ b/docs/guides/proofreading.md @@ -1,16 +1,41 @@ -.. _proofreading: - -Tracking and proofreading -========================== - +--- +substitutions: + orange_leg: |- + ```{image} ../_static/orange-leg.jpg + ``` + orange_track: |- + ```{image} ../_static/orange-track.jpg + ``` + swap_trails: |- + ```{image} ../_static/swap-trails.jpg + ``` + track_fixing_list: |- + ```{image} ../_static/track-fixing-list.jpg + ``` + velocity_suggestions: |- + ```{image} ../_static/velocity-suggestions.jpg + ``` + wedges: |- + ```{image} ../_static/wedges.jpg + ``` + set_instance_count: |- + ```{image} ../_static/set-instance-count.jpg + ``` +--- + +(proofreading)= + +# Tracking and proofreading + +```{note} *Case: You're happy enough with the frame-by-frame predictions but you need to correct the identities tracked across frames.* -The basics of :ref:`track_proofreading` are covered in the :ref:`Tutorial`. You should go read that if you haven't already. Here we'll go into more details. +The basics of {ref}`track_proofreading` are covered in the {ref}`Tutorial`. You should go read that if you haven't already. Here we'll go into more details. +``` -.. _tracking-method-details: +(tracking-method-details)= -Tracking methods ------------------ +## Tracking methods The process of predicting instances frame-by-frame and the process of putting these together into **tracks** (i.e., identities across frames) are distinct, although it's common to run them together during the inference pipeline. Obviously you can only track identities after you've predicted instances, but once you have predictions, it's easy to then run tracking by itself to try out different methods and parameters. @@ -18,7 +43,7 @@ If you're getting poor results, you may want to try out different methods and pa The tracker will go through the predictions frame by frame and try to match instances on frame N to candidates which already have track identities assigned. These candidates are generated from a certain number of frames immediately prior to frame N (what we refer to as the “tracking window”). -If you use the “**simple**” tracker then the frames chosen are the instances from prior frames. If you use “**flow**” as the tracking method then SLEAP takes instances from the prior frames and uses optical flow (`Xiao et al., 2018 `_) to shift the points in the instances, and then uses these shifted points as the candidate instances. +If you use the “**simple**” tracker then the frames chosen are the instances from prior frames. If you use “**flow**” as the tracking method then SLEAP takes instances from the prior frames and uses optical flow ([Xiao et al., 2018](https://arxiv.org/abs/1804.06208)) to shift the points in the instances, and then uses these shifted points as the candidate instances. There are currently three methods for matching instances in frame N against these candidates, each encoded by a cost function: @@ -28,51 +53,56 @@ There are currently three methods for matching instances in frame N against thes Once SLEAP has measured the similarity between all the candidates and the instances in frame N, you need to choose a way to pair them up. You can do this either by picking the best match, and the picking the best remaining match for each remaining instance in turn—this is “**greedy**” matching—or you can find the way of matching identities which minimizes the total cost (or: maximizes the total similarity)—this is “**Hungarian**” matching. -Finally, you have an option second-pass method which “cleans” the resulting identities. To use this method, you specify a target number of tracks (i.e., how many animals there are in your video). SLEAP then goes frame by frame and removes instances over this target number. +Finally, you have an optional second-pass method which “cleans” the resulting +identities with **"Cull to Target Instance Count"**. To use this method, you +specify a target number of tracks by setting the **"Target Number of Instances +Per Frame"** (i.e., how many animals there are in your video). SLEAP then goes +frame by frame and removes (or culls) instances over this target number. To cull +to a target number of instances per frame, navigate to the Inference Pipeline +via Predict >> Inference, then: -Once you have the desired number of instances in every frame, SLEAP connects identities with a simple heuristic: if exactly one track identity was dropped from frame N and exactly one new track identity was added in frame N+1, it matches up the dropped and the new tracks. +1) Specify the **Tracker (cross-frame identity) Method** +2) Uncheck the **No target** checkbox +3) Specify the **Target Number of Instances Per Frame** +4) Check the **Cull to Target Instance Count** checkbox +{{ set_instance_count }} -More training data? --------------------- +Once you have the desired number of instances in every frame, SLEAP connects identities with a simple heuristic: if exactly one track identity was dropped from frame N and exactly one new track identity was added in frame N+1, it matches up the dropped and the new tracks. -Often your models will fail to predict *all* of the instances on *all* of the frames. Even if you're happy enough with the result since you can interpolate missing data, it's possible that the missing instances will cause problems when we try to determine track identities across frames, so if your tracking results are poor, you may wish to :ref:`merging`. +## More training data? -The "track cleaning" script ----------------------------- +Often your models will fail to predict *all* of the instances on *all* of the frames. Even if you're happy enough with the result since you can interpolate missing data, it's possible that the missing instances will cause problems when we try to determine track identities across frames, so if your tracking results are poor, you may wish to {ref}`merging`. -There's an experimental command-line utility which tries to match up lost identities. You need to give it a predictions file which already has track assignments, and specify how many instances there should be. It looks for frames where there's exactly one lost identity and exactly one newly spawned identity, and it joins these into a single track. Suppose you have a predictions file at :code:`path/to/predictions.h5` and you want to end up with three distinct tracks. You can run +## The "track cleaning" script -:: +There's an experimental command-line utility which tries to match up lost identities. You need to give it a predictions file which already has track assignments, and specify how many instances there should be. It looks for frames where there's exactly one lost identity and exactly one newly spawned identity, and it joins these into a single track. Suppose you have a predictions file at {code}`path/to/predictions.h5` and you want to end up with three distinct tracks. You can run - python -m sleap.info.trackcleaner path/to/predictions.h5 -c 3 +``` +python -m sleap.info.trackcleaner path/to/predictions.h5 -c 3 +``` -This will result in a new file at :code:`path/to/predictions.cleaned.h5`. This file has the same format as the SLEAP labels and predictions files. +This will result in a new file at {code}`path/to/predictions.cleaned.h5`. This file has the same format as the SLEAP labels and predictions files. The main worry is that this script will connect identities which should be distinct, so that in place of **lost** identities you'll now have more **mistaken** identities, which can be harder to locate when proofreading. Tools and techniques for finding **mistaken** identities during proofreading are explained below. -Color palettes ---------------- +## Color palettes When you're proofreading track identities, the first step should always be to enable "**Color Predicted Instances**" in the View menu. Choosing the right color palette can also make a difference. If there are a small number of instances you're tracking, the "five+" palette will make it easier to see instances which were assigned to later tracks, both in on the video frame: -|orange-leg| +{{ orange_leg }} and on the seekbar: -|orange-track| - -.. |orange-leg| image:: ../_static/orange-leg.jpg -.. |orange-track| image:: ../_static/orange-track.jpg +{{ orange_track }} If there are a large number of instances you're tracking, then a palette with a large number of distinct colors can make it easier to see each distinct instance. The "alphabet" palette has 26 visually distinctive colors. -Sometimes the background in the video will make it hard to see certain colors in a palette. It's possible to edit palettes, as explained in the :ref:`view` menu section of the :ref:`gui`. +Sometimes the background in the video will make it hard to see certain colors in a palette. It's possible to edit palettes, as explained in the {ref}`view` menu section of the {ref}`gui`. -Proofreading --------------- +## Proofreading -As discussed in the :ref:`track_proofreading` section of the :ref:`Tutorial`, there are two main types of mistakes made by the tracking code: lost identities and mistaken +As discussed in the {ref}`track_proofreading` section of the {ref}`Tutorial`, there are two main types of mistakes made by the tracking code: lost identities and mistaken identities. **Lost Identities:** The code may fail to identity an instance in one @@ -81,55 +111,46 @@ frame with any instances from previous frames. Here's a strategy that works well for fixing **lost** identities: 1. Turn on colors for predicted instances and use a good color palette (as explained above). - -2. Turn on track **trails** using the "**Show Trails**" command in the "View" menu. These trails show where instances in each track were in prior frames. You can determine how many prior frames by setting the "**Trail Length**" (also in the "View" menu). - -3. Use the keyboard shortcut for the "**Next Track Spawn Frame**" command in the "Go" menu to jump to frames where a new track identity is spawned. - -4. Select the instance with the new track identity—either use the mouse, type a number key to jump to that instance, or use the **`** key to cycle through instances. - +2. Change the "**Trail Length**" to a number greater than zero. These trails show where instances in each track were in prior frames. +3. Use the keyboard shortcut for the "**Next Track Spawn Frame**" command in the **"Go"** menu to jump to frames where a new track identity is spawned. +4. Select the instance with the new track identity—either use the mouse, type a number key to jump to that instance, or use the **Select Next** key to cycle through instances. 5. The color of the track trail may help you determine which track identity should have been used. +6. Hold down the **Show tracks legend** key (see {ref}`selection_keys`) with an instance already selected and you'll see a color-coded list of numbered tracks, like so: -6. Hold down the **Control** key (or **Command** key on a Mac) with an instance already selected and you'll see a color-coded list of numbered tracks, like so: - -|track-fixing-list| - -You can then type the number key listed next to the track (while still holding down the control or command key) to assign the selected instance to the corresponding track. In the image above, you'd want to type **command-1** to assign the orange instance to the red "F" track. +{{ track_fixing_list }} +You can then type the number key listed next to the track (while still holding down the **Show tracks legend** key) to assign the selected instance to the corresponding track. In the image above, you'd want to hit **Command + 1** to assign the orange instance to the red **"F"** track. **Mistaken Identities:** The code may misidentify which instance goes in which track. -Mistake identities are harder to correct since there's no certain way to find them—if we knew where they were, then we wouldn't have gotten them wrong in the first place. But there are some strategies to make it easier to locate them in your predictions. +Mistaken identities are harder to correct since there's no certain way to find them—if we knew where they were, then we wouldn't have gotten them wrong in the first place. But there are some strategies to make it easier to locate them in your predictions. -One strategy is to set the trail length to **50** and jump through the predictions 50 frames at a time using the **down arrow** key. It's usually possible to see identity swaps by looking at the shape of the track trails, as here: +One strategy is to set the trail length to a **number greater than 0** (e.g. 50) and jump through the predictions using the **frame next large step** hotkey. It's usually possible to see identity swaps by looking at the shape of the track trails, as here: -|swap-trails| +{{ swap_trails }} -The downside of this method is that when you find the 50-frames which contain a swap, you'll then have to go through the frames individually to find exactly where the swap occurs. (You may want to turn off trails while doing this, since they can make it harder to see where the instances are in the current frame, and they also make it slower to move between frames.) +The downside of this method is that when you find the set of frames which contain a swap, you'll then have to go through the frames individually to find exactly where the swap occurs. (You may want to turn off trails while doing this, since they can make it harder to see where the instances are in the current frame, and they also make it slower to move between frames.) Another strategy is to generate **velocity**-based frame suggestions: -|velocity-suggestions| +{{ velocity_suggestions }} -In the "**Labeling Suggestions**" panel, choose the "velocity" method. You should select a node with a relatively stable position relative to the position of the body (i.e., not an appendage), and start with the default threshold. +In the "**Labeling Suggestions**" panel, choose the **"velocity"** method. You should select a node with a relatively stable position relative to the position of the body (i.e., not an appendage), and start with the default threshold. If there are far too many frame suggestions, then make the threshold higher. If there aren't very many, you might try lowering the threshold (or this may indicate that this method won't work well for this file). -Once you're happy with the number of suggested frames, you can step between these (use the keyboard shortcut for the "**Next Suggestion**" command in the "Go" menu) and quickly review whether this is in fact a swap by looking at the track trails or reviewing adjacent frames. If you've found a swap, either use the keyboard shortcut for the "**Transpose Instance Tracks**" command in the "Labels" menu, or select one of the swapped instances and use **Control** (or command) plus a number key, just like you do for fixing lost identities (as explained above). +Once you're happy with the number of suggested frames, you can step between these (using the "**Next Suggestion**" hotkey in the "Go" menu) and quickly review whether this is in fact a swap by looking at the track trails or reviewing adjacent frames. If you've found a swap, either use the keyboard shortcut for the "**Transpose Instance Tracks**" hotkey in the "Labels" menu, or select one of the swapped instances and use **Show tracks legend** hotkey plus a number key, just like you do for fixing lost identities (as explained above). + +You can optionally select "**Propagate Track Labels**". This means that +switching the tracks in one frame will also be applied in all subsequent frames. -.. _orientation: +(orientation)= -Orientation ------------- +## Orientation In some cases it may be difficult to see the orientation of the predicted instances. You can make it easier to see the orientation by changing the style of the edges drawn between nodes from thin lines (as shown above) to **wedges**, as shown here: -|wedges| +{{ wedges }} The wedges point from each **source** node to its **destination** node(s) in your skeleton. You can set the edge style using the "**Edge Style**" submenu in the "View" menu. - -.. |track-fixing-list| image:: ../_static/track-fixing-list.jpg -.. |swap-trails| image:: ../_static/swap-trails.jpg -.. |velocity-suggestions| image:: ../_static/velocity-suggestions.jpg -.. |wedges| image:: ../_static/wedges.jpg