Podstawy przetwarzania obrazu w Web Workerze
Ciężkie obliczenia na głównym wątku spowalniają stronę. Web Worker uruchamia wnioskowanie modelu na osobnym wątku, więc przyciski i podgląd zostają użyteczne.
Dla Ciebie wygląda to tak, że edytor nadal reaguje, podczas gdy maska jest liczona.
Główny wątek ma zadanie interfejsu użytkownika
Strona przeglądarki zwykle uruchamia JavaScript w głównym wątku. Ten wątek koordynuje także układ, malowanie i wprowadzanie danych. Jeśli zajmie to jedno długie obliczenie, kliknięcia mogą być opóźnione, animacja może się zatrzymać, a przeglądarka może ostrzec, że strona nie odpowiada.
Edytor obrazów ma wiele obowiązków związanych z wątkiem głównym, zanim w ogóle rozpocznie się wnioskowanie:
- otrzymać wybór pliku, wkleić go lub upuścić;
- dekodować i wyświetlać obraz;
- aktualizować stany postępu i błędów;
- narysuj płótno podglądu;
- obsługa ruchu pędzla Dodaj i Usuń;
- przygotuj akcje pobierania lub schowka.
Umieszczenie pracy numerycznej modelu segmentacji w tym samym wątku spowodowałoby, że zadania te bezpośrednio ze sobą konkurowały. Pracownik tworzy wyraźniejszą granicę.
Granica oparta na komunikatach
Edytor i pracownik nie współdzielą zwykłych zmiennych. Komunikują się poprzez wysyłanie wiadomości. Uproszczony przepływ wygląda następująco:
- Edytor tworzy lub ponownie wykorzystuje pracownika.
- Prosi pracownika o zainicjowanie środowiska wykonawczego i modelu wnioskowania.
- Przygotowuje dane obrazu i wysyła żądanie wnioskowania.
- Pracownik konwertuje dane na oczekiwane dane wejściowe modelu.
- Pracownik uruchamia model i tworzy wartości maski.
- Wysyła maskę lub dane wynikowe z powrotem.
- Edytor składa podgląd i umożliwia jego udoskonalenie lub eksport.
Wiadomości powinny zawierać wystarczający kontekst, aby dopasować odpowiedź do prawidłowego żądania. Ma to znaczenie, jeśli użytkownik wybierze inny obraz przed zakończeniem poprzedniego zadania. Interfejs musi unikać wyświetlania starego wyniku zamiast nowego źródła.
Kopiowanie i przesyłanie danych obrazu
Wysłanie krótkiej wiadomości tekstowej jest tanie. Wysyłanie milionów wartości pikseli może być kosztowne, jeśli przeglądarka musi skopiować cały bufor. Zamiast tego interfejsy API sieci Web mogą przenosić własność niektórych buforów binarnych. Przesłany bufor staje się dostępny dla odbiorcy bez zachowania użytecznego duplikatu po stronie nadawcy.
Optymalizacja ta wiąże się z ograniczeniem projektowym: po przesłaniu nadawca nie może w dalszym ciągu korzystać z tego samego bufora, jakby nadal był właścicielem danych. Edytor może zachować oddzielną reprezentację wyświetlania, utworzyć dedykowany bufor wnioskowania lub zrekonstruować to, czego potrzebuje później.
Nie w każdej implementacji transfer odbywa się dokładnie w tych samych miejscach. Ogólna lekcja jest taka, że separacja wątków nie powoduje zaniku ruchu danych. Wymiary obrazu, rozmiar buforu i liczba konwersji nadal wpływają na opóźnienia i pamięć.
Co Easy Background Remover wkłada do pracownika
Easy Background Remover wykorzystuje proces roboczy sieci Web ze środowiskiem wykonawczym wnioskowania przeglądarki do segmentacji na urządzeniu. Ciężki, automatyczny etap wycinania tworzy maskę. Następnie edytor wyświetla złożony wynik i obsługuje udoskonalanie pędzla płótna procesora.
Ta separacja nadaje awariom bardziej użyteczną granicę. Jeśli proces roboczy nie może zainicjować lub ulega awarii podczas wnioskowania, interfejs może zgłosić błąd związany z procesem roboczym, zamiast polegać na trwale zablokowanej karcie jako jedynym sygnale.
Dzięki temu twierdzenie o przetwarzaniu lokalnym jest zrozumiałe. Wysyłanie pikseli ze strony rozszerzenia do własnego procesu roboczego to komunikacja w środowisku przeglądarki, a nie przesyłanie do zdalnego interfejsu API wycinania. Podczas pierwszej sesji można oddzielnie pobrać zasób modelu do ponownego wykorzystania; zobacz Dlaczego pierwsze uruchomienie powoduje pobranie modelu.
Proces roboczy nie wykonuje obliczeń natychmiastowo
Pracownicy poprawiają responsywność, a nie surową wydajność urządzenia. Model nadal zużywa procesor, procesor graficzny lub inne zasoby wykonawcze, w zależności od tego, co może zapewnić przeglądarka. Duże dane wejściowe mogą nadal trwać dłużej i wymagać więcej pamięci niż małe.
Pozostaje kilka ograniczeń:
- inicjalizacja modelu ma realny koszt;
- bufory pikseli zajmują pamięć po obu stronach w przypadku kopiowania;
- zmiana rozmiaru i konwersja formatu wymagają czasu;
- urządzenia o małej ilości pamięci mogą mieć problemy z dużymi obrazami;
- większa liczba pracowników może zwiększyć spór, zamiast go zmniejszać;
- aktualizacje eksportu i płótna mogą nadal dotyczyć głównego wątku.
Uruchamianie pięciu procesów wnioskowania dla pięciu obrazów nie jest automatycznie pięć razy szybsze. Pracownicy korzystają z tej samej maszyny. Zadania równoległe mogą konkurować o przepustowość pamięci i zasoby wykonawcze, podczas gdy każda instancja modelu może wiązać się z własnym kosztem pamięci.
Raportowanie postępów sprzyja współpracy
Pracownik może wysyłać komunikaty o stanie, ale nie wie automatycznie, jaki procent postępu będzie dokładny. Pobieranie modelu, inicjalizacja środowiska wykonawczego, przygotowanie danych wejściowych, wnioskowanie, konwersja maski i renderowanie podglądu to oddzielne fazy o różnym czasie.
Niektóre fazy mają mierzalną liczbę bajtów. Wykonanie pojedynczego modelu może ujawnić tylko informacje „rozpoczęte” i „zakończone”. Płynny procent, który rośnie równomiernie, może zatem mieć charakter kosmetyczny, a nie precyzyjny pomiar.
Przydatny interfejs postępu nazywa fazę, jeśli to możliwe: przygotowanie modelu, przetwarzanie obrazu lub wynik budowania. Radzi sobie również z awarią i anulowaniem, zamiast pozostawiać spinner bez wyjaśnienia.
Anulowanie to coś więcej niż ukrywanie pokrętła
Jeśli użytkownik zamknie obraz lub zacznie od nowa, interfejs może zignorować ostateczną odpowiedź na nieaktualne żądanie. Natychmiastowe zatrzymanie podstawowych obliczeń może wymagać dodatkowego wsparcia ze strony środowiska wykonawczego lub zakończenia i ponownego utworzenia procesu roboczego.
Zakończenie procesu roboczego jest decydujące, ale powoduje odrzucenie jego stanu zainicjowanego. W następnym zadaniu może być konieczne ponowne załadowanie i zainicjowanie modelu. W przypadku krótkiej operacji oznaczenie wyniku jako nieaktualnego może być tańsze niż zburzenie wszystkiego.
Właściwy wybór zależy od ilości pamięci, czasu trwania operacji i możliwości środowiska wykonawczego. Z punktu widzenia użytkownika ważną zasadą jest to, że nieaktualne prace nie mogą nadpisywać bieżącej edycji.
Błędy też muszą przekroczyć granicę
Wyjątek wewnątrz procesu roboczego nie staje się normalnym wyjątkiem wątku głównego. Pracownik musi zgłaszać użyteczne błędy, a redaktor powinien wykrywać awarie na poziomie pracownika.
Dobra obsługa błędów wyróżnia co najmniej:
- zasób modelu niedostępny;
- inicjalizacja modelu nie powiodła się;
- nie powiodło się dekodowanie obrazu lub przygotowanie wejścia;
- wnioskowanie nie powiodło się;
- pracownik nieoczekiwanie zatrzymał się;
- wynik nie należy już do bieżącego żądania.
Jest to bardziej wykonalne niż ogólne „coś poszło nie tak”, zwłaszcza gdy pierwsza konfiguracja i normalne przetwarzanie obrazu mają różne rozwiązania.
Dane wyjściowe pracownika to nadal tylko pierwsza maska
Architektura wątków sama w sobie nie poprawia niejednoznacznej krawędzi. Pracownik może zwrócić sprawną technicznie maskę, w której brakuje jeszcze futra, przezroczystego materiału, wąskich ramiączek lub pożądanego cienia. Są to pytania dotyczące segmentacji i intencji.
Zadanie edytora zostaje wznowione po wnioskowaniu: przeskaluj maskę do roboczego układu współrzędnych, złóż podgląd, pozwól użytkownikowi go udoskonalić i wyeksportuj bieżący stan. Rozdzielczość maski a rozmiar podglądu wyjaśnia, dlaczego nie należy mylić tych układów współrzędnych.
Zwięzły model mentalny
Pomyśl o pracowniku jako o lokalnym specjalistze za oknem wiadomości:
- redaktor jest właścicielem interakcji;
- pracownik ma ciężkie zadanie wnioskowania;
- dane obrazu binarnego przekraczają określoną granicę;
- pracownik zwraca maskę, a nie gotową ocenę każdej krawędzi;
- redaktor pozostaje odpowiedzialny za stan bieżący, przegląd, udoskonalanie i eksport.
Aby zobaczyć model samych pikseli, przejdź do Co widzi model z wycięciem na urządzeniu. Aby zapoznać się z kompleksowym praktycznym omówieniem, zobacz Jak działa lokalne usuwanie tła.