Fix bone likelihood in analyzebone to use both bodyparts - #3401
Merged
C-Achard merged 4 commits intoJul 16, 2026
Merged
Conversation
analyzebone() computed each skeleton bone's likelihood as min(bp2.likelihood, bp2.likelihood), stacking the second bodypart twice and discarding bp1. The adjacent comment states the intent is 'keep the smallest of the two likelihoods', so the result should be min(bp1.likelihood, bp2.likelihood). As written, a bone whose first bodypart is occluded (low confidence) but whose second bodypart is confident was reported as fully confident, silently corrupting the likelihood column of every skeleton analysis output.
…3350) * fix path resolution on network drives. Replace Path(..).resolve() with Path(..).absolute() * Add safe_resolve helper for path resolution * replace str with pathlib.Path * fix redundant resolution of resolved path in memory_replay.py * fix open -> os.stat * replace os.stat -> open for files, listdir for dirs. * fix TestReadConfigProjectPath * Update deeplabcut/utils/auxiliaryfunctions.py * additional replacements: str ->Path * Update function signatures str -> str | Path * Add ruff linting rule PTH * Open dataset file directly using Path.open Fix path handling when loading the dataset pickle. The code previously attempted Path(project_path) / file_name even though file_name already included the project path, resulting in an incorrect path. This changes the context manager to call file_name.open('rb') directly, removing the redundant join and preventing path errors when loading the pickle. * Use context manager when writing pose_cfg.yaml Replace direct ruamel_file.dump(...open('w')) call with a with-statement to open pose_cfg.yaml. This ensures the file handle is properly closed after writing and avoids potential resource leaks. * Pass string path to cv2.VideoCapture Convert video_path to str when constructing cv2.VideoCapture to ensure pathlib.Path objects are handled correctly and avoid type errors when opening videos. This makes VideoReader more robust when given Path instances. * Use explicit loop to unlink frame files Replace the list-comprehension side-effect used to delete temporary frame files with an explicit for-loop that checks p.is_file() before calling unlink. This avoids building an unused list, prevents errors from trying to unlink non-file entries (e.g., directories), and improves readability and safety. * Fix CircleCI failure * fix Matplotlib Path import shadowing ->MPLPath * use pathlib consistently in `metrics` * use safe_resolve in export * remove redundant defensive block for windows paths on python 3.6 * remove unused `get_immediate_subdirectories` * use Path in plot_edge_affinity_distributions * remove PTH enforcement in linting * use safe_resolve instead of resolve in `training` and `auxiliaryfunctions` * Update GUI assets import (DeepLabCut#3370) * Add GUI asset helper utilities Introduce deeplabcut.gui.gui_assets module providing utilities to load bundled GUI assets. It locates the package assets directory via importlib.resources, and exposes resource_bytes, resource_text, get_assets_dir, get_style_qss, pixmap_from_resource and icon_from_resource helpers (using PySide6 QPixmap/QIcon). Includes error handling when image data cannot be loaded and uses type annotations for clarity. * Use gui_assets for icons and pixmaps Replace direct filesystem asset loading (BASE_DIR/assets and manual Path lookups) with centralized gui_assets helpers (icon_from_resource, pixmap_from_resource, get_style_qss/get_assets_dir) across multiple GUI modules. Updated imports and calls in components, launch_script, create_project, modelzoo, open_project, train_network, and window to use the new resource functions and remove redundant logo path handling, improving resource access and packaging robustness. * fix path concatenation in `make_labeled_images_from_dataframe` --------- Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> * Adjust config path tests for Path objects Update `test_auxiliaryfunctions.py` to assert `project_path` as a `pathlib.Path` instead of a string. The tests now cast to `str` only for the `"Volume{"` check, use `.exists()` for filesystem validation, and compare against `project_dir.absolute()` directly. * Fix os import in safe_resolve Import `os` inside `safe_resolve` before calling `os.listdir` so directory resolution no longer risks a `NameError`. This also removes an unused `os` import in `test_auxiliaryfunctions.py` and a stray blank line in `video_processor.py`. * address remaining `.resolve()` cases: prefer `.absolute()`, or otherwise `safe_resolve()` * update `safe_resolve`: add logging, use os.stat (more efficient) * update test safe_resolve: allow fallback and test open/closing instead Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix remaining Path.resolve() * fix reintroduced pathlib `resolve()` occurences (see DeepLabCut#3349) * use pathlib Path in GUI codebase * use pathlib Path in memory replay * GUI rename field `config` to `config_path` * GUI use os.fspath for str conversions where required * use pathlib Path in create_project * use pathlib Path across pose_estimation_pytorch internally * use centralized yaml dumper (which normalizes Path -> str) * fix materialize.py downstream old str.split -> Path * fix testsscripts str usage * fix old str usage in trainingsetmanipulation * allow str type at TF boundary * allow str formatting in tensorflow code * fix config update in train_from_coco.py PoseConfig.model.backbone is currently a dict-type but freeze_bn_stats were set as attribute. This commit fixes that and treats backbone correctly as dict. --------- Co-authored-by: Cyril Achard <cyril.achard@epfl.ch> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Bumps [idna](https://github.com/kjd/idna) from 3.13 to 3.15. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.md) - [Commits](kjd/idna@v3.13...v3.15) --- updated-dependencies: - dependency-name: idna dependency-version: '3.15' dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Cyril Achard <cyril.achard@epfl.ch>
deruyter92
approved these changes
Jul 15, 2026
C-Achard
merged commit Jul 16, 2026
b2d21cb
into
DeepLabCut:external/hwang-misc-fixes
29 checks passed
9 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
analyzebone() computed each skeleton bone's likelihood as min(bp2.likelihood, bp2.likelihood), stacking the second bodypart twice and discarding bp1. The adjacent comment states the intent is 'keep the smallest of the two likelihoods', so the result should be min(bp1.likelihood, bp2.likelihood).
As written, a bone whose first bodypart is occluded (low confidence) but whose second bodypart is confident was reported as fully confident, silently corrupting the likelihood column of every skeleton analysis output.