AGDATA Vari · přehled řešení · stav 7. 10. 2026

Detekce plevele z dronu a bodový postřik

Agronom nahraje ortofoto pole, služba v něm najde plevel a vyrobí aplikační mapu pro postřikovač. Na holé půdě stačí zelenost (ExG). V porostu, třeba v jetelu, je potřeba natrénovaný model, který se učí z rostlin označených ve /spot.

Buňka hustoty
0,5 m
Čtverec anotace
20 × 20 m
Ortofoto na devu
2 cm/px
Model v porostu
RT-DETRv2-r18 AP 0,70*
Potvrzené rostliny
0 z cíle 200–500 na plodinu
Nepotvrzené návrhy
1 084 v 68 čtvercích
Stavy hotovo = develop, běží na vari-dev.agdatasrvc.com na větvi 261005 = anotace, pushnutá na větvi 261006 = ML, jen lokálně (6 commitů) chybí experiment

* AP měřené proti nepotvrzeným návrhům, ne proti agronomovi. Skutečná přesnost bude známá až po fázi 1.

Schéma řešení

Vyber průchod a projdi ho po krocích (šipky ← →), nebo klikni na libovolný blok. Vpravo se ukáže, co blok dělá, s čím mluví a kde je jeho kód.

Schéma je široké, posuň ho do strany.

Prohlížeč a stroje
API agdata-vari · Node.js
Výpočty, modely a data
Mimo produkt · Mac, USB

Webové stránky

Všechny stránky servíruje přímo API (role api). Na devu jsou na vari-dev.agdatasrvc.com. Zákazníka určuje pole „Customer (X-Customer)“, výchozí hodnota je test.

Klávesy v kroku 5

A nový čtverecB boxP bodS výběr 1–9 třídaEnter přijmoutDel smazat D čtverec hotovýN další čtverecM návrh modelemEsc konec

API

Cesty jsou relativní k základu skupiny. Zákazník se bere z hlavičky X-Customer (nebo ApiKey, ?customer=) a služba mu věří bez ověření.

MetodaCestaCo děláStav

Modely a metody

Co jsme vyzkoušeli, co je v produktu a proč. Všechna čísla kvality jsou zatím náhradní metrika (shoda s nepotvrzenými návrhy), protože agronom ještě nepotvrdil žádnou rostlinu.

Benchmark detektorů · AP na odložených čtvercích

16 odložených čtverců, 172 hodnocených návrhů, uvnitř týchž dvou letů. Jetel je těžší případ, holá půda jde všem. RT-DETRv2-r18 a YOLO11n jsou rovnocenné (rozdíl +0,01, interval −0,02 až +0,04), YOLO ale má licenci AGPL-3.0.

Proč tyhle modely

  • ExG zůstává výchozí na holé půdě. Je deterministický a nepotřebuje štítky, jen neodliší plevel od vzcházející plodiny.
  • DINOv2-small hledá podobné rostliny z pár potvrzených. Větší modely (DINOv2-base, DINOv3) nebyly průkazně lepší a jsou 3–7× pomalejší.
  • RT-DETRv2-r18 je detektor pro porost. Má licenci Apache-2.0, stejnou kvalitu jako YOLO11n a na CPU zvládne čtverec 20 m za 0,6 s.
  • Celé pole odhadem ≈ 4 min CPU na 15 ha při 2 cm/px. Je to extrapolace z testu 60 × 60 m (25 dlaždic za 6 s).
ModelK čemuLicenceKvalita (náhradní)CPU, 4 vláknaRozhodnutí

Jak se model učí

Smyčka existuje celá, ale zatím ručně: trénuje se offline na Macu a nový model se do produktu dostane přes /admin. Automatické přetrénování na serveru chybí.

  1. Anotace/spot krok 5: přijaté rostliny v hotových čtvercích
  2. ExportZIP: výřezy PNG, YOLO štítky, původ každého štítku
  3. Tréninktrain_detector.py na Macu, M3 Pro ≈ 18–20 min
  4. Nahrání/admin → „Upload“ → stav registered
  5. Bránaholdout po letech, srovnání se současným modelem
  6. Aktivacezkušební dotaz do sidecaru, slot skupiny plodin
  7. Použitídetekce v porostu a „Propose with model“
  8. Automatickypřetrénování na serveru po ~100 nových rostlinách — chybí
Jak štítek vzniklJde do tréninkuPočítá se jako
Ruční box nebo bodano, z hotového čtvercelidský
Přijatý návrh „Propose“ (anomálie)anolidský
Přijatý návrh „Find similar“ (DINOv2)anolidský
Přijatý návrh „Propose with model“anos pomocí modelu, v holdoutu nejvýš 20 %
Nepotvrzený návrh (jakýkoli)ne, export ho nebere—
Oprava masky „✎ Edit weed mask“ne pro rámečkyVari.reviewLabels, pro hodnocení hustoty

Brána před aktivací

  • Aspoň 100 hodnocených štítků v holdoutu.
  • Precision i recall na holdoutu aspoň 0,5.
  • Štítků s pomocí modelu v holdoutu nejvýš 20 %.
  • Holdout lety nejsou v tréninku nového ani současného modelu. První aktivace je pro skupinu plodin zmrazí.
  • Proti současnému modelu nejvýš o 0,01 horší AP a o 0,02 horší buňkový záchyt.
  • force=1 bránu přebije (benchmarkový balíček jinak neprojde). Zkušební dotaz do sidecaru přebít nejde.

Lze se učit z nepotvrzených návrhů DINOv2?

Technicky ano, takhle vznikl benchmarkový model: z 1 084 nepotvrzených návrhů anomálie a DINOv2 dosáhl AP 0,70. Naučí se ale i jejich chyby a nedá se poctivě ověřit, protože holdout tvoří tytéž návrhy. Hodí se pro „Propose with model“, kde výsledek stejně potvrzuje člověk, ne pro postřikové mapy. Produktový export nepotvrzené návrhy nebere, a balíček z nich jde zapnout jen s force=1.

Nasazení na dev

Dev dnes běží develop ed9a5e42: kroky 1–4 /spot, ExG a exporty. Anotace, sidecar ani ML tam nejsou.

Swarm · dev101 (app-manager)

  • agdata-vari-api-develop · role api×1
  • agdata-vari-worker-develop · role worker×3
  • NodeODM 3.5.6 · limit RAM 16 GB×1
  • plant-similar · 3 GB, 4 CPU, privátní síťchybí

Kubernetes · Argo CD (app-of-apps)

  • agdata-vari-api · RAM 1–2 Gi×1
  • agdata-vari-worker×3
  • NodeODM · limit 8 Gi×1
  • plant-similar · vlastní soubor manifestuchybí

Hostname agdata-vari-dev.agdata.test. Obě prostředí mají v konfiguraci stejnou adresu vari-dev.agdatasrvc.com.

  1. Push větve feature/261006_plant-detector (obsahuje i anotační větev), bez merge.Claude · tvoje OK
  2. GitLab → „Run pipeline“ na větvi: build API, deploy DEV a automatický zápis image do app-manageru i app-of-apps.ty
  3. V téže pipeline ruční job „build plant-similar“. Image sidecaru se ještě nikdy nestavěl, je to první test Dockerfilu.ty
  4. app-manager compose: služba sidecaru (image v uvozovkách, replicas 1, 3 GB, 4 CPU, privátní overlay síť) a na API PLANT_SIMILAR_URL.Claude · diff, push na OK
  5. Dev .env: ADMIN_TOKEN, PLANT_SIDECAR_TOKEN, PLANT_ML_CUSTOMERS.Claude · na OK
  6. Push do app-manageru sám spustí redeploy devu.automaticky
  7. /admin → „Upload“ balíčku pro jetel → „Force activate“ (benchmark). Pozor: zmrazí jeho dva trénovací lety jako odložené, takže první skutečný model pak projde jen s force a reset_holdout.Claude nebo ty
  8. Ověření: /health, „Find similar plants“ v /spot, „Crop model“ u jetelového letu.Claude

Na co dát pozor

  • Další push do develop vrátí dev na develop a funkce zmizí. Natrvalo tam budou až po merge.
  • ADMIN_TOKEN zamkne i ostatní akce /admin (Abandon, Stop, Delete).
  • Nevíme, jestli má dev101 volné 3 GB a 4 CPU vedle NodeODM s limitem 16 GB.
  • V Kubernetes CI přepisuje image v deployment.yaml i v uvozovkách, proto sidecar potřebuje vlastní soubor.

Otevřená rozhodnutí

  1. Pushnout větev (bez merge)?
  2. Swarm, Kubernetes, nebo obojí?
  3. Změna v app-manageru (diff předem)?
  4. ML na devu jen pro testovacího zákazníka, nebo pro všechny?
  5. Nahrát na dev lety z USB s 1 084 návrhy k potvrzení?

Co chybí do ostrého provozu

Seřazeno podle oblasti. První skupina blokuje vše ostatní.

Data a model

  • 0 potvrzených rostlin. Cíl je 200–500 na plodinu ze 2 a více letů, plus záměrně negativní čtverce (okraje, cesty, kolejové řádky, stíny).
  • Druh (šťovík) agronom nepotvrdil.
  • Obilné lety nejsou složené. Celý jetelový let (472 snímků) na devu spadl na paměť.
  • Přetrénovat s holdoutem po letech a aktivovat bez force.

Provoz

  • Sidecar v compose, tokeny v .env, merge obou větví.
  • Detekce a stitch běží v procesu API a restart je ukončí. Přesun na workery chybí.
  • Ortofoto se nahrává přes API (≤ 5 GiB). Přímý upload do GCS chybí.
  • Čas tréninku na CPU serveru je neměřený.

Bezpečnost

  • /api/v2/files je bez ověření: kdo zná URL, stáhne ortofoto i mapu.
  • Zákazník je jen hlavička X-Customer, registr klíčů neexistuje.
  • Na develop jsou akce /admin bez tokenu.
  • Schválení v kroku 4 stahování neblokuje.

Později

  • Automatické přetrénování na serveru.
  • Ukládání odmítnutých návrhů, aby se šlo učit i z nich.
  • Zúžení rámečku na rostlinu nebo segmentace (rámeček hustotu nadhodnocuje).
  • Multispektrum pro ML; model místo ExG na holé půdě.

Konfigurace

Proměnné prostředí, které zapínají a ladí dronovou část. Chybná hodnota proměnných ML (větev 261006) nebo ANNOTATION_CLASSES shodí start služby. Ostatní číselné proměnné se při chybě tiše vrátí na výchozí hodnotu.

Ukázat proměnné (31)
ProměnnáVýchozíCo dělá