feat(lidar): qualify Patchwork++ on GOOSE

This commit is contained in:
DCCONSTRUCTIONS
2026-07-25 15:22:28 +03:00
parent 951b40c870
commit 60ba64004b
15 changed files with 1082 additions and 256 deletions
@@ -138,9 +138,11 @@ export function DatasetGatewayWorkspace() {
masks: {
currentGround: comparisonAligned?.currentGround ?? emptyMask,
currentAssigned: comparisonAligned?.evaluated ?? emptyMask,
candidateGround: comparisonAligned?.groundTruthGround ?? emptyMask,
candidateAssigned: comparisonAligned?.evaluated ?? emptyMask,
disagreement: comparisonAligned?.disagreement ?? emptyMask,
candidateGround: comparisonAligned?.patchworkGround ?? emptyMask,
candidateAssigned: comparisonAligned?.patchworkAssigned ?? emptyMask,
disagreement: comparisonAligned?.currentDisagreement ?? emptyMask,
candidateDisagreement:
comparisonAligned?.patchworkDisagreement ?? emptyMask,
groundTruthGround: preview.groundTruthGround,
},
};
@@ -301,7 +303,9 @@ export function DatasetGatewayWorkspace() {
...(comparison
? ([
["current", "Current"],
["disagreement", "Ошибки"],
["candidate", "Patchwork++"],
["disagreement", "Ошибки Current"],
["candidate-disagreement", "Ошибки PW++"],
] as const)
: []),
["intensity", "Remission"],
@@ -320,20 +324,42 @@ export function DatasetGatewayWorkspace() {
{comparison ? (
<dl className="dataset-preview__metrics">
<div>
<dt>Ground IoU</dt>
<dd>{(comparison.metrics.groundIou * 100).toFixed(1)}%</dd>
<dt>Current · IoU</dt>
<dd>{(comparison.metrics.current.groundIou * 100).toFixed(1)}%</dd>
</div>
<div>
<dt>Precision</dt>
<dd>{(comparison.metrics.precision * 100).toFixed(1)}%</dd>
<dt>Current · Recall</dt>
<dd>{(comparison.metrics.current.recall * 100).toFixed(1)}%</dd>
</div>
<div>
<dt>Recall</dt>
<dd>{(comparison.metrics.recall * 100).toFixed(1)}%</dd>
<dt>Current · Natural</dt>
<dd>
{(comparison.metrics.current.naturalGroundRecall * 100).toFixed(1)}%
</dd>
</div>
<div>
<dt>Latency</dt>
<dd>{comparison.latencyMs.toFixed(0)} ms</dd>
<dt>Current · Latency</dt>
<dd>{comparison.latencyMs.current.toFixed(0)} ms</dd>
</div>
<div>
<dt>Patchwork++ · IoU</dt>
<dd>
{(comparison.metrics.patchworkpp.groundIou * 100).toFixed(1)}%
</dd>
</div>
<div>
<dt>Patchwork++ · Recall</dt>
<dd>{(comparison.metrics.patchworkpp.recall * 100).toFixed(1)}%</dd>
</div>
<div>
<dt>Patchwork++ · Natural</dt>
<dd>
{(comparison.metrics.patchworkpp.naturalGroundRecall * 100).toFixed(1)}%
</dd>
</div>
<div>
<dt>Patchwork++ · Latency</dt>
<dd>{comparison.latencyMs.patchworkpp.toFixed(1)} ms</dd>
</div>
</dl>
) : comparisonError ? (
@@ -362,9 +388,19 @@ export function DatasetGatewayWorkspace() {
<span><i className="dataset-legend-ground" />current ground</span>
<span><i className="dataset-legend-other" />current non-ground</span>
</>
) : previewMode === "candidate" ? (
<>
<span><i className="dataset-legend-ground" />Patchwork++ ground</span>
<span><i className="dataset-legend-other" />Patchwork++ non-ground</span>
</>
) : previewMode === "disagreement" ? (
<>
<span><i className="dataset-legend-error" />ошибка относительно labels</span>
<span><i className="dataset-legend-error" />ошибка Current</span>
<span><i className="dataset-legend-other" />совпадение с labels</span>
</>
) : previewMode === "candidate-disagreement" ? (
<>
<span><i className="dataset-legend-error" />ошибка Patchwork++</span>
<span><i className="dataset-legend-other" />совпадение</span>
</>
) : (
@@ -380,6 +416,14 @@ export function DatasetGatewayWorkspace() {
<p>{previewError ?? "Проверяем point alignment и разметку."}</p>
</div>
)}
{comparison ? (
<p className="dataset-preview__comparison-note">
Patchwork++ использует опубликованную высоту VLS-128{" "}
{comparison.inputProfile.sensorHeightM.toFixed(2)} м; это
algorithm-specific admission, а не полный vehicle TF и не
normalized scan.
</p>
) : null}
</section>
) : null}
@@ -7,6 +7,7 @@ export type LidarGroundViewMode =
| "current"
| "candidate"
| "disagreement"
| "candidate-disagreement"
| "semantic"
| "ground-truth";
@@ -21,6 +22,7 @@ export interface LidarGroundPointCloudFrame {
candidateGround: number[];
candidateAssigned: number[];
disagreement: number[];
candidateDisagreement?: number[];
groundTruthGround?: number[];
};
}
@@ -119,6 +121,15 @@ function frameColors(
disagreement ? 0.31 : 0.29,
disagreement ? 0.22 : 0.35,
);
} else if (mode === "candidate-disagreement") {
const disagreement = frame.masks.candidateDisagreement?.[index] === 1;
setRgb(
colors,
offset,
disagreement ? 1 : 0.24,
disagreement ? 0.31 : 0.29,
disagreement ? 0.22 : 0.35,
);
} else {
setRgb(colors, offset, candidate ? 0.24 : 0.29, candidate ? 0.84 : 0.36, 0.43);
}