not too hard
This commit is contained in:
@@ -7,6 +7,7 @@ import warnings
|
|||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
import shutil
|
import shutil
|
||||||
|
import gc
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from sam2.build_sam import build_sam2_video_predictor
|
from sam2.build_sam import build_sam2_video_predictor
|
||||||
@@ -257,11 +258,11 @@ class SAM2VideoMatting:
|
|||||||
if self.inference_state is not None:
|
if self.inference_state is not None:
|
||||||
try:
|
try:
|
||||||
# Reset SAM2 state first (critical for memory cleanup)
|
# Reset SAM2 state first (critical for memory cleanup)
|
||||||
if hasattr(self.predictor, 'reset_state'):
|
if self.predictor is not None and hasattr(self.predictor, 'reset_state'):
|
||||||
self.predictor.reset_state(self.inference_state)
|
self.predictor.reset_state(self.inference_state)
|
||||||
|
|
||||||
# Fallback to cleanup_state if available
|
# Fallback to cleanup_state if available
|
||||||
elif hasattr(self.predictor, 'cleanup_state'):
|
elif self.predictor is not None and hasattr(self.predictor, 'cleanup_state'):
|
||||||
self.predictor.cleanup_state(self.inference_state)
|
self.predictor.cleanup_state(self.inference_state)
|
||||||
|
|
||||||
# Explicitly delete inference state and video segments
|
# Explicitly delete inference state and video segments
|
||||||
@@ -275,15 +276,6 @@ class SAM2VideoMatting:
|
|||||||
finally:
|
finally:
|
||||||
self.inference_state = None
|
self.inference_state = None
|
||||||
|
|
||||||
# Explicitly delete predictor
|
|
||||||
if self.predictor is not None:
|
|
||||||
try:
|
|
||||||
del self.predictor
|
|
||||||
except Exception as e:
|
|
||||||
warnings.warn(f"Failed to delete predictor: {e}")
|
|
||||||
finally:
|
|
||||||
self.predictor = None
|
|
||||||
|
|
||||||
# Clean up temporary video file
|
# Clean up temporary video file
|
||||||
if self.temp_video_path is not None:
|
if self.temp_video_path is not None:
|
||||||
try:
|
try:
|
||||||
@@ -299,9 +291,15 @@ class SAM2VideoMatting:
|
|||||||
torch.cuda.empty_cache()
|
torch.cuda.empty_cache()
|
||||||
|
|
||||||
# Force garbage collection (critical for memory leak prevention)
|
# Force garbage collection (critical for memory leak prevention)
|
||||||
import gc
|
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
||||||
|
# Clear predictor reference (but don't delete the object itself)
|
||||||
|
self.predictor = None
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
"""Destructor to ensure cleanup"""
|
"""Destructor to ensure cleanup"""
|
||||||
|
try:
|
||||||
self.cleanup()
|
self.cleanup()
|
||||||
|
except Exception:
|
||||||
|
# Ignore errors during Python shutdown
|
||||||
|
pass
|
||||||
Reference in New Issue
Block a user