class Model: | |
def __init__(self): | |
self.model = None | |
self.imported = False | |
def load(self): | |
if self.model is None: | |
self.__load() | |
def __load(self): | |
if not self.imported: | |
self.imported = True | |
import torch | |
import pathlib | |
import sys | |
import os | |
from myutils.respath import resource_path | |
# Redirect sys.stderr to a file or a valid stream | |
if sys.stderr is None: | |
sys.stderr = open(os.devnull, 'w') | |
# Check if the current operating system is Windows | |
is_windows = (sys.platform == "win32") | |
if is_windows: | |
# If on Windows, apply the patch temporarily | |
temp = pathlib.PosixPath | |
pathlib.PosixPath = pathlib.WindowsPath | |
try: | |
# Load the model with the patch applied | |
self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=resource_path('ai-models/2024-11-00/best.pt')) | |
finally: | |
# CRITICAL: Always restore the original class, even if loading fails | |
pathlib.PosixPath = temp | |
else: | |
# If on Linux, macOS, or other systems, load the model directly | |
self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=resource_path('ai-models/2024-11-00/best.pt')) | |
def __call__(self, *args, **kwds): | |
if self.model is None: | |
self.__load() | |
return self.model(*args, **kwds) | |
model = Model() | |