Guide de segmentation d'image pour Python

La tâche "Segmenteur d'images MediaPipe" vous permet de diviser les images en régions en fonction d'éléments prédéfinis pour appliquer des effets visuels comme le floutage de l'arrière-plan. Ces vous expliquent comment utiliser le segmenteur d'images avec le langage Python. Pour plus d'informations sur les fonctionnalités, les modèles et les options de configuration cette tâche, consultez la section Présentation.

Exemple de code

L'exemple de code pour le segment d'image fournit une implémentation complète de ce dans Python à titre de référence. Ce code vous aide à tester cette tâche et à obtenir vous avez commencé à créer votre propre application de segmentation d'images. Vous pouvez afficher, exécuter modifier le segmenteur d'image exemple de code en utilisant uniquement votre navigateur Web.

Configuration

Cette section décrit les étapes clés à suivre pour configurer votre environnement de développement spécifiques pour utiliser le segmenteur d'images. Pour obtenir des informations générales sur configurer votre environnement de développement pour utiliser les tâches MediaPipe, y compris versions de la plate-forme requises, consultez la Guide de configuration pour Python Vous pouvez consulter le code source de cet exemple sur GitHub

<ph type="x-smartling-placeholder">

Colis

La tâche MediaPipe Image Segmenter nécessite le package mediapipe. Vous pouvez installer les dépendances requises à l'aide de la commande suivante:

$ python -m pip install mediapipe

Importations

Importez les classes suivantes pour accéder aux fonctions de la tâche "Segmenteur d'images" :

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

Modèle

La tâche MediaPipe Image Segmenter nécessite un modèle entraîné et compatible avec tâche. Pour en savoir plus sur les modèles entraînés disponibles pour le segmenteur d'images, consultez la section Modèles de la présentation des tâches.

Sélectionnez et téléchargez le modèle, puis stockez-le dans le répertoire de votre projet:

model_path = '/absolute/path/to/model.tflite'

Spécifiez le chemin d'accès du modèle dans le paramètre "Nom du modèle", comme indiqué ci-dessous:

base_options = BaseOptions(model_asset_path=model_path)

Créer la tâche

La tâche "Segmenteur d'images MediaPipe" utilise la fonction create_from_options pour : configurer la tâche. La fonction create_from_options accepte les valeurs pour les options de configuration à gérer. Pour en savoir plus sur la configuration des tâches, consultez la section Options de configuration.

Ces exemples montrent également les variantes de la construction de la tâche pour les images, des fichiers vidéo et des flux vidéo en direct.

Image

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

Vidéo

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the video mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

Diffusion en direct

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the live stream mode:
def print_result(result: List[Image], output_image: Image, timestamp_ms: int):
    print('segmented masks size: {}'.format(len(result)))

options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
    

Options de configuration

Cette tâche comporte les options de configuration suivantes pour les applications Python:

Nom de l'option Description Plage de valeurs Valeur par défaut
running_mode Définit le mode d'exécution de la tâche. Il y en a trois modes:

IMAGE: mode utilisé pour la saisie d'une seule image.

VIDEO: mode des images décodées d'une vidéo.

LIVE_STREAM: mode d'une diffusion en direct des entrées provenant d'un appareil photo, par exemple. Dans ce mode, resultListener doit être appelé pour configurer un écouteur afin de recevoir les résultats ; de manière asynchrone.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask Si la valeur est True, le résultat inclut un masque de segmentation. en tant qu'image uint8, où chaque valeur de pixel indique la catégorie gagnante . {True, False} False
output_confidence_masks Si la valeur est True, le résultat inclut un masque de segmentation. en tant qu'image d'une valeur flottante, où chaque valeur flottante représente le niveau de confiance tableau des scores de la catégorie. {True, False} True
display_names_locale Définit la langue des libellés à utiliser pour les noms à afficher fournis dans les les métadonnées du modèle de la tâche, le cas échéant. La valeur par défaut est en pour anglais. Vous pouvez ajouter des libellés localisés aux métadonnées d'un modèle personnalisé à l'aide de l'API TensorFlow Lite Metadata Writer ; Code des paramètres régionaux en
result_callback Définit l'écouteur des résultats pour qu'il reçoive les résultats de la segmentation. de manière asynchrone lorsque le segmenteur d'images est en mode LIVE_STREAM. Ne peut être utilisé que lorsque le mode d'exécution est défini sur LIVE_STREAM N/A N/A

Préparer les données

Préparez votre entrée sous forme de fichier image ou de tableau Numpy. puis le convertir en objet mediapipe.Image. Si votre entrée est un fichier vidéo ou une diffusion en direct depuis une webcam, vous pouvez utiliser une bibliothèque externe telle que OpenCV pour charger vos frames d'entrée au format Numpy ; tableaux.

Image

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

Vidéo

# Use OpenCV’s VideoCapture to load the input video.
# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You need the frame rate to calculate the timestamp for each frame.
# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Diffusion en direct

# Use OpenCV’s VideoCapture to start capturing from the webcam.
# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Pour obtenir un exemple de code illustrant la préparation des données pour le segmenteur d'images, consultez la exemple de code.

Exécuter la tâche

L'outil de segmentation d'images utilise les éléments segment, segment_for_video et segment_async. pour déclencher des inférences. Pour la segmentation d'image, cela implique prétraitement des données d'entrée, exécution du modèle de segmentation et post-traitement les sorties du modèle brut vers les masques segmentés.

Les exemples de code suivants montrent comment exécuter un traitement avec le modèle de tâche.

Image

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
segmented_masks = segmenter.segment(mp_image)
    

Vidéo

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the video mode.
segmented_masks = segmenter.segment_for_video(mp_image, frame_timestamp_ms)
    

Diffusion en direct

# Send live image data to perform image segmentation.
# The results are accessible via the `result_callback` provided in
# the `ImageSegmenterOptions` object.
# The image segmenter must be created with the live stream mode.
segmenter.segment_async(mp_image, frame_timestamp_ms)
    

Veuillez noter les points suivants :

  • Lorsque vous êtes en mode vidéo ou flux en direct, vous devez également fournir à la tâche de segmentation d'image le code temporel de la trame d'entrée.
  • Lors de son exécution dans le modèle d'image ou de vidéo, la tâche "Segmenteur d'images" bloquer le thread actuel jusqu'à ce qu'il ait fini de traiter l'image d'entrée ou cadre.

Pour obtenir un exemple plus complet d'exécution d'inférences de segment d'image, consultez exemple de code.

Gérer et afficher les résultats

Le segmenteur d'image génère une liste de données Image. Si output_type est CATEGORY_MASK, la sortie est une liste contenant un seul masque segmenté en tant qu'image uint8. Le pixel indique index de catégorie reconnue de l'image d'entrée. Si output_type correspond à CONFIDENCE_MASK, la sortie est un vecteur avec une taille du numéro de catégorie. Chaque masque segmenté est une image flottante dans la plage [0,1], qui représente le score de confiance du pixel appartenant à la catégorie.

Les sections suivantes présentent des exemples de données de sortie de cette tâche:

Confiance dans la catégorie

Les images suivantes illustrent le résultat des tâches pour une catégorie de confiance. Le résultat du masque de confiance contient des valeurs flottantes entre [0, 1]

Sortie du masque de confiance des images et catégories d'origine. Image source de la Pascal VOC 2012 ensemble de données.

Valeur de la catégorie

Les images suivantes illustrent le résultat des tâches pour une catégorie de valeur. La plage de masques de catégorie est [0, 255], et chaque valeur de pixel représente l'indice de la catégorie d'annonces gagnantes pour la sortie du modèle. Catégorie gagnante est le score le plus élevé parmi toutes les catégories reconnues par le modèle.

Sortie du masque d'image d'origine et de catégorie. Image source de la Pascal VOC 2012 ensemble de données.