Přejít na obsah
CleverComp
Strojové vidění

5 min čtení

Segmentace obrazu U-Net: jak jsem vytáhl čísla z 31 830 grafů

Jak z obrázku grafu v PDF dostat tabulku čísel: segmentace křivek sítí U-Net, kalibrace os přes Hough, OCR a RANSAC. Postup, metriky a použití ve výrobě.

Napsal František Jánoš, konzultant pro AI a datovou analýzu

Segmentace obrazu přiřadí každému pixelu obrázku třídu, třeba „křivka“ nebo „pozadí“. U grafů v PDF z toho dostanete tabulku čísel: síť U-Net najde pixely křivky, OCR přečte popisky os a přepočet z pixelů na jednotky dopočítá skutečné hodnoty. Takto jsem pro výzkumný ústav AV ČR zpracoval 31 830 obrázků z odborných článků a získal 61 741 kalibrovaných spekter.

Popíšu, co nefungovalo, co nakonec fungovalo a kde stejný postup pomůže výrobní firmě.

Zadání: z obrázku grafu zpět na data

Odborné články publikují naměřené spektrální křivky jen jako obrázek. Původní data autoři většinou nezveřejní. Výzkumníci chtěli databázi spekter, se kterou se dá dál počítat, a ruční obkreslování v nástroji typu WebPlotDigitizer při desítkách tisíc grafů nepřicházelo v úvahu.

Úloha má tři části:

  1. Najít křivky. Oddělit pixely křivky od os, mřížky, popisků a legendy.
  2. Kalibrovat osy. Zjistit, kterému pixelu odpovídá která hodnota na ose x a y.
  3. Přepočítat a zkontrolovat. Převést křivku na řadu bodů a vyřadit grafy, kde kalibrace nesedí.

Před tím ještě běžel sběr článků, který popisuji v článku o sběru dat z webu. Z přibližně 1,8 milionu adres článků zbylo po filtraci 500 000 zpracovaných článků a z nich 31 830 obrázků s grafy.

Proč nefungovala instanční segmentace

Jako první jsem zkoušel instanční segmentaci: Mask R-CNN s nástavbou PointRend, která zpřesňuje okraje masek. Instanční segmentace hledá jednotlivé objekty a každému dá vlastní masku. Na fotkách aut nebo součástek to funguje dobře.

Na grafech selhala ze dvou důvodů:

  • Křivka je tenká a dlouhá. Má na šířku pár pixelů a táhne se přes celý graf. Mask R-CNN napřed hledá ohraničující obdélník a masku dopočítá uvnitř. U tenké čáry obdélník zabírá skoro celý graf a maska v něm tvoří malý zlomek plochy.
  • NMS mazal správné detekce. Krok NMS (non-maximum suppression) odstraní detekce, jejichž obdélníky se hodně překrývají, protože předpokládá, že jde o duplikát. Dvě křivky ve stejném grafu mají obdélníky skoro totožné. Vysoké IoU (podíl překryvu) způsobilo, že síť druhou křivku našla a pak ji sama zahodila.

Ladění prahů tu moc nepomůže, protože chyba vychází ze samotného principu obdélníků.

Co fungovalo: U-Net s pomocnou hlavou

Přešel jsem na sémantickou segmentaci. U-Net obrázek zmenší, zachytí kontext a pak ho po krocích zvětší zpět na plné rozlišení. Propojení mezi oběma polovinami sítě drží jemné detaily, takže se neztratí ani čára široká dva pixely. Síť vrací masku pixel po pixelu a obdélníky ani NMS nepoužívá.

Moje varianta měla tři úpravy:

ČástCo děláProč
Enkodér ResNet-34předtrénovaná síť na extrakci rysůméně ručně označených obrázků na trénink
Pozornost SCSEpřeváží kanály a místa v obrázku (Roy a kol.)potlačí text a mřížku, které vypadají jako čára
Pomocná hlava s distanční transformacípředpovídá vzdálenost každého pixelu od osy křivkysíť se učí souvislý průběh, ne jen jednotlivé pixely

Pomocná hlava se při použití zahodí. Během tréninku ale nutí síť chápat křivku jako souvislý útvar se středem, takže maska drží pohromadě i tam, kde křivka kříží mřížku nebo popisek.

Proč jsem cílil na F0.5, ne na Dice

Na validační sadě dosáhla síť F0.5 0,825 a Dice 0,831. Obě metriky porovnávají předpovězenou masku s ručně označenou, liší se vahou chyb:

  • Dice (shodný s F1) váží stejně falešné pixely i chybějící pixely.
  • F0.5 dává větší váhu přesnosti. Penalizuje hlavně pixely, které síť označila jako křivku, a přitom patří popisku, mřížce nebo jiné čáře.

Pro další zpracování vadí víc falešné pixely. Když síť vynechá krátký úsek křivky, dopočítám ho z okolních bodů. Když k ní připojí kus písmene z popisku osy, ve spektru vznikne falešný pík a ten už nikdo neodhalí. Model jsem proto vybíral podle F0.5.

Kalibrace os: Hough, OCR a RANSAC

Maska křivky je v pixelech. Abyste dostali vlnočet nebo intenzitu, musíte vědět, jak pixely odpovídají hodnotám na osách.

  1. Najít osy. Houghova transformace v OpenCV najde v obrázku dlouhé rovné čáry. Vodorovná a svislá čára na okraji grafu jsou kandidáti na osy.
  2. Přečíst popisky. PaddleOCR čte čísla u značek na osách. Malé a rozmazané popisky jeden průchod nepřečte spolehlivě, proto OCR běží ve více průchodech a výsledky se porovnají.
  3. Napasovat přepočet. RANSAC proloží dvojicemi „pozice pixelu, přečtená hodnota“ přímku a ignoruje body, které na ni nesedí. Špatně přečtené číslo (třeba 1500 místo 1800) tak kalibraci nerozbije.
  4. Vyřadit nejisté grafy. Když přímka nevyjde nebo z OCR nezbude dost čísel, graf skončí mimo výsledná data.

Z 31 830 obrázků vzniklo 61 741 kalibrovaných spekter. Jeden obrázek často obsahuje víc křivek.

Z mé praxe: kde se to hodí ve výrobě

Patnáct let jsem pracoval v kvalitě a ve vývoji výrobních procesů, mimo jiné jako dodavatelský inženýr kvality v IGW Power a procesní inženýr v Nitto Denko Czech. Grafy uvězněné v PDF jsem tam viděl často:

  • Staré protokoly z měření. Výstupy zapisovačů, vytištěné a naskenované průběhy teploty, tlaku nebo viskozity. Data z nich chybí v databázi, takže je nikdo nesrovná s dnešní výrobou.
  • Zprávy od dodavatelů. Atesty a zkušební protokoly často obsahují graf místo tabulky. Kdo chce sledovat trend vlastností materiálu napříč dodávkami, opisuje hodnoty ručně. Jak z takových dat vznikají specifikace, popisuji v článku o strojovém učení v kvalitě výroby.
  • Výkresy a schémata. Stejný princip segmentace najde ve skenu kóty, rámečky tolerancí nebo značky. Výkres je složitější než graf, ale postup maska, OCR a kontrola zůstává.

Rozdíl proti výzkumu je v objemu. Výrobní firma nemá desítky tisíc grafů z tisíců časopisů s různou grafikou. Má stovky protokolů z několika zdrojů, které vypadají podobně. Menší rozmanitost dokumentů znamená menší trénovací sadu a jednodušší kontrolu výsledků.

Co od vás potřebuji na první pokus

CoProč
20 až 50 typických dokumentůodhad, kolik variant grafů a skenů máte
popis, jaká čísla chcete získatjestli stačí celá křivka, nebo jen maxima, prahy a sklon
kam mají data dorazitExcel, databáze, Power BI
kdo výsledek zkontrolujeu měření pro zákazníka chcete kontrolu člověkem

Na vzorku ukážu, kolik dokumentů projde automaticky a kolik skončí v kontrole. Další projekty strojového vidění najdete v případových studiích, detekci objektů v leteckých snímcích popisuji v článku o detekci fotovoltaiky z ortofota. Co dalšího dělám, je na stránce Co umím.

Časté dotazy

Co je segmentace obrazu?
Segmentace obrazu přiřadí každému pixelu třídu, například křivka, osa, text nebo pozadí. Výsledkem je maska stejně velká jako obrázek. Detekce objektů naproti tomu kreslí kolem objektů jen obdélníky.
Proč na tenké křivky nestačí Mask R-CNN?
Mask R-CNN hledá objekty přes ohraničující obdélníky a překrývající se obdélníky maže krokem NMS. Dvě křivky v jednom grafu mají skoro stejný obdélník, takže síť jednu z nich zahodí, i když ji našla správně.
Jaký je rozdíl mezi metrikou F0.5 a Dice?
Dice váží přesnost a úplnost stejně. F0.5 klade větší váhu na přesnost, tedy na to, aby pixel označený jako křivka opravdu patřil křivce. Chybějící kousek křivky se dá dopočítat, falešný pixel z popisku nebo mřížky posune naměřená data.
Kolik obrázků je potřeba na natrénování U-Net?
U-Net se dá natrénovat na stovkách ručně označených obrázků, pokud jsou data rozmanitá a trénink používá augmentace. Na první ověření stačí menší vzorek typických dokumentů z vaší firmy.
Nestačí na digitalizaci grafu WebPlotDigitizer?
Na desítky grafů stačí. Uživatel v něm ručně nastaví osy a zkontroluje body. Pro tisíce grafů nebo archiv protokolů potřebujete automatickou kalibraci os a kontrolu kvality bez člověka u každého obrázku.

Zdroje

  1. 01Ronneberger, Fischer, Brox: U-Net: Convolutional Networks for Biomedical Image Segmentation (arXiv 1505.04597), navštíveno 23. 10. 2026
  2. 02He a kol.: Mask R-CNN (arXiv 1703.06870), navštíveno 23. 10. 2026
  3. 03Kirillov a kol.: PointRend: Image Segmentation as Rendering (arXiv 1912.08193), navštíveno 23. 10. 2026
  4. 04Roy, Navab, Wachinger: Concurrent Spatial and Channel Squeeze & Excitation in Fully Convolutional Networks (arXiv 1803.02579), navštíveno 23. 10. 2026
  5. 05PaddleOCR (GitHub), navštíveno 23. 10. 2026

O autorovi

František Jánoš

Stavím nástroje na vytěžování faktur a poptávek, AI asistenty nad technickou dokumentací a napojení AI na ERP. Několik z nich je v ostrém provozu.

Co umím

Napište mi, co vás ve výrobě zdržuje

Projdeme to spolu na krátké schůzce a řeknu vám, jestli a jak se to dá řešit.

Domluvit konzultaci