comfy_fm24_newgens/lib/remove_bg.py

78 lines
2.9 KiB
Python
Raw Normal View History

2024-12-13 12:06:05 +00:00
from rembg import remove
from PIL import Image
from tqdm import tqdm
2024-12-14 08:11:27 +00:00
import os
2024-12-13 16:43:45 +00:00
from concurrent.futures import ThreadPoolExecutor
2024-12-13 12:06:05 +00:00
2024-12-14 08:11:27 +00:00
import onnxruntime as ort
2024-12-14 15:49:36 +00:00
def process_images_in_batch(batch, use_gpu):
2024-12-13 12:06:05 +00:00
"""
2024-12-14 08:11:27 +00:00
Process a batch of images: remove their backgrounds and save the results.
2024-12-13 16:43:45 +00:00
Args:
2024-12-14 08:11:27 +00:00
batch (list): List of tuples (input_path, output_path).
2024-12-14 15:49:36 +00:00
use_gpu (bool): Whether to enable GPU support.
2024-12-14 08:11:27 +00:00
2024-12-13 16:43:45 +00:00
Returns:
2024-12-14 08:11:27 +00:00
int: Number of images successfully processed in this batch.
2024-12-13 16:43:45 +00:00
"""
2024-12-14 08:11:27 +00:00
success_count = 0
for input_path, output_path in batch:
try:
with Image.open(input_path) as img:
2024-12-14 15:49:36 +00:00
# Initialize ONNX session options with GPU support if required
session_options = ort.SessionOptions()
providers = ["CUDAExecutionProvider"] if use_gpu else ["CPUExecutionProvider"]
ort.set_default_logger_severity(3) # Suppress non-critical logging
# Initialize the rembg remove function with appropriate providers
output = remove(img, session_options=session_options, providers=providers)
2024-12-14 08:11:27 +00:00
output.save(output_path)
success_count += 1
except Exception as e:
print(f"Error processing {input_path}: {str(e)}")
return success_count
2024-12-14 15:49:36 +00:00
def remove_bg_from_files_in_dir(directory, max_workers=2, batch_size=3, use_gpu=False):
2024-12-13 16:43:45 +00:00
"""
2024-12-14 08:11:27 +00:00
Process all JPG, JPEG, and PNG images in the given directory and its subfolders using parallel processing and GPU.
2024-12-13 12:06:05 +00:00
Args:
directory (str): Path to the directory containing images.
2024-12-13 16:43:45 +00:00
max_workers (int): Maximum number of threads to use for parallel processing.
2024-12-14 08:11:27 +00:00
batch_size (int): Number of images to process per batch.
2024-12-14 15:49:36 +00:00
use_gpu (bool): Whether to enable GPU support.
2024-12-14 08:11:27 +00:00
2024-12-13 12:06:05 +00:00
Returns:
int: The number of images successfully processed.
"""
2024-12-13 16:43:45 +00:00
files_to_process = []
# Gather all the image files to process
for subdir, dirs, files in os.walk(directory):
for file in files:
2024-12-14 08:11:27 +00:00
if file.lower().endswith(('.jpg', '.jpeg', '.png')):
2024-12-13 16:43:45 +00:00
input_path = os.path.join(subdir, file)
output_filename = os.path.splitext(file)[0] + '.png'
output_path = os.path.join(subdir, output_filename)
files_to_process.append((input_path, output_path))
2024-12-14 08:11:27 +00:00
processed_count = 0
# Divide files into batches
batches = [files_to_process[i:i + batch_size] for i in range(0, len(files_to_process), batch_size)]
2024-12-13 16:43:45 +00:00
with ThreadPoolExecutor(max_workers=max_workers) as executor:
2024-12-14 15:49:36 +00:00
with tqdm(total=len(files_to_process), desc="Removing Backgrounds", unit="image") as pbar:
futures = {
executor.submit(process_images_in_batch, batch, use_gpu): batch
for batch in batches
}
2024-12-13 16:43:45 +00:00
for future in futures:
2024-12-14 08:11:27 +00:00
processed_count += future.result()
pbar.update(len(futures[future]))
2024-12-13 16:43:45 +00:00
return processed_count