a
    d                     @   st   d dl Z d dlZd dlm  mZ d dlmZ d dlmZm	Z	m
Z
mZmZ ddlmZ dddZd	d
 Zdd ZdS )    N)tqdm)get_input_dtypeget_tokenizerbuild_zero_shot_classifierIMAGENET_CLASSNAMESOPENAI_IMAGENET_TEMPLATES   )get_autocastr   c                    sF   |  t|dddd  }||dd|  fdd|D S )Nr   Tc                    s8   g | ]0}t  d | d  jddd  qS )Nr   r   T)Zkeepdim)floatZreshapesumcpunumpy).0kcorrect [/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/training/zero_shot.py
<listcomp>       zaccuracy.<locals>.<listcomp>)topkmaxteqviewZ	expand_as)outputtargetr   predr   r   r   accuracy   s    r    c              
   C   s  t |j}t|j}t  d\}}}t||jdD ]\}	}
|	j|j|d}	|
|j}
| @ | |	d}t	|t
r~|d n|d }d| | }W d    n1 s0    Y  t||
dd	\}}||7 }||7 }||	d7 }q6W d    n1 s0    Y  || }|| }||fS )
N)        r!   r!   )Z
unit_scale)deviceZdtype)imageimage_featuresr   g      Y@)r      )r   )r	   	precisionr   torchZno_gradr   Z
batch_sizetor"   
isinstancedictr    size)model
classifier
dataloaderargsautocastZinput_dtypetop1top5nZimagesr   r   r$   ZlogitsZacc1Zacc5r   r   r   run   s$    




*.r4   c           
   
   C   s4  d|vrd|vri S |j dkr"i S ||j  dkr>||jkr>i S |jrP|jsP| j} td td t|j}| 2 t	|j
}t| |ttd|jdd}W d    n1 s0    Y  td	 i }d|v rt| ||d j|\}}	||d
< |	|d< d|v r&t| ||d j|\}}	||d< |	|d< td |S )Nzimagenet-valzimagenet-v2r   zStarting zero-shot imagenet.zBuilding zero-shot classifier
   T)	tokenizerZ
classnamesZ	templatesZnum_classes_per_batchr"   Zuse_tqdmzUsing classifierzimagenet-zeroshot-val-top1zimagenet-zeroshot-val-top5zimagenetv2-zeroshot-val-top1zimagenetv2-zeroshot-val-top5zFinished zero-shot imagenet.)Zzeroshot_frequencyZepochsZdistributedZhorovodmodulelogginginfor	   r&   r   r,   r   r   r   r"   r4   r.   )
r,   dataepochr/   r0   r6   r-   resultsr1   r2   r   r   r   zero_shot_eval-   sD    




$



r=   )r
   )r8   r'   Ztorch.nn.functionalnnZ
functionalFr   Z	open_clipr   r   r   r   r   r&   r	   r    r4   r=   r   r   r   r   <module>   s   
