U
    h'                     @   sP   d dl mZ d dlZd dlZd dlZd dlZddlmZ dgZ	G dd dZ
dS )    )divisionN   )
face_alignArcFaceONNXc                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )r   Nc                 C   s^  |d k	st || _|| _d| _d}d}t| j}|j}t|jd d D ]@\}}|j	
dsj|j	
drnd}|j	
ds|j	
drJd}qJ|r|rd	}	d
}
nd}	d}
|	| _|
| _| jd krt| jd | _| j d }|j}|j	}t|dd d d d | _|| _| j }g }|D ]}||j	 q|| _|| _t| jdksNt |d j| _d S )NZrecognitionF   ZSubZ_minusTZMulZ_mulg              ?g     _@r   r         )AssertionError
model_filesessionZtasknameonnxloadgraph	enumeratenodename
startswith
input_mean	input_stdonnxruntimeZInferenceSession
get_inputsshapetuple
input_sizeinput_shapeget_outputsappend
input_nameoutput_nameslenZoutput_shape)selfr   r   Zfind_subZfind_mulmodelr   nidr   r   r   Z	input_cfgr   r   outputsr    out r'   F/tmp/pip-unpacked-wheel-5oclok7i/insightface/model_zoo/arcface_onnx.py__init__   sF    

zArcFaceONNX.__init__c                 K   s   |dk r| j dg d S )Nr   ZCPUExecutionProvider)r   Zset_providers)r"   Zctx_idkwargsr'   r'   r(   prepare=   s    zArcFaceONNX.preparec                 C   s.   t j||j| jd d}| | |_|jS )Nr   )ZlandmarkZ
image_size)r   Z	norm_cropZkpsr   get_featflattenZ	embedding)r"   imgfaceZaimgr'   r'   r(   getA   s    zArcFaceONNX.getc                 C   s<   ddl m} | }| }t||||||  }|S )Nr   )norm)Znumpy.linalgr1   Zravelnpdot)r"   Zfeat1Zfeat2r1   simr'   r'   r(   compute_simF   s
    zArcFaceONNX.compute_simc                 C   s\   t |ts|g}| j}tjj|d| j || j| j| jfdd}| j	| j
| j|id }|S )Nr   T)ZswapRBr   )
isinstancelistr   cv2ZdnnZblobFromImagesr   r   r   runr    r   )r"   Zimgsr   blobnet_outr'   r'   r(   r,   M   s    
 zArcFaceONNX.get_featc                 C   s.   || j  | j }| j| j| j|id }|S )Nr   )r   r   r   r9   r    r   )r"   Z
batch_datar:   r;   r'   r'   r(   forwardW   s    zArcFaceONNX.forward)NN)	__name__
__module____qualname__r)   r+   r0   r5   r,   r<   r'   r'   r'   r(   r      s   
)
)
__future__r   Znumpyr2   r8   r   r   utilsr   __all__r   r'   r'   r'   r(   <module>   s   