
    ciEE                     f    d Z ddlmZmZmZmZmZ ddlZddlZddl	Z	ddl
Z
 G d d      Z e       Zy)u9   
检测器注册中心
管理所有已注册的检测器
    )DictTypeOptionalListAnyNc                       e Zd ZdZdZdZ fdZd Zddede	fdZ
d	ed
ee   fdZd d	ede	d
ee   fdZd
eeef   fdZd	ed
ee   fdZd	efdZd Zd	ed
eeef   fdZ	 d!d	ededeeef   d
eeef   fdZd Zd Zd!d	eded
eeef   fdZdd	ede	d
eeef   fdZd	edeeef   d
e	fdZ	 	 d"d	ededeeef   d
e	fdZd	ed
eeef   fdZ xZS )#DetectorRegistryu   检测器注册中心NFc                 d    | j                   t        t        |   |       | _         | j                   S )u   单例模式)	_instancesuperr	   __new__)cls	__class__s    ;   D:\pyccd\极耳翻折-拆分\detectors\detector_registry.pyr   zDetectorRegistry.__new__   s+    == !"2C@ECM}}    c                     | j                   sTi | _        i | _        t        j                  t
              | _        i | _        t        j                         | _
        d| _         yy)u   初始化注册中心TN)_initialized	detectorsdetector_instanceslogging	getLogger__name__loggerparams_cache	threadingLock
cache_lockselfs    r   __init__zDetectorRegistry.__init__   sQ      .0DN9;D#!++H5DK <>D'nn.DO $D !r   detector_class	overwritec                    ddl m} t        ||      st        d|        |       }|j                  }|| j
                  v r|st        d| d      || j
                  |<   | j                  j                  d|        y)u   
        注册检测器类
        
        Args:
            detector_class: 检测器类，必须继承BaseDetector
            overwrite: 是否覆盖已存在的检测器
           )BaseDetectoru&   检测器类必须继承BaseDetector: u   检测器已存在: u    ，使用overwrite=True来覆盖u   注册检测器: N)base_detectorr%   
issubclass
ValueErrornamer   r   info)r   r!   r"   r%   temp_instancedetector_names         r   registerzDetectorRegistry.register&   s     	0.,7EnEUVWW '(%**DNN*93M?Bbcdd(6}%,]O<=r   r,   returnc                     || j                   vr| j                  j                  d|        y	 | j                   |   } ||i |}|S # t        $ r+}| j                  j                  d| d|        Y d}~yd}~ww xY w)u  
        创建检测器实例
        
        Args:
            detector_name: 检测器名称
            *args, **kwargs: 传递给检测器构造函数的参数
            
        Returns:
            检测器实例，如果不存在则返回None
        u   未找到检测器: Nu   创建检测器实例失败 : )r   r   error	Exception)r   r,   argskwargsr!   instancees          r   create_detectorz DetectorRegistry.create_detector=   s     .KK 4]ODE	!^^M:N%t6v6HO 	KK <]O2aSQR	s   A 	A<!A77A<create_if_not_existsc                     || j                   v r| j                   |   S |r$| j                  |      }|r|| j                   |<   |S y)u  
        获取检测器实例（单例模式）
        
        Args:
            detector_name: 检测器名称
            create_if_not_exists: 如果实例不存在是否创建
            
        Returns:
            检测器实例，如果不存在则返回None
        N)r   r7   )r   r,   r8   r5   s       r   get_detectorzDetectorRegistry.get_detectorT   sQ     D333**=99++M:H9A''6Or   c                 6    | j                   j                         S )u~   
        获取所有已注册的检测器
        
        Returns:
            检测器名称到类的映射字典
        r   copyr   s    r   list_detectorszDetectorRegistry.list_detectorsj        ~~""$$r   c                 $   | j                  |d      }|r|j                         S || j                  v r&	 | j                  |      }|r|j                         S 	 yy# t        $ r+}| j
                  j                  d| d|        Y d}~yd}~ww xY w)u   
        获取检测器信息
        
        Args:
            detector_name: 检测器名称
            
        Returns:
            检测器信息字典，如果不存在则返回None
        F)r8   u   获取检测器信息失败 r0   N)r:   get_infor   r7   r2   r   r1   )r   r,   detectortemp_detectorr6   s        r   get_detector_infoz"DetectorRegistry.get_detector_infos   s     $$]$O$$&& DNN*W $ 4 4] C (1133 !
   W!!$@rRSQT"UVVWs   "A 	B$!B

Bc                    || j                   v r| j                   |= || j                  v r8| j                  |   }t        |d      r|j                          | j                  |= | j                  j                  d|        y)uc   
        注销检测器
        
        Args:
            detector_name: 检测器名称
        cleanupu   注销检测器: N)r   r   hasattrrF   r   r*   )r   r,   r5   s      r   
unregisterzDetectorRegistry.unregister   sx     DNN*}-D333..}=Hx+  "''6,]O<=r   c                 6    | j                   j                         S )u   
        获取所有已注册的检测器
        
        Returns:
            Dict[str, Type]: 检测器名称到检测器类的映射
        r<   r   s    r   get_registered_detectorsz)DetectorRegistry.get_registered_detectors   r?   r   c                     || j                   vri S | j                  |      }|rt        |d      r|j                         S ddiS )u   
        获取指定检测器的可用函数列表
        
        Args:
            detector_name: 检测器名称
            
        Returns:
            Dict[str, str]: 函数名称到描述的映射
        get_available_functionsdetectu   主检测函数)r   r:   rG   rL   )r   r,   detector_instances      r   get_detector_functionsz'DetectorRegistry.get_detector_functions   sO     .I --m<):<U!V$<<>>+,,r   function_nameparamsc                 @   | j                  |      }|st        d|       | j                  |      }|r"|j                         }|j	                  |       n|}t        |d      r|j                  |||      S |dk(  r|j                  ||      S t        d| d|       )uH  
        调用检测器的指定函数
        
        Args:
            detector_name: 检测器名称
            function_name: 函数名称
            image: 输入图像
            params: 外部传入的参数（可选），会与缓存参数合并
            
        Returns:
            Dict: 检测结果
           检测器不存在: call_functionrM   u
   检测器 u    不支持函数: )r:   r(   get_detector_paramsr=   updaterG   rT   rM   )r   r,   rP   imagerQ   rN   cached_paramsfinal_paramss           r   call_detector_functionz'DetectorRegistry.call_detector_function   s     !--m< 3M?CDD 00? (--/L'(L$o6$22=%VVh&$++E<@@z-8J=/Z[[r   c                 H    t        | j                  j                               S )u   
        获取所有已注册检测器的名称列表
        
        Returns:
            List[str]: 检测器名称列表
        )listr   keysr   s    r   list_detector_namesz$DetectorRegistry.list_detector_names   s     DNN'')**r   c                    | j                   j                         D ]  }t        |d      s|j                          ! | j                  j                          | j                   j                          | j                  5  | j                  j                          ddd       | j                  j                  d       y# 1 sw Y   %xY w)u   清空所有注册的检测器rF   Nu   清空所有检测器注册)
r   valuesrG   rF   r   clearr   r   r   r*   )r   r5   s     r   ra   zDetectorRegistry.clear   s     //668Hx+  " 9 	%%'__##% 67 _s   =B<<Cconfig_file_pathc                 L   | j                  |      }|s | j                  j                  d|        i S |j                         }|Bt	        |d      r|j                         }n| d}t        j                  j                  d|      }|j                         }t        j                  j                  |      r]	 t        |dd      5 }t        j                  |      }ddd       |j                         | j                  j                  d	|        n| j                  j                  d|        | j$                  5  || j&                  |<   ddd       |S # 1 sw Y   }xY w# t         $ r)}	| j                  j#                  d
|	 d       Y d}	~	_d}	~	ww xY w# 1 sw Y   |S xY w)u  
        加载检测器参数到缓存
        
        Args:
            detector_name: 检测器名称
            config_file_path: 配置文件路径，如果为None则使用默认路径
            
        Returns:
            Dict[str, Any]: 合并后的参数字典
        rS   Nget_config_filename_params.jsonconfigrutf-8encodingu   已加载检测器配置: u   加载检测器配置失败: u   ，使用默认参数u,   配置文件不存在，使用默认参数: )r:   r   r1   get_default_parametersrG   rd   ospathjoinr=   existsopenjsonloadrV   r*   r2   warningr   r   )
r   r,   rb   rN   default_paramsconfig_filenamemerged_paramsfjson_paramsr6   s
             r   load_detector_paramsz%DetectorRegistry.load_detector_params   s    !--m< KK 4]ODEI +AAC #(*?@"3"G"G"I%2O<"@!ww||HoF '++-77>>*+^*C'Ba"&))A,K C$$[1  #=>N=O!PQ KKKL\K]^_ __/<Dm,   CB  ^##&CA3F[$\]]^  s<   8E$ E7E$ >FE!E$ $	F-FFF#reloadc                     | j                   5  |s4|| j                  v r&| j                  |   j                         cddd       S ddd       | j                  |      S # 1 sw Y   xY w)u
  
        获取检测器参数（从缓存或重新加载）
        
        Args:
            detector_name: 检测器名称
            reload: 是否强制重新加载参数
            
        Returns:
            Dict[str, Any]: 检测器参数字典
        N)r   r   r=   ry   )r   r,   rz   s      r   rU   z$DetectorRegistry.get_detector_params"  sV     __mt/@/@@((7<<> __
 ((77 _s   -AA&c                    || j                   vr| j                  j                  d|        y|dk(  r|d|v rx|d   d   }| j                  j                  d|        || j                  v rDd| j                  |   v r3| j                  |   d   d   }| j                  j                  d|        | j
                  5  |j                         | j                  |<   ddd       |dk(  rDd| j                  |   v r3| j                  |   d   d   }| j                  j                  d	|        | j                  j                  d
|        y# 1 sw Y   qxY w)u   
        更新检测器参数缓存
        
        Args:
            detector_name: 检测器名称
            params: 新的参数字典
            
        Returns:
            bool: 更新是否成功
        rS   F   极耳完整流程检测器   极耳裁切模型参数   模型路径u:   🔄 即将更新缓存，新的极耳裁切模型路径: u"   📦 缓存中当前模型路径: Nu0   ✅ 缓存已更新，极耳裁切模型路径: u    已更新检测器参数缓存: T)r   r   r1   r*   r   r   r=   )r   r,   rQ   new_model_pathold_model_pathcached_model_paths         r   update_detector_paramsz'DetectorRegistry.update_detector_params4  si    .KK 4]ODE 99>X\b>b#$>?ONKKYZhYijk  1 116PTXTeTefsTt6t!%!2!2=!AB\!]^l!m  #EnEU!VW__/5{{}Dm,  99>X\`\m\mn{\|>| $ 1 1- @A[ \]k lKKOPaObcd;M?KL _s   ;E		Ec                 x   |i| j                   5  || j                  vr)| j                  j                  d| d       	 ddd       y| j                  |   j	                         }ddd       |S| j                  |      }t        |d      r|j                         }n| d}t        j                  j                  d|      }t        j                  t        j                  j                  |      d	       |d
k(  r*d|v r&|d   d   }| j                  j                  d|        	 i }t        j                  j                  |      r\	 t        |dd      5 }t!        j"                  |      }ddd       |d
k(  r*d|v r&|d   d   }	| j                  j                  d|	        t        |dd      5 }t!        j(                  ||dd       ddd       t        |dd      5 }t!        j"                  |      }ddd       |d
k(  r}dv ry|d   d   }| j                  j                  d|        |rQd|v rM|d   d   }	||	k7  r"| j                  j                  d|	 d|        n| j                  j'                  d|        | j                  j                  d|        y# 1 sw Y   =xY w# 1 sw Y   CxY w# t$        $ r)}
| j                  j'                  d|
        Y d}
~
Dd}
~
ww xY w# 1 sw Y   &xY w# 1 sw Y   xY w# t$        $ r(}
| j                  j                  d|
        Y d}
~
yd}
~
ww xY w)uc  
        保存检测器参数到文件
        
        Args:
            detector_name: 检测器名称
            config_file_path: 配置文件路径，如果为None则使用默认路径
            params: 要保存的参数字典，如果为None则使用缓存中的参数
            
        Returns:
            bool: 保存是否成功
        Nu   参数缓存中没有检测器 u
    的参数Frd   re   rf   T)exist_okr}   r~   r   u4   🔧 即将保存参数，极耳裁切模型路径: rg   rh   ri   u"   📖 文件中当前模型路径: u   读取旧配置文件失败: w   )indentensure_asciiu3   ✅ 验证保存结果，极耳裁切模型路径: u   🎯 路径已更新: u    → u   ⚠️ 路径未改变: u   已保存检测器参数: u   保存检测器参数失败: )r   r   r   r1   r=   r:   rG   rd   rl   rm   rn   makedirsdirnamer*   ro   rp   rq   rr   r2   rs   dump)r   r,   rb   rQ   rN   ru   
model_pathold_contentrw   r   r6   verify_contentverify_model_paths                r   save_detector_paramsz%DetectorRegistry.save_detector_paramsX  s+    > (9(99KK%%(GV`&ab  ! **=9>>@	 ! # $ 1 1- @(*?@"3"G"G"I%2O<"@!ww||HoF 	BGGOO$45E 99>X\b>b :;NKJKKST^S_`a%	Kww~~./M.gF!&*iil G$(EEJdhsJs)45O)PQ_)`((+MnM])^_
 &g>!		&!AEB ? &g>!!%1 ?  ==B\`nBn$23M$N~$^!  #VWhVi!jk #=#L%01K%L^%\N(N:((+A.AQQVWhVi)jk++.FGXFY,Z[KK9:J9KLMu !: GF
 ! MKK''*Gs(KLLM ?> ?>"  	KK =aSAB	s   /JJ%!L J9 J,+7J9 "L 0K.
L  K;6B(L J),J61J9 9	K+K& L &K++L .K83L ;L L 	L9L44L9c                     | j                   5  || j                  vr| j                  |       | j                  j                  |i       cddd       S # 1 sw Y   yxY w)u   
        获取用于TreeViewer的参数（返回缓存的引用，允许直接修改）
        
        Args:
            detector_name: 检测器名称
            
        Returns:
            Dict[str, Any]: 参数字典的引用
        N)r   r   ry   get)r   r,   s     r   get_params_for_tree_viewerz+DetectorRegistry.get_params_for_tree_viewer  sI     __D$5$55))-8 $$((; __s   ;AA)F)T)N)NN) r   
__module____qualname____doc__r   r   r   r    r   boolr-   strr   objectr7   r:   r   r>   rD   rH   rJ   rO   r   rZ   r^   ra   ry   rU   r   r   r   __classcell__)r   s   @r   r	   r	      s   IL%>t > >.S hvFV .# T U]^dUe ,%S$Y %s x~ 2> >&%-C -DcN -& ?C!\C !\ !\-1#s(^!\GKCQTH~!\F+8,# , ,X\]`be]eXf ,\8 8d 8tTWY\T\~ 8$"C "c3h "TX "H PT48L# L L#'S>L=AL\< <S#X <r   r	   )r   typingr   r   r   r   r   r   r   rq   rl   r	   detector_registry r   r   <module>r      s6   
 3 2    	i< i<Z %& r   