| 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() |
|
|