
    >|hp                     `   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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 n"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  G d de      Z!	 ddefdZ"defdZ#ddZ$ddZ%d Z&y)    )ListN)package_utilsfolder_utils)Logger)FacialRecognitionzbasemodels.ArcFace)module   )Modeltraining)	ZeroPadding2DInputConv2DBatchNormalizationPReLUAddDropoutFlattenDensec                   @    e Zd ZdZd Zdej                  dee   fdZ	y)ArcFaceClientz
    ArcFace model class
    c                 L    t               | _        d| _        d| _        d| _        y )NArcFace)p   r      )
load_modelmodel
model_nameinput_shapeoutput_shape)selfs    Z/var/www/html/test/engine/venv/lib/python3.12/site-packages/deepface/basemodels/ArcFace.py__init__zArcFaceClient.__init__5   s"    \
#%    imgreturnc                 f    | j                  |d      j                         d   j                         S )z
        find embeddings with ArcFace model
        Args:
            img (np.ndarray): pre-loaded image in BGR
        Returns
            embeddings (list): multi-dimensional vector
        Fr   r   )r   numpytolist)r!   r%   s     r"   find_embeddingszArcFaceClient.find_embeddings;   s.     zz#z.446q9@@BBr$   N)
__name__
__module____qualname____doc__r#   npndarrayr   floatr*    r$   r"   r   r   0   s*     
C2:: 
C$u+ 
Cr$   r   r&   c                 H   t               }|j                  d   }|j                  d   } t        dd      |      } t	        d      |      } t               |      } t        dddd	
      |      } t        dddd      |      }t        |||j                        }t        j                         }d}|dz   |z   }t        j                  j                  |      dk7  r2t        j                  | d|        t!        j"                  | |d       |j%                  |       |S )zc
    Construct ArcFace model, download its weights and load
    Returns:
        model (Model)
    r   ?h㈵>)momentumepsilong?r   NTglorot_normal)
activationuse_biaskernel_initializer	embedding)r6   r7   namescaler=   zarcface_weights.h5z/.deepface/weights/z will be downloaded to F)quiet)ResNet34inputsoutputsr   r   r   r   r
   r=   r   get_deepface_homeospathisfileloggerinfogdowndownloadload_weights)	url
base_modelrB   arcface_modelr<   r   home	file_nameoutputs	            r"   r   r   H   s"    Jq!F&&q)MB&TB=QM GCL/MGIm,MbE#$RabM ]"CKW[\I &)*//:E
 ))+D$I))I5F	ww~~f%yk!8ABsF%0 
vLr$   c            	         t        d      }  t        dd      |       } t        ddddd	d
      |      } t        dddd      |      } t	        ddgd      |      }t        |      }t        j                  | |d      }|S )z;
    ResNet34 model
    Returns:
        model (Model)
    )r   r      )shaper	   	conv1_padpaddingr=   @   rT   Fr8   
conv1_convstridesr:   r;   r=   r5   r4   conv1_bnaxisr7   r6   r=      conv1_prelushared_axesr=   rA   r?   )r   r   r   r   r   stack_fnr   r
   )	img_inputxr   s      r"   rA   rA   r   s     M*I2ak29=A	
Aq5_S_			A 	P4#JOPQRA51a&}5a8AANN9aj9ELr$   c           
      &   d}|r3 t        |d|dd|dz         |       } t        |dd|d	z   
      |      }n| } t        |dd|dz   
      |       }  t        d|dz         |       }  t        |dddd|dz         |       }  t        |dd|dz   
      |       }  t        ddg|dz         |       }  t        d|dz         |       }  t        |||dd|dz         |       }  t        |dd|dz   
      |       }  t	        |dz         || g      } | S )NrT   r	   Fr8   _0_convr[   r5   r4   _0_bnr^   _1_bn_1_padrW   _1_conv)r\   r;   r:   r=   _2_bnr`   _1_prelurb   _2_pad_2_conv_3_bn_addr?   )r   r   r   r   r   )rf   filterskernel_sizestrideconv_shortcutr=   bn_axisshortcuts           r"   block1ry      s   G
6.	!
 
%$4'>

 Y$QX.YZ[\A6adXo6q9A		*I	 		A 	Z$QX.YZ[\A91a&tj'89!<A6adXo6q9A	*I	 		A 	Z$QX.YZ[\A1.AHr$   c           
          t        | |||dz         } t        d|dz         D ]   }t        | |d|dz   t        |      z         } " | S )N_block1)ru   r=   r`   r	   F_block)rv   r=   )ry   rangestr)rf   rs   blocksstride1r=   is         r"   stack1r      sU    q''y0@AA1fqj! S1gU3q69QRSHr$   c                 z    t        | ddd      } t        | ddd      } t        | dd	d
      } t        | ddd      S )NrY   rT   conv2r?         conv3      conv4r   conv5)r   )rf   s    r"   rd   rd      sC    q"ag&Aq#qw'Aq#qw'A!S!'**r$   )zUhttps://github.com/serengil/deepface_models/releases/download/v1.0/arcface_weights.h5)rT   r	   TN)r`   N)'typingr   rE   rJ   r(   r/   deepface.commonsr   r   deepface.commons.loggerr   !deepface.models.FacialRecognitionr   rH   get_tf_major_version
tf_versionkeras.modelsr
   keras.enginer   keras.layersr   r   r   r   r   r   r   r   r   tensorflow.keras.modelstensorflow.python.keras.enginetensorflow.keras.layersr   r   rA   ry   r   rd   r2   r$   r"   <module>r      s     	   8 * ?	+	, 0]//1
?"%
 
 
 .7
 
 
C% C2 	`'
'T% *+\+r$   