| 
									
										
										
										
											2025-09-23 14:10:16 +01:00
										 |  |  | try: | 
					
						
							|  |  |  |     from rembg import remove | 
					
						
							|  |  |  |     REMBG_AVAILABLE = True | 
					
						
							|  |  |  | except ImportError as e: | 
					
						
							|  |  |  |     print(f"Warning: rembg not available: {e}") | 
					
						
							|  |  |  |     REMBG_AVAILABLE = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import onnxruntime as ort | 
					
						
							|  |  |  |     ONNX_AVAILABLE = True | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     ONNX_AVAILABLE = False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-23 13:42:21 +01:00
										 |  |  | from PIL import Image | 
					
						
							|  |  |  | from tqdm import tqdm | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | from concurrent.futures import ThreadPoolExecutor | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def process_images_in_batch(batch, directory, use_gpu): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Process a batch of images: remove their backgrounds and save the results. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Args: | 
					
						
							|  |  |  |     batch (list): List of filenames to process (without path or extension). | 
					
						
							|  |  |  |     directory (str): Base directory to locate input files. | 
					
						
							|  |  |  |     use_gpu (bool): Whether to enable GPU support. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Returns: | 
					
						
							|  |  |  |     int: Number of images successfully processed in this batch. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2025-09-23 14:10:16 +01:00
										 |  |  |     if not REMBG_AVAILABLE: | 
					
						
							|  |  |  |         return 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-23 13:42:21 +01:00
										 |  |  |     success_count = 0 | 
					
						
							|  |  |  |     for filename in batch: | 
					
						
							|  |  |  |         input_path = os.path.join(directory, f"{filename}.png") | 
					
						
							|  |  |  |         output_path = os.path.join(directory, f"{filename}.png") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             with Image.open(input_path) as img: | 
					
						
							|  |  |  |                 # Initialize ONNX session options with GPU support if required | 
					
						
							| 
									
										
										
										
											2025-09-23 14:10:16 +01:00
										 |  |  |                 if ONNX_AVAILABLE: | 
					
						
							|  |  |  |                     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) | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     # Fallback to CPU-only processing | 
					
						
							|  |  |  |                     output = remove(img) | 
					
						
							| 
									
										
										
										
											2025-09-23 13:42:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 output.save(output_path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             success_count += 1 | 
					
						
							|  |  |  |         except Exception as e: | 
					
						
							|  |  |  |             print(f"Error processing {input_path}: {str(e)}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return success_count | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def remove_bg_from_file_list(directory, filenames, max_workers=2, batch_size=2, use_gpu=False): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Process a list of specified filenames: remove their backgrounds and save the results. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Args: | 
					
						
							|  |  |  |     directory (str): Path to the directory containing images. | 
					
						
							|  |  |  |     filenames (list): List of filenames (without path or extension) to process. | 
					
						
							|  |  |  |     max_workers (int): Maximum number of threads to use for parallel processing. | 
					
						
							|  |  |  |     batch_size (int): Number of images to process per batch. | 
					
						
							|  |  |  |     use_gpu (bool): Whether to enable GPU support. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Returns: | 
					
						
							|  |  |  |     int: The number of images successfully processed. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2025-09-23 14:10:16 +01:00
										 |  |  |     if not REMBG_AVAILABLE: | 
					
						
							|  |  |  |         print("Background removal not available (rembg not installed). Skipping background removal.") | 
					
						
							|  |  |  |         return 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-23 13:42:21 +01:00
										 |  |  |     processed_count = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Divide filenames into batches | 
					
						
							|  |  |  |     batches = [filenames[i:i + batch_size] for i in range(0, len(filenames), batch_size)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with ThreadPoolExecutor(max_workers=max_workers) as executor: | 
					
						
							|  |  |  |         with tqdm(total=len(filenames), desc="Removing Backgrounds", unit="image") as pbar: | 
					
						
							|  |  |  |             futures = { | 
					
						
							|  |  |  |                 executor.submit(process_images_in_batch, batch, directory, use_gpu): batch | 
					
						
							|  |  |  |                 for batch in batches | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for future in futures: | 
					
						
							|  |  |  |                 processed_count += future.result() | 
					
						
							|  |  |  |                 pbar.update(len(futures[future])) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-16 15:56:39 +00:00
										 |  |  |     return processed_count |