
    >|h'                        d dl Z d dlmZ d dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZ d dlmZ  ed      Z e	j                          Zedk(  r-d dlZd d	lmZ d d
lmZ d dlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# n.d dlmZ d d	l$mZ d d
l%mZ d dl&mZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# dZ' G d de      Z(d Z)defdZ*d Z+ddZ,ddZ-defdZ.y)    N)List)package_utilsfolder_utils)FacialRecognition)Loggerzbasemodels.VGGFace)module   )backend)Model)
ActivationAddBatchNormalizationConcatenateConv2DDepthwiseConv2DGlobalAveragePooling2DInputReshapeMultiplyReLUPReLU)kerasz_https://github.com/HamadYA/GhostFaceNets/releases/download/v1.2/GhostFaceNet_W1.3_S1_ArcFace.h5c                   @    e Zd ZdZd Zdej                  dee   fdZ	y)GhostFaceNetClientaN  
    GhostFaceNet model (GhostFaceNetV1 backbone)
    Repo: https://github.com/HamadYA/GhostFaceNets
    Pre-trained weights: https://github.com/HamadYA/GhostFaceNets/releases/tag/v1.2
        GhostFaceNet_W1.3_S1_ArcFace.h5 ~ 16.5MB
        Author declared that this backbone and pre-trained weights got 99.7667% accuracy on LFW
    c                 L    d| _         d| _        d| _        t               | _        y )NGhostFaceNet)p   r      )
model_nameinput_shapeoutput_shape
load_modelmodel)selfs    _/var/www/html/test/engine/venv/lib/python3.12/site-packages/deepface/basemodels/GhostFaceNet.py__init__zGhostFaceNetClient.__init__E   s"    (%\
    imgreturnc                 f    | j                  |d      j                         d   j                         S )NF)trainingr   )r#   numpytolist)r$   r(   s     r%   find_embeddingsz"GhostFaceNetClient.find_embeddingsK   s.     zz#z.446q9@@BBr'   N)
__name__
__module____qualname____doc__r&   npndarrayr   floatr.    r'   r%   r   r   <   s*    "C2:: C$u+ Cr'   r   c                  B   t               } t        j                         }|dz   }t        j                  j                  |      durIt        j                  d       t        j                  t        |d       t        j                  d|        | j                  |       | S )Nz%/.deepface/weights/ghostfacenet_v1.h5TzGPre-trained weights is downloaded from {PRETRAINED_WEIGHTS} to {output}F)quietz*Pre-trained weights is just downloaded to )GhostFaceNetV1r   get_deepface_homeospathisfileloggerinfogdowndownloadPRETRAINED_WEIGHTSload_weights)r#   homeoutputs      r%   r"   r"   Q   s}    E))+D;;F	ww~~fT)]^)6?@IJ	vLr'   r)   c                     t        d      } d} t        |ddddt        j                  j	                  dd	d
            |       } t        d      |      } t        d      |      }g d}g d}g d}g d}g d}|}t        |||||      D ](  \  }	}
}}}||k(  xr |
dk(   }t        ||	|
||||      }|}*  t        dddddt        j                  j	                  dd	d
            |      } t        d      |      } t        d      |      }t        | |d      }|j                  d   } |j                  d   }t        j                  j                  |j                  d   dd      |      }t        j                  j                  ddd       |      }t        j                  j                  d!dd"d#d$%      |      }t        j                  j                  d&'      |      }t        j                  j                  ddd"d()      |      }t        j                  j                  d*d+d,-      |      }t        j                   j                  | ||j"                  '      }t%        |.      }|S )/z
    Build GhostFaceNetV1 model. Refactored from
        github.com/HamadYA/GhostFaceNets/blob/main/backbones/ghost_model.py
    Returns:
        model (Model)
    )r   r      )shape   )rG   rG   r	   sameF       @fan_outtruncated_normalscalemodedistributionstridespaddinguse_biaskernel_initializeraxisrelu)rG   rG   rG      r[   rG   rG   rG   rG   rG   rG   r[   r[   r[   r[   r[   )rI   @   \   r]      8  i     r`   ip  h  ra     rb   rb     )rI       rd   4   re   h   rf   rf   rf      rg      rh   rh   rh   rh   )r	      r	   ri   r	   ri   r	   r	   r	   r	   r	   ri   r	   r	   r	   r	   )r   r   r      (   r   r   r   r   r^      rl   r   r_   r      rc   r	   r	   validr9   )inputsoutputsnamer   GDC_dw)rU   rr   gGz?gMbP?GDC_batchnorm)momentumepsilonrr   r   Tglorot_normalGDC_conv)rU   rV   rr   GDC_flatten)rr   pre_embedding)ru   rv   rO   rr   linearfloat32	embedding)dtyperr   )r#   )r   r   r   initializersVarianceScalingr   r   zipghost_bottleneckr   rp   rq   layersr   rH   Flattenmodelsrr   replace_relu_with_prelu)rp   out_channelnn	dwkernelsexpsoutsstrides_set
reductionspre_outdwkstrideexpout	reductionshortcutxxr}   embedding_fp32r#   s                      r%   r9   r9   a   s    'FK	
 --==I4F > 
	
 	
B 
%		$R	(B	F	B	B@IZDVDBKMJG,/	;dT^,_ (VS#yw66Q;7b#vsCHM
	
 --==I4F > 
	
 		

B 
%		$R	(B	F	B	B	fb/?	@B YYq\F	AB		%	%bhhqkE	%	QRT	UB		(	($O	(	\]_	`B			Q/
 
 


B 
		=		1"	5B//uD 0 
I \\,,XY[,YZcdNLLv~BGGDE#%0ELr'   c                    t        j                         dk(  rdnd}| j                  |   } t               |       } t	        dd|f      |      } t        |ddt        j                  j                  ddd      	      |      } t        d
      |      } t        |ddt        j                  j                  ddd      	      |      } t        d      |      } t               | |g      S )]
    Refactored from github.com/HamadYA/GhostFaceNets/blob/main/backbones/ghost_model.py
    channels_firstr	   rW   TrK   rL   rM   rN   )kernel_sizerU   rV   rZ   hard_sigmoid)Kimage_data_formatrH   r   r   r   r   r   r   r   r   )rp   r   channel_axisfiltersses        r%   	se_moduler      s   
 ++-1AA1rLll<(G 
"		!&	)B 
"!Q	!"	%B
 --==I4F > 
	
 	

B 
F	B	B
 --==I4F > 
	
 	

B 
$N	#B	'B8:vrl##r'   c                    |dz  } t        ||dddt        j                  j                  ddd      	      |       } t	        d
      |      }|r t        d      |      } t        |dddt        j                  j                  ddd            |      } t	        d
      |      }|r t        d      |      } t               ||g      S )r   ri   Frn   rJ   rK   rL   rM   rN   )rU   rS   rT   rV   rW   rX   rZ   r	   rT   rU   depthwise_initializer)r   r   r   r   r   r   r   r   )rp   r   
convkerneldwkerneladd_activationconv_out_channelccr   s           r%   ghost_moduler      s     ax	
 --==I4F > 
	
 	
B 
%		$R	(BZ#
	#00@@I4F A 

 	

B 
%		$R	(BZ#;="b""r'   c                 F   t        | |d      }|dkD  rH t        ||ddt        j                  j	                  ddd	      
      |      } t        d      |      }|dkD  rt        ||      }t        ||d      }|r t        ||ddt        j                  j	                  ddd	      
      |       } t        d      |      } t        |ddddt        j                  j	                  ddd	            |      } t        d      |      }n| } t               ||g      S )r   T)r   r	   rJ   FrK   rL   rM   rN   r   rW   rX   r   rn   ro   rR   )	r   r   r   r   r   r   r   r   r   )	rp   r   rS   r   r   r   r   r   r   s	            r%   r   r      sg    
fc$	7B{
_"'"4"4"D"D	8J #E #
  )R(,1}r9% 
b#e	4B
_"'"4"4"D"D	8J #E #
  )R(,	
V$11AA	8J  B  	
 	 )R(,35"b?r'   c                     d }t         j                  j                  | j                  dd       }t         j                  j                  | ||      S )aA  
    Replaces relu activation function in the built model with prelu.
        Refactored from github.com/HamadYA/GhostFaceNets/blob/main/backbones/ghost_model.py
    Args:
        model (Model): built model with relu activation functions
    Returns
        model (Model): built model with prelu activation functions
    c                 &   t        | t              s7t        | t              rp| j                  t        j
                  j                  k(  rI| j                  j                  dd      }t        ddgt        j                  j                  d      |      S | S )N_relu_prelur	   ri   g      ?)shared_axesalpha_initializerrr   )
isinstancer   r   
activationr   activationsrZ   rr   replacer   tfr   Constant)layer
layer_names     r%   convert_reluz-replace_relu_with_prelu.<locals>.convert_relu2  su    eT"uj)e.>.>%BSBSBXBX.X++GX>JF"$//":":4"@ 
 r'   r	   N)input_tensorsclone_function)r   r   r   r    r   clone_model)r#   r   r   s      r%   r   r   (  sG    
 LL&&u'8'8'<=M<<##EWc#ddr'   )r	   rG   T)T)/r;   typingr   r@   r,   r3   
tensorflowr   deepface.commonsr   r   !deepface.models.FacialRecognitionr   deepface.commons.loggerr   r>   get_tf_major_versiontf_majorr   r
   r   keras.modelsr   keras.layersr   r   r   r   r   r   r   r   r   r   r   r   tensorflow.kerastensorflow.keras.modelstensorflow.keras.layersrB   r   r"   r9   r   r   r   r   r6   r'   r%   <module>r      s    	     9 ? *	+	,-=--/q=""    !--   " w C* C* F FR%$P#D1hee er'   