Erstellen Sie eine API zur Entfernung des Hintergrunds und Extrahierung von Farben aus Fotos unter Verwendung von FastAPI, rembg und extcolors.

Erstellen eines API-Posts zur Entfernung des Hintergrunds und Extrahierung von Farben aus Fotos unter Verwendung von FastAPI, rembg und extcolors. Es behandelt Themen wie Bildverarbeitung, die Grundstruktur von FastAPI, das Starten des uvicorn-Servers und das Erstellen von APIs.

5
Erstellen Sie eine API zur Entfernung des Hintergrunds und Extrahierung von Farben aus Fotos unter Verwendung von FastAPI, rembg und extcolors.

0. Einführung

Ich habe Beiträge für Entwickler vorbereitet, die sich für die digitale Bildverarbeitung interessieren oder Bildverarbeitung in realen Projekten durchführen müssen.

Das Entfernen des Hintergrunds aus Fotos oder das Extrahieren von Hauptfarben wird in verschiedenen Bereichen wie digitale Kunst, Webentwicklung, mobilen Apps, Machine-Learning-Projekten usw. eingesetzt.

Obwohl es kompliziert erscheinen mag, solche Aufgaben auszuführen, ist es tatsächlich sehr einfach.

Durch die Verwendung von FastAPI, rembg und der Python-Bibliothek extcolors können diese Aufgaben leicht in APIs umgewandelt und in verschiedenen Anwendungen verwendet werden. In diesem Beitrag werde ich Sie Schritt für Schritt durch die Erstellung einer leistungsstarken Bildverarbeitungs-API führen, indem ich diese drei Tools kombiniere.

1. Einrichten der Grundstruktur von FastAPI

1.1. Installation der erforderlichen Pakete

Installieren Sie fastapi und uvicorn, um es auszuführen.

pip install fastapi
pip install uvicorn

1.2. Ausgabe von Hello World

Fügen Sie den folgenden Code zu main.py hinzu:

# 패키지 import
from fastapi import FastAPI
import uvicorn


# Helper 함수 작성
# app = FastAPI()


# Endpoint 함수 작성
# # 루트 페이지("/") 접속 시 "Hello": "world" return
@app.get("/")
def read_root():
    return {
        "Hello": "world"
    }


if __name__ == "__main__":
    uvicorn.run(app, host='0.0.0.0', port=5000)

Wir werden host auf '0.0.0.0' und port auf 5000 setzen.

1.3. Starten des uvicorn-Servers

Geben Sie Folgendes in Ihr Terminal ein:

uvicorn main:app --reload
INFO:     Will watch for changes in these directories: ['PROJECT_DIRECTORY_PATH']
INFO:     Uvicorn running on <http://127.0.0.1:8000> (Press CTRL+C to quit)
INFO:     Started reloader process [9982] using StatReload

Der uvicorn-Server läuft jetzt unter http://127.0.0.1:8000!

notion image

Sie können sehen, dass die Rückgabewerte auf der Startseite ordnungsgemäß angezeigt werden.

2. Erstellen einer API zum Entfernen des Hintergrunds und Extrahieren von Farben

2.1. Installation der erforderlichen Pakete

Installieren Sie die erforderlichen Pakete, um die API zu erstellen:

pip install image
pip install rembg
pip install extcolors

Importieren Sie wie folgt:

import os
import request
from PIL import Image
from extcolors import extract_from_image
from rembg import remove

2.2. Hilfsfunktion zum Speichern von Bildern

Lassen Sie uns zuerst eine Hilfsfunktion erstellen, die eine Bild-URL erhält und die Bilddatei speichert.

Im HTML-<img>-Tag gibt es ein src-Attribut. Die folgende Funktion greift darauf zu und lädt die Bilddatei herunter.

def save_image(image_url):
    response = requests.get(image_url)

    # 이미지 저장 디렉토리
    download_dir_name = 'downloaded_images'
    if response.status_code == 200:
        # 파일 이름 얻기
        image_name = os.path.basename(image_url)

        # 파일 이름에 확장자 없다면 추가
        exts = [".jpg", ".jpeg", ".png", ".gif"]
        ext_included = False
        file_ext = None
        for ext in exts:
            if ext in image_name:
                ext_included = True
                file_ext = ext
                break

        if ext_included:
            image_name = image_name.split(file_ext)[0] + file_ext
        else:
            image_name += ".jpeg"
            file_ext = ".jpeg"

        # 저장 경로 없다면 생성
        if not os.path.exists(download_dir_name):
            os.makedirs(download_dir_name)

        # 파일 경로 얻기
        image_path = os.path.join(download_dir_name, image_name)

        # 파일 저장
        with open(image_path, 'wb') as f:
            f.write(response.content)

        result = {
            "message": "Image saved successfully!",
            "status_code": response.status_code,
            "image_path": image_path,
            "image_name": image_name,
            "file_ext": file_ext
        }
        return result
    else:
        return {
            "message": "Failed to save image",
            "status_code": response.status_code
        }

2.3. Hilfsfunktion zum Konvertieren von RGB in HEX

Es gibt verschiedene Möglichkeiten, Farben anzuzeigen. Diese API extrahiert Farben und liefert RGB- und HEX-Informationen.

Lassen Sie uns eine Hilfsfunktion erstellen, die die Farben aus dem Bild extrahiert, RGB erhält und in HEX umwandelt.

def rgb_to_hex(rgb_tuple):
    r = int(rgb_tuple[0])
    g = int(rgb_tuple[1])
    b = int(rgb_tuple[2])
    return '#' + hex(r)[2:].zfill(2) + hex(g)[2:].zfill(2) + hex(b)[2:].zfill(2)

2.4. Funktion für den Hintergrundentfernungs-Endpunkt

http://127.0.0.1:8000/rembg/{IMAGE_URL}

Wenn Sie auf eine solche URL zugreifen, wird nach dem Speichern des Bildes der Hintergrund entfernt und eine Funktion für den Endpunkt erstellt, die den Bildpfad und den Bildnamen zurückgibt.

@app.get('/rembg/{url:path}')
def remove_image_background(url: str):
    image_info = save_image(url) # 이미지 저장
    image_path = image_info["image_path"]
    image_name = image_info["image_name"]
    file_ext = image_info["file_ext"]
    image_name_without_ext = image_name.rsplit(file_ext, 1)[0]

    image = Image.open(image_path).convert('RGBA')
    output = remove(image)

    convert_dir_name = 'converted_images'

    # 저장 경로 없다면 생성
    if not os.path.exists(convert_dir_name):
        os.makedirs(convert_dir_name)

    out_image_path = os.path.join(convert_dir_name, f'{image_name_without_ext}_rembg.png')
    output.save(out_image_path, 'PNG')

    result = {
        "message": "The background of the image is successfully removed",
        "image_path": out_image_path,
        "image_name": image_name
    }
    return result

Ergebnis der Ausführung:

Ich habe den folgenden Bild-URL eingegeben:

notion image

Ich habe erfolgreich den Pfad des Bildes, von dem der Hintergrund entfernt wurde, und den Bildnamen erhalten.

...

(Translated text is too long. Please divide and submit separately for accurate translation)

Comments

Add Comment

Your email won't be published and will only be used for reply notifications.

Weiterlesen

Get notified of new posts

We'll email you when 해시스크래퍼 기술 블로그 publishes new content.

Your email will only be used for new post notifications.