Service API pour la Suppression de Filigranes d'Images Utilisant LaMa

Créer un service d'API REST permettant d'éliminer les filigranes des images via un appel HTTP. Le frontend transmet une image et les coordonnées du masque, le backend traite l'image avec LaMa et retourne le résultat.

Fonctionnalités Principales

  • Requêtes HTTP POST avec upload d'image et coordonnées du masque (x1, y1, x2, y2).
  • Génération automatique d'un fichier masque à partir des coordonnées.
  • Appel au modèle LaMa pour produire l'image sans filigrane.
  • Support de la concurrence via le multithreading intégré à FastAPI.
  • Renvoi de l'image traitée en réponse (fichier ou encodée en base64).

Approhce Technique Recommandée

Utiliser FastAPI pour l'interface HTTP, OpenCV pour la création du masque, et un appel subprocess pour exécuter LaMa. La concurence est gérée par les workers asynchrones de FastAPI, avec possibilité de scaling via uvicorn ou gunicorn.

Stack Technique

Composant Technologie
Interface HTTP FastAPI
Traitement d'image OpenCV (cv2)
Exécution de LaMa subprocess
Retour de données FileResponse ou encodage Base64
Déploiement uvicorn avec workers multiples

Implémentation de l'API

Voici un exemple de code pour le point d'entrée de l'API. Les chemins et noms de variables ont été ajustés pour clarifier la logique.


from fastapi import FastAPI, UploadFile, Form
from fastapi.responses import FileResponse
import cv2
import numpy as np
import os
import uuid
import subprocess

application = FastAPI()

@application.post("/remove_watermark/")
async def handle_watermark_removal(
    image_file: UploadFile,
    coord_left: int = Form(...),
    coord_top: int = Form(...),
    coord_right: int = Form(...),
    coord_bottom: int = Form(...)
):
    # Générer un identifiant unique pour éviter les conflits
    request_id = str(uuid.uuid4())
    input_image_path = f"input_data/{request_id}.png"
    mask_file_path = f"input_data/{request_id}_mask.png"
    output_result_path = f"output_data/{request_id}_processed.png"

    # Sauvegarder l'image téléchargée
    with open(input_image_path, "wb") as file_handler:
        file_handler.write(await image_file.read())

    # Lire les dimensions de l'image originale
    original_image = cv2.imread(input_image_path)
    height, width = original_image.shape[:2]

    # Créer le masque à partir des coordonnées
    mask_array = np.zeros((height, width), dtype=np.uint8)
    cv2.rectangle(mask_array, (coord_left, coord_top), (coord_right, coord_bottom), 255, thickness=-1)
    cv2.imwrite(mask_file_path, mask_array)

    # Exécuter LaMa pour le traitement
    subprocess.run([
        "python",
        "-m",
        "bin.predict",
        f"model.path={os.getcwd()}/big-lama",
        f"indir={os.getcwd()}/input_data",
        f"outdir={os.getcwd()}/output_data",
        "device=cpu"
    ], cwd="lama_project")

    # Retourner l'image traitée
    return FileResponse(output_result_path, media_type="image/png", filename="resultat.png")

Configuration et Démarrage

Installer les dépendances requises avec pip :


pip install fastapi uvicorn opencv-python python-multipart

Structure de répertoire suggérée :


lama_service/
├── main.py
├── lama_project/
├── input_data/
├── output_data/

Lancer le service avec uvicorn, en activant plusieurs workers pour la concurrence :


uvicorn main:application --host 0.0.0.0 --port 8000 --workers 4

Test de l'API

Utiliser curl pour envoyer une requête POST avec l'image et les coordonnées :


curl -X POST "http://localhost:8000/remove_watermark/" \
     -F "image_file=@input_data/exemple.png" \
     -F "coord_left=782" -F "coord_top=1272" \
     -F "coord_right=1046" -F "coord_bottom=1353" \
     --output resultat.png

Pour une gestion robuste en production, envisager le déploiement avec gunicorn, supervisor, ou dans un conteneur Docker.

Étiquettes: FastAPI LaMa OpenCV Python API

Publié le 9 juin à 18h16