From a923c0b2a3365eb254d0d4383dd3c5499118182e Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Tue, 31 Mar 2026 16:28:28 -0500 Subject: [PATCH 1/5] Rewrite README: update install, usage, workflows Overhaul README to improve onboarding and standalone use of napari-deeplabcut. Adds header image, reorganizes installation (pip/uv, dev install, pre-commit), clarifies usage, saving behavior, video support, and labeling/refinement workflows with tips and shortcuts. Updates links, badges, the workflow flowchart, and contributor instructions. Updates license reference to LGPL-3.0 and refines wording throughout for clarity. --- README.md | 360 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 231 insertions(+), 129 deletions(-) diff --git a/README.md b/README.md index b3d755e8..622e6b45 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,10 @@ -# napari-deeplabcut: keypoint annotation for pose estimation +# napari-deeplabcut - Keypoint annotation tool for pose estimation +napari+deeplabcut - -napari+deeplabcut - -[📚Documentation](https://deeplabcut.github.io/DeepLabCut/README.html) | +[📚 Plugin Documentation](https://deeplabcut.github.io/DeepLabCut/docs/gui/napari_GUI.html) | [🛠️ DeepLabCut Installation](https://deeplabcut.github.io/DeepLabCut/docs/installation.html) | -[🌎 Home Page](https://www.deeplabcut.org) | +[🌎 DeepLabCut Home Page](https://www.deeplabcut.org) | [![License: LGPL-3.0](https://img.shields.io/badge/License-LGPL%203.0-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) [![PyPI](https://img.shields.io/pypi/v/napari-deeplabcut.svg?color=green)](https://pypi.org/project/napari-deeplabcut) @@ -15,129 +13,214 @@ [![codecov](https://codecov.io/gh/DeepLabCut/napari-deeplabcut/branch/main/graph/badge.svg)](https://codecov.io/gh/DeepLabCut/napari-deeplabcut) [![napari hub](https://img.shields.io/endpoint?url=https://api.napari-hub.org/shields/napari-deeplabcut)](https://napari-hub.org/plugins/napari-deeplabcut) -A napari plugin for keypoint annotation, also used within DeepLabCut! +A napari plugin for keypoint annotation and label refinement, also used within DeepLabCut. +--- ## Installation -If you installed DeepLabCut[gui], this plugin is already installed. However, you can also use this as a stand-alone keypoint annotator without using DeepLabCut. Instructions below! +If you installed `DeepLabCut[gui]`, this plugin is already included. -Start by installing PySide6 with `pip install "pyside6==6.4.2"`; this is the library we now use to build GUIs. +You can also install `napari-deeplabcut` as a standalone keypoint annotation plugin without using the full DeepLabCut GUI. -You can then install `napari-deeplabcut` via [pip]: +### Standard install - pip install napari-deeplabcut +Using `pip`: + +```bash +pip install napari-deeplabcut +``` + +Using `uv`: + +```bash +uv add napari-deeplabcut +``` +> [!NOTE] +> A conda environment is not strictly required, please use your preferred package manager! +### Latest development version -Alternatively, to install the latest development version, run: +Using `pip`: - pip install git+https://github.com/DeepLabCut/napari-deeplabcut.git +```bash +pip install git+https://github.com/DeepLabCut/napari-deeplabcut.git +``` +--- ## Usage -To use the plugin, please run: +Start napari: + +```bash +napari +``` + +Then activate the plugin in: + +> **Plugins → napari-deeplabcut: Keypoint controls** + +Accepted files such as `config.yaml`, image folders, videos, and `.h5` annotation files can be loaded either by dragging them onto the canvas or through the **File** menu. + +> [!TIP] +> The widget will open automatically when drag-and-dropping a compatible labeled data folder + +### Recommended way to get started + +The easiest way to start labeling from scratch is: + +1. Open (or drag-and-drop) an image-only folder from your computer, or within a DeepLabCut project's `labeled-data` directory + - This means that only the images are loaded, without any existing annotations +2. Open (or drag-and-drop) the `config.yaml` from your project + +This creates: +- an **Image** layer with the images (or video frames), and +- an empty **Points** layer populated with the keypoint metadata from the config. + +You may then start annotating in the points layer that was created. + +> [!NOTE] +> If you load a folder from outside a DeepLabCut project and try to save a Points layer, you will be prompted to provide the config.yaml file +> used by the project. You may then move the labeled data folder into your project directory for downstream use. + +[🎥 DEMO](https://youtu.be/hsA9IB5r73E) + +--- + +## Tools and shortcuts + +- `2` / `3`: switch between labeling and selection mode when a Points layer is active +- `4`: enable pan & zoom +- `M`: cycle through sequential, quick, and cycle annotation modes +- `E`: toggle edge coloring +- `F`: toggle between individual and body-part coloring modes +- `V`: toggle visibility of the selected layer +- `Backspace`: delete selected point(s) +- `Ctrl+C` / `Ctrl+V`: copy and paste selected points +- Double-click the current frame number to jump to a specific frame + +> [!TIP] +> Press the "View shortcuts" button in the dock widget for a reference. + +Additional dock controls include: + +- **Warn on overwrite**: enable or disable confirmation prompts when saving would overwrite existing annotations +- **Show trails**: display keypoint trails over time in the main viewer +- **Show trajectories**: open a trajectory plot in a separate dock widget +- **Show color scheme**: display the active/configured color mapping reference +- **Video tools**: extract the current frame and store crop coordinates for videos + +--- - napari +## Saving layers -Then, activate the plugin in Plugins > napari-deeplabcut: Keypoint controls. +Use: -All accepted files (config.yaml, images, h5 data files) can be loaded -either by dropping them directly onto the canvas or via the File menu. +> **File → Save Selected Layer(s)...** +> +or the shortcut: -The easiest way to get started is to drop a folder (typically a folder from within a DeepLabCut's `labeled-data` directory), and, if labeling from scratch, drop the corresponding `config.yaml` to automatically add a `Points layer` and populate the dropdown menus. +```text +Ctrl+S +``` + +### Keypoint save behavior + +Keypoint annotations are automatically saved into the corresponding dataset folder as: + +```text +CollectedData_.h5 +``` + +For convenience, the companion `.csv` file is written in the same folder. + +### Important notes -[🎥 DEMO -](https://youtu.be/hsA9IB5r73E) +- DeepLabCut uses the **H5** file as the authoritative annotation file. +- Before saving, make sure the **Points** layer you want to save is selected. + - The plugin will not save if several Points layers are selected at the same time, to avoid ambiguity. +- Saving a `machinelabels...` layer does **not** write back to the machine labels file. + Instead, refined annotations are written into the appropriate `CollectedData...` file. +- If saving would overwrite existing annotations, the plugin will prompt for confirmation. + - While labeling, confirmation can be disabled by unchecking the "Warn on overwrite" option in the dock widget. -**Tools & shortcuts are:** +--- -- `2` and `3`, to easily switch between labeling and selection mode -- `4`, to enable pan & zoom (which is achieved using the mouse wheel or finger scrolling on the Trackpad) -- `M`, to cycle through regular (sequential), quick, and cycle annotation mode (see the description [here](https://github.com/DeepLabCut/napari-deeplabcut/blob/5a5709dd38868341568d66eab548ae8abf37cd63/src/napari_deeplabcut/keypoints.py#L25-L34)) -- `E`, to enable edge coloring (by default, if using this in refinement GUI mode, points with a confidence lower than 0.6 are marked -in red) -- `F`, to toggle between animal and body part color scheme. -- `V`, to toggle visibility of the selected layer. -- `backspace` to delete a point. -- Check the box "display text" to show the label names on the canvas. -- To move to another folder, be sure to save (`Ctrl+S`), then delete the layers, and re-drag/drop the next folder. -- One can jump to a specific image by double-clicking and editing the current frame number (located to the right of the slider). -- Selected points can be copied with `Ctrl+C`, and pasted onto other images with `Ctrl+V`. +## Video support +Videos can be opened directly in the GUI. -### Save Layers +When a video is loaded, the plugin enables a small video action panel that can be used to: -Annotations and segmentations are saved with `File > Save Selected Layer(s)...` (or its shortcut `Ctrl+S`). -Only when saving segmentation masks does a save file dialog pop up to name the destination folder; -keypoint annotations are otherwise automatically saved in the corresponding folder as `CollectedData_.h5`. -- As a reminder, DLC will only use the H5 file; so be sure if you open already labeled images you save/overwrite the H5. -- Note, before saving a layer, make sure the points layer is selected. If the user clicked on the image(s) layer first, does `Save As`, then closes the window, any labeling work during that session will be lost! -- Modifying and then saving points in a `machinelabels...` layer will add to or overwrite the existing `CollectedData` layer and will **not** save to the `machinelabels` file. +- Extract the current frame into the dataset +- Optionally export existing machine labels for that frame +- Define and save crop coordinates to the DLC `config.yaml` +Keypoints in video-based workflows can be edited and saved in the same way as ordinary image-folder workflows. -### Video frame extraction and prediction refinement +--- -Since v0.0.4, videos can be viewed in the GUI. +## Workflow (outside of DLC GUI) -Since v0.0.5, trailing points can be visualized; e.g., helping in the identification -of swaps or outlier, jittery predictions. +Suggested workflows depend on what is already present in the dataset folder. -Loading a video (and its corresponding output h5 file) will enable the video actions -at the top of the dock widget: they offer the option to manually extract video -frames from the GUI, or to define cropping coordinates. -Note that keypoints can be displaced and saved, as when annotating individual frames. +Please note this describes the workflow when napari is launched as a standalone application, outside of the DeepLabCut GUI. +### 1) Labeling from scratch -## Workflow +Use this when the image folder does **not** yet contain a `CollectedData_.h5` file. -Suggested workflows, depending on the image folder contents: +1. Open a folder of extracted images +2. Open the corresponding DeepLabCut `config.yaml` +3. Select the created **Points** layer +4. Start labeling +5. Save the points layer with `Ctrl+S` -1. **Labeling from scratch** – the image folder does not contain `CollectedData_.h5` file. +After saving, the folder should now contain: - Open *napari* as described in [Usage](#usage) and open an image folder together with the DeepLabCut project's `config.yaml`. - The image folder creates an *image layer* with the images to label. - Supported image formats are: `jpg`, `jpeg`, `png`. - The `config.yaml` file creates a *Points layer*, which holds metadata (such as keypoints read from the config file) necessary for labeling. - Select the *Points layer* in the layer list (lower left pane on the GUI) and click on the *+*-symbol in the layer controls menu (upper left pane) to start labeling. - The current keypoint can be viewed/selected in the keypoints dropdown menu (right pane). - The slider below the displayed image (or the left/right arrow keys) allows selecting the image to label. +```text +CollectedData_.h5 +CollectedData_.csv +``` + +--- - To save the labeling progress refer to [Save Layers](#save-layers). - `Data successfully saved` should be shown in the status bar, and the image folder should now contain a `CollectedData_.h5` file. - (Note: For convenience, a CSV file with the same name is also saved.) +### 2) Resuming labeling -2. **Resuming labeling** – the image folder contains a `CollectedData_.h5` file. +Use this when the folder already contains a `CollectedData_.h5` file. - Open *napari* and open an image folder (which needs to contain a `CollectedData_.h5` file). - In this case, it is not necessary to open the DLC project's `config.yaml` file, as all necessary metadata is read from the `h5` data file. +Open the folder in napari. The existing keypoint metadata and annotations will be loaded from the H5 file, so loading `config.yaml` is not needed nor recommended. - Saving works as described in *1*. +However, loading the config is still useful if: - ***Note that if a new body part has been added to the `config.yaml` file after having started to label, loading the config in the GUI is necessary to update the dropdown menus and other metadata.*** +- The project’s bodyparts changed +- you want to refresh the configured color scheme from the project config - ***As `viridis` is `napari-deeplabcut` default colormap, loading the config in the GUI is also needed to update the color scheme.*** +--- -3. **Refining labels** – the image folder contains a `machinelabels-iter<#>.h5` file. +### 3) Refining machine labels - The process is analog to *2*. - Open *napari* and open an image folder. - If the video was originally labeled, *and* had outliers extracted it will contain a `CollectedData_.h5` file and a `machinelabels-iter<#>.h5` file. In this case, select the `machinelabels` layer in the GUI, and type `e` to show edges. Red indicates likelihood < 0.6. As you navigate through frames, images with labels with edges will need to be refined (moved, deleted, etc). Images with labels without edges will be on the `CollectedData` (previous manual annotations) layer and shouldn't need refining. However, you can switch to that layer and fix errors. You can also right-click on the `CollectedData` layer and select `toggle visibility` to hide that layer. Select the `machinelabels` layer before saving which will append your refined annotations to `CollectedData`. +Use this when the folder contains a machine predictions file such as: + +```text +machinelabels-iter<...>.h5 +``` - If the folder only had outliers extracted and wasn't originally labeled, it will not have a `CollectedData` layer. Work with the `machinelabels` layer selected to refine annotation positions, then save. +Open the folder in napari. - In this case, it is not necessary to open the DLC project's `config.yaml` file, as all necessary metadata is read from the `h5` data file. +If both a `CollectedData...` file and a `machinelabels...` file are present: - Saving works as described in *1*. +- Edit the `machinelabels` layer to refine predictions +- Optionally use edge coloring (`E`) to highlight low-confidence labels +- Save the selected `machinelabels` layer to merge refinements into `CollectedData` -4. **Drawing segmentation masks** +If the folder contains only `machinelabels...` and no `CollectedData...`, refined annotations will still be saved into a new `CollectedData...` target. - Drop an image folder as in *1*, manually add a *shapes layer*. Then select the *rectangle* in the layer controls (top left pane), - and start drawing rectangles over the images. Masks and rectangle vertices are saved as described in [Save Layers](#save-layers). - Note that masks can be reloaded and edited at a later stage by dropping the `vertices.csv` file onto the canvas. +--- -### Workflow flowchart +## Workflow flowchart ```mermaid %%{init: {"flowchart": {"htmlLabels": false}} }%% @@ -145,81 +228,100 @@ graph TD id1[What stage of labeling?] id2[deeplabcut.label_frames] id3[deeplabcut.refine_labels] - id4[Add labels to, or modify in, \n `CollectedData...` layer and save that layer] - id5[Modify labels in `machinelabels` layer and save \n which will create a `CollectedData...` file] + id4[Add labels to, or modify in, + `CollectedData...` layer and save that layer] + id5[Modify labels in `machinelabels` layer and save + which will create or update `CollectedData...`] id6[Have you refined some labels from the most recent iteration and saved already?] id7["All extracted frames are already saved in `CollectedData...`. -1. Hide or trash all `machinelabels` layers. -2. Then modify in and save `CollectedData`"] - id8[" -1. hide or trash all `machinelabels` layers except for the most recent. -2. Select most recent `machinelabels` and hit `e` to show edges. -3. Modify only in `machinelabels` and skip frames with labels without edges shown. -4. Save `machinelabels` layer, which will add data to `CollectedData`. - - If you need to revisit this video later, ignore `machinelabels` and work only in `CollectedData`"] - - id1 -->|I need to manually label new frames \n or fix my labels|id2 - id1 ---->|I need to refine outlier frames \nfrom analyzed videos|id3 - id2 -->id4 +1. Hide or remove all `machinelabels` layers. +2. Continue working in `CollectedData`."] + id8["1. Keep only the most recent `machinelabels` layer. +2. Select it and press `E` to show edges. +3. Refine labels in `machinelabels`. +4. Save to merge into `CollectedData`. +- If you revisit the dataset later, you can continue working in `CollectedData`."] + + id1 -->|I need to manually label new frames + or fix existing labels|id2 + id1 -->|I need to refine outlier frames + from analyzed videos|id3 + id2 --> id4 id3 -->|I only have a `machinelabels...` file|id5 - id3 ---->|I have both `machinelabels` and `CollectedData` files|id6 + id3 -->|I have both `machinelabels` and `CollectedData` files|id6 id6 -->|yes|id7 - id6 ---->|no, I just extracted outliers|id8 + id6 -->|no, I just extracted outliers|id8 ``` -### Labeling multiple image folders +--- + +## Labeling multiple image folders + +Only one dataset folder should be worked on at a time. + +After finishing a folder: -Labeling multiple image folders has to be done in sequence; i.e., only one image folder can be opened at a time. -After labeling the images of a particular folder is done and the associated *Points layer* has been saved, *all* layers should be removed from the layers list (lower left pane on the GUI) by selecting them and clicking on the trashcan icon. -Now, another image folder can be labeled, following the process described in *1*, *2*, or *3*, depending on the particular image folder. +1. Save the relevant **Points** layer +2. Remove the current layers from the viewer +3. Open the next folder +This keeps plugin operation and saving unambiguous. -### Defining cropping coordinates +--- -Prior to defining cropping coordinates, two elements should be loaded in the GUI: -a video and the DLC project's `config.yaml` file (into which the crop dimensions will be stored). -Then it suffices to add a `Shapes layer`, draw a `rectangle` in it with the desired area, -and hit the button `Store crop coordinates`; coordinates are automatically written to the configuration file. +## Defining crop coordinates +To store crop coordinates in a DLC project: + +1. Open the video from the project’s `videos` folder +2. Enable cropping in the video tools +3. Draw a rectangle in the newly created crop layer (the tool is selected by default) +4. Click **Store crop coordinates** after checking the coordinates in the widget. + +The crop coordinates are then written back to the project configuration. + +--- ## Contributing -Contributions are very welcome. Tests can be run with [tox], please ensure -the coverage at least stays the same before you submit a pull request. +Contributions are welcome. -To locally install the code, please git clone the repo and then run `pip install -e .` +Tests can be run locally with [tox]. +Please note we use pre-commit hooks to run linters and formatters on changed files, so make sure to install the pre-commit dependencies: -## License +```bash +pip install pre-commit +pre-commit install +``` -Distributed under the terms of the [BSD-3] license, -"napari-deeplabcut" is free and open source software. +### Development install -## Issues +Clone the repository and install it in editable mode. + +Using `pip`: -If you encounter any problems, please [file an issue] along with a detailed description. +```bash +pip install -e . +``` -[file an issue]: https://github.com/DeepLabCut/napari-deeplabcut/issues +If you need development dependencies as well, use the project’s `dev` extra: +```bash +pip install -e .[dev] +``` -## Acknowledgements +## License +Distributed under the terms of the [LGPL-3.0](https://www.gnu.org/licenses/lgpl-3.0). -This [napari] plugin was generated with [Cookiecutter] using [@napari]'s [cookiecutter-napari-plugin] template. We thank the Chan Zuckerberg Initiative (CZI) for funding the initial development of this work! +## Issues + +If you encounter any problems, please [file an issue](https://github.com/DeepLabCut/napari-deeplabcut/issues) with a detailed description and, if possible, a minimal reproducible example. - +This [napari](https://github.com/napari/napari) plugin was originally generated with [Cookiecutter](https://github.com/audreyr/cookiecutter) using [@napari](https://github.com/napari)'s [cookiecutter-napari-plugin](https://github.com/napari/cookiecutter-napari-plugin) template. +We thank the Chan Zuckerberg Initiative (CZI) for funding the initial development of this work! -[napari]: https://github.com/napari/napari -[Cookiecutter]: https://github.com/audreyr/cookiecutter -[@napari]: https://github.com/napari -[cookiecutter-napari-plugin]: https://github.com/napari/cookiecutter-napari-plugin -[BSD-3]: http://opensource.org/licenses/BSD-3-Clause [tox]: https://tox.readthedocs.io/en/latest/ -[pip]: https://pypi.org/project/pip/ -[PyPI]: https://pypi.org/ From ba291e19c964d2df754339021d0ad5f89ef40e66 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 1 Apr 2026 15:42:19 -0500 Subject: [PATCH 2/5] Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 622e6b45..8d403fe8 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ uv add napari-deeplabcut ``` > [!NOTE] -> A conda environment is not strictly required, please use your preferred package manager! +> A conda environment is not strictly required. Please use your preferred package manager! ### Latest development version From 9b2e877839fe3f4d3ea66e49ca55792a5f8657ac Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 1 Apr 2026 15:46:56 -0500 Subject: [PATCH 3/5] Fix README quote block --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d403fe8..ba367e71 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ Additional dock controls include: Use: > **File → Save Selected Layer(s)...** -> + or the shortcut: ```text From a7616c964e54211fe283a34229161a6f9dfcb230 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Thu, 9 Apr 2026 10:41:33 +0200 Subject: [PATCH 4/5] Clarify install and config handling in README Clarified installation instructions and added an example for creating and activating a uv virtual environment (using Python 3.12) before installing with uv. Small wording tweaks: note that pip example is shown e.g. for a conda environment, and the widget auto-open phrasing was made clearer. Added guidance about config.yaml: several plugin functions expect the config two folders up from saved CollectedData files, fallback behavior exists but you will be prompted to provide a matching config if it is missing; the plugin will then save points/metadata into the correct folder based on that config. Recommended moving the dataset into the project structure and updating paths in config.yaml for full compatibility. --- README.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ba367e71..6a2bc73d 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ You can also install `napari-deeplabcut` as a standalone keypoint annotation plu ### Standard install -Using `pip`: +Using `pip` (e.g. in a `conda` environment): ```bash pip install napari-deeplabcut @@ -34,11 +34,13 @@ pip install napari-deeplabcut Using `uv`: ```bash -uv add napari-deeplabcut +uv venv -p 3.12 # create a new virtual environment with Python 3.12 +source .venv/bin/activate # activate the virtual environment. Use the relevant command for your OS/shell if different. +uv pip install napari-deeplabcut ``` > [!NOTE] -> A conda environment is not strictly required. Please use your preferred package manager! +> A conda environment or uv venv is not strictly required. Please use your preferred package manager! ### Latest development version @@ -65,7 +67,7 @@ Then activate the plugin in: Accepted files such as `config.yaml`, image folders, videos, and `.h5` annotation files can be loaded either by dragging them onto the canvas or through the **File** menu. > [!TIP] -> The widget will open automatically when drag-and-dropping a compatible labeled data folder +> The widget opens automatically when drag-and-dropping a compatible labeled-data folder. ### Recommended way to get started @@ -145,6 +147,8 @@ For convenience, the companion `.csv` file is written in the same folder. Instead, refined annotations are written into the appropriate `CollectedData...` file. - If saving would overwrite existing annotations, the plugin will prompt for confirmation. - While labeling, confirmation can be disabled by unchecking the "Warn on overwrite" option in the dock widget. +- Several plugin functions implicitly expect `config.yaml` to be present two folders up from the saved `CollectedData...` file, so make sure to keep the config in the project directory structure for best results. Fallback behaviors are present but may not cover all edge cases. + - If you save a Points layer without a config file present in the expected location, you will be prompted to provide the path to the config file that matches the dataset you are working on. The plugin will then save the points and metadata into the correct folder based on the config path provided. Afterwards, it is recommended to move the dataset folder into the correct location within the project directory structure for best compatibility with other DeepLabCut functions. Please edit the `config.yaml` file if needed to update the paths to the videos and image folders. --- @@ -191,12 +195,12 @@ CollectedData_.csv Use this when the folder already contains a `CollectedData_.h5` file. -Open the folder in napari. The existing keypoint metadata and annotations will be loaded from the H5 file, so loading `config.yaml` is not needed nor recommended. +Open (or drag-and-drop) the folder in napari. The existing keypoint metadata and annotations will be loaded from the H5 file, so loading `config.yaml` is not needed nor recommended. However, loading the config is still useful if: - The project’s bodyparts changed -- you want to refresh the configured color scheme from the project config +- You would like to refresh the configured color scheme from the project config --- From 0f62f80d37c112bbd9167ffb636e60168f6c2558 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Thu, 9 Apr 2026 11:27:09 +0200 Subject: [PATCH 5/5] Update tests workflow badge in README Replace the tests badge URL in README.md to point to the new GitHub Actions workflow (test_and_deploy.yml) and include branch=main in the badge URL so the status reflects the correct workflow/branch. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a2bc73d..acfe2276 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![License: LGPL-3.0](https://img.shields.io/badge/License-LGPL%203.0-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) [![PyPI](https://img.shields.io/pypi/v/napari-deeplabcut.svg?color=green)](https://pypi.org/project/napari-deeplabcut) [![Python Version](https://img.shields.io/pypi/pyversions/napari-deeplabcut.svg?color=green)](https://python.org) -[![tests](https://github.com/DeepLabCut/napari-deeplabcut/workflows/tests/badge.svg)](https://github.com/DeepLabCut/napari-deeplabcut/actions) +[![tests](https://github.com/DeepLabCut/napari-deeplabcut/actions/workflows/test_and_deploy.yml/badge.svg?branch=main)](https://github.com/DeepLabCut/napari-deeplabcut/actions/workflows/test_and_deploy.yml) [![codecov](https://codecov.io/gh/DeepLabCut/napari-deeplabcut/branch/main/graph/badge.svg)](https://codecov.io/gh/DeepLabCut/napari-deeplabcut) [![napari hub](https://img.shields.io/endpoint?url=https://api.napari-hub.org/shields/napari-deeplabcut)](https://napari-hub.org/plugins/napari-deeplabcut)