Nakon utakmice ostane mi panoramska snimka. Da bi igrač u PLAYGRND-u mogao kliknuti na svoj gol, treba pronaći taj trenutak, dobro ga kadrirati i povezati isječak s pravim događajem.
Snimanje je još u pilotu. ChatGPT mi pomaže pokrenuti obradu na Macu, a završne videe pogledam prije nego što odobrim upload.
Nakon utakmice
Ručno stavim snimku na Drive pa ChatGPT-u dam taj link i link na utakmicu u PLAYGRND-u. Sa stranice utakmice uzima ekipe, sastave i golove, a u snimci traži njihove stvarne trenutke.
-
Snimim utakmicu
JaPostavim Ballr i snimim panoramu sa zvukom terena.
Ballr · 6976 × 2160 · 30 FPS
-
Prebacim izvornik na Drive
JaNakon utakmice ručno prebacim snimku na Google Drive. Izvorna datoteka ostaje neizmijenjena.
Google Drive · ručni upload
-
Pošaljem ChatGPT-u dva linka
JaJedan vodi na snimku na Driveu, drugi na utakmicu u PLAYGRND-u. Dodam koje videe želim i na što treba paziti u montaži.
Snimka na Driveu + utakmica u PLAYGRND-u
-
ChatGPT pripremi obradu
ChatGPT + lokalni alatiPreuzme izvornik, pročita detalje utakmice i pokrene analizu. Detekcija lopte, promjene semafora i zvuk pomažu pronaći vrijeme golova. Iz toga nastaje putanja kamere koja prati razvoj igre.
Core ML / YOLO11 · Python · NumPy · SciPy · spremljeni podaci utakmice
-
Izrada i provjera videa
Lokalni alati + ChatGPTSkripte dodaju grafike i izrade utakmicu, highlightse i golove. ffprobe i FFmpeg provjere datoteke. ChatGPT pregleda uzorkovane kadrove i vremenske oznake pa ispravi ono što se na njima vidi.
Swift · Metal · VideoToolbox · Pillow · FFmpeg / libx264 · ffprobe
-
Dobijem lokalni link za pregled
JaGledam kodirane videe u playeru na LAN mreži radnog računala. Ako rez, timestamp ili pomak kamere treba doraditi, vratim ga ChatGPT-u pa pogledam novu verziju.
Lokalni HTTP player · premotavanje videa
Moj feedback vraća video na novi render i ponovni lokalni pregled.
-
Odobrim datoteke i objavu
Ja, zatim ChatGPTKad odobrim točne datoteke i zatražim objavu, ChatGPT ih dostupnim API-jima ili preglednikom uploada. Provjeri dobivene linkove i poveže ih s utakmicom i njezinim golovima.
YouTube · Drive · odabrani social isječci · PLAYGRND ID-jevi događaja
Prvi pregled događa se tijekom obrade. ChatGPT gleda uzorkovane kadrove i rezultate provjera. Modele računalnog vida i skripte za render pokreće lokalno. Kad tehničke provjere prođu, meni ostaje pogledati video u pokretu.
Dobijem lokalni link i gledam rezultat u playeru. Ako nešto treba promijeniti, pošaljem komentar, ChatGPT doradi montažu pa pogledam novu verziju. Player radi na LAN mreži radnog računala, pa do tog računala moram imati mrežni pristup.
Model je pripremljen zasebno uz PyTorch, Ultralytics i coremltools pa se ponovno koristi u Core ML programu. OpenCV i FilterPy drugi su adapteri za praćenje u istraživačkom kodu. Uz svaki posao ostaje zapisano koji je put korišten.
Stvarni primjer: Bajamonti 2:4 Ponediljak 10
Primjer je utakmica Bajamonti – Ponediljak 10, odigrana 9. studenoga 2026. na Legendarnim Terenima, u devetom kolu Serie B2. Stranica povezuje šest događaja gola s pripadajućim isječcima i nudi tri verzije snimke:
Javna stranica snimljena 10. studenoga 2026. Zapis utakmice daje ekipe, natjecanje, teren, sastave i identitete događaja.
Snimanje: sačuvati panoramu
Aktualna oprema uključuje Ballr kameru, zasebno kupljeni Walimex pro AIR Jumbo 600 stalak i SmallRig 3757 stezaljku s rukom. Stalak se izvlači do 6 m. Radna visina ovisi o terenu i sigurnim uvjetima postavljanja. Ovdje opisujemo iskustvo pilota s nogometom šest na šest.
Ballr navodi dvije širokokutne 4K kamere, panoramu 6976 × 2160 i 30 FPS. Izvor za ovu utakmicu bio je već spojeni HEVC panoramski video s AAC zvukom, te razlučivosti, dug približno 56 minuta i 38 sekundi. Izvornik čuvamo bez rezanja i ponovnog kodiranja. Video s praćenjem zaseban je izlaz obrade.
Panorama omogućuje promjenu odluke o kadru nakon snimanja. Iz uskog izvoza više ne možemo vratiti prostor koji je ostao izvan slike. Ballr ima i vlastiti AI prikaz s praćenjem. Naša obrada opisana u nastavku kreće od panorame i ne opisuje Ballrov interni algoritam.
Što radi pojedina biblioteka
Python vodi posao, a nativni programi napisani su u Swiftu. Biblioteke u nastavku imaju različite uloge. Alati za izvoz modela koriste se pri pripremi checkpointa. Lokalni programi taj checkpoint poslije ponovno koriste za utakmicu.
| Alat | Njegova uloga u ovom postupku |
|---|---|
| Python | Čita JSON posla, pokreće programe, sprema rezultate i provjerava što se može ponovno koristiti iz cachea. Skripte za utakmicu pripremaju i grafike, intervale montaže te izlazne datoteke. |
| NumPy | Drži timestampove, detekcije i koordinate kamere u nizovima. Radi interpolaciju te operacije s vektorima i matricama rotacije iz profila kamere. |
| SciPy | gaussian_filter1d zaglađuje ciljeve kamere, a PchipInterpolator popunjava putanju između pregledanih smjernica kadra. Medijanski filtri stabiliziraju prijedloge stanja semafora. Tako iz rijetkih uzoraka nastaje putanja kamere. |
| PyTorch | Učitava izvorni .pt checkpoint pri pripremi modela i ranijim eksperimentima. Nativni Core ML program nakon toga koristi izvezeni model. |
| Ultralytics | Daje sučelje za YOLO model i njegov izvoz. U primjeru koristimo postojeći Soccana YOLO11 checkpoint. Posao za utakmicu ponovno ga koristi bez treniranja novog detektora. |
| coremltools | Pretvara model u Appleov .mlpackage za nativno izvršavanje. Taj korak pripreme formata radi se prije obrade utakmice. |
| Core ML | Lokalno izvršava izvezeni detektor nad uzorkovanim slikama. Vraća kandidate objekata i njihove ocjene. Tracker zatim pokušava utvrditi koji kandidat pripada aktivnoj lopti. |
| AVFoundation | Otvara izvorni video i daje nativnom programu dekodirane kadrove s njihovim vremenskim oznakama. Tako detekcije ostaju vezane uz izvornu snimku. |
| Core Video | Daje međuspremnike kadrova između Appleovih medijskih, Metal i Core ML komponenti. Nativni put može raditi s njima bez spremanja svakog kadra u JPEG. |
| Metal | Priprema dijelove slike za detekciju, a pri renderu primjenjuje projekciju kamere i slaže grafike. Plan kamere određuje pogled za svaki izlazni kadar. |
| VideoToolbox | Daje Macov hardverski put za kodeke kroz medijske alate i FFmpeg. Kodiranje i dekodiranje pripadaju tom dijelu. Geometriju kamere računamo zasebno. |
| OpenCV | Učitava izrezane slike za klasifikator semafora prilagođen ovoj snimci. Drugi istraživački adapteri koriste njegov Lucas–Kanade optički tok za provjeru kratkih praznina u praćenju. Ovdje semafor čitamo usporedbom oblika znamenki. |
| FilterPy | Daje Kalman/RTS filtriranje i zaglađivanje u pomoćnim eksperimentima praćenja. Bajamontijeva skripta kamere koristila je NumPy/SciPy interpolaciju i pregledane smjernice pa FilterPy nije bio obvezna faza tog rendera. |
| Pillow | Crta tekst, grbove i stanja rezultata u odobrene PNG predloške. Te slike postaju teksture grafika i naslovnice. Isti se predložak ponovno koristi za sljedeću utakmicu. |
| FFmpeg | Izdvaja uzorke za pregled, obrađuje zvuk, primjenjuje odabrane filtre slike, spaja kompatibilne segmente i zapisuje završnu datoteku. Tijekom QA-a također dekodira izlaze. |
| libx264 | Softverski H.264 enkoder korišten za završne HQ golove i highlightse u ovom primjeru, uz odabrani preset i CRF. Cijela utakmica koristila je zaseban nativni hardverski render. |
| ffprobe | Čita kodek, dimenzije, broj i učestalost kadrova, trajanje te vremenske oznake zvuka. Skripte ih uspoređuju s planom montaže prije nego što je datoteka spremna za pregled. |
Izvorne reference za ponašanje biblioteka su Ultralyticsov vodič za Core ML izvoz, SciPyjev Gaussov filtar, PCHIP interpolacija i Pillow API za crtanje. Uloge u tablici dolaze iz skripti korištenih za ovaj posao.
Kako pokrećem posao
Počinjem u chatu linkovima na snimku i utakmicu. ChatGPT dohvaća izvornik i priprema radne datoteke. Lokalni programi primaju putanje datoteka i JSON pa se Drive link razriješi prije njihova pokretanja.
Za Bajamonti je posao još bio podijeljen u skripte spremljene uz tu utakmicu. analyze_stage1.py pripremio je analizu zvuka, slike za pregled i prijedloge niveliranja. analyze_tracking.py pozvao je nativni detektor. classify_board.py predložio je promjene semafora. build_camera.py spojio je detekcije, profil postave i pregledane smjernice kadra u camera-plan.json.
Sučelje nativnog analizatora je kratko. Uz skraćene nazive datoteka, poziv za cijelu snimku izgleda ovako:
./native-analyze panorama.mp4 soccana-yolo11.mlpackage \
detections.jsonl 0 3398.444056 3
| Argument | Značenje u ovom pozivu |
|---|---|
panorama.mp4 | Lokalna izvorna snimka. |
soccana-yolo11.mlpackage | Pripremljeni checkpoint detektora. |
detections.jsonl | Izlaz: jedan JSON zapis po analiziranom izvornom uzorku. |
0 | Početak na izvornoj sekundi nula. |
3398.444056 | Traženo trajanje izvora u sekundama, prema zapisu tehničke provjere. |
3 | Uzorkovanje približno tri izvorna kadra u sekundi za analizu. Izlazni video ima zasebnu vremensku mrežu od 30 FPS. |
Program nakon tih argumenata prima i neobvezni kalibracijski JSON kojim se analiza može ograničiti na određeno područje. Model i nativni programi već moraju postojati lokalno. Ovaj poziv ne preuzima i ne trenira model.
Renderer ima zasebno sučelje:
./native-metal-render panorama.mp4 camera-plan.json followcam-silent.mp4
camera-plan.json sadrži dimenzije izlaza, FPS i kodek te pogled za svaki kadar: yaw, pitch i kut gledanja. Tu su i preslikavanje objektiva te putanje vremenski zadanih grafika. Program renderira sliku, a FFmpeg dodaje pripadajući izvorni zvuk i sastavlja izlaznu datoteku. U poslu za ovu utakmicu render_package.py full renderirao je cijelu utakmicu u ograničenim segmentima, a render_clips.py pripremio kratke izlaze. resume_full.py poslužio je za nastavak prekinutog rendera uz očuvan već kodirani početak.
Te skripte čitaju datoteke uz sebe, uključujući source-receipt.json, facts.json, timing.json i plan kamere. Većina njihovih postavki nalazi se u tim datotekama, umjesto u argumentima naredbe. final_qc.py provjerava izlaze, a serve_review.py poslužuje player i videe na podešenoj LAN adresi i portu. Podržava HTTP byte range zahtjeve da mogu premotavati dugu utakmicu.
Naredba koju ponovno koristimo
U repozitoriju postoji i parametrizirani CLI, playgrnd-video, registriran kroz Python paket. Ponavljajuće postavke drži u jednom JSON-u posla. Opisana Bajamontijeva isporuka još je koristila vlastite skripte. Taj runner možemo koristiti kako sve više koraka postane ponovno upotrebljivo.
playgrnd-video job init match.json \
--source panorama.mp4 \
--workdir work \
--profile camera-profile.json \
--goal-mode timestamps \
--full landscape \
--highlights landscape \
--goals landscape
playgrnd-video job plan match.json
playgrnd-video job run match.json --background
playgrnd-video job status match.json
init zapisuje konfiguraciju. Prije run treba dopuniti podatke utakmice, vremenske oznake golova i putanje analizatora, checkpointa i renderera. plan prikazuje namjeravani posao bez dekodiranja videa. --background vraća PID i putanju loga. status čita napredak.
| Postavka | Što zadajem |
|---|---|
--source, --workdir, --profile | Lokalnu snimku, radnu mapu i profil za tu poziciju kamere. |
--goal-mode | timestamps koristi zadane izvorne oznake. minutes kreće od minuta iz zapisnika i sidara sata. auto daje kandidate za pregled. |
--full, --highlights, --goals | Koje proizvode i orijentacije renderirati. Svaka postavka prihvaća none, landscape, vertical ili both. |
analysis.fps i engine.* u JSON-u | Učestalost uzorkovanja te putanje postojećih nativnih programa i modela. |
source.keep_intervals, goals.events, render.* | Koje intervale izvora zadržati, zapise golova, izlazni FPS i postavke kodiranja. |
FPS analize i FPS rendera odvojene su postavke. Minuta zapisnika također je odvojena od izvornog timestampa. To čuvamo u konfiguraciji jer montaža može zadržati poluvrijeme, izrezati prekid ili promijeniti početak isječka.
Runner lokalno računa bez LLM poziva. Zapisuje napredak i datoteke za pregled. Uploadi i promjene u PLAYGRND-u dolaze poslije, kad odobrim izlaz i objavu. Pouzdana automatska potvrda golova i kalibracija novih postava još traže rad.
Follow cam: detekcija je tek početak
Detektor daje okvire mogućih objekata. Time još nije utvrđeno koji je mali bijeli objekt aktivna lopta, tko ima posjed ili je li postignut gol.
U ovom primjeru nativni je program analizirao približno tri kadra u sekundi, dok završni render koristi vremensku mrežu od 30 FPS. Preklapajući dijelovi panorame zadržavaju više detalja male lopte nego smanjivanje cijele slike na jedan ulaz detektora. Kandidati ulaze u tracker aktivne lopte. Aktivnost igrača daje širi kontekst kad je opažanje lopte slabo.
Planer kamere pretvara ciljeve u kontinuirano pomicanje, nagib i kut gledanja. Koristi pogled unaprijed, interpolaciju, zaglađivanje i ograničenja gibanja. Početna interpolacija cilja u ovom poslu gledala je približno 0,65 sekundi unaprijed. Pregledane smjernice kadra popravljale su odabrane akcije. To su montažne namjere kamere, a ne izmjerena putanja lopte.
Pravilo kompozicije je praktično: zadržati razvoj napada i, oko udarca, po mogućnosti loptu i gol prema kojem ide. Prije brze promjene treba proširiti kadar. Poznati timestamp završnice ne smije odvući kameru prema praznoj mreži nekoliko sekundi prerano. Nesigurne praznine zahtijevaju širi kadar ili korekciju.
Geometrija je zaseban problem. Za ovaj posao iz slike je procijenjena rotacija za niveliranje kamere te korištena pravocrtna izlazna projekcija s profilom tog izvora. Provjeravamo vratnice i proporcije igrača lijevo, u sredini i desno. Deklarirani kut od 180° sam po sebi ne dokazuje točno preslikavanje objektiva ni metrički kalibriran teren.
Zapis faze detekcije za ovaj posao navodi 10.207 uzorkovanih kadrova u približno 1.184 sekunde, uz izvor dug približno 3.398 sekundi. U toj je fazi obrađeno približno 2,87 sekundi izvora po sekundi obrade. Broj ne uključuje ostatak procesa i sam ne govori ništa o točnosti praćenja aktivne lopte ni spremnosti za prijenos uživo.
Ključni timestampovi: minuta utakmice nije vrijeme videa
U ovoj snimci koristan trag bio je fizički semafor vidljiv u panorami. Skripta je izrezala taj dio slike. Druga je uspoređivala oblike znamenki s predlošcima uzetima iz iste snimke te medijanskim filtrom predlagala stabilna stanja i promjene rezultata. To je klasifikacija slike prilagođena ovom izvoru, a ne opći OCR koji čita bilo koji semafor.
Promjena rezultata sužava prozor pretrage, ali se može dogoditi nakon samog gola. Asistent je zatim pregledao gušće izvorne kadrove oko akcije, dokaz lopte i završnice te povratak na centar, uz zvučnu aktivnost kao dodatni trag. Početak i kraj igre dobili su zasebne vremenske oznake. Uzorkovani kadrovi i zvuk i dalje ne zamjenjuju završno operatersko odobrenje pokretne snimke.
Prvi gol konkretno pokazuje vremensko preslikavanje:
| Koordinata | Prvi gol Borne Šunjića |
|---|---|
| Službeni zapisnik | 4′, vodstvo Ponediljka 10 od 0:1. |
| Oznaka u izvorniku | 774,267 s, približno 12:54,267 od početka panorame. |
| Oznaka u cijeloj utakmici | 235,267 s, približno 3:55,267, jer odabrani izvorni interval počinje na 539 s. |
| Oznaka u highlightsima | Približno 22,267 s: uvodna kartica od 7 s pa prvi isječak koji počinje na izvornoj sekundi 759. |
Lokalni zapis nosi procjenu nesigurnosti ±0,2 s. To je nesigurnost anotacije, a ne izmjerena točnost cijelog sustava. Minute iz zapisnika identificiraju događaj u nogometnom zapisu. Ne mogu dati točne timestampove videa, posebno oko poluvremena i prekida.
Montaža, grafike i kodiranje
Podatke i grbove utakmice dohvaćamo i spremamo jednom. Pillow ispunjava odobreni grafički predložak. Za svako ime ekipe ili promjenu rezultata ne trebaju novi dizajn ni poziv jezičnom modelu.
Svi izlazi koriste odabranu reviziju kamere. Intervali grafika vezani su uz izvorno vrijeme: rezultat se mijenja na pregledanoj završnici, a u ovom primjeru redak strijelca pojavljuje se 0,7 sekundi kasnije. Uvodna kartica ne otkriva konačan rezultat. Završna koristi provjereni zapisnik.
Cijela utakmica sastavlja se iz ograničenih renderiranih segmenata. Kratki izlazi koriste odabrane intervale sa sačuvanom pripremom akcije i reakcijom. Šest isječaka golova u ovom primjeru trajalo je 20–26 sekundi. Highlightsi s uvodom i odjavom traju približno 2:40. Cijela utakmica, sa sačuvanim poluvremenom, traje približno 47:24,5.
Render uzima sliku iz izvorne panorame, a ne iz smanjene analitičke kopije. Metal primjenjuje projekciju i slaže grafike. U ovom poslu nativni render cijele utakmice bio je 25 Mb/s. Kratki masteri koristili su 80 Mb/s prije FFmpeg čišćenja i završnog libx264 medium/CRF 14 kodiranja. Blagi hqdn3d denoise te prilagodba kontrasta i zasićenosti uspoređeni su na pokretnom uzorku. To su postavke ovog noćnog izvora, a ne univerzalna preporuka kvalitete. Sačuvan je izvorni zvuk terena.
Kompatibilni kodirani isječci spajaju se kopiranjem paketa, bez još jednog potpunog gubitnog kodiranja. Mapa montaže zapisuje izvorne intervale i početke u izlazu. Tehnička provjera obuhvaća dimenzije, ritam kadrova, trajanje, sinkronizaciju zvuka i dekodiranje. Vizualni pregled obuhvaća samu akciju, geometriju gola i položaj grafika.
Objava i povezivanje s utakmicom
Objava je zaseban, odobren korak. Pomoćni alati pripremaju datoteke, naslovnice, naslove, opise i vremenske oznake. API-je platformi koristimo gdje ih workflow podržava. Dio aktualnog pilota i dalje uključuje rad u pregledniku, uključujući neke uploade i provjere vidljivosti. Zato ovo ne opisujemo kao potpuno samostalan sustav objave.
Nakon uploada spremamo identifikatore platforme i provjeravamo rezultat. Prihvaćen upload, obrađen video i javno gledanje zasebna su stanja.
Za ovu utakmicu integracija s PLAYGRND-om dodala je tri zapisa u match_media, označena kao panorama, full_match i highlights. Svaki postojeći događaj gola dobio je svoj video_url. Povezivanje koristi identifikatore utakmice i događaja, uz provjeru strijelca, minute iz zapisnika i slijeda rezultata prije upisa. Identitet igrača ne zaključuje se iz lica.
Ograničena izmjena uvježbana je lokalno, primijenjena uz provjere stanja i pripremljen obratni postupak, a zatim provjerena na javnoj stranici. Za dodavanje videa nije trebalo mijenjati rezultat ili sastave. Klik na događaj sada otvara taj gol. Video odjeljak prikazuje tri verzije utakmice.
Screenshot vodi na izvornu javnu stranicu utakmice. Video otvara čitatelj. Članak ne učitava automatski player treće strane.
Što automatiziramo, što pregledavamo i kamo idemo
Skripte obavljaju uzorkovanje, detekciju kandidata i render. ChatGPT mi pomaže pregledati rezultate i pripremiti korekcije. Ja postavljam kameru, gledam završne datoteke i odlučujem što ide u objavu.
Sljedeći je cilj smanjiti broj skripti za pojedinu snimku: profili postave koji se mogu ponovno koristiti, malo sučelje za korekcije, označena evaluacija na zasebnim utakmicama i pouzdano ponovno renderiranje samo promijenjenih dijelova. Treba mjeriti vidljivost cijele akcije, pogrešku timestampova i vrijeme korekcije, uz održivu brzinu cijelog procesa. Identitet igrača, posjed i druge statistike traže dodatne dokaze i validaciju.
Odgođeni prijenos uživo kasniji je istraživački smjer. Ballr dokumentira custom RTMP streaming, ali to ne potvrđuje pristup cijeloj panorami uživo za naš renderer. Buffer kašnjenja također ne popravlja sustav koji obrađuje sporije nego što snima. Ovdje opisani workflow jest naknadna obrada.
Prava i opseg ovog zapisa o pilotu
Članak dokumentira inženjerski rad. Ne distribuira težine modela, skupove podataka ni softverski paket. Ultralyticsove licencne opcije, pojedini checkpointovi, uvjeti podataka za treniranje i točna FFmpeg konfiguracija zahtijevaju zasebnu provjeru za predviđenu uporabu. Permisivna licenca pomoćnog koda ili pretvorba u Core ML ne rješavaju ta prava. Naziv pilot ne izuzima rad iz licencnih obveza, a ovim tekstom ne tvrdimo da je svaka eksperimentalna komponenta odobrena za svaku vrstu primjene.
Snimanje i ponovna objava traže definiranu svrhu, odgovarajuću pravnu osnovu, informiranje sudionika te primjerene dogovore s organizatorom i lokacijom. Javna dostupnost nije opća dozvola za ponovnu uporabu snimki ili glazbe. EDPB smjernice o video uređajima početna su referenca. Konkretne obveze ovise o snimanju i objavi. Lokalna analiza sama po sebi ne znači usklađenost s GDPR-om.
Nazivi Ballr i ostalih proizvoda identificiraju opisane alate. Tekst ne najavljuje partnerstvo ni preporuku tih proizvođača. Specifikacije kamere provjerene su 10. studenoga 2026. Objavljeni primjer i lokalni zapisi obrade podloga su za opis implementacije.

