Meten is weten & tracken is ontdekken. Met sport data science krijg je inzicht in je performance, worden je kernkwaliteiten zichtbaar en kan je over tijd je progressie van houding en techniek onderbouwen.
Met InpinkInsight is het mogelijk om jouw videobeelden van een wedstrijd of trainingssessie te analyseren. Wil je je eigen videobeelden door mij laten analyseren, of zie je andere mogelijkheden? Laat het me weten door een mail te sturen naar mattijn [at] gmail.com.
We zijn hier geinteresseerd in de positie van de pols ten opzichte van de schouder voor alle inpikken in de video. Deze zou met een juiste afstelling van de boot en een symmetrische haalbeweging gelijk moeten zijn voor links en rechts. Door wind, onrustig water en vermoeidheid is de verwachting dat deze positie niet gelijk blijft tijdens de gehele training. Deze service maakt het mogelijk om dit kwantitatief inzichtelijk te maken.
Hiervoor analyseren we de 30 minuten durende video (~54k frames, ~600 roeihalen) met Computer Vision en Machine Learning. We identificeren in elk frame de hoofdgewrichten en kijken voor elke inpik naar het hoogte verschil tussen de pols en schouder onafhankelijk voor links en rechts. In de animated gif hierboven zie je hoe dat gaat voor 2 halen.
De volgende Interactieve Graphic maakt de kwaliteit van inpikken kwantitatief inzichtelijk. Beweeg de slider om elke inpik an sich te analyseren.
Toon de code
import altair as alt
= 'data_tracking.json'
data_tracking = 'data_stills_base64.json'
data_stills
# updated to altair 5
= alt.binding_range(min=0, max=576, step=1, name='Inpik ')
slider = alt.selection_point(name='Inpik', value=1, bind=slider, fields=['nr'])
selector
= alt.Chart(data_tracking, width=100).mark_area(
area ='cardinal',
interpolate=0.7
opacity
).encode(='var:N',
color=alt.X('value:Q').title(None),
x=alt.Y('bin_min:Q', bin='binned').title(None)
y
).transform_bin(=['bin_max', 'bin_min'],
as_='val',
fieldbin=alt.BinParams(maxbins=50)
).transform_aggregate(='count()',
value=['var', 'bin_min', 'bin_max']
groupby
)
= alt.Chart(data_tracking, width=100).mark_circle().encode(
circle =alt.Color('var:N').legend(direction='horizontal', orient='top-left', padding=0).title(None),
color=alt.X('jitter:Q', stack='zero').scale(padding=10).axis(grid=False, labels=False, ticks=True, values=[0]),
x=alt.Y('val:Q').title("Positie pols tov schouder (schouder = 0)").scale(padding=10),
y=alt.condition('datum.idx === Inpik_nr', alt.value(1), alt.value(0.2)),
opacity=alt.condition('datum.idx === Inpik_nr', alt.value(400), alt.value(40))
size
).transform_calculate(="1*sqrt(-6*log(random()))*cos(2*PI*random())-8"
jitter
).add_params(selector)
= alt.Chart().mark_rule(
rule ='#888888',
color=[10, 4]
strokeDash
).encode(=alt.datum(0)
y
)
= (area + circle + rule).facet(
chart_top =alt.Column('idx:Q', bin=True).header(labelPadding=-5).title("Inpik momenten (gegroepeerd per 100 slagen)")
column
)
= alt.Chart(data_stills).mark_image(
image =200,
height=356,
width=356,
x=1
y
).encode(='urls:N'
url
).transform_filter(selector)
alt.vconcat(
chart_top,
image
).configure_view(=None
stroke
).configure_axisY(='left',
titleAlign=0,
titleAngle=-10,
titleX=-10
titleY )
Beweeg de slider voor analyse van elke inpik. De eerste keer dat een beeld geselecteerd wordt is er een lichte hapering voordat deze getoond wordt.
De oranje stip komt overeen met de pols-positie van de rechterzijde en de blauwe stip met de pols-positie van de linkerzijde van de skiffeur. Naast de stippen zie je de bijhorende dichtheidsplot voor inzicht in concentratie en verdeling van de gemeten pols-posities tov de schouder. De inpikken zijn verdeeld in 6 groepen van maximaal 100 momenten. Op deze manier wordt inzichtelijk hoe de polspositie zich manifesteert gedurende het verloop van de training.
Meten is weten & tracken is ontdekken. Met sport data science krijg je inzicht in je performance, worden je kernkwaliteiten zichtbaar en kan je over tijd je progressie van houding en techniek onderbouwen.