Zum Inhalt springen
dan felser @felsr
Sport KI 06

Bike-Fit aus einem Handyvideo

1 Claude Code öffnen — nicht die App, der Prompt installiert etwas  2 Prompt reinhauen  3 dein Video schicken, wenn er danach fragt.

Ich will meine Sitzposition auf dem Rennrad messen lassen. Nicht schaetzen, nicht
mit einem Rechner im Netz, sondern aus einem Video von mir selbst auf der Rolle.

Du machst das komplett. Ich lege keinen Ordner an, installiere nichts von Hand und
schreibe keinen Code. Sprich Deutsch mit mir, geh Schritt fuer Schritt vor und
halt an, wenn du etwas von mir brauchst.

Am Ende will ich drei Dinge haben: mein Video mit einer eingeblendeten Analyse --
farbiges Skelett, Messwerte, ein mitlaufender Winkel am Knie und ein
Verlaufsdiagramm. Eine Zahl fuer den Kniewinkel am unteren Totpunkt. Und einen
Satz, der mir sagt, ob und um wie viele Millimeter ich meinen Sattel verstellen
soll.


SCHRITT 1: UMGEBUNG

Leg einen Ordner "bikefit" an und arbeite darin.

Pruef, ob Python da ist. Wenn nicht, hilf mir bei der Installation. Leg eine
virtuelle Umgebung an, damit nichts an meinem System haengen bleibt.

Installiere diese Pakete und lies vorher kurz die aktuelle Doku, damit du die
richtigen Aufrufe benutzt und nicht die aus deinem Gedaechtnis:

  ultralytics    das Posenmodell, das die Koerperpunkte findet
                 github.com/ultralytics/ultralytics
                 Doku: docs.ultralytics.com
                 Lizenz AGPL-3.0. Fuer mich privat unkritisch, weil ich es nur
                 lokal laufen lasse und nichts davon weitergebe.
  opencv-python  Video lesen und schreiben
  pillow         das Overlay zeichnen, mit echter Schrift statt Balkenlettern
  numpy          die Rechnerei
  torch          fuehrt das Modell aus

Nimm das Modell yolo11x-pose.pt, nicht das kleinste. Es liefert 17 Koerperpunkte
je Bild, jeweils mit Pixelposition und einer Zuversicht zwischen null und eins.
Alles danach ist Geometrie auf diesen Punkten, kein weiteres Modell.

Finde heraus, worauf das Modell bei mir rechnen kann, und nimm das schnellste:
auf einem Mac mit Apple-Chip ist das "mps", mit einer Nvidia-Karte "cuda", sonst
"cpu". Sag mir vorher, wie lange der Durchlauf ungefaehr dauert. Richtwerte fuer
einen Clip von 30 Sekunden: auf einem Apple-Chip rund fuenf Minuten, auf einer
reinen CPU eher dreizehn. Wenn nur die CPU bleibt und dir das zu lang ist, biete
mir das kleine Modell an, aber sag dazu, dass die Punkte dann bei Bewegungs-
unschaerfe ungenauer sitzen.

Pruef auch, ob ffmpeg da ist. Wenn nicht, hilf mir es zu installieren.


SCHRITT 2: MEIN VIDEO PRUEFEN, BEVOR DU RECHNEST

Frag mich nach der Datei. Bevor du irgendetwas auswertest, pruef die Aufnahme.
Die Aufnahme entscheidet ueber das Ergebnis, nicht die Rechnung.

Miss an ein paar Bildern nach:

  Ist es wirklich von der Seite? Bei einer sauberen Seitenansicht liegen linke
  und rechte Schulter im Bild fast uebereinander, ebenso die Hueften. Rechne den
  waagerechten Abstand der beiden Schultern und teile ihn durch den Abstand von
  Schulter zu Huefte. Liegt das ueber etwa 0,25, stand die Kamera schraeg. Sag
  mir das und sag mir, dass jede Winkelmessung dann zu klein ausfaellt. Frag
  mich, ob ich neu filmen will.

  Bin ich ueberhaupt durchgehend zu sehen und trete ich? Wenn die Zuversicht fuer
  Huefte, Knie und Knoechel oft unter 0,5 liegt, ist es zu dunkel oder etwas
  steht im Weg.

  Ist der Clip lang genug? Unter zehn Sekunden reicht es nicht fuer mehrere
  Kurbelumdrehungen.

Sag mir das Ergebnis dieser Pruefung in einem Satz, bevor du weitermachst.


SCHRITT 3: DIE MESSKETTE BAUEN

Bau ein Skript, das folgendes tut. Die vier markierten Punkte sind die Stellen,
an denen so eine Messung still falsch wird, ohne dass man es dem Ergebnis ansieht.
Halt dich genau daran.

Lauf ueber jedes Bild und hol dir die 17 Punkte. Nimm die Person mit der hoechsten
mittleren Zuversicht, falls mehrere im Bild sind. Entscheide einmal fuer den
ganzen Clip, welche Koerperseite naeher an der Kamera ist, ueber die mittlere
Zuversicht der Punkte je Seite, und miss dann nur diese Seite.

  WICHTIG 1: Nimm die Punkte in PIXELN, nicht die auf null bis eins normierten.
  Die normierten sind je Achse normiert. Bei einem Hochformatvideo bedeutet 0,1
  waagerecht eine andere Strecke als 0,1 senkrecht, und jeder Winkel daraus ist
  gestaucht. Aus 143 Grad werden dann 119, und die Zahl sieht weiter plausibel
  aus. Wenn du aus irgendeinem Grund doch die normierten nimmst, multipliziere
  die waagerechte Koordinate vorher mit Breite geteilt durch Hoehe, und zwar an
  jeder Stelle, an der eine Laenge oder ein Winkel entsteht.

Such den unteren Totpunkt, also den Moment, in dem das Pedal ganz unten steht und
das Bein am weitesten gestreckt ist. Zaehle dafuer nur Bilder, in denen ich
wirklich trete. Beim Auf- und Absteigen und beim Danebenstehen ist das Bein
gestreckter als bei jedem echten Tritt, und der Fuss steht auf dem Boden tiefer,
als er beim Treten je kommt. Beide Groessen wuerden also genau die falschen Bilder
gewinnen lassen. Erkenne das Treten daran, dass die Knoechelhoehe regelmaessig
schwingt, und wirf die erste und letzte Sekunde weg.

  WICHTIG 2: Wie du den Wert am Totpunkt abliest, entscheidet ueber das ganze
  Ergebnis. Zwei Wege sind naheliegend und beide falsch.

  Nimm NICHT den Median ueber ein Band von Bildern um den Totpunkt. Das klingt
  robust, ist aber systematisch falsch: Ein Median ueber ein Band um ein Minimum
  liegt immer ueber dem Minimum. Der Fehler betraegt rund fuenf Grad, zeigt immer
  in dieselbe Richtung und verschwindet auch bei mehr Bildern je Sekunde nicht.
  Fuenf Grad sind ueber elf Millimeter Sattelhoehe.

  Nimm aber auch nicht einfach das Bild mit der kleinsten Beugung. Wer das
  Minimum eines verrauschten Signals sucht, findet bevorzugt die Bilder, deren
  Rauschen gerade nach unten zeigt, und misst dadurch zu wenig Beugung.

  So machst du es: Such je Kurbelumdrehung das Bild mit der geringsten Beugung
  als groben Ort. Leg dann eine Parabel per Ausgleichsrechnung durch ein Fenster
  von Bildern um diesen Ort und nimm den Scheitel dieser Parabel. Ueber alle
  Umdrehungen bildest du den Median.

  Die Fensterbreite ist dabei ein Anteil der TRITTDAUER, keine feste Bildzahl.
  Nimm ein Viertel der Trittdauer. Die Trittdauer holst du dir aus der Schwingung
  der Knoechelhoehe. Der Grund: Neun Bilder sind bei 60 Bildern je Sekunde ein
  Fuenftel eines Tritts und bei 30 fast die Haelfte. Ein zu schmales Fenster
  laesst das Rauschen gewinnen, ein zu breites bricht die Parabelnaeherung, weil
  die Kurve ueber einen ganzen Tritt keine Parabel mehr ist. Mit einem Viertel
  bleibt der Fehler ueber alle ueblichen Bildraten und Trittfrequenzen unter
  einem halben Grad.

  Und wenn du eine geglaettete Reihe benutzt, um den Ort zu finden, lies den Wert
  trotzdem auf der ungeglaetteten ab: Glaetten verschiebt den Scheitel um bis zu
  zwei Bilder.

Miss am unteren Totpunkt den Kniewinkel, also den Winkel zwischen Huefte, Knie
und Knoechel. Gib ihn als Beugung an, das sind 180 Grad minus diesem Winkel.

Miss ausserdem die Rumpfneigung gegen die Waagerechte, also die Linie von der
Schulter zur Huefte, und die Ellbogenbeugung.

Lies die Bildrate aus der Videodatei aus. Rate sie nicht und setz sie nicht auf
30. Handyvideos laufen oft mit 60 Bildern je Sekunde, und mit einer geratenen
Bildrate laeuft das fertige Video hinterher in halber Geschwindigkeit.


SCHRITT 4: PRUEF DEINE EIGENE RECHNUNG, BEVOR DU MEIN VIDEO ANFASST

Das ist der wichtigste Schritt, und du ueberspringst ihn nicht.

Bau dir einen kuenstlichen Tretzyklus, bei dem du den wahren Kniewinkel kennst.
Das geht so: Setz das Tretlager in den Ursprung, die Huefte auf einen festen
Punkt darueber und leicht dahinter, und lass das Pedal auf einem Kreis mit
172,5 Millimeter Radius umlaufen. Nimm 430 Millimeter Oberschenkel und 440
Millimeter Unterschenkel. Das Knie ist dann der Schnittpunkt zweier Kreise, einer
um die Huefte mit Oberschenkellaenge, einer um das Pedal mit Unterschenkellaenge.
Waehl die Huefthoehe so, dass am unteren Totpunkt genau 35 Grad Kniebeugung
herauskommen. Rechne das ueber den Kosinussatz aus, statt es zu probieren.

Jetzt schick diesen Zyklus durch deine fertige Messkette und vergleiche mit den
35 Grad, die du hineingesteckt hast.

  WICHTIG 3: Ein sauberer Durchlauf beweist noch nichts. Wiederhole ihn mit
  verrauschten Punkten, also mit ein paar Pixeln zufaelliger Abweichung auf jedem
  Koerperpunkt, und mit verschiedenen Phasenlagen, damit der Totpunkt mal genau
  auf ein Bild faellt und mal dazwischen. Zwei Dutzend Durchlaeufe reichen.

Zeig mir das Ergebnis: den mittleren Fehler und den schlechtesten Einzelfall.
Liegt der mittlere Fehler ueber einem Grad, stimmt etwas in der Kette nicht.
Dann suchst du den Fehler, bevor es weitergeht. Sag mir ehrlich, was herauskam.

Zur Einordnung, damit du weisst, was erreichbar ist: Eine sauber gebaute Kette
schafft hier einen mittleren Fehler unter einem halben Grad, und zwar in allen
vier Faellen. Wenn bei dir ein Wert von mehreren Grad steht, hast du entweder das
Band statt des Scheitels genommen oder das Fenster falsch gewaehlt. Das ist kein
Rauschen, das man wegmitteln kann, sondern ein Fehler im Verfahren.


SCHRITT 5: JETZT MEIN VIDEO

Lauf ueber meinen Clip und miss die Winkel.

Faerbe das Skelett im Video nach dem, was du gemessen hast. Fuer den Kniewinkel
gilt gruen bei 30 bis 40 Grad Beugung am unteren Totpunkt. Ueber 42 Grad heisst,
der Sattel ist zu tief, unter 28, er ist zu hoch. Nimm 2,5 Grad Toleranz an den
Raendern, weil ein Handyvideo nur auf etwa zwei bis drei Grad genau aufloest.

  WICHTIG 4: Die Farbe und der Text muessen dieselbe Schwelle benutzen. Wenn du
  bei 42 Grad noch gruen faerbst, darf daneben nicht stehen, ich solle den Sattel
  verstellen. Entweder beides oder keines von beidem.

Fuer Rumpf und Ellbogen faerbe mit, aber schreib dazu, dass das Erfahrungswerte
aus der Praxis sind und keine belegte Norm: Rumpf 40 bis 50 Grad zur Waagerechten,
Ellbogen 15 bis 30 Grad Beugung.

Schulter- und Hueftwinkel misst du und zeigst sie an, aber du bewertest sie NICHT
und faerbst sie nicht. Grund: Die Studie, die dafuer gern zitiert wird, misst 112
Grad an der Schulter und 77 Grad an der Huefte, waehrend in Bike-Fit-Anleitungen
80 bis 95 und 85 bis 110 stehen. Das passt nicht zusammen, weil die Studie den
Gelenkpunkt anders definiert als ein Posenmodell ihn setzt. Solange das nicht
aufgeloest ist, ist eine Farbe dafuer eine Behauptung, keine Messung.

Rechne die Sattelverstellung aus, statt eine Faustregel zu nehmen. Wie viele
Millimeter ein Grad wert ist, haengt von der Beinlaenge ab, und das steckt im
Kosinussatz: Leite den Abstand Huefte zu Pedal nach dem Kniewinkel ab. Bei den
Massen oben kommen ungefaehr 2,3 Millimeter je Grad heraus. Rechne mit meinen
Werten, nicht mit dieser Zahl, und schreib sie in den Bericht.

Schreib das Video mit der Bildrate der Quelle und kodiere es am Ende mit ffmpeg
nach H.264, damit es auf jedem Geraet laeuft. Speicher zusaetzlich das Einzelbild
vom unteren Totpunkt.


SCHRITT 5b: DAS OVERLAY

Das fertige Video ist der Teil, den ich wirklich anschaue. Bau es als
Analyse-Ansicht, nicht als nacktes Strichmaennchen. Zeichne mit Pillow auf einer
durchsichtigen Ebene und leg sie ueber das Bild -- mit OpenCV allein bekommst du
nur Balkenlettern.

Das gehoert aufs Bild:

  Kopfleiste oben, dunkel hinterlegt: das Wort BIKEFIT gross, darunter klein der
  Name des Modells. Rechts die laufende Bildnummer, die Sekunde und die Bildrate.

  Ein Rahmen um mich, aber nur die vier Ecken statt eines geschlossenen Kastens,
  dazu klein die Zahl der verfolgten Punkte.

  Das Skelett aus fuenf Strichen: Huefte zu Knie, Knie zu Knoechel, Schulter zu
  Huefte, Schulter zu Ellbogen, Ellbogen zu Handgelenk. Jeder Strich traegt die
  Farbe des Winkels, zu dem er gehoert. Zeichne jeden Strich zweimal, erst dick
  in Schwarz, dann duenner in der Farbe -- sonst verschwindet er vor hellen
  Waenden. Gelenke als weisse Punkte mit dunklem Ring.

  Am Knie ein Kreisbogen zwischen Oberschenkel und Unterschenkel, daneben die
  Beugung des AKTUELLEN Bildes, mit dem Wort live dabei. Diese Zahl laeuft mit
  jeder Kurbelumdrehung hoch und runter, und genau das macht sichtbar, dass hier
  gemessen und nicht geschaetzt wird.

  Rechts eine Spalte Kacheln, eine je Winkel: Bezeichnung links, Urteil rechts,
  darunter gross der Messwert und klein das Sollband. Die Kachel traegt den
  farbigen Rand ihres Urteils. Schulter und Huefte bekommen statt eines Urteils
  das Wort ohne Bewertung.

  Links die Erkennungsguete als Prozentzahl mit einem Balken darunter -- das ist
  der Mittelwert der Zuversicht von Huefte, Knie und Knoechel im aktuellen Bild.

  Unten ueber die ganze Breite ein Verlaufsdiagramm der Kniebeugung ueber die
  Zeit. Das Zielband liegt als getoente Flaeche dahinter, jeder gefundene
  Totpunkt als Punkt auf der Kurve, und ein senkrechter Strich zeigt, wo im
  Video ich gerade bin. Das ist das ueberzeugendste Element von allen: Man sieht
  die Kurve bei jedem Tritt nach unten laufen und die Punkte entweder im Band
  einrasten oder darueber.

  Ganz unten eine Leiste mit dem Ergebnis in einem Satz.

Zwei Dinge, damit es auf jedem Rechner funktioniert:

  Such die Schrift, statt einen Pfad zu setzen. Geh eine Liste von Kandidaten
  durch und nimm die erste, die existiert -- auf einem Mac liegt SF Compact oder
  Helvetica, unter Windows Segoe UI oder Arial, unter Linux DejaVu oder
  Liberation. Findest du keine, nimm die eingebaute Schrift von Pillow. Fuer die
  technischen Zahlen eine Schreibmaschinenschrift, das laesst sie nach Messung
  aussehen statt nach Beschriftung.

  Rechne alle Groessen ueber einen Massstab aus der Bildbreite geteilt durch
  1080. Sonst sitzt das Overlay bei einem Video in anderer Groesse daneben.

Farben: Gruen, Gelb und Rot fuer die Urteile, sonst nur Weiss und Grau auf
dunklen, halbdurchsichtigen Flaechen. Die Farbe ist die Aussage, alles andere
tritt zurueck.


SCHRITT 6: SAG MIR, WAS SACHE IST

Erklaer mir das Ergebnis in normalen Worten. Was passt, was nicht, und was ich
als Erstes aendern soll.

Wenn alles im Bereich liegt, sag genau das. Erfinde keinen Verbesserungsvorschlag,
nur damit einer dasteht. Eine Messung, die nichts findet, ist ein Ergebnis.

Sag mir auch, wo diese Messung aufhoert: Ein Video von der Seite kann Sattelhoehe
und Oberkoerperhaltung einordnen. Es kann nicht sehen, ob meine Knie nach innen
oder aussen wandern, und es kann nichts ueber die Stellung meiner Schuhplatten
sagen. Dafuer braeuchte es eine Aufnahme von vorn. Und wenn mir beim Fahren etwas
weh tut, ersetzt das hier keinen Menschen, der mich anschaut.

Zum Schluss: Sag mir, ich soll immer nur eine Sache aendern und danach neu filmen.
Wer Sattelhoehe und Sitzposition gleichzeitig verstellt, weiss hinterher nicht,
was gewirkt hat.


WAS DU NICHT TUST

Bau keinen Schalter ein, mit dem sich eine Farbe von Hand setzen laesst. Was
gemessen wird, wird gemessen.

Faerbe nichts gruen, weil es schoener aussieht, und nichts rot, weil es
eindrucksvoller ist.

Wenn eine Zahl nicht sauber messbar war, schreib das hin, statt sie zu schaetzen.


Dieser Prompt ist Folge 6 von 100 aus "Sport KI" von Dan Felser.
Instagram: @felsr — alle Prompts der Reihe: felsr.com
Der Prompt kostet nichts. Wenn er dir was bringt: folg mir auf @felsr — dort kommt jede Folge zuerst. Kostenlose Trainingspläne
20 Pläne, 5 km bis Marathon — ohne E-Mail, ohne Konto
Alle Prompts der Reihe
Sport KI — 100 Folgen, jede Woche ein Tool aus meinem Training