Skip to content

Add detection confidence curves - #429

Merged
kozlov721 merged 3 commits into
mainfrom
feat/detection-confidence-curves
Aug 4, 2026
Merged

Add detection confidence curves#429
kozlov721 merged 3 commits into
mainfrom
feat/detection-confidence-curves

Conversation

@rolandocortez

@rolandocortez rolandocortez commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Add precision-recall and confidence curves for detection

Purpose

Add confidence-based evaluation curves for bounding-box detection in luxonis-train.

The new metric provides:

  • precision-recall
  • precision-confidence
  • recall-confidence

The current detection metrics operate on post-NMS detections produced at a fixed confidence threshold. That is sufficient for scalar metrics such as mAP, but it does not provide the decoded candidates needed to evaluate how precision and recall change across confidence thresholds.

This PR adds an opt-in PrecisionRecallCurve metric and exposes decoded pre-NMS detections from the supported bounding-box heads during evaluation.

Specification

Detection-head output

Updated:

  • EfficientBBoxHead
  • PrecisionBBoxHead

Both heads now expose:

  • the existing post-NMS boundingbox output
  • a new decoded detections_pre_nms tensor during evaluation

Training and export output contracts remain unchanged.

For EfficientBBoxHead, decoding and NMS are separated into:

  • _prepare_bbox_inference_output()
  • _run_nms()

The existing _postprocess_detections() behavior is preserved as a wrapper around those two steps.

PrecisionRecallCurve metric

Added an opt-in PrecisionRecallCurve metric for bounding-box detection.

The metric:

  • supports an explicit confidence grid or a generated linear grid
  • runs NMS once at the minimum configured confidence threshold
  • reuses the retained detections across the confidence grid
  • performs class-aware, score-ordered, one-to-one matching
  • uses a configurable matching IoU threshold
  • defaults NMS IoU and maximum detections to the attached detection head values
  • accumulates true positives, false positives, and target counts with distributed sum reduction

The metric computes:

  • precision for each confidence threshold
  • recall for each confidence threshold
  • F1 for each confidence threshold
  • maximum F1
  • confidence threshold at maximum F1

max_f1 is exposed as the primary scalar under the metric name.

confidence_at_max_f1 is exposed as a submetric.

Metric artifacts

Extended the metric interface with generic hooks for:

  • filtering values intended for scalar logging
  • generating image artifacts from computed metric results
  • declaring stable artifact names

PrecisionRecallCurve logs one RGB image containing:

  • precision-recall
  • precision-confidence
  • recall-confidence

The artifact is generated only on global rank zero.

Scope

This PR intentionally supports:

  • bounding-box detection only
  • global micro-averaged curves
  • one matching IoU threshold
  • one NMS pass at the minimum confidence threshold

The following are not included:

  • per-class curves
  • AUPRC
  • instance-keypoint or segmentation curves

mAP remains the recommended primary detection metric.

Dependencies & Potential Impact

No new external dependency is introduced.

Potential impact:

  • evaluation packets from EfficientBBoxHead and PrecisionBBoxHead now include the additional detections_pre_nms key
  • the existing post-NMS boundingbox output remains unchanged
  • training output remains unchanged
  • export output remains unchanged
  • the curve metric is opt-in and does not affect configurations that do not attach it
  • generating the curve artifact requires rendering one Matplotlib figure at evaluation epoch end on global rank zero

The metric uses the decoded candidates produced by the detection head, so the supported heads and the metric share the same pre-NMS tensor contract.

Testing & Validation

Validation performed:

  • Ruff checks passed
  • formatting checks passed
  • Python compilation passed
  • git diff --check passed
  • private metadata and temporary-code checks passed

Focused metric validation:

  • 23 PrecisionRecallCurve tests passed
  • invalid configuration and empty-input cases covered
  • accumulation and reset behavior covered
  • scalar and artifact separation covered
  • behavior with log_sub_metrics=True and False covered
  • MLflow metric and artifact keys covered

Detection-head validation:

  • real forward-path tests for EfficientBBoxHead
  • real forward-path tests for PrecisionBBoxHead
  • exact replay of the canonical post-NMS output from detections_pre_nms
  • training contract checked
  • evaluation contract checked
  • export contract checked

Regression validation:

  • 95 metric unit tests passed
  • 4 Lightning utility tests passed

Distributed validation:

  • two-process CPU/Gloo validation passed
  • distributed states matched a single-process reference
  • computed vectors and primary scalar were identical across ranks
  • curve artifact generation occurred only on rank zero

The final commit was also rebased onto the current main and revalidated before push.

Deployment Plan

No deployment is required.

Rollout:

  • review the implementation and metric contract
  • verify hosted CI
  • use PrecisionRecallCurve only in detection configurations that require confidence-based curves
  • keep mAP as the default primary detection metric

Rollback:

  • revert this PR if the additional evaluation packet output or metric artifact hooks cause regressions

Monitoring:

  • hosted CI results
  • reviewer feedback on the pre-NMS output contract
  • reviewer feedback on the global micro matching and single-NMS design
  • runtime and memory behavior in larger detection validation runs

AI Usage

Assisted-by: ChatGPT

Summary by CodeRabbit

  • New Features

    • Added a bounding-box Precision/Recall curve metric with precision, recall, F1, and best-confidence reporting.
    • Added visual curve artifacts for validation and testing results.
  • Improvements

    • Standardized metric logging and artifact handling.
    • Inference now exposes pre-NMS detections for more accurate evaluation.
  • Tests

    • Added comprehensive metric, logging, artifact, and detection-head integration coverage.
  • Chores

    • Added Matplotlib for curve rendering.

@rolandocortez
rolandocortez requested a review from klemen1999 July 28, 2026 11:31
@rolandocortez
rolandocortez requested a review from a team as a code owner July 28, 2026 11:31
@rolandocortez
rolandocortez requested review from kozlov721 and removed request for a team July 28, 2026 11:31
@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: af7f2dce-a33e-4932-a232-1ac90357e42e

📥 Commits

Reviewing files that changed from the base of the PR and between 825c06d and 9bd8bdb.

📒 Files selected for processing (8)
  • luxonis_train/attached_modules/metrics/__init__.py
  • luxonis_train/attached_modules/metrics/base_metric.py
  • luxonis_train/attached_modules/metrics/precision_recall_curve.py
  • luxonis_train/lightning/luxonis_lightning.py
  • luxonis_train/nodes/heads/efficient_bbox_head.py
  • luxonis_train/nodes/heads/precision_bbox_head.py
  • requirements.txt
  • tests/unittests/test_metrics/test_precision_recall_curve.py
🚧 Files skipped from review as they are similar to previous changes (6)
  • luxonis_train/nodes/heads/precision_bbox_head.py
  • luxonis_train/attached_modules/metrics/init.py
  • luxonis_train/nodes/heads/efficient_bbox_head.py
  • tests/unittests/test_metrics/test_precision_recall_curve.py
  • luxonis_train/attached_modules/metrics/base_metric.py
  • requirements.txt

📝 Walkthrough

Walkthrough

Adds a configurable bounding-box precision-recall curve metric, exposes pre-NMS detections from inference heads, and integrates scalar and image artifact logging into Lightning evaluation and MLflow key generation.

Changes

Precision-recall metric and contracts

Layer / File(s) Summary
Metric implementation and validation
luxonis_train/attached_modules/metrics/*, requirements.txt, tests/unittests/test_metrics/test_precision_recall_curve.py
Adds threshold validation, NMS and IoU matching, metric accumulation, F1 computation, scalar logging, curve rendering, public exports, matplotlib support, and focused metric tests.

Pre-NMS detection flow

Layer / File(s) Summary
Inference tensor exposure
luxonis_train/nodes/heads/efficient_bbox_head.py, luxonis_train/nodes/heads/precision_bbox_head.py, tests/unittests/test_metrics/test_precision_recall_curve.py
Centralizes pre-NMS construction and NMS execution where applicable, returns detections_pre_nms, and verifies head outputs against replayed NMS.

Evaluation artifact logging

Layer / File(s) Summary
Metric and image logging integration
luxonis_train/lightning/luxonis_lightning.py, tests/unittests/test_metrics/test_precision_recall_curve.py
Computes metrics once, separates loggable values from artifacts, logs valid images on global-zero processes, derives artifact keys, and tests failure and rank-handling paths.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ModelHead
  participant non_max_suppression
  participant PrecisionRecallCurve
  participant LuxonisLightningModule
  participant tracker
  ModelHead->>non_max_suppression: produce bounding boxes from detections_pre_nms
  ModelHead-->>PrecisionRecallCurve: return detections_pre_nms
  PrecisionRecallCurve->>non_max_suppression: filter detections during update
  PrecisionRecallCurve-->>LuxonisLightningModule: return computed curves and max_f1
  LuxonisLightningModule->>PrecisionRecallCurve: get loggable values and artifacts
  LuxonisLightningModule->>tracker: log metrics and curve image
Loading

Suggested reviewers: klemen1999

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add detection confidence curves' clearly and specifically describes the main change—addition of precision-recall, precision-confidence, and recall-confidence curves for bounding-box detection metrics.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/detection-confidence-curves

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added the enhancement New feature or request label Jul 28, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (3)
luxonis_train/nodes/heads/precision_bbox_head.py (1)

110-121: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Lift _run_nms into BaseDetectionHead instead of duplicating the NMS kwargs.

EfficientBBoxHead._run_nms now encapsulates exactly this call with identical arguments. Both heads derive from BaseDetectionHead, so hosting the helper there removes the drift risk between the two call sites.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@luxonis_train/nodes/heads/precision_bbox_head.py` around lines 110 - 121,
Move the shared _run_nms implementation from EfficientBBoxHead into
BaseDetectionHead, preserving the existing non_max_suppression arguments and
behavior. Update the precision bbox head flow around
_prepare_bbox_inference_output to call the inherited _run_nms helper instead of
duplicating the NMS kwargs, and remove the subclass duplicate.
luxonis_train/attached_modules/metrics/precision_recall_curve.py (1)

233-250: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Per-prediction box_iou calls make matching O(N) kernel launches per image.

With max_det up to 300 (default) per image and a large validation set, this launches one tiny IoU kernel per prediction. Computing the full IoU matrix once per image and then greedily consuming it is equivalent and much cheaper.

♻️ Single IoU matrix per image
+            iou_matrix = (
+                box_iou(prediction_boxes, target_boxes)
+                if len(target_boxes)
+                else prediction_boxes.new_zeros((len(prediction_boxes), 0))
+            )
+            class_match = (
+                prediction_classes.unsqueeze(1) == target_classes.unsqueeze(0)
+            )
+
             for prediction_index in range(len(image_predictions)):
-                candidate_indices = torch.where(
-                    (target_classes == prediction_classes[prediction_index])
-                    & ~matched_targets
-                )[0]
+                candidate_indices = torch.where(
+                    class_match[prediction_index] & ~matched_targets
+                )[0]
                 if candidate_indices.numel() == 0:
                     continue
 
-                ious = box_iou(
-                    prediction_boxes[prediction_index].unsqueeze(0),
-                    target_boxes[candidate_indices],
-                ).squeeze(0)
+                ious = iou_matrix[prediction_index, candidate_indices]
                 best_iou, best_local_index = torch.max(ious, dim=0)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@luxonis_train/attached_modules/metrics/precision_recall_curve.py` around
lines 233 - 250, Update the matching logic around the prediction loop to compute
one full IoU matrix between all prediction_boxes and target_boxes per image,
then index that matrix for each prediction while greedily honoring
matched_targets and the matching_iou_threshold. Remove the per-prediction
box_iou call, preserving class filtering, best-candidate selection, and
true_positive assignment.
tests/unittests/test_metrics/test_precision_recall_curve.py (1)

285-337: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Harness duplicates LuxonisLightningModule internals via SimpleNamespace.

Calling the unbound _evaluation_epoch_end/get_mlflow_logging_keys with a hand-rolled namespace means any added attribute access in those methods breaks these tests with an opaque AttributeError. Acceptable here, but consider a small fixture that builds a real module (or a Mock(spec=LuxonisLightningModule)) if this pattern spreads.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/unittests/test_metrics/test_precision_recall_curve.py` around lines 285
- 337, Update make_epoch_end_harness to construct a real LuxonisLightningModule
or a Mock(spec=LuxonisLightningModule) instead of duplicating its internals with
SimpleNamespace. Preserve the existing test-specific configuration, logged
capture, and attributes needed by _evaluation_epoch_end and
get_mlflow_logging_keys while allowing missing module attributes to be detected
through the module interface.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@luxonis_train/attached_modules/metrics/precision_recall_curve.py`:
- Around line 33-53: Run docformatter on precision_recall_curve.py and apply its
formatting changes to the docstrings in __init__, compute, and get_artifacts,
preserving the documented content and behavior.
- Around line 342-348: Update get_artifacts so its runtime matplotlib import is
handled when the library is unavailable: either declare matplotlib in the
package’s runtime dependency metadata or catch the import failure and follow the
existing intended plotting-error or artifact-skipping behavior. Keep the curve
rendering path unchanged when matplotlib is installed.

In `@luxonis_train/lightning/luxonis_lightning.py`:
- Around line 862-874: Replace the ValueError raised in the artifact loop with
fail-soft handling: when an artifact’s dimension is not 3, log the contract
violation and skip that artifact instead of raising. Keep valid artifacts
flowing through self.tracker.log_image, and ensure the skip does not interrupt
the surrounding DDP execution.

---

Nitpick comments:
In `@luxonis_train/attached_modules/metrics/precision_recall_curve.py`:
- Around line 233-250: Update the matching logic around the prediction loop to
compute one full IoU matrix between all prediction_boxes and target_boxes per
image, then index that matrix for each prediction while greedily honoring
matched_targets and the matching_iou_threshold. Remove the per-prediction
box_iou call, preserving class filtering, best-candidate selection, and
true_positive assignment.

In `@luxonis_train/nodes/heads/precision_bbox_head.py`:
- Around line 110-121: Move the shared _run_nms implementation from
EfficientBBoxHead into BaseDetectionHead, preserving the existing
non_max_suppression arguments and behavior. Update the precision bbox head flow
around _prepare_bbox_inference_output to call the inherited _run_nms helper
instead of duplicating the NMS kwargs, and remove the subclass duplicate.

In `@tests/unittests/test_metrics/test_precision_recall_curve.py`:
- Around line 285-337: Update make_epoch_end_harness to construct a real
LuxonisLightningModule or a Mock(spec=LuxonisLightningModule) instead of
duplicating its internals with SimpleNamespace. Preserve the existing
test-specific configuration, logged capture, and attributes needed by
_evaluation_epoch_end and get_mlflow_logging_keys while allowing missing module
attributes to be detected through the module interface.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 503af074-6e78-48fe-a38b-3aa889a8f9d5

📥 Commits

Reviewing files that changed from the base of the PR and between f1ff2e0 and b1a1e76.

📒 Files selected for processing (7)
  • luxonis_train/attached_modules/metrics/__init__.py
  • luxonis_train/attached_modules/metrics/base_metric.py
  • luxonis_train/attached_modules/metrics/precision_recall_curve.py
  • luxonis_train/lightning/luxonis_lightning.py
  • luxonis_train/nodes/heads/efficient_bbox_head.py
  • luxonis_train/nodes/heads/precision_bbox_head.py
  • tests/unittests/test_metrics/test_precision_recall_curve.py

Comment thread luxonis_train/attached_modules/metrics/precision_recall_curve.py
Comment thread luxonis_train/attached_modules/metrics/precision_recall_curve.py
Comment thread luxonis_train/lightning/luxonis_lightning.py Outdated
@rolandocortez
rolandocortez force-pushed the feat/detection-confidence-curves branch 2 times, most recently from 5fdfe6e to 3e943db Compare July 28, 2026 12:47

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
luxonis_train/attached_modules/metrics/precision_recall_curve.py (1)

14-21: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Approve with a minor static-analysis nit on supported_tasks.

Ruff RUF012 flags the mutable list default on supported_tasks. Low value here since the logic is unaffected (this attribute is never mutated), but consider a ClassVar[list[Tasks]] annotation or a tuple to silence the hint if the codebase already does this elsewhere.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@luxonis_train/attached_modules/metrics/precision_recall_curve.py` around
lines 14 - 21, Update the class-level supported_tasks declaration in
PrecisionRecallCurve to avoid Ruff RUF012, using the codebase’s established
convention: annotate it as ClassVar[list[Tasks]] or make it an immutable tuple
while preserving the BOUNDINGBOX task value.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@luxonis_train/lightning/luxonis_lightning.py`:
- Around line 881-910: Wrap each per-artifact image conversion and
self.tracker.log_image call in a try/except within the is_global_zero block,
logging the exception with metric and artifact context and continuing to the
next artifact instead of propagating it. Preserve the existing shape validation
and successful logging behavior.

---

Nitpick comments:
In `@luxonis_train/attached_modules/metrics/precision_recall_curve.py`:
- Around line 14-21: Update the class-level supported_tasks declaration in
PrecisionRecallCurve to avoid Ruff RUF012, using the codebase’s established
convention: annotate it as ClassVar[list[Tasks]] or make it an immutable tuple
while preserving the BOUNDINGBOX task value.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: a0de5c4c-21b5-46f5-9608-8f0e0b0ab7ef

📥 Commits

Reviewing files that changed from the base of the PR and between b1a1e76 and 3e943db.

📒 Files selected for processing (8)
  • luxonis_train/attached_modules/metrics/__init__.py
  • luxonis_train/attached_modules/metrics/base_metric.py
  • luxonis_train/attached_modules/metrics/precision_recall_curve.py
  • luxonis_train/lightning/luxonis_lightning.py
  • luxonis_train/nodes/heads/efficient_bbox_head.py
  • luxonis_train/nodes/heads/precision_bbox_head.py
  • requirements.txt
  • tests/unittests/test_metrics/test_precision_recall_curve.py
🚧 Files skipped from review as they are similar to previous changes (5)
  • luxonis_train/attached_modules/metrics/init.py
  • luxonis_train/attached_modules/metrics/base_metric.py
  • luxonis_train/nodes/heads/efficient_bbox_head.py
  • luxonis_train/nodes/heads/precision_bbox_head.py
  • tests/unittests/test_metrics/test_precision_recall_curve.py

Comment thread luxonis_train/lightning/luxonis_lightning.py Outdated
@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.96373% with 4 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (main@d2a29c1). Learn more about missing BASE report.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
...ttests/test_metrics/test_precision_recall_curve.py 98.03% 4 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main     #429   +/-   ##
=======================================
  Coverage        ?   93.89%           
=======================================
  Files           ?      271           
  Lines           ?    13582           
  Branches        ?        0           
=======================================
  Hits            ?    12753           
  Misses          ?      829           
  Partials        ?        0           
Flag Coverage Δ
pytest 93.89% <98.96%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

@rolandocortez
rolandocortez force-pushed the feat/detection-confidence-curves branch from 3e943db to 8cfca72 Compare July 28, 2026 15:28

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@luxonis_train/lightning/luxonis_lightning.py`:
- Around line 901-910: Wrap the artifact conversion and self.tracker.log_image
call in the existing per-artifact fail-soft handling so conversion or tracker
backend errors are caught and do not escape on rank zero or deadlock other DDP
ranks; preserve processing of subsequent artifacts. Add a regression test
alongside the existing get_artifacts-failure and invalid-shape tests that makes
tracker.log_image fail and verifies the failure is handled without propagating.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: eaaf1bfa-b66f-4ef8-9a46-aa4e591e887c

📥 Commits

Reviewing files that changed from the base of the PR and between 3e943db and 8cfca72.

📒 Files selected for processing (8)
  • luxonis_train/attached_modules/metrics/__init__.py
  • luxonis_train/attached_modules/metrics/base_metric.py
  • luxonis_train/attached_modules/metrics/precision_recall_curve.py
  • luxonis_train/lightning/luxonis_lightning.py
  • luxonis_train/nodes/heads/efficient_bbox_head.py
  • luxonis_train/nodes/heads/precision_bbox_head.py
  • requirements.txt
  • tests/unittests/test_metrics/test_precision_recall_curve.py
🚧 Files skipped from review as they are similar to previous changes (6)
  • luxonis_train/attached_modules/metrics/init.py
  • requirements.txt
  • luxonis_train/attached_modules/metrics/base_metric.py
  • tests/unittests/test_metrics/test_precision_recall_curve.py
  • luxonis_train/nodes/heads/efficient_bbox_head.py
  • luxonis_train/nodes/heads/precision_bbox_head.py

Comment thread luxonis_train/lightning/luxonis_lightning.py Outdated
Comment thread luxonis_train/attached_modules/metrics/base_metric.py Outdated
@kozlov721
kozlov721 force-pushed the feat/detection-confidence-curves branch from 825c06d to 9bd8bdb Compare August 4, 2026 16:39
@kozlov721
kozlov721 merged commit 85910ce into main Aug 4, 2026
16 checks passed
@kozlov721
kozlov721 deleted the feat/detection-confidence-curves branch August 4, 2026 18:35
@kozlov721 kozlov721 mentioned this pull request Aug 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants