Création d'une API pour supprimer l'arrière-plan et extraire les couleurs des photos en utilisant FastAPI, rembg et extcolors.

Création d'une API pour supprimer l'arrière-plan et extraire les couleurs des photos en utilisant FastAPI, rembg et extcolors. Le post aborde le traitement d'images, la structure de base de FastAPI, l'exécution du serveur uvicorn, la création d'API, etc.

4
Création d'une API pour supprimer l'arrière-plan et extraire les couleurs des photos en utilisant FastAPI, rembg et extcolors.

0. Introduction

J'ai préparé des publications pour les développeurs intéressés par le traitement d'images numériques ou ceux qui doivent traiter des images dans des projets réels.

Supprimer l'arrière-plan d'une photo ou extraire les couleurs principales sont des techniques largement utilisées dans divers domaines tels que l'art numérique, le développement web, les applications mobiles, les projets de machine learning, etc.

Bien que cela puisse sembler nécessiter des algorithmes complexes ou des compétences techniques avancées, en réalité, c'est une tâche très simple.

En utilisant les bibliothèques Python FastAPI, rembg et extcolors, vous pouvez facilement créer une API pour effectuer ces tâches et l'utiliser dans diverses applications. Dans ce post, je vous guiderai étape par étape sur la façon de combiner ces trois outils pour construire une API de traitement d'images puissante.

1. Mise en place de la structure de base de FastAPI

1.1. Installation des packages nécessaires

Installez fastapi et uvicorn pour exécuter FastAPI.

pip install fastapi
pip install uvicorn

1.2. Affichage du "Hello world"

Écrivez le code suivant dans main.py:

# 패키지 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)

Nous allons définir l'hôte comme '0.0.0.0' et le port comme 5000.

1.3. Démarrage du serveur uvicorn

Entrez ce qui suit dans votre terminal:

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

Le serveur uvicorn est en cours d'exécution sur http://127.0.0.1:8000!

image notion

Vous pouvez vérifier que la valeur de retour est correcte lorsque vous accédez à la page racine.

2. Création de l'API de suppression de l'arrière-plan et d'extraction des couleurs

2.1. Installation des packages nécessaires

Installez les packages nécessaires pour créer l'API:

pip install image
pip install rembg
pip install extcolors

Importez comme suit:

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

2.2. Fonction d'aide pour enregistrer l'image

Commençons par créer une fonction d'aide qui prend une URL d'image et enregistre le fichier image.

Les balises <img> en HTML ont un attribut src, et cette fonction y accède pour récupérer l'image.

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. Fonction d'aide pour convertir RGB en hex

image notion

Il existe plusieurs façons d'afficher les couleurs, mais dans cette API, nous extrayons les couleurs pour fournir les informations RGB et HEX.

Créez une fonction d'aide pour extraire les couleurs de l'image en RGB et les convertir en HEX.

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. Fonction de point de terminaison pour la suppression de l'arrière-plan

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

Lorsque vous accédez à cette URL, une fonction de point de terminaison est créée pour enregistrer l'image, supprimer l'arrière-plan et renvoyer le chemin de l'image et son nom.

@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

Résultat de l'exécution:

Nous avons utilisé l'URL de l'image suivante pour l'exécution:

image notion

Nous avons reçu avec succès le chemin de l'image où l'arrière-plan a été supprimé et son nom.

...

(Le reste du texte a été tronqué en raison de la limite de caractères. Veuillez poursuivre la traduction à partir de là.)

Comments

Add Comment

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

Continuer la lecture

Get notified of new posts

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

Your email will only be used for new post notifications.