Skip to content

Gaze-in-the-Wild labeller agreement

GazeForge can quantify human-human event agreement for Gaze-in-the-Wild only after the local source copy has passed the source-audit contract. The agreement runner consumes a verified GazeInWildSourceAuditRun; it does not accept arbitrary label files or a caller-supplied claim that two streams describe the same data.

Why the runner is source-audit aware

The distributed corpus can contain multiple human label streams for one recording, and the cadence actually present in LabelData.T should not be replaced by the nominal acquisition-hardware rate. The runner therefore:

  • revalidates the source-audit report and specification fingerprints;
  • requires two distinct audited labeller IDs;
  • checks the shared participant/trial inventory and requires complete overlap by default;
  • re-aligns every shared trial one-to-one by participant, trial, and timestamp;
  • rechecks point-of-regard, validity, and confidence identity between the paired streams;
  • verifies that paired streams imply the same timestamp-derived sampling rate;
  • computes sample-level exact agreement and Cohen's kappa;
  • preserves excluded or invalid samples as temporal separators before event exclusion;
  • segments each trial at its own inferred source-file cadence; and
  • pools the resulting event intervals in milliseconds for bidirectional event matching.

This design avoids inventing one common sampling rate when an audited snapshot contains files with different timestamp-derived cadences.

Python workflow

from gazeforge import (
    audit_gaze_in_wild_source,
    load_gaze_in_wild_source_audit_spec,
    run_gaze_in_wild_labeller_agreement,
)

spec = load_gaze_in_wild_source_audit_spec("gaze-in-wild-source-audit.json")
audit = audit_gaze_in_wild_source(
    "/path/to/LabelData",
    "/path/to/ProcessData",
    spec,
)

agreement = run_gaze_in_wild_labeller_agreement(
    audit,
    left_labeller=1,
    right_labeller=2,
    excluded_labels=("unlabelled",),
    exclude_invalid_tracking=True,
    event_min_iou=0.50,
)

print(agreement.report["metrics"]["sample_agreement_analysis_labels"])
print(agreement.report["metrics"]["event_agreement_left_as_reference"])
print(agreement.per_trial)

Sample-level evidence

Two sample-level summaries are retained. The all-label summary describes the distributed annotation streams as they exist. The analysis-label summary excludes configured non-analysis labels pairwise and, by default, samples whose audited tracking-validity mask is false. The report records the number and fraction of samples excluded from that analysis summary rather than deleting them silently.

Event-level evidence

Invalid or excluded samples are not removed before event segmentation. They remain hard temporal separators so two same-labelled events on opposite sides of a tracking-loss or unlabelled run cannot be accidentally joined into one event.

Event precision, recall, F1, temporal IoU, and onset/offset/duration errors are reported in both labeller-reference directions. The left/right designations are bookkeeping only: neither human labeller is treated as error-free.

Overlap policy

require_complete_overlap=True is the default for frozen agreement evidence. If one selected labeller is missing a participant/trial that exists for the other, the runner refuses to create the report. Setting the option to False is available for controlled exploratory work; the report then records left-only and right-only trial identities explicitly.

Claim limit

This module completes the agreement-analysis infrastructure, not an empirical Gaze-in-the-Wild result. A real agreement report should only be frozen after the authoritative snapshot, current reuse terms, participant/task mapping, and coordinate semantics have been independently audited.

Gaze-in-the-Wild is head-mounted naturalistic evidence from different hardware and conditions. Even a fully audited human-human result must not be described as Gazepoint GP3-specific or native GP3 60 Hz validation.