try: from .abdomen_yolo import AbdominalAcupointsDetector as YoloDetector from .abdomen_manual import AbdominalAcupointsDetector as ManualDetector from .config import Config except ImportError: from abdomen_yolo import AbdominalAcupointsDetector as YoloDetector from abdomen_manual import AbdominalAcupointsDetector as ManualDetector from config import Config import os class AbdomenDetector: """腹部穴位检测器,整合了YOLO自动检测和手动标注两种方法""" def __init__(self): """ 初始化检测器,同时加载YOLO模型和手动检测器 """ self.yolo = YoloDetector() self.manual = ManualDetector() def detect_by_yolo(self, image_path, output_path=None): """ 使用YOLO模型进行自动检测 参数: image_path (str): 输入图片路径 output_path (str, optional): 输出图片路径,如果不指定则自动生成 返回: dict: 包含穴位坐标的字典 {"穴位名称": (x, y), ...} """ if output_path is None: # 从输入图片名生成输出图片名 base_name = os.path.basename(image_path) name, ext = os.path.splitext(base_name) output_path = Config.get_output_path(f"{name}_yolo{ext}") return self.yolo.process_image(image_path, output_path) def detect_by_manual(self, image_path, json_data, output_path=None): """ 使用手动标注数据进行检测 参数: image_path (str): 输入图片路径 json_data (dict): 包含腹部顶点、脐点和尺寸信息的JSON数据 output_path (str, optional): 输出图片路径,如果不指定则自动生成 返回: dict: 包含穴位坐标的字典 {"穴位名称": (x, y), ...} """ if output_path is None: # 从输入图片名生成输出图片名 base_name = os.path.basename(image_path) name, ext = os.path.splitext(base_name) output_path = Config.get_output_path(f"{name}_manual{ext}") self.manual.load_data(json_data) return self.manual.process_image(image_path, output_path) if __name__ == "__main__": # 示例用法 sample_json = { "shapes": [ { "label": "fubu", "points": [ [278, 241], [400, 255], [396, 301], [262, 294] ], "shape_type": "polygon" }, { "label": "duqiyan", "points": [[341, 276]], "shape_type": "point" } ] } # 创建检测器实例 detector = AbdomenDetector() # 测试图片路径 test_image = Config.get_image_path("color.png") # YOLO检测示例 yolo_results = detector.detect_by_yolo(test_image) print("YOLO Result:") print(yolo_results) # 手动标注检测示例 manual_results = detector.detect_by_manual(test_image, sample_json) print("\nManully checked results") print(manual_results)