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
`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
[ADR 0021](docs/adr/0021-dataset-gateway-representation-boundary.md).

View File

@ -1665,6 +1665,36 @@
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-unavailable,
.polygon-review-analysis,

View File

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

View File

@ -879,10 +879,11 @@ workflow:
explicitly grouped into eight independent fragments; Play is bounded to one
fragment and described as accelerated review of sparse annotated scans.
- 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`
view shows official frame `000104`, semantic colors, FLU axes and the
versioned `ground / non-ground / ignore` mapping; it does not show invented
algorithm metrics.
domain with its own license and admission state. Its complete admitted
release exposes the two real validation sequences and all `2,413` scans with
public ground truth, Current, Patchwork++ and error modes. Metrics come only
from the sealed qualification report and are scoped to the selected
sequence.
- The dataset viewer exposes source frame number, nanosecond timestamp gaps,
ground truth and Current/Patchwork++ overlays.
- 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
localization source.
RELLIS S0 uses only a bounded derivative of the pinned official example for
browser inspection. The full `14 GB` Ouster SemanticKITTI scans, labels and
poses remain a separate D-only admission gate. Its `CC-BY-NC-SA-3.0` license
means cross-dataset research evidence cannot silently become an unrestricted
commercial runtime or training dependency.
RELLIS has passed the full D-only release-admission gate: `13,556` aligned
scan/label pairs, official splits, five source sequences and complete LiDAR
pose coverage. The R1 validation run processed all `2,413` frames after a
train-only sensor-height calibration. Its Patchwork++ candidate was explicitly
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
`MISSIONCORE_POLYGON_RUNS_ROOT` using

View File

@ -24,7 +24,7 @@ Implemented now:
- path-free `missioncore.dataset-admission/v1` worker evidence instead of a
static React status;
- 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=...`;
- explicit `native-scan`, `normalized-scan` and `rolling-local-map`
representations;
@ -40,10 +40,13 @@ Implemented now:
`Открыть` action;
- one admitted GOOSE validation frame with source colors, normalized remission
and an independent ground-truth view;
- a pinned RELLIS-3D v1.1 compatibility smoke using the official Ouster example
frame `000104`, its native `131,072` XYZI points, point-aligned labels,
official ontology colors, explicit FLU sensor axes and a versioned
`ground / non-ground / ignore` evaluation policy;
- a fail-closed admission of the complete official RELLIS-3D v1.1 release:
`13,556` aligned Ouster scans and labels, all five sequences, official
train/validation/test splits and complete LiDAR pose coverage;
- 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:
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;
@ -59,8 +62,8 @@ Not implemented:
- no implicit coordinate conversion;
- no fake ring/timestamp reconstruction for K1 MQTT evidence;
- no model training or production promotion;
- no full RELLIS Ouster archive, pose set, algorithm comparison or ROS bag
admission yet;
- no RELLIS ROS bag admission, continuous synchronized playback or production
promotion;
- no rolling-map implementation yet.
## 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
storage gate and keeps `Открыть датасет` disabled. GOOSE becomes available only
after the worker manifest says `frame-ready`; RELLIS becomes available at
`smoke-ready` only for the pinned official example. Both bounded previews must
pass their own identity, point-alignment and safety checks.
after the worker manifest says `frame-ready`; RELLIS becomes `dataset-ready`
only after all four pinned archives, every split pair and pose coverage pass
admission. Both bounded previews must pass their own identity, point-alignment
and safety checks.
## 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] RELLIS axes, ontology colors and versioned ground-target/ignore mapping
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.
- [x] Current/Patchwork++ comparison executed and sealed over all `2,413`
RELLIS validation frames.
- [ ] Current/Patchwork++ RELLIS comparison qualified without obstacle loss.
- [ ] 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
Core evaluation decision, not an upstream RELLIS claim.
The smoke closes reader, alignment, axes, palette and mapping compatibility
only. The next gate admits the `14 GB` Ouster SemanticKITTI scans plus the
`174 MB` labels and `174 MB` poses to D-only worker storage. Full ROS bags are
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
from the example cloud.
The smoke closed reader, alignment, axes, palette and mapping compatibility
only. The complete release was then admitted from four pinned archives kept
exclusively on worker D:
- scans: `15,037,868,425` bytes, SHA-256
`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