# Jak v Pythonu hledat AI původ a AI úpravy fotografie Rešerše pro tento proof of concept, 29. 10. 2026. Níže jsou konkrétní primární zdroje a technické možnosti; nejde o vyčerpávající žebříček aktuálních detektorů. ## Co vlastně zjišťujeme Rozlišujme tři odlišné otázky: 1. **Celý obrázek byl syntetizován.** Binární naučený klasifikátor může mít použitelný signál, ale závisí na generátorech a datech, které viděl při učení. 2. **Fotografie má lokální AI úpravu.** Inpainting, generative fill, výměna části scény nebo AI retuš mohou zabírat jen malé procento pixelů. Detektor celého obrázku je může minout. Pro lokalizaci je potřeba zvlášť trénovaný a testovaný segmentační model, ideálně s maskami skutečných úprav. 3. **Obrázek někdo upravil.** Komprese, barevná korekce, resize, HDR či odšumění jsou běžné. Stopu úpravy nelze automaticky přepsat na „AI“ nebo „podvrh“. Z jednoho souboru nelze obecně prokázat, že vyobrazená událost opravdu nastala. Ani správně rozpoznaný fotoaparát a platný podpis nevylučují vyfotografování monitoru nebo zinscenování scény. ## Přehled metod a praktická volba | Metoda | Jak funguje v Pythonu | Co může přinést | Hlavní omezení | Stav v aplikaci | |---|---|---|---|---| | EXIF, PNG text, XMP, IPTC | Pillow přečte metadata, pravidla hledají konkrétní označení nástroje/původu | Explicitní deklarace generátoru, parametry, kamera, software | Lze odstranit a podvrhnout; editor ≠ AI | Implementováno | | C2PA / Content Credentials | `c2pa-python` čte manifesty, podpisy a stav validace | Prohlášení o původu a akcích svázané se souborem | Oddělit integritu, certifikační důvěru a pravdivost tvrzení; absence není důkaz | Implementováno pro vložené manifesty, offline | | NPR, CVPR 2024 | PyTorch klasifikuje nearest-neighbor reziduum lokálních pixelů | Skóre syntetického původu z naučených znaků | Posun domény, noví generátoři, komprese a výřezy; skóre není jistota | Implementováno, skutečný checkpoint | | UniversalFakeDetect, CVPR 2023 | CLIP ViT-L/14 reprezentace + trénovaná lineární vrstva | Přenos znaků mezi rodinami generátorů v experimentech autorů | Náročnější backbone, nová doména vyžaduje novou evaluaci | Rešerše, není spuštěno | | CNNDetection, CVPR 2020 | ResNet klasifikátor s augmentacemi blur/JPEG | Důležitý baseline a referenční data | Starší trénovací distribuce a omezená generalizace | Rešerše + dva externí smoke vzorky, není další detektor | | DIRE, ICCV 2023 | Diffusion reconstruction error + klasifikátor | Využívá chybu rekonstrukce difuzním modelem | Těžší modely a obvykle GPU; není to obyčejná JPEG ELA | Rešerše, není spuštěno | | ELA / JPEG recompression | Pillow JPEG Q90/Q95 a absolutní rozdíl | Mapa citlivosti pixelů na opakovanou kompresi | Hrany a textury jsou světlé i bez manipulace; jen JPEG | Implementováno jako forenzní pomůcka | | Reziduum / šum | SciPy mediánový filtr, MAD, vizualizace | Jemná struktura a nehomogenita pro další zkoumání | Obsah, ISO, resize a odšumění jsou velké konfúzní faktory | Implementováno, bez AI klasifikace | | PRNU | Korelace reziduí s otiskem senzoru ze sady referenčních snímků | Shoda s konkrétním zařízením za vhodných podmínek | Potřebuje reference; tato aplikace je nemá | Není implementováno; náš šum není PRNU | | FFT / spektrální stopy | NumPy FFT; případně učený frekvenční klasifikátor | Periodicita a artefakty některých syntéz | Běžné textury a komprese vytvářejí podobné vzory | Pouze vizualizace FFT, žádný FreqNet | | Vizuální GPT-4o | Vision API popíše viditelné vady | Srozumitelný komentář konkrétních pozorování | Není forenzní klasifikátor, halucinuje; externí API | Volitelný opt-in, bez vlivu na závěr | ## Proč právě tato první verze Praktický CPU PoC kombinuje **informaci o původu**, **jeden naučený detektor** a **tři vysvětlitelné forenzní pomůcky**. Nejde o šest nezávislých AI detektorů. Žádný „souhlas většiny algoritmů“ ani společné procento pravděpodobnosti nepočítáme. ELA, FFT a šum jsou korelované a nejsou kalibrované na tutéž rozhodovací úlohu. ### NPR v této aplikaci Pro rozměry dělitelné dvěma je vstupní reprezentace: ```python small = interpolate(x, scale_factor=0.5, mode="nearest") npr = x - interpolate(small, scale_factor=2.0, mode="nearest") logit = network(npr * 2 / 3) score = sigmoid(logit) # vyšší = více syntetické podle modelu, ne P(AI) ``` Používáme autory zveřejněný `model_epoch_last_3090.pth` (ProGAN-4class), revize `781ced3f7ca2cdc69ec9dd4ef27e8d0b3c07752a`, SHA-256 `b67a91555ce786a6d0463ff0cb2b0b874d1c3f971b0e3febd2ae5618a80f7e8a`. Downloader kontroluje hash, loader používá `torch.load(weights_only=True)` a striktní shodu parametrů. Nevykonáváme kód dodaný s checkpointem. Architektura vychází z běžných torchvision ResNet bottlenecků, používá první dvě stages, 3×3 stem a jeden výstup. Normalizace je ImageNet mean/std podle upstream datového pipeline. Výpočet běží na CPU ve float32. Kvůli dostupné latenci se analyzuje střed a rohy v nativních pixelech, až 5 výřezů nejvýše 512 × 512, bez interpolace textur. Z každé strany se případně zkrátí jeden pixel na sudý rozměr. Duplicity výřezů se odstraní. Vracíme dílčí skóre a průměr. To se liší od plnoobrazové evaluace v článku a může minout malé AI úpravy mezi výřezy. Výstup není segmentační mapa. UI označí skóre ≥ 0,8 jako indicii, ≤ 0,2 jako příklon k fotografii a mezilehlé hodnoty jako nejasné. Tyto prahy jsou **nekalibrovaná prezentační heuristika**; nevydáváme je za optimální rozhodovací hranice a nedeklarujeme přesnost. V experimentálním kódu autorů je běžný binární práh 0,5. Změna textových kategorií nevytváří detektor se statisticky ověřenou specificitou. ### Metadata a C2PA Hledáme strukturovaná metadata, nikoli název souboru nebo náhodné textové řetězce uvnitř pixelových dat. Například PNG `parameters` obsahující `Steps: … Sampler:` může pocházet z generátoru. `Software=Adobe Photoshop` prokazuje nanejvýš uvedený software, nikoli Generative Fill. IPTC rozlišuje např. `trainedAlgorithmicMedia` a `compositeWithTrainedAlgorithmicMedia`. C2PA parsujeme oficiálním SDK. AI deklarace hledáme v **aktivním manifestu**, nikoli v libovolné historické ingredienci. Vypisujeme SDK `validation_status`, nevymýšlíme vlastní „platný podpis“ na základě pouhé přítomnosti řetězce `c2pa`. Bez udržovaného seznamu důvěryhodných certifikačních autorit v tomto PoC nepotvrzujeme důvěryhodného vydavatele. Nezakazujeme validaci podpisu ani vazby na soubor. Stažení vzdáleného manifestu a OCSP je vypnuté, aby nahraný soubor nezpůsoboval libovolné odchozí požadavky; takový manifest je označen neprovedeno. ### Obrazové mapy ELA se počítá z původních JPEG pixelů, před zmenšením vizualizace. Mapu Q90 zesilujeme pevně 12×, aby normalizace nezměnila každou nepatrnou chybu na maximum. Měříme průměr i 95. percentil rozdílu pro Q90/Q95. Barvy a hrany ovlivňují mapu. Nevykreslujeme falešné bounding boxy „AI zásahu“. Šum a FFT jsou omezené na 1024 px na straně. Tento resize je sám změnou obrazu a je uveden ve výsledcích. U FFT odečteme průměr, aplikujeme Hannovo okno, zobrazujeme `log(1 + amplituda)` po fftshift. Měřítko této vizualizace není AI skóre. U průhledných vstupů skládáme barvy na bílé pozadí a tuto skutečnost hlásíme; směšování alfa kanálu ovlivňuje obrazové metody. ## Jak ověřit užitečnost před praktickým rozhodováním Funkční testy dokazují správné spuštění pipeline, nikoli detekční přesnost. Před rozhodováním na základě výsledků připravte sadu odpovídající vašim datům: - Originální fotky z různých zařízení, screenshoty, grafiku, skeny a běžné úpravy. - Celé AI obrazy z více rodin a verzí generátorů, oddělené od trénovacích dat. - Reálné fotografie s inpaintingem, generative fill, AI odšuměním/upscalem, ideálně s originály a maskami úprav. - Každý originál i jeho exporty: JPEG Q95/Q75, resize, screenshot a sociální sítě. Vyhodnoťte zvlášť citlivost, specificitu, false-positive rate, ROC-AUC/PR-AUC a matici záměn. U lokalizace navíc pixelovou precision/recall/IoU. Kalibraci a rozhodovací práh volte na validační sadě, potom zmrazte a testujte na oddělené sadě. Nevkládejte deriváty stejné fotky do train i test. Uveďte složení dat, verze modelů i rozdíl mezi syntézou celého obrazu a částečnou editací. Výsledky několika ukázek nebo čísla z článku nejsou měřením přesnosti této aplikace. Nejprve má smysl sbírat vlastní skutečné příklady a jejich známý původ. ## Zdroje Primární README, datový pipeline, architektura a API dokumentace byly načteny při implementaci. U článků níže vycházíme zejména z popisu a kódu autorů; zde neopakujeme jejich benchmarková čísla jako vlastní měření. 1. [NPR — autoři, kód, checkpoint a inference](https://github.com/chuangchuangtan/NPR-DeepfakeDetection), [článek](https://arxiv.org/abs/2312.10461). V kontrolovaných kořenových souborech `LICENSE`/`LICENSE.md` nebyla nalezena explicitní licence; pro komerční využití a redistribuci vah ověřte podmínky u autorů. Váhy se stahují ze zdroje, necommitují se. Tento PoC není prohlášení o otevřené licenci těchto vah. 2. [UniversalFakeDetect — CVPR 2023](https://github.com/WisconsinAIVision/UniversalFakeDetect), [článek](https://arxiv.org/abs/2302.10174). 3. [CNNDetection — CVPR 2020](https://github.com/peterwang512/CNNDetection), [článek](https://arxiv.org/abs/1912.11035). Dvojice `examples/real.png` a `examples/fake.png` sloužila jen k ad hoc funkčnímu smoke testu NPR. 4. [DIRE — ICCV 2023](https://github.com/ZhendongWang6/DIRE), [článek](https://arxiv.org/abs/2303.09295). 5. [Oficiální c2pa-python](https://github.com/contentauth/c2pa-python), [API a použití](https://github.com/contentauth/c2pa-python/blob/main/docs/usage.md), [offline konfigurace](https://github.com/contentauth/c2pa-python/blob/main/docs/context-settings.md). 6. [IPTC Digital Source Type](https://iptc.org/standards/digital-source-type/). 7. [Pillow Image API](https://pillow.readthedocs.io/en/stable/reference/Image.html), [ImageChops difference](https://pillow.readthedocs.io/en/stable/reference/ImageChops.html). 8. [SciPy median_filter](https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.median_filter.html), [NumPy FFT](https://numpy.org/doc/stable/reference/routines.fft.html). 9. [OpenAI image inputs / vision](https://platform.openai.com/docs/guides/images-vision). 10. [Oficiální HF dokumentace Docker Spaces](https://huggingface.co/docs/hub/spaces-sdks-docker), [zdroj dokumentace](https://github.com/huggingface/hub-docs/blob/main/docs/hub/spaces-sdks-docker.md).