Curatrix

Referenz

Python-SDK

Das SDK ist eine dünne Schicht über der Release-Struktur: Es löst Versionen auf, prüft Prüfsummen und liefert Episoden und Frames. Alles, was es tut, geht auch mit pyarrow und einem Video-Reader.

Technische Beispiele zeigen die vorgesehene Struktur. Zugang, Endpunkte und unterstützte Funktionen werden im jeweiligen Projekt bestätigt.

Installation

Der Client wird über einen privaten Index verteilt. Die Zugangsdaten für den Index werden zusammen mit dem Datensatzzugang vergeben — installierbar ist das Paket also nur für Lizenznehmer.

Installation aus dem privaten Index
pip install curatrix --index-url https://pkg.curatrix.de/simple

Authentifizierung

Das SDK liest CURATRIX_API_KEY aus der Umgebung. Schlüssel sind auf die von Ihnen gehaltenen Datensätze, Versionen und Lizenzstufen beschränkt; ein Schlüssel erweitert diesen Umfang nie.

Schlüssel bereitstellen
export CURATRIX_API_KEY="ck_live_..."

Datensatz öffnen und iterieren

Episoden filtern und Frames lesen
from curatrix import Dataset

# Pin the version. Omitting it resolves to the newest licensed release,
# which makes a training run non-reproducible.
ds = Dataset.open("electrical-assembly", version="1.3.0")

print(ds.schema_version, ds.episode_count, ds.accepted_hours)

for episode in ds.episodes(outcome="failure", environment="workshop"):
    frames = episode.frames(stream="head", fps=10)  # lazy, decoded on demand
    recovery = [s for s in episode.subtasks if s.label == "recover"]
    if recovery:
        print(episode.id, len(frames), recovery[0].start_s)

Vorgeschlagene Splits verwenden

Trainings- und Evaluierungssets ohne Überschneidung der Mitwirkenden
train = ds.split("train")
evaluation = ds.split("eval")

assert set(train.contributors).isdisjoint(evaluation.contributors)

Ohne das SDK

Nichts in einem Release setzt unseren Client voraus. Die Tabellen sind Parquet, das Video ist MP4.

Ein Release nur mit pyarrow lesen
import pyarrow.parquet as pq

episodes = pq.read_table("episodes/episodes.parquet").to_pandas()
spans = pq.read_table("episodes/annotations.parquet").to_pandas()

failures = episodes[episodes.outcome == "failure"]
print(spans[spans.episode_id.isin(failures.episode_id)]
      .groupby("label").size().sort_values(ascending=False))