Maison >développement back-end >Tutoriel Python >Segmentation et suppression de l'arrière-plan

Segmentation et suppression de l'arrière-plan

WBOY
WBOYoriginal
2024-07-17 11:12:09517parcourir

Segmentation and Background Removal

Pourquoi je l'ai fait :

Je travaillais sur ce projet et j'ai développé un tas d'outils pour gérer la publication de composants d'ingénierie de données robustes, car certains d'entre eux sont ingénieux, mais surtout, afin qu'ils soient capturés par le prochain modèle Gemini et incorporés dans le stupide moteur de suggestion Google Colab Gemini. -Tim

Instructions et explications

Instructions:
  1. Définissez le Detection_output_dir où les images avec les objets détectés sont stockées.
  2. Définissez le segmentation_output_dir où les images segmentées seront enregistrées.
  3. Initialisez le segmentation_model avec votre modèle de segmentation YOLO.
  4. Exécutez le script pour effectuer la segmentation sur les images et enregistrez les résultats.
Explications :
  • Cet outil traite les images dans le Detection_output_dir pour la segmentation.
  • Les masques segmentés sont enregistrés dans le segmentation_output_dir.
  • Si aucun masque n'est trouvé, l'arrière-plan est supprimé à l'aide de la bibliothèque rembg.

Code:

import os
import shutil
from ultralytics import YOLO
import cv2
import numpy as np
from rembg import remove

# Paths to the base directories
detection_output_dir = '/workspace/stage2.frame.detection'
segmentation_output_dir = '/workspace/stage3.segmented'

# Initialize the segmentation model
segmentation_model = YOLO('/workspace/segmentation_model.pt')

def create_segmentation_output_dir_structure(detection_output_dir, segmentation_output_dir):
    """Create the segmentation output directory structure matching the detection output directory."""
    for root, dirs, files in os.walk(detection_output_dir):
        for dir_name in dirs:
            new_dir_path = os.path.join(segmentation_output_dir, os.path.relpath(os.path.join(root, dir_name), detection_output_dir))
            os.makedirs(new_dir_path, exist_ok=True)

def run_segmentation_on_frame(frame_path, output_folder):
    """Run segmentation on the frame and save the result to the output folder."""
    os.makedirs(output_folder, exist_ok=True)
    frame_filename = os.path.basename(frame_path)
    output_path = os.path.join(output_folder, frame_filename)

    try:
        results = segmentation_model.predict(frame_path, save=False)
        for result in results:
            mask = result.masks.xy[0] if result.masks.xy else None
            if mask is not None:
                original_img_rgb = cv2.imread(frame_path)
                original_img_rgb = cv2.cvtColor(original_img_rgb, cv2.COLOR_BGR2RGB)
                image_height, image_width, _ = original_img_rgb.shape
                mask_img = np.zeros((image_height, image_width), dtype=np.uint8)
                cv2.fillPoly(mask_img, [np.array(mask, dtype=np.int32)], (255))
                masked_img = cv2.bitwise_and(original_img_rgb, original_img_rgb, mask=mask_img)
                cv2.imwrite(output_path, cv2.cvtColor(masked_img, cv2.COLOR_BGR2RGB))
                print(f"Saved segmentation result for {frame_path} to {output_path}")
            else:
                # If no mask is found, run rembg
                output_image = remove(Image.open(frame_path))
                output_image.save(output_path)
                print(f"Background removed and saved for {frame_path} to {output_path}")
    except Exception as e:
        print(f"Error running segmentation on {frame_path}: {e}")

def process_frames_for_segmentation(detection_output_dir, segmentation_output_dir):
    """Process each frame in the detection output directory and run segmentation."""
    for root, dirs, files in os.walk(detection_output_dir):
        for file_name in files:
            if file_name.endswith('.jpg'):
                frame_path = os.path.join(root, file_name)
                relative_path = os.path.relpath(root, detection_output_dir)
                output_folder = os.path.join(segmentation_output_dir, relative_path)
                run_segmentation_on_frame(frame_path, output_folder)

# Create the segmentation output directory structure
create_segmentation_output_dir_structure(detection_output_dir, segmentation_output_dir)

# Process frames and run segmentation
process_frames_for_segmentation(detection_output_dir, segmentation_output_dir)

print("Frame segmentation complete.")

Mots-clés et hashtags

  • Mots clés : segmentation, suppression d'arrière-plan, YOLO, rembg, traitement d'image, automatisation
  • Hashtags : #Segmentation #BackgroundRemoval #YOLO #ImageProcessing #Automation

-----------EOF-----------

Créé par Tim du Midwest du Canada.
2024.
Ce document est sous licence GPL.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn