Maluj obrazy za pomocą Stable Diffusion za pomocą Amazon SageMaker JumpStart

Maluj obrazy za pomocą Stable Diffusion za pomocą Amazon SageMaker JumpStart

W listopadzie 2022 r. my ogłosił za pomocą których klienci AWS mogą generować obrazy z tekstu Stabilna dyfuzja modele używające Amazon SageMaker JumpStart. Dzisiaj z przyjemnością przedstawiamy nową funkcję, która umożliwia użytkownikom malowanie obrazów za pomocą modeli stabilnej dyfuzji. Inpainting odnosi się do procesu zastępowania części obrazu innym obrazem na podstawie zachęty tekstowej. Dostarczając oryginalny obraz, obraz maski przedstawiający część do zastąpienia oraz monit tekstowy, model stabilnej dyfuzji może wytworzyć nowy obraz, który zastępuje zamaskowany obszar obiektem, podmiotem lub środowiskiem opisanym w monicie tekstowym.

Możesz użyć malowania do przywracania zdegradowanych obrazów lub tworzenia nowych obrazów z nowymi tematami lub stylami w niektórych sekcjach. W dziedzinie projektowania architektonicznego malowanie metodą Stable Diffusion może być stosowane do naprawy niekompletnych lub uszkodzonych obszarów planów budynków, dostarczając precyzyjnych informacji ekipom budowlanym. W przypadku klinicznego obrazowania MRI głowa pacjenta musi być unieruchomiona, co może prowadzić do uzyskania wyników poniżej normy z powodu artefaktu kadrowania powodującego utratę danych lub zmniejszenie dokładności diagnostycznej. Malowanie obrazu może skutecznie pomóc złagodzić te nieoptymalne wyniki.

W tym poście przedstawiamy obszerny przewodnik dotyczący wdrażania i uruchamiania wnioskowania przy użyciu modelu inpainting Stable Diffusion na dwie metody: za pośrednictwem interfejsu użytkownika (UI) JumpStart w Studio Amazon SageMakeri programowo przez Interfejsy API JumpStart dostępny w SageMaker SDK dla Pythona.

Omówienie rozwiązania

Poniższe obrazy są przykładami inpaintingu. Oryginalne obrazy znajdują się po lewej stronie, obraz maski znajduje się pośrodku, a obraz wygenerowany przez model jest po prawej stronie. W przypadku pierwszego przykładu model otrzymał oryginalny obraz, obraz maski i podpowiedź tekstową „biały kot, niebieskie oczy, ubrany w sweter, leżący w parku”, a także podpowiedź negatywną „źle narysowane stopy. ” W przypadku drugiego przykładu zachęta tekstowa brzmiała: „Modelka z wdziękiem prezentuje swobodną długą sukienkę z mieszanką różowych i niebieskich odcieni”.

Maluj obrazy za pomocą Stable Diffusion przy użyciu Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Uruchamianie dużych modeli, takich jak stabilna dyfuzja, wymaga niestandardowych skryptów wnioskowania. Musisz przeprowadzić kompleksowe testy, aby upewnić się, że skrypt, model i żądana instancja wydajnie ze sobą współpracują. JumpStart upraszcza ten proces, udostępniając gotowe do użycia skrypty, które zostały gruntownie przetestowane. Dostęp do tych skryptów można uzyskać jednym kliknięciem w interfejsie Studio lub za pomocą kilku wierszy kodu w programie Interfejsy API JumpStart.

Poniższe sekcje przeprowadzą Cię przez proces wdrażania modelu i uruchamiania wnioskowania przy użyciu interfejsu Studio lub interfejsów API JumpStart.

Pamiętaj, że korzystając z tego modelu, zgadzasz się na Licencja CreativeML Open RAIL++-M.

Uzyskaj dostęp do JumpStart przez interfejs użytkownika Studio

W tej sekcji zilustrujemy wdrażanie modeli JumpStart przy użyciu interfejsu Studio. Towarzyszący film wideo pokazuje lokalizowanie wstępnie wytrenowanego modelu malowania stabilnej dyfuzji w programie JumpStart i wdrażanie go. Strona modelu zawiera istotne szczegóły dotyczące modelu i jego użycia. Aby przeprowadzić wnioskowanie, używamy instancji typu ml.p3.2xlarge, która zapewnia wymaganą akcelerację GPU dla wnioskowania o małych opóźnieniach w przystępnej cenie. Po skonfigurowaniu instancji hostingowej SageMaker wybierz Rozmieścić. Punkt końcowy będzie działał i był przygotowany do obsługi żądań wnioskowania w ciągu około 10 minut.

JumpStart udostępnia przykładowy notatnik, który może przyspieszyć czas potrzebny do uruchomienia wnioskowania na nowo utworzonym punkcie końcowym. Aby uzyskać dostęp do notesu w Studio, wybierz Otwórz notatnik Użyj punktu końcowego ze Studio sekcja strony punktu końcowego modelu.

Używaj programu JumpStart z pakietem SDK SageMaker

Korzystanie z interfejsu użytkownika JumpStart umożliwia interaktywne wdrożenie wstępnie wytrenowanego modelu za pomocą zaledwie kilku kliknięć. Alternatywnie, możesz programowo zastosować modele JumpStart, używając interfejsów API zintegrowanych z SageMaker Python SDK.

W tej sekcji wybieramy odpowiedni wstępnie wytrenowany model w JumpStart, wdrażamy ten model w punkcie końcowym SageMaker i przeprowadzamy wnioskowanie na wdrożonym punkcie końcowym, a wszystko to przy użyciu zestawu SageMaker Python SDK. Poniższe przykłady zawierają fragmenty kodu. Aby uzyskać dostęp do pełnego kodu ze wszystkimi krokami zawartymi w tej demonstracji, zapoznaj się z Wprowadzenie do edycji obrazu JumpStart — Inpainting w trybie stabilnej dyfuzji przykładowy notatnik.

Wdróż wstępnie wytrenowany model

SageMaker wykorzystuje kontenery Docker do różnych zadań kompilacji i wykonywania. JumpStart wykorzystuje Kontenery do głębokiego uczenia SageMaker (DLC), które są specyficzne dla platformy. Najpierw pobieramy wszelkie dodatkowe pakiety, a także skrypty do obsługi uczenia i wnioskowania dla wybranego zadania. Następnie wstępnie wytrenowane artefakty modelu są pobierane oddzielnie model_uris, co zapewnia elastyczność platformy. Pozwala to na użycie wielu wstępnie wytrenowanych modeli z jednym skryptem wnioskowania. Poniższy kod ilustruje ten proces:

model_id, model_version = "model-inpainting-stabilityai-stable-diffusion-2-inpainting-fp16", "*"
# Retrieve the inference docker container uri
deploy_image_uri = image_uris.retrieve( region=None, framework=None, # automatically inferred from model_id image_scope="inference", model_id=model_id, model_version=model_version, instance_type=inference_instance_type,
)
# Retrieve the inference script uri
deploy_source_uri = script_uris.retrieve(model_id=model_id, model_version=model_version, script_scope="inference") base_model_uri = model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="inference")

Następnie udostępniamy te zasoby a Model SageMakera instancję i wdrożyć punkt końcowy:

# Create the SageMaker model instance
# Create the SageMaker model instance
model = Model( image_uri=deploy_image_uri, source_dir=deploy_source_uri, model_data=base_model_uri, entry_point="inference.py", # entry point file in source_dir and present in deploy_source_uri role=aws_role, predictor_cls=Predictor, name=endpoint_name,
) # deploy the Model - note that we need to pass the Predictor class when we deploy the model through the Model class,
# in order to run inference through the SageMaker API
base_model_predictor = model.deploy( initial_instance_count=1, instance_type=inference_instance_type, predictor_cls=Predictor, endpoint_name=endpoint_name,
)

Po wdrożeniu modelu możemy uzyskać z niego prognozy w czasie rzeczywistym!

Wkład

Dane wejściowe to obraz podstawowy, obraz maski i monit opisujący podmiot, przedmiot lub środowisko, które mają zostać zastąpione w zamaskowanej części. Tworzenie idealnego obrazu maski na potrzeby efektów podczas malowania obejmuje kilka najlepszych praktyk. Zacznij od konkretnego monitu i nie wahaj się eksperymentować z różnymi ustawieniami stabilnej dyfuzji, aby osiągnąć pożądane rezultaty. Użyj obrazu maski, który bardzo przypomina obraz, który chcesz pomalować. Takie podejście pomaga algorytmowi malowania w uzupełnieniu brakujących fragmentów obrazu, co daje bardziej naturalny wygląd. Obrazy wysokiej jakości zazwyczaj dają lepsze wyniki, więc upewnij się, że obrazy bazowe i maski są dobrej jakości i przypominają się nawzajem. Ponadto wybierz duży i gładki obraz maski, aby zachować szczegóły i zminimalizować artefakty.

Punkt końcowy akceptuje obraz podstawowy i maskę jako nieprzetworzone wartości RGB lub obraz zakodowany w formacie base64. Program obsługi wnioskowania dekoduje obraz na podstawie content_type:

  • W razie zamówieenia projektu content_type = “application/json”, wejściowy ładunek musi być słownikiem JSON z nieprzetworzonymi wartościami RGB, monitem tekstowym i innymi opcjonalnymi parametrami
  • W razie zamówieenia projektu content_type = “application/json;jpeg”, ładunek wejściowy musi być słownikiem JSON z obrazem zakodowanym w formacie base64, monitem tekstowym i innymi opcjonalnymi parametrami

Wydajność

Punkt końcowy może generować dwa typy danych wyjściowych: obraz RGB zakodowany w formacie Base64 lub słownik JSON wygenerowanych obrazów. Możesz określić żądany format wyjściowy, ustawiając plik accept nagłówek do "application/json" or "application/json;jpeg" odpowiednio dla obrazu JPEG lub base64.

  • W razie zamówieenia projektu accept = “application/json”, punkt końcowy zwraca słownik JSON z wartościami RGB dla obrazu
  • W razie zamówieenia projektu accept = “application/json;jpeg”, punkt końcowy zwraca słownik JSON z obrazem JPEG w postaci bajtów zakodowanych z kodowaniem base64.b64

Należy pamiętać, że wysyłanie lub odbieranie ładunku z nieprzetworzonymi wartościami RGB może spowodować przekroczenie domyślnych limitów wejściowego ładunku i rozmiaru odpowiedzi. W związku z tym zalecamy użycie obrazu zakodowanego w formacie base64 przez ustawienie content_type = “application/json;jpeg” i zaakceptuj = „aplikacja/json;jpeg”.

Poniższy kod jest przykładowym żądaniem wnioskowania:

content_type = "application/json;jpeg" with open(input_img_file_name, "rb") as f: input_img_image_bytes = f.read()
with open(input_img_mask_file_name, "rb") as f: input_img_mask_image_bytes = f.read() encoded_input_image = base64.b64encode(bytearray(input_img_image_bytes)).decode()
encoded_mask = base64.b64encode(bytearray(input_img_mask_image_bytes)).decode() payload = { "prompt": "a white cat, blue eyes, wearing a sweater, lying in park", "image": encoded_input_image, "mask_image": encoded_mask, "num_inference_steps": 50, "guidance_scale": 7.5, "seed": 0, "negative_prompt": "poorly drawn feet",
} accept = "application/json;jpeg" def query(model_predictor, payload, content_type, accept): """Query the model predictor.""" query_response = model_predictor.predict( payload, { "ContentType": content_type, "Accept": accept, }, ) return query_response query_response = query(model_predictor, json.dumps(payload).encode("utf-8"), content_type, accept)
generated_images = parse_response(query_response)

Obsługiwane parametry

Modele malowania metodą stabilnej dyfuzji obsługują wiele parametrów generowania obrazu:

  • obraz – Oryginalny obraz.
  • maska – Obraz, w którym zaciemniona część pozostaje niezmieniona podczas generowania obrazu, a biała część jest zastępowana.
  • podpowiedź – Monit, aby poprowadzić generowanie obrazu. Może to być ciąg znaków lub lista ciągów znaków.
  • num_inference_steps (opcjonalnie) – Liczba kroków odszumiania podczas generowania obrazu. Więcej kroków prowadzi do wyższej jakości obrazu. Jeśli jest określony, musi być dodatnią liczbą całkowitą. Należy pamiętać, że więcej kroków wnioskowania prowadzi do dłuższego czasu odpowiedzi.
  • skala_wskazówek (opcjonalnie) – Wyższa skala prowadzenia powoduje, że obraz jest bardziej zbliżony do monitu, kosztem jakości obrazu. Jeśli określono, musi to być liczba zmiennoprzecinkowa. guidance_scale<=1 jest ignorowany.
  • negatywna_prompt (opcjonalnie) – To prowadzi generowanie obrazu do tego monitu. Jeśli jest określony, musi to być ciąg znaków lub lista ciągów znaków i używany z guidance_scale. Jeśli guidance_scale jest wyłączone, to również jest wyłączone. Co więcej, jeśli monit jest listą ciągów znaków, to negative_prompt musi być również listą ciągów znaków.
  • nasiona (opcjonalnie) – To naprawia losowy stan dla odtwarzalności. Jeśli jest określony, musi być liczbą całkowitą. Ilekroć użyjesz tego samego monitu z tym samym materiałem siewnym, wynikowy obraz będzie zawsze taki sam.
  • wielkość_wsadu (opcjonalnie) – Liczba obrazów do wygenerowania w jednym przejściu do przodu. Jeśli używasz mniejszej instancji lub generujesz wiele obrazów, zmniejsz batch_size być małą liczbą (1–2). Liczba obrazów = liczba monitów*num_images_per_prompt.

Ograniczenia i uprzedzenia

Mimo że Stable Diffusion ma imponującą wydajność w malowaniu, ma kilka ograniczeń i uprzedzeń. Obejmują one między innymi:

  • Model może nie generować dokładnych twarzy lub kończyn, ponieważ dane treningowe nie zawierają wystarczającej liczby obrazów z tymi funkcjami.
  • Model był szkolony na Zbiór danych LAION-5B, która zawiera treści dla dorosłych i może nie nadawać się do użytku w produkcie bez dalszych rozważań.
  • Model może nie działać dobrze z językami innymi niż angielski, ponieważ model został przeszkolony na tekście w języku angielskim.
  • Model nie może generować dobrego tekstu w obrazach.
  • Malowanie metodą stabilnej dyfuzji zazwyczaj działa najlepiej w przypadku obrazów o niższych rozdzielczościach, takich jak 256×256 lub 512×512 pikseli. Podczas pracy z obrazami o wysokiej rozdzielczości (768×768 lub wyższej) metoda może mieć problemy z utrzymaniem pożądanego poziomu jakości i szczegółowości.
  • Chociaż użycie materiału siewnego może pomóc w kontrolowaniu odtwarzalności, malowanie w trybie stabilnej dyfuzji może nadal dawać zróżnicowane wyniki przy niewielkich zmianach danych wejściowych lub parametrów. Może to utrudniać precyzyjne dostrojenie danych wyjściowych do określonych wymagań.
  • Ta metoda może mieć problemy z generowaniem skomplikowanych tekstur i wzorów, zwłaszcza gdy obejmują one duże obszary obrazu lub są niezbędne do zachowania ogólnej spójności i jakości pomalowanego obszaru.

Aby uzyskać więcej informacji na temat ograniczeń i stronniczości, patrz Karta modelu stabilnej dyfuzji Inpainting.

Rozwiązanie do malowania z maską generowaną za pomocą monitu

CLIPSeq to zaawansowana technika głębokiego uczenia się, która wykorzystuje moc wstępnie wytrenowanych modeli CLIP (Contrastive Language-Image Pretraining) do generowania masek z obrazów wejściowych. Takie podejście zapewnia wydajny sposób tworzenia masek do zadań, takich jak segmentacja obrazu, malowanie i manipulacja. CLIPSeq używa CLIP do generowania opisu tekstowego obrazu wejściowego. Opis tekstowy jest następnie używany do generowania maski, która identyfikuje piksele na obrazie, które są istotne dla opisu tekstowego. Maski można następnie użyć do wyodrębnienia odpowiednich części obrazu do dalszego przetwarzania.

CLIPSeq ma kilka zalet w porównaniu z innymi metodami generowania masek z obrazów wejściowych. Po pierwsze, jest to bardziej wydajna metoda, ponieważ nie wymaga przetwarzania obrazu przez osobny algorytm segmentacji obrazu. Po drugie, jest dokładniejszy, ponieważ może generować maski, które są ściślej dopasowane do opisu tekstowego obrazu. Po trzecie, jest bardziej wszechstronny, ponieważ można go używać do generowania masek z szerokiej gamy obrazów.

Jednak CLIPSeq ma również pewne wady. Po pierwsze, technika ta może mieć ograniczenia pod względem przedmiotu, ponieważ opiera się na wstępnie wytrenowanych modelach CLIP, które mogą nie obejmować określonych dziedzin lub obszarów wiedzy specjalistycznej. Po drugie, może to być metoda wrażliwa, ponieważ jest podatna na błędy w opisie tekstowym obrazu.

Aby uzyskać więcej informacji, zobacz Wirtualna stylizacja mody z generatywną sztuczną inteligencją przy użyciu Amazon SageMaker.

Sprzątać

Po zakończeniu uruchamiania notesu pamiętaj o usunięciu wszystkich zasobów utworzonych w procesie, aby mieć pewność, że rozliczenia zostaną zatrzymane. Kod służący do czyszczenia punktu końcowego jest dostępny w powiązanym pliku notatnik.

Wnioski

W tym poście pokazaliśmy, jak wdrożyć wstępnie wytrenowany model malowania metodą stabilnej dyfuzji za pomocą funkcji JumpStart. W tym poście pokazaliśmy fragmenty kodu — pełny kod ze wszystkimi krokami w tej wersji demonstracyjnej jest dostępny w Wprowadzenie do JumpStart — Popraw jakość obrazu, kierując się monitami przykładowy notatnik. Wypróbuj rozwiązanie samodzielnie i prześlij nam swoje uwagi.

Aby dowiedzieć się więcej o modelu i sposobie jego działania, zobacz następujące zasoby:

Aby dowiedzieć się więcej o JumpStart, sprawdź następujące posty:


O autorach

Maluj obrazy za pomocą Stable Diffusion przy użyciu Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.Dr Vivek Madan jest naukowcem w zespole Amazon SageMaker JumpStart. Uzyskał doktorat na Uniwersytecie Illinois w Urbana-Champaign i był badaczem podoktoranckim w Georgia Tech. Jest aktywnym badaczem w dziedzinie uczenia maszynowego i projektowania algorytmów. Publikował artykuły na konferencjach EMNLP, ICLR, COLT, FOCS i SODA.

Maluj obrazy za pomocą Stable Diffusion przy użyciu Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.Alfreda Shena jest starszym specjalistą AI/ML w AWS. Pracował w Dolinie Krzemowej, zajmując stanowiska techniczne i kierownicze w różnych sektorach, w tym w służbie zdrowia, finansach i zaawansowanych technologiach. Jest oddanym badaczem stosowanej AI/ML, koncentrującym się na CV, NLP i multimodalności. Jego prace były prezentowane w publikacjach takich jak EMNLP, ICLR i Public Health.

Znak czasu:

Więcej z Uczenie maszynowe AWS