import os import folder_paths from . import subcore from . import utils import logging def update_model_paths(model_path): utils.add_folder_path_and_extensions("ultralytics_bbox", [os.path.join(model_path, "ultralytics", "bbox")], folder_paths.supported_pt_extensions) utils.add_folder_path_and_extensions("ultralytics_segm", [os.path.join(model_path, "ultralytics", "segm")], folder_paths.supported_pt_extensions) utils.add_folder_path_and_extensions("ultralytics", [os.path.join(model_path, "ultralytics")], folder_paths.supported_pt_extensions) logging.info(f'[Impact Subpack] ultralytics_bbox: {", ".join(folder_paths.folder_names_and_paths["ultralytics_bbox"][0])}') logging.info(f'[Impact Subpack] ultralytics_segm: {", ".join(folder_paths.folder_names_and_paths["ultralytics_segm"][0])}') update_model_paths(folder_paths.models_dir) if 'download_model_base' in folder_paths.folder_names_and_paths: update_model_paths(folder_paths.get_folder_paths('download_model_base')[0]) class UltralyticsDetectorProvider: @classmethod def INPUT_TYPES(s): bboxs = ["bbox/"+x for x in folder_paths.get_filename_list("ultralytics_bbox")] segms = ["segm/"+x for x in folder_paths.get_filename_list("ultralytics_segm")] return {"required": {"model_name": (bboxs + segms, )}} RETURN_TYPES = ("BBOX_DETECTOR", "SEGM_DETECTOR") FUNCTION = "doit" CATEGORY = "ImpactPack" def doit(self, model_name): model_path = folder_paths.get_full_path("ultralytics", model_name) if model_path is None: if model_name.startswith('bbox/'): model_path = folder_paths.get_full_path("ultralytics_bbox", model_name[5:]) elif model_name.startswith('segm/'): model_path = folder_paths.get_full_path("ultralytics_segm", model_name[5:]) if model_path is None: logging.error(f"[Impact Subpack] model file '{model_name}' is not found in one of the following directories:") cands = [] cands.extend(folder_paths.get_folder_paths("ultralytics")) if model_name.startswith('bbox/'): cands.extend(folder_paths.get_folder_paths("ultralytics_bbox")) elif model_name.startswith('segm/'): cands.extend(folder_paths.get_folder_paths("ultralytics_segm")) formatted_cands = "\n\t".join(cands) logging.error(f'\t{formatted_cands}\n') raise ValueError(f"[Impact Subpack] model file '{model_name}' is not found.") model = subcore.load_yolo(model_path) if model_name.startswith("bbox"): return subcore.UltraBBoxDetector(model), subcore.NO_SEGM_DETECTOR() else: return subcore.UltraBBoxDetector(model), subcore.UltraSegmDetector(model) NODE_CLASS_MAPPINGS = { "UltralyticsDetectorProvider": UltralyticsDetectorProvider } NODE_DISPLAY_NAME_MAPPINGS = { }