feat: publish full RELLIS qualification
This commit is contained in:
parent
21c7a5507c
commit
d8b7ed4526
|
|
@ -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).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue