feat: publish full RELLIS qualification

This commit is contained in:
DCCONSTRUCTIONS 2026-07-25 21:38:22 +03:00
parent 21c7a5507c
commit d8b7ed4526
5 changed files with 156 additions and 33 deletions

View File

@ -131,6 +131,12 @@ K1 `lio_pcl` remains a post-LIO vendor-map increment and is not promoted to a
raw scan. Large dataset bytes are admitted only on the Windows/WSL worker under raw scan. Large dataset bytes are admitted only on the Windows/WSL worker under
`D:\NDC_MISSIONCORE\datasets`; no archive is downloaded automatically. `D:\NDC_MISSIONCORE\datasets`; no archive is downloaded automatically.
The complete RELLIS-3D v1.1 release is now admitted there and its full
`2,413`-frame validation split is available in **Полигон → Датасеты**. The
sealed Current/Patchwork++ comparison rejected Patchwork++ for navigation:
despite much lower latency and a small Ground-IoU gain, obstacle non-ground
recall regressed from `80.46%` to `69.70%`.
See [the Dataset Gateway plan](docs/14_LIDAR_DATASET_GATEWAY.md) and See [the Dataset Gateway plan](docs/14_LIDAR_DATASET_GATEWAY.md) and
[ADR 0021](docs/adr/0021-dataset-gateway-representation-boundary.md). [ADR 0021](docs/adr/0021-dataset-gateway-representation-boundary.md).

View File

@ -1665,6 +1665,36 @@
font-size: 0.82rem; font-size: 0.82rem;
} }
.rellis-review__decision {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 1rem;
border-radius: 0.9rem;
background: rgb(var(--nodedc-danger-rgb) / 0.08);
padding: 0.78rem 0.9rem;
}
.rellis-review__decision strong {
color: rgb(var(--nodedc-danger-rgb));
font-size: 0.68rem;
}
.rellis-review__decision span {
color: var(--nodedc-text-muted);
font-size: 0.58rem;
line-height: 1.45;
text-align: right;
}
.rellis-review__decision[data-passed="true"] {
background: rgb(255 255 255 / 0.045);
}
.rellis-review__decision[data-passed="true"] strong {
color: var(--nodedc-text-primary);
}
.polygon-review-summary, .polygon-review-summary,
.polygon-review-unavailable, .polygon-review-unavailable,
.polygon-review-analysis, .polygon-review-analysis,

View File

@ -10,8 +10,10 @@ import {
type LidarGroundViewMode, type LidarGroundViewMode,
} from "./LidarGroundPointCloud"; } from "./LidarGroundPointCloud";
import { import {
fetchGroundQualification,
fetchGroundReview, fetchGroundReview,
fetchGroundReviewFrame, fetchGroundReviewFrame,
type GroundQualification,
type GroundReview, type GroundReview,
type GroundReviewFrame, type GroundReviewFrame,
type GroundReviewFrameSummary, type GroundReviewFrameSummary,
@ -324,6 +326,7 @@ function qualifiedModeExplanation(mode: LidarGroundViewMode) {
} }
function RellisQualifiedReview({ runId }: { runId: string }) { function RellisQualifiedReview({ runId }: { runId: string }) {
const [qualification, setQualification] = useState<GroundQualification | null>(null);
const [review, setReview] = useState<GroundReview | null>(null); const [review, setReview] = useState<GroundReview | null>(null);
const [frame, setFrame] = useState<GroundReviewFrame | null>(null); const [frame, setFrame] = useState<GroundReviewFrame | null>(null);
const [selectedSequence, setSelectedSequence] = useState<string | null>(null); const [selectedSequence, setSelectedSequence] = useState<string | null>(null);
@ -336,15 +339,20 @@ function RellisQualifiedReview({ runId }: { runId: string }) {
useEffect(() => { useEffect(() => {
const controller = new AbortController(); const controller = new AbortController();
setError(null); setError(null);
setQualification(null);
setReview(null); setReview(null);
setFrame(null); setFrame(null);
cache.current.clear(); cache.current.clear();
void fetchGroundReview(runId, { signal: controller.signal }) void Promise.all([
.then((value) => { fetchGroundQualification(runId, { signal: controller.signal }),
if (controller.signal.aborted || !value) return; fetchGroundReview(runId, { signal: controller.signal }),
setReview(value); ])
setSelectedSequence(value.frames[0]?.datasetSequenceId ?? null); .then(([qualificationValue, reviewValue]) => {
setSelectedFrame(value.frames[0]?.frameId ?? null); if (controller.signal.aborted || !qualificationValue || !reviewValue) return;
setQualification(qualificationValue);
setReview(reviewValue);
setSelectedSequence(reviewValue.frames[0]?.datasetSequenceId ?? null);
setSelectedFrame(reviewValue.frames[0]?.frameId ?? null);
}) })
.catch((loadError: unknown) => { .catch((loadError: unknown) => {
if (!controller.signal.aborted) setError(errorMessage(loadError)); if (!controller.signal.aborted) setError(errorMessage(loadError));
@ -440,7 +448,7 @@ function RellisQualifiedReview({ runId }: { runId: string }) {
<header className="dataset-sequence-review__truth"> <header className="dataset-sequence-review__truth">
<div> <div>
<span className="section-eyebrow">RELLIS · FULL VALIDATION</span> <span className="section-eyebrow">RELLIS · FULL VALIDATION</span>
<h2>Пять последовательностей Ouster OS1 с покадровым сравнением</h2> <h2>Две validation-последовательности Ouster OS1 с покадровым сравнением</h2>
<p> <p>
Все {review.frameCount.toLocaleString("ru-RU")} validation-сканов Все {review.frameCount.toLocaleString("ru-RU")} validation-сканов
выровнены с labels и pose index. Высота Patchwork++ определена только выровнены с labels и pose index. Высота Patchwork++ определена только
@ -577,6 +585,26 @@ function RellisQualifiedReview({ runId }: { runId: string }) {
</article> </article>
</div> </div>
{qualification ? (
<div
className="rellis-review__decision"
data-passed={qualification.decision.passed ? "true" : "false"}
>
<strong>
{qualification.decision.passed
? "Кандидат прошёл независимую проверку"
: "Patchwork++ не прошёл независимую проверку"}
</strong>
<span>
Полный validation: obstacle recall{" "}
{formatPercent(qualification.current.micro.obstacleNonGroundRecall)}
{" → "}
{formatPercent(qualification.patchwork.micro.obstacleNonGroundRecall)}.
Алгоритм не принят для navigation/safety.
</span>
</div>
) : null}
<p className="dataset-sequence-review__raw-note"> <p className="dataset-sequence-review__raw-note">
Это независимая исследовательская проверка переносимости. Она не Это независимая исследовательская проверка переносимости. Она не
включает управление машиной и не принимает алгоритм для navigation/safety. включает управление машиной и не принимает алгоритм для navigation/safety.

View File

@ -879,10 +879,11 @@ workflow:
explicitly grouped into eight independent fragments; Play is bounded to one explicitly grouped into eight independent fragments; Play is bounded to one
fragment and described as accelerated review of sparse annotated scans. fragment and described as accelerated review of sparse annotated scans.
- The catalog is multi-source. RELLIS-3D v1.1 appears as an independent Ouster - The catalog is multi-source. RELLIS-3D v1.1 appears as an independent Ouster
domain with its own license and admission state. Its current `smoke-ready` domain with its own license and admission state. Its complete admitted
view shows official frame `000104`, semantic colors, FLU axes and the release exposes the two real validation sequences and all `2,413` scans with
versioned `ground / non-ground / ignore` mapping; it does not show invented public ground truth, Current, Patchwork++ and error modes. Metrics come only
algorithm metrics. from the sealed qualification report and are scoped to the selected
sequence.
- The dataset viewer exposes source frame number, nanosecond timestamp gaps, - The dataset viewer exposes source frame number, nanosecond timestamp gaps,
ground truth and Current/Patchwork++ overlays. ground truth and Current/Patchwork++ overlays.
- The fixed sensor-centric coordinate frame and operator camera are preserved - The fixed sensor-centric coordinate frame and operator camera are preserved
@ -899,11 +900,15 @@ The accepted `3.3 GB` annotated validation ZIP is not a continuous recording.
Continuous ego-motion requires a separately admitted raw ROS bag and Continuous ego-motion requires a separately admitted raw ROS bag and
localization source. localization source.
RELLIS S0 uses only a bounded derivative of the pinned official example for RELLIS has passed the full D-only release-admission gate: `13,556` aligned
browser inspection. The full `14 GB` Ouster SemanticKITTI scans, labels and scan/label pairs, official splits, five source sequences and complete LiDAR
poses remain a separate D-only admission gate. Its `CC-BY-NC-SA-3.0` license pose coverage. The R1 validation run processed all `2,413` frames after a
means cross-dataset research evidence cannot silently become an unrestricted train-only sensor-height calibration. Its Patchwork++ candidate was explicitly
commercial runtime or training dependency. rejected: Ground IoU improved by only `1.41` points while obstacle non-ground
recall fell from `80.46%` to `69.70%`. The result remains research evidence,
not navigation or safety authority. The `CC-BY-NC-SA-3.0` license also prevents
the source from silently becoming an unrestricted commercial runtime or
training dependency.
The backend reads the configured repository from The backend reads the configured repository from
`MISSIONCORE_POLYGON_RUNS_ROOT` using `MISSIONCORE_POLYGON_RUNS_ROOT` using

View File

@ -24,7 +24,7 @@ Implemented now:
- path-free `missioncore.dataset-admission/v1` worker evidence instead of a - path-free `missioncore.dataset-admission/v1` worker evidence instead of a
static React status; static React status;
- bounded `missioncore.dataset-native-scan-preview/v1` (GOOSE) and `/v2` - bounded `missioncore.dataset-native-scan-preview/v1` (GOOSE) and `/v2`
(RELLIS smoke) artifacts, selected by source at (RELLIS) artifacts, selected by source at
`GET /api/v1/lidar/dataset-gateway/preview?source_id=...`; `GET /api/v1/lidar/dataset-gateway/preview?source_id=...`;
- explicit `native-scan`, `normalized-scan` and `rolling-local-map` - explicit `native-scan`, `normalized-scan` and `rolling-local-map`
representations; representations;
@ -40,10 +40,13 @@ Implemented now:
`Открыть` action; `Открыть` action;
- one admitted GOOSE validation frame with source colors, normalized remission - one admitted GOOSE validation frame with source colors, normalized remission
and an independent ground-truth view; and an independent ground-truth view;
- a pinned RELLIS-3D v1.1 compatibility smoke using the official Ouster example - a fail-closed admission of the complete official RELLIS-3D v1.1 release:
frame `000104`, its native `131,072` XYZI points, point-aligned labels, `13,556` aligned Ouster scans and labels, all five sequences, official
official ontology colors, explicit FLU sensor axes and a versioned train/validation/test splits and complete LiDAR pose coverage;
`ground / non-ground / ignore` evaluation policy; - a full RELLIS validation viewer with its two real source sequences,
`2,413` source scans, ground truth, Current, Patchwork++ and error modes;
- a train-only, label-backed Ouster height calibration and a sealed R1
Current/Patchwork++ qualification over every RELLIS validation frame;
- a published, dimensioned MuCAR-3/VLS-128 Patchwork++ input profile: - a published, dimensioned MuCAR-3/VLS-128 Patchwork++ input profile:
sensor frame `x-forward / y-left / z-up`, physical height `2.24 m`, native sensor frame `x-forward / y-left / z-up`, physical height `2.24 m`, native
one-revolution scan and explicit absence of deskew/full vehicle TF claims; one-revolution scan and explicit absence of deskew/full vehicle TF claims;
@ -59,8 +62,8 @@ Not implemented:
- no implicit coordinate conversion; - no implicit coordinate conversion;
- no fake ring/timestamp reconstruction for K1 MQTT evidence; - no fake ring/timestamp reconstruction for K1 MQTT evidence;
- no model training or production promotion; - no model training or production promotion;
- no full RELLIS Ouster archive, pose set, algorithm comparison or ROS bag - no RELLIS ROS bag admission, continuous synchronized playback or production
admission yet; promotion;
- no rolling-map implementation yet. - no rolling-map implementation yet.
## Product surface boundary ## Product surface boundary
@ -82,9 +85,10 @@ The gateway is not part of device quality diagnostics.
Before compatible source evidence exists, the catalog explains the blocked Before compatible source evidence exists, the catalog explains the blocked
storage gate and keeps `Открыть датасет` disabled. GOOSE becomes available only storage gate and keeps `Открыть датасет` disabled. GOOSE becomes available only
after the worker manifest says `frame-ready`; RELLIS becomes available at after the worker manifest says `frame-ready`; RELLIS becomes `dataset-ready`
`smoke-ready` only for the pinned official example. Both bounded previews must only after all four pinned archives, every split pair and pose coverage pass
pass their own identity, point-alignment and safety checks. admission. Both bounded previews must pass their own identity, point-alignment
and safety checks.
## Why public recordings look different ## Why public recordings look different
@ -203,8 +207,10 @@ time; TTL/dynamic filtering prevents stale ghosts.
- [x] Official RELLIS Ouster example passes the shared SemanticKITTI reader. - [x] Official RELLIS Ouster example passes the shared SemanticKITTI reader.
- [x] RELLIS axes, ontology colors and versioned ground-target/ignore mapping - [x] RELLIS axes, ontology colors and versioned ground-target/ignore mapping
are visible in the same Dataset workflow. are visible in the same Dataset workflow.
- [ ] Full RELLIS Ouster SemanticKITTI scans, labels and poses admitted on - [x] Full RELLIS Ouster SemanticKITTI scans, labels and poses admitted on
worker D. worker D.
- [x] Current/Patchwork++ comparison executed and sealed over all `2,413`
RELLIS validation frames.
- [ ] Current/Patchwork++ RELLIS comparison qualified without obstacle loss. - [ ] Current/Patchwork++ RELLIS comparison qualified without obstacle loss.
- [ ] Rolling local map with pose/TTL/dynamic policy qualified. - [ ] Rolling local map with pose/TTL/dynamic policy qualified.
@ -239,12 +245,60 @@ non-ground; and `void`, `water`, `sky`, generic `object` and `puddle` as
silently counted as either free ground or obstacle. This mapping is a Mission silently counted as either free ground or obstacle. This mapping is a Mission
Core evaluation decision, not an upstream RELLIS claim. Core evaluation decision, not an upstream RELLIS claim.
The smoke closes reader, alignment, axes, palette and mapping compatibility The smoke closed reader, alignment, axes, palette and mapping compatibility
only. The next gate admits the `14 GB` Ouster SemanticKITTI scans plus the only. The complete release was then admitted from four pinned archives kept
`174 MB` labels and `174 MB` poses to D-only worker storage. Full ROS bags are exclusively on worker D:
not needed for the ground cross-check. Patchwork++ may be compared only after a
physical Ouster mounting-height profile is evidenced; no height is inferred - scans: `15,037,868,425` bytes, SHA-256
from the example cloud. `4e2bb5654bda5b9d08b9ac1ddbd39bd6dd231163a77ff811f2f282f3bbdf8ee7`;
- labels: `182,265,710` bytes, SHA-256
`03297c30b9f2182c74be93f8564d6ce1349237fcc4f89fc96479fe71bb40d905`;
- poses: `609,344` bytes, SHA-256
`6deaf38a9cac3a480cfdb70fa9a1d9278f25c36f5efd2487a3c4a6a400250f67`;
- splits: `76,774` bytes, SHA-256
`de639728e0058d7d477188028d9b811313a601884ef00d267ce13736be7cf54f`.
Admission identity
`a3f3f161a5a7edccdf66cea75ecf9004b8f6a895282faabe661c075c15a82774`
proves `13,556` scan/label pairs, the official `7,800 / 2,413 / 3,343`
train/validation/test split counts, all five sequences and matching pose
coverage. No ROS bag is needed for this single-scan ground cross-check.
## Full RELLIS qualification result
The immutable R1 replay-shadow run
`rellis-ground-5b49d241a42b41d9b427` processed all `2,413` validation frames.
Its qualification identity is
`5b49d241a42b41d9b4279062c7517c99e16880e025cd2b70d3966d49f3ff6b7f`.
The physical-height input was calibrated from `64` deterministic
sequence-stratified **train** frames only: `1.0937 m` median height,
`0.0538 m` median absolute deviation and no validation labels used.
| Validation micro metric | Current | Patchwork++ |
| --- | ---: | ---: |
| Ground IoU | `40.5450%` | `41.9599%` |
| Natural-ground recall | `72.2992%` | `93.2555%` |
| Obstacle non-ground recall | `80.4612%` | `69.7040%` |
| Assigned fraction | `100%` | `100%` |
| Latency p50 | `900.22 ms` | `8.58 ms` |
| Latency p95 | `1284.29 ms` | `13.98 ms` |
| Maximum latency | `1706.78 ms` | `20.50 ms` |
The sealed decision is `qualification-rejected`. Patchwork++ improved Ground
IoU by only `1.41` percentage points against the required `2.00`, preserved
only `69.70%` of obstacle points against the required `90%`, and regressed
obstacle recall by `10.76` points against the allowed `1%`. Coverage, latency
and catastrophic per-frame regression gates passed, but none of those can
override obstacle loss. The provider therefore remains visualization and
research evidence only:
`promoted_to_navigation_or_safety = false`.
The bound review-pack identity is
`1ee454fedd37bd56c3c9d07e17a3b5f59cdb29f7c1ae2086f8bc746149f3eb1b`.
It contains bounded `12,000`-point previews for every validation scan and keeps
the two real validation sequences separate. This lets an operator inspect raw
geometry, public ground truth, both predictions and both error maps before
changing the profile or acceptance thresholds.
## First GOOSE admission evidence ## First GOOSE admission evidence