|
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 torch.serialization |
|
from torch.serialization import safe_globals |
|
import pathlib |
|
import sys |
|
import os |
|
from myutils.respath import resource_path |
|
from yolov5.models.yolo import DetectionModel |
|
|
|
|
|
torch.serialization.add_safe_globals([DetectionModel]) |
|
|
|
|
|
self._safe_ctx = safe_globals([DetectionModel]) |
|
|
|
|
|
if sys.stderr is None: |
|
sys.stderr = open(os.devnull, 'w') |
|
|
|
|
|
is_windows = (sys.platform == "win32") |
|
|
|
|
|
with getattr(self, '_safe_ctx', dummy_context()): |
|
if is_windows: |
|
|
|
temp = pathlib.PosixPath |
|
pathlib.PosixPath = pathlib.WindowsPath |
|
try: |
|
|
|
self.model = torch.hub.load( |
|
'ultralytics/yolov5', 'custom', |
|
path=resource_path('ai-models/2024-11-00/best.pt'), |
|
force_reload=True |
|
) |
|
finally: |
|
|
|
pathlib.PosixPath = temp |
|
else: |
|
|
|
self.model = torch.hub.load( |
|
'ultralytics/yolov5', 'custom', |
|
path=resource_path('ai-models/2024-11-00/best.pt'), |
|
force_reload=True |
|
) |
|
|
|
def __call__(self, *args, **kwds): |
|
if self.model is None: |
|
self.__load() |
|
return self.model(*args, **kwds) |
|
|
|
|
|
from contextlib import contextmanager |
|
@contextmanager |
|
def dummy_context(): |
|
yield |
|
|
|
model = Model() |
|
|