Kursy i Poradniki IT - Adrian Kowalski

Wycinanie tła z obrazów to popularny problem w fotografii, grafice komputerowej czy mediach społecznościowych. Python oferuje narzędzia, dzięki którym możemy łatwo stworzyć aplikację do tego celu, wykorzystując potęgę sztucznej inteligencji i przetwarzania obrazów. W tym poradniku pokażemy krok po kroku, jak napisać aplikację usuwającą tło z obrazów.


Wprowadzenie do technologii

Do stworzenia naszej aplikacji użyjemy następujących narzędzi:

  • Python: Uniwersalny i łatwy w nauce język programowania, idealny do szybkiego prototypowania i analizy danych. Python oferuje bogaty ekosystem bibliotek do przetwarzania obrazów i uczenia maszynowego.
  • OpenCV: Biblioteka do przetwarzania obrazów i wideo. Jest przydatna do operacji takich jak zmiana rozmiaru, filtrowanie czy konwersje kolorów.
  • Rembg: Narzędzie oparte na modelu U-2-Net, wykorzystujące sztuczną inteligencję do precyzyjnego wycinania tła z obrazów.
  • Pillow: Biblioteka do przetwarzania obrazów w Pythonie, wspierająca formaty takie jak JPEG, PNG czy GIF.
  • Gradio: Framework pozwalający szybko tworzyć prosty interfejs użytkownika dla aplikacji machine learning i innych narzędzi.

Przygotowanie projektu

1. Zainstaluj Python

Upewnij się, że Python jest zainstalowany na twoim komputerze. Najnowszą wersję możesz pobrać z oficjalnej strony https://www.python.org

Podczas instalacji zaznacz opcję Add Python to PATH, aby Python był dostępny w wierszu poleceń.

Ważne:

Pobierz wersję =<3.12, aby była kompatybilna z bibliotekami, z których będziemy korzystać.

2. Czym jest wirtualne środowisko?

Wirtualne środowisko (ang. virtual environment) to izolowane środowisko dla Pythona, w którym możemy instalować specyficzne biblioteki dla danego projektu. W ten sposób unikamy konfliktów między różnymi projektami, które mogą wymagać innych wersji tych samych bibliotek.

Na przykład: projekt A może korzystać z OpenCV w wersji 4.5, podczas gdy projekt B wymaga wersji 4.7. Bez wirtualnych środowisk musiałbyś ręcznie zarządzać bibliotekami globalnie, co prowadzi do problemów z kompatybilnością.

3. Tworzenie wirtualnego środowiska

Aby utworzyć wirtualne środowisko w folderze projektu, wykonaj w terminalu:

python -m venv venv
  • python: Wywołuje interpretera Pythona.
  • -m venv: Uruchamia moduł do tworzenia wirtualnych środowisk.
  • venv: To nazwa folderu, w którym zostaną zapisane wszystkie pliki wirtualnego środowiska. Możesz nadać mu inną nazwę, np. env.

Po wykonaniu tego polecenia w folderze projektu pojawi się katalog venv, zawierający:

  • Scripts (Windows) lub bin (Linux/macOS): Pliki do aktywacji środowiska.
  • Lib: Zainstalowane biblioteki Pythona.
  • pyvenv.cfg: Plik konfiguracyjny.
4. Aktywacja wirtualnego środowiska

Aby aktywować wirtualne środowisko, wykonaj:

  • Windows:
.\venv\Scripts\activate

Po aktywacji w terminalu pojawi się prefiks (venv), co oznacza, że pracujesz w izolowanym środowisku.

  • macOS/Linux:
source venv/bin/activate
5. Wyłączenie wirtualnego środowiska

Aby zakończyć pracę w wirtualnym środowisku, użyj polecenia:

deactivate
6. Przełączanie między wirtualnymi środowiskami

Jeśli pracujesz nad kilkoma projektami, każde może mieć swoje własne środowisko. Wystarczy aktywować odpowiednie środowisko, uruchamiając plik aktywacyjny w folderze danego projektu.


Instalacja bibliotek

Zainstalujmy wymagane biblioteki, używając polecenia pip w aktywnym środowisku wirtualnym:

pip install opencv-python rembg numpy pillow gradio onnxruntime
Opis bibliotek:
  • OpenCV: Służy do podstawowego przetwarzania obrazów, np. zmiany rozmiaru, wykrywania krawędzi czy konwersji kolorów.
  • Rembg: Wykorzystuje model AI do automatycznego usuwania tła z obrazów. Obsługuje formaty takie jak PNG (zachowując przezroczystość).
  • NumPy: Biblioteka do obliczeń numerycznych, często używana w kontekście przetwarzania obrazu.
  • Pillow: Prosta biblioteka do edycji obrazów.
  • Gradio: Narzędzie do szybkiego tworzenia interfejsów użytkownika dla aplikacji webowych.

Tworzenie aplikacji

1. Importowanie bibliotek

Zacznijmy od zaimportowania wszystkich potrzebnych modułów.

import cv2
import numpy as np
from rembg import remove
from PIL import Image
import gradio as gr
2. Funkcja do wycinania tła

Stworzymy funkcję, która będzie odpowiedzialna za przetwarzanie obrazu i usuwanie jego tła.

def remove_background(input_image):
    # Konwersja obrazu z formatu NumPy na PIL
    input_image = Image.fromarray(input_image)

    # Konwersja PIL na BytesIO (w formacie, który rembg oczekuje)
    img_byte_arr = io.BytesIO()
    input_image.save(img_byte_arr, format='PNG')
    img_byte_arr = img_byte_arr.getvalue()

    # Usuwanie tła za pomocą rembg
    output_image = remove(img_byte_arr)

    # Konwersja obrazu wynikowego z BytesIO do NumPy
    output_image = Image.open(io.BytesIO(output_image))
    output_image = np.array(output_image)

    return output_image
3. Tworzenie interfejsu

Dzięki Gradio stworzymy intuicyjny interfejs użytkownika. Użytkownik będzie mógł przesłać obraz i zobaczyć wynik z usuniętym tłem w czasie rzeczywistym.

def create_interface():
    interface = gr.Interface(
        fn=remove_background,
        inputs=gr.Image(type="numpy"),
        outputs=gr.Image(type="numpy"),
        title="Usuwanie Tła z Obrazu",
        description="Prześlij obraz, aby usunąć jego tło."
    )
    return interface

if __name__ == "__main__":
    app = create_interface()
    app.launch(share=True)  # Uruchomienie aplikacji z możliwością udostępnienia
4. Kompletny kod
import cv2
import numpy as np
from rembg import remove
from PIL import Image
import gradio as gr
import io

def remove_background(input_image):
    # Konwersja obrazu z formatu NumPy na PIL
    input_image = Image.fromarray(input_image)

    # Konwersja PIL na BytesIO (w formacie, który rembg oczekuje)
    img_byte_arr = io.BytesIO()
    input_image.save(img_byte_arr, format='PNG')
    img_byte_arr = img_byte_arr.getvalue()

    # Usuwanie tła za pomocą rembg
    output_image = remove(img_byte_arr)

    # Konwersja obrazu wynikowego z BytesIO do NumPy
    output_image = Image.open(io.BytesIO(output_image))
    output_image = np.array(output_image)

    return output_image

def create_interface():
    interface = gr.Interface(
        fn=remove_background,
        inputs=gr.Image(type="numpy"),
        outputs=gr.Image(type="numpy"),
        title="Usuwanie Tła z Obrazu",
        description="Prześlij obraz, aby usunąć jego tło."
    )
    return interface

if __name__ == "__main__":
    app = create_interface()
    app.launch(share=True)  # Uruchomienie aplikacji z możliwością udostępnienia

Zapisz plik jako app.py w folderze projektu, a następnie uruchom

python app.py

Ważne aby być w konsoli w sesji wirtualnego środowiska.

Komenda ta wyświetli komunikat o aktywnym serwerze. Skopiuj jego adres do przeglądarki.

Twoim oczom powinien ukazać się interfejs aplikacji.

* Running on local URL:  http://127.0.0.1:7860

Wyniki:


Podsumowanie

W tym artykule stworzyliśmy prostą aplikację w Pythonie do usuwania tła z obrazów. Wykorzystaliśmy bibliotekę Rembg do analizy obrazu i OpenCV z Pillow do przetwarzania danych wizualnych. Dzięki Gradio przygotowaliśmy prosty interfejs użytkownika, który umożliwia łatwe korzystanie z naszej aplikacji.

Gotową aplikację możesz rozbudować, np. o opcje tworzenia maski, która będzie służyła do oznaczenia głównego obiektu. Powodzenia w dalszych eksperymentach z Pythonem i grafiką komputerową!

Adrian Kowalski

Jestem doświadczonym PHP Developerem z pasją do tworzenia wydajnych i skalowalnych aplikacji webowych. Specjalizuję się w pracy z frameworkiem Symfony, a także integracją z bazami danych oraz API. Posiadam solidne doświadczenie w optymalizacji kodu i pracy w zespołach Agile. Moje projekty skupiają się na dostarczaniu nowoczesnych rozwiązań z dbałością o jakość kodu i bezpieczeństwo.

kowalskiadrian.pl

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *