Blog / Inżynieria

Czy AI naprawi rozdarcia i rysy? Liczby o wykonalności

· opis eksperymentu · dowód koncepcji, potem wdrożona opcjonalna beta

Tak, a ten wpis dokumentuje pomiary, które zaprowadziły tę funkcję od nadziei na mapie drogowej do wdrożenia: co potok robił wcześniej z uszkodzonymi skanami, liczby z dowodu koncepcji, które uzasadniły zbudowanie tego etapu, oraz wyniki od początku do końca wersji, która działa dziś za polem wyboru „Napraw rysy i rozdarcia”.

Co potok robił wcześniej z podartym zdjęciem

Renowacja nie miała etapu inpaintingu: niczego, co mogłoby usunąć obszar i zsyntetyzować zastępstwo. Sprawdzone na mocno popękanym portrecie: wewnątrz obszarów twarzy uszkodzenia znikały przypadkiem (model twarzy syntetyzuje na nowo cały wycinek), a potem nagle wracały na granicy wtapiania, pęknięcie urywające się na policzku, co może wyglądać gorzej niż brak naprawy. Wszędzie indziej uszkodzenia były uwydatniane: przebieg wyostrzania uwyraźniał krawędzie rozdarć, jakby były detalem, a koloryzator barwił białe linie pęknięć jak treść sceny.

Dowód koncepcji

Obiekt testowy: czarno-biały portret 510×817 z siatką pęknięć emulsji. Sprzęt: celowo słaby sandbox wyłącznie na CPU, więc każdy czas to najgorszy przypadek. Dwa etapy: sieć wykrywania rys (z otwartoźródłowego projektu Microsoftu „Bringing Old Photos Back to Life”[2]) tworzy maskę uszkodzeń; model inpaintingu LaMa[1] wypełnia potem tylko zamaskowane obszary w kafelkach 512 px, oba na dostawcy CPU ONNX Runtime[3].

Rys. 1. Pomiary z dowodu koncepcji na portrecie z siatką pęknięć (sandbox wyłącznie CPU, najgorszy przypadek). Ładowanie modeli to koszt jednorazowy na rozgrzanej instancji.

Maska uszkodzeń objęła 18,4% pikseli tego mocno uszkodzonego zdjęcia. Wynik jakościowy: siatka pęknięć została usunięta z twarzy, ubrania i tła, bez szkodliwych fałszywych wykryć: koronkowy obrus, klasyczna pułapka na detektory rys, przetrwał.

Co wdrożono, zmierzone od początku do końca

Produkcyjny etap działa jako pierwszy w kolejności renowacji, więc pęknięcia nigdy nie są kolorowane ani wyostrzane przed usunięciem. Wykrywanie działa przy krótszym boku 256 z dylatacją maski 2 px; inpainting jest łatowy w natywnej rozdzielczości, z limitem 12 łat na zdjęcie, przy czym wygrywają największe obszary uszkodzeń. Dwa niezmienniki są wymuszane, a nie zakładane: zapisywane są wyłącznie zamaskowane piksele (każdy nieuszkodzony piksel wyjścia jest bajt w bajt identyczny z wejściem), a bramka pokrycia pomija cały etap, gdy wykryty obszar jest poniżej 0,5% (nie ma czego naprawiać) lub powyżej 35% (to raczej błędnie wykryta faktura niż uszkodzenie).

Późniejsza rewizja produkcyjna dodała do automatycznej bramki drugi, ostrzejszy dyskryminator: kształt. Samo pokrycie nie odróżni włoskowatego rozdarcia od szumu detektora, ale ich geometria różni się o rząd wielkości: rozdarcie jest długie i cienkie, szum to kleksy. Dla każdej spójnej składowej maski, o ramce bw×bh i polu w pikselach A, liczymy

elongation = (bw² + bh²) / A , auto-naprawa ⇔ 0.005 ≤ coverage ≤ 0.35 ∧ max elongation ≥ 6(1)

Punkty kalibracyjne ze stanowiska testowego: czysta grafika marketingowa uzyskuje maksymalne wydłużenie 2,4; skan z siatką pęknięć 29,8. Próg 6 leży wyraźnie z dala od obu, a każdy produkcyjny przebieg loguje swoje pokrycie i wydłużenie, więc bramka jest wciąż strojona na prawdziwym ruchu, a nie na dwóch zdjęciach.

Naprawa uszkodzeńwykryj → maska → inpainting
Koloryzacjajeśli monochromatyczne
Ulepszaniecały obraz
Twarzeodnów i wtop
Rys. 2. Kolejność renowacji z włączonym etapem uszkodzeń. Naprawa uszkodzeń działa pierwsza, więc pęknięcia są usuwane, zanim cokolwiek zdąży je wyostrzyć lub zabarwić.
Rys. 3. Czasy na rozgrzanej instancji od początku do końca na zdjęciu testowym z zaznaczonym polem wyboru: łącznie 20,2 s, z czego etap uszkodzeń to 7,9 s (zimny start: 35,7 s). Z odznaczonym polem etap nigdy nie działa, a czasy pokrywają się z poprzednim potokiem.

Dwie kontrole: z odznaczonym polem wyboru etap nigdy nie ruszył, a czasy dokładnie pokryły się z poprzednim potokiem. Na niemal czystym zdjęciu detektor oznaczył tylko naprawdę uszkodzone 0,81% pikseli (resztki pęknięć w rogach i kurz), z zerem fałszywych wykryć na twarzach, koronce czy fakturze.

Czemu jest opcjonalna, a nie domyślna

Znanym trybem awarii automatycznej naprawy uszkodzeń są fałszywe wykrycia: detektor, który oznaczy druty ogrodzenia, kosmyki włosów czy koronkę jako rysy, wymaże prawdziwą treść, a inpainter bardzo dobrze wymazuje. Dwa zdjęcia kontrolne to dowód, nie test porównawczy. Etap trafia więc do produkcji jako jawne pole wyboru, a każdy przebieg loguje swoje pokrycie uszkodzeń, żeby progi dało się dostroić na prawdziwym ruchu przed jakimkolwiek awansem na ustawienie domyślne. Odrzuciliśmy też skrót w postaci wysyłania zdjęć do zewnętrznego generatywnego API obrazów: to narzędzie przetwarza zdjęcia przejściowo na naszej własnej infrastrukturze, a pełne generatywne przerysowanie dryfuje tożsamość; celem jest naprawa uszkodzeń, a nie przemalowanie Twojego krewnego.

Źródła

  1. Suvorov, R., Logacheva, E., Mashikhin, A., et al. (2022). Resolution-robust Large Mask Inpainting with Fourier Convolutions (LaMa). WACV. arXiv:2109.07161. arxiv.org
  2. Wan, Z., Zhang, B., Chen, D., et al. (2020). Bringing Old Photos Back to Life (the scratch-detection recipe). CVPR. arXiv:2004.09484. arxiv.org
  3. ONNX Runtime: the inference engine both our server (CPU) and in-browser (WebGPU/WASM) engines run on. onnxruntime.ai