1. Liste des bibliothèques de suppression d'arrière plan d'une image
Python est doté de nombreuses bibliothèques qui permettent la suppression de l'arrière-plan d'une image. En voici une liste complète de telles bibliothèques selon différentes approches: IA, vision par ordinateur, outils spécialisés...
- rembg : Bibliothèque légère utilisant le modèle U²-Net pour une suppression d'arrière-plan rapide et efficace. Idéale pour un usage simple sans configuration.
- backgroundremover : Alternative à rembg avec outils CLI intégrés, utilisant des modèles légers pour le détourage.
- modnet : Modèle optimisé pour les portraits et les objets, avec un bon équilibre entre performance et qualité.
- OpenCV (cv2) : Permet des méthodes manuelles (GrabCut, seuillage, masques) pour des cas spécifiques. Requiert une expertise.
- scikit-image : Offre des algorithmes de segmentation (SLIC, Felzenszwalb) pour des approches semi-automatiques.
- Pillow (PIL) : Utile pour des opérations basiques de masquage et post-traitement, mais limité seul.
- PyTorch/TensorFlow : Permet d'utiliser des modèles avancés (DeepLabV3, U-Net) pour des besoins spécifiques. Requiert des compétences en ML.
- Hugging Face Transformers : Accès à des modèles comme MaskFormer ou CLIPSeg pour une segmentation sémantique haute précision.
- segment-anything (Meta AI) : Modèle polyvalent (SAM) pour la segmentation d'objets via prompts, très puissant mais gourmand en ressources.
- auto-background : Solution minimaliste pour un traitement rapide, mais moins personnalisable.
- DeepLabV3+ (via torchvision) : Modèle de segmentation sémantique pré-entraîné, efficace pour les scènes complexes.
- MediaPipe Selfie Segmentation : Modèle léger de Google pour la segmentation en temps réel (optimisé pour les vidéos).
2. La bibliothèque Rembg
2.1 Description de bibliothèque Rembg
Rembg est une bibliothèque Python open-source qui permet de supprimer les arrière-plans d'images de manière automatique et efficace. Elle utilise des modèles de deep learning pré-entraînés pour détecter et isoler le premier plan d'une image, éliminant ainsi l'arrière-plan sans nécessiter d'intervention manuelle.
2.2 Fonctionnalités principales
- Suppression d'arrière-plan : Retire l'arrière-plan des images, laissant le sujet principal (personnes, objets, etc.) avec un fond transparent (format PNG).
- Modèles pré-entraînés : Utilise des architectures comme U²-Net pour une segmentation précise.
- Facile à utiliser : Une seule ligne de code suffit pour traiter une image.
- Support multiple : Fonctionne avec des fichiers locaux, des URLs ou des données binaires.
- Personnalisable : Possibilité d'utiliser différents modèles ou de post-traiter les résultats.
2.3 Installation
1 |
pip install rembg |
Nous devons aussi installer la bibliothèque onnxruntime qui est un moteur d'inférence (inference engine) haute performance pour l'exécution de modèles au format ONNX (Open Neural Network Exchange). Il est optimisé pour déployer des modèles de machine learning (ML) et d'intelligence artificielle (IA).
1 |
pip install onnxruntime |
2.4 Utilisation de base
1 2 3 4 5 6 7 8 9 10 11 |
from rembg import remove from PIL import Image # Charger l'image input_image = Image.open("input.jpg") # Supprimer l'arrière-plan output_image = remove(input_image) # Sauvegarder le résultat output_image.save("output.png") |
3. Usage de la bibliothèque rembg
3.1 Usage basique
Dans l'usage basique de la bibliothèque rmbg Python, nous allons commencer par traiter un exemple simple de suppression d'arrière-plan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from rembg import remove from PIL import Image # Charger l'image d'entrée input_path = 'input.jpg' output_path = 'output.png' # Ouvrir l'image input_image = Image.open(input_path) # Supprimer l'arrière-plan output_image = remove(input_image) # Sauvegarder le résultat output_image.save(output_path) |
3.2 Utilisation avec des fichiers directement
La bibliothèque rembg offre aussi la possibilité de travailler directement avec des fichiers:
1 2 3 4 5 6 7 8 9 10 |
from rembg import remove input_path = 'input.jpg' output_path = 'output.png' with open(input_path, 'rb') as i: with open(output_path, 'wb') as o: input_data = i.read() output_data = remove(input_data) o.write(output_data) |
3.3 Usage avancé
3.3.1 hoix du modèle
rembg propose plusieurs modèles. Par défaut, il utilise "u2net", mais vous pouvez en choisir d'autres:
1 2 3 4 5 6 7 8 9 10 |
from rembg import remove, new_session # Liste des modèles disponibles : 'u2net', 'u2netp', 'u2net_human_seg', 'u2net_cloth_seg', 'silueta', 'isnet-general-use', 'isnet-anime' model_name = 'isnet-general-use' # Créer une session avec le modèle choisi session = new_session(model_name) # Utiliser la session personnalisée output_image = remove(input_image, session=session) |
3.3.2 Usage des paramètres supplémentaires
La fonction remove() accepte plusieurs paramètres:
python
1 2 3 4 5 6 7 8 9 |
output_image = remove( input_image, session=session, # session personnalisée only_mask=False, # retourne seulement le masque alpha_matting=False, # active l'alpha matting alpha_matting_foreground_threshold=240, alpha_matting_background_threshold=10, alpha_matting_erode_size=10 ) |
3.3.3 Usage en tant que service
rembg peut aussi être utilisé comme un service HTTP. Pour lancer le serveur:
1 |
rembg-server |
Par défaut, le serveur écoute sur http://0.0.0.0:5000. Vous pouvez ensuite envoyer des requêtes POST à ce serveur avec vos images.
Exemple complet
Voici un exemple complet avec gestion des erreurs et options avancées:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from rembg import remove, new_session from PIL import Image import os def remove_background(input_path, output_path, model='u2net'): try: # Vérifier si le fichier d'entrée existe if not os.path.exists(input_path): raise FileNotFoundError(f"Le fichier d'entrée {input_path} n'existe pas") # Charger l'image input_image = Image.open(input_path) # Initialiser la session avec le modèle choisi session = new_session(model) # Supprimer l'arrière-plan avec options avancées output_image = remove( input_image, session=session, alpha_matting=True, alpha_matting_foreground_threshold=240, alpha_matting_background_threshold=10, alpha_matting_erode_size=10 ) # Sauvegarder le résultat output_image.save(output_path) print(f"Arrière-plan supprimé avec succès. Résultat sauvegardé dans {output_path}") except Exception as e: print(f"Une erreur est survenue : {str(e)}") # Utilisation remove_background('input.jpg', 'output.png', model='isnet-general-use') |
3.3.4 Bonnes pratiques pour un usage correcte
- Format de sortie : Utilisez PNG pour préserver la transparence plutôt que JPEG.
- Performance : Pour traiter plusieurs images, réutilisez la même session.
- Modèles :
- 'u2net' : modèle général (bon équilibre)
- 'u2netp' : version plus légère de u2net
- 'u2net_human_seg' : spécialisé pour les personnes
- 'isnet-general-use' : très performant pour les objets généraux
- GPU : Si disponible, utilisez un GPU pour accélérer le traitement.
4. Traitement par lots, Intégration avec opencv
4.1 Traitement par lots
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
from rembg import remove, new_session from PIL import Image import os input_folder = 'input_images' output_folder = 'output_images' model = 'isnet-general-use' # Créer le dossier de sortie s'il n'existe pas os.makedirs(output_folder, exist_ok=True) # Initialiser la session une seule fois session = new_session(model) # Traiter toutes les images du dossier d'entrée for filename in os.listdir(input_folder): if filename.lower().endswith(('.png', '.jpg', '.jpeg')): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, os.path.splitext(filename)[0] + '.png') try: with Image.open(input_path) as img: output = remove(img, session=session) output.save(output_path) print(f"Traité : {filename}") except Exception as e: print(f"Erreur avec {filename}: {str(e)}") |
4.2 Intégration avec OpenCV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from rembg import remove import cv2 import numpy as np # Charger l'image avec OpenCV input_image = cv2.imread('input.jpg') # Convertir de BGR (OpenCV) à RGB (PIL) image_rgb = cv2.cvtColor(input_image, cv2.COLOR_BGR2RGB) # Supprimer l'arrière-plan output = remove(image_rgb) # Convertir en tableau numpy output_array = np.array(output) # Convertir de RGBA à BGRA pour OpenCV output_bgra = cv2.cvtColor(output_array, cv2.COLOR_RGBA2BGRA) # Sauvegarder le résultat cv2.imwrite('output.png', output_bgra) |
Younes Derfoufi
CRMEF OUJDA