[BUG] Keypoint confidence range filter hides all points when max bound is null
#8,152 opened on Jul 31, 2026
Repository metrics
- Stars
- (4,021 stars)
- PR merge metrics
- (Avg merge 3d 11h) (161 merged PRs in 30d)
Description
🗃️ Describe the problem
In the App, filtering a Keypoint / Keypoints list attribute such as confidence with the numeric range slider can hide all points even when some values fall inside the intended range.
Expected: Dragging the min thumb above the lower bound while leaving max at the upper bound keeps points whose confidence is ≥ min (and ≤ the field max).
Actual: That filter often shows no points. Filtering only the upper end (e.g. max ≈ 0.4 with min at the lower bound) still works and shows the low-confidence points.
Root cause (investigation):
The range slider stores null when a thumb sits on a field bound (RangeSlider onMinCommit / onMaxCommit). Per-point keypoint filtering in skeletonFilter compared values with:
value >= range[0] && value <= range[1]
In JavaScript, null coerces to 0, so a stored range like [0.2, null] becomes value <= 0 and drops every positive confidence. Other numeric filters already handle null ends via helperFunction in pathFilters/numeric.ts; keypoints did not.
🖥️ Operating System Platform & Distribution
- Linux
- MacOS
- Windows
- Other (please specify)
💻 System Details
MacOS:
Model Name: MacBook Pro Model Identifier: MacBookPro17,1 Model Number: Z11B0004URU/A Chip: Apple M1 Total Number of Cores: 8 (4 performance and 4 efficiency) Memory: 16 GB System Firmware Version: 10151.61.4 OS Loader Version: 10151.61.4 Activation Lock Status: Enabled
Linux:
---OS--- Linux akorotaevskiy-3-0 5.15.0-130-generic #140-Ubuntu SMP Wed Dec 18 17:59:53 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux ---HWinfo--- /0/0 memory 130GiB System memory /0/1 processor 12th Gen Intel(R) Core(TM) i5-12400F /0/100/1/0 display NVIDIA Corporation /0/100/6/0 storage Samsung Electronics Co Ltd /0/100/6/0/0 nvme0 storage Samsung SSD 990 PRO 2TB /0/100/14.2 memory RAM memory /0/100/17 storage Intel Corporation /0/100/1c.7/0 display NVIDIA Corporation
🌐 Browser
Not applicable, Chrome (or Chromium-based)
⤵️ Installation type
- Package (
pip) - Source (
git)
⌨️ Code to reproduce issue
import fiftyone as fo
dataset = fo.Dataset("keypoint-confidence-bug")
dataset.persistent = True
dataset.default_skeleton = fo.KeypointSkeleton(
labels=["p0", "p1", "p2", "p3"],
edges=[[0, 1, 2, 3]],
)
sample = fo.Sample(
filepath="/path/to/any/image.jpg",
keypoints=fo.Keypoints(
keypoints=[
fo.Keypoint(
label="person",
points=[(0.2, 0.3), (0.4, 0.5), (0.6, 0.4), (0.8, 0.6)],
confidence=[0.1, 0.3, 0.5, 0.7],
)
]
),
)
dataset.add_sample(sample)
session = fo.launch_app(dataset)
- Open the sample (modal).
- In the sidebar, expand
keypoints→confidenceand use the range slider. - Drag min to ~
0.2and leave max at the upper bound. - Observe: no keypoints are drawn (expected: 3 points with confidences
0.3,0.5,0.7). - Reset, then drag max to ~
0.4and leave min at the lower bound. - Observe: 2 points show correctly (
0.1,0.3).
🐍 What version of Python?
Python 3.12.4
🔖 What version of FiftyOne?
Version: 1.21.0 (develop branch)
🪵 Other info/logs
- Affects per-point list attributes on keypoints (e.g.
confidence), because looker usespointFilter→skeletonFilter. - Regular detection
confidencefilters are unaffected (they usehelperFunction). - Leaving a slider thumb on a bound is intentional: the App stores
nullfor that end so the filter means “unbounded” on that side.
🚀 Willingness to contribute
Yes, I can contribute a fix for this bug independently
📸 Upload screenshots
Снимок экрана 2026-07-31 в 14.43.52.png Снимок экрана 2026-07-31 в 14.44.01.png