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.