a
    d[                     @   s  d dl Z d dlZd dlmZ d dlmZ d dlZd dlZd dlmZ d dl	m
Z
 d dlZd dlZd dlT d dlmZmZ d dlT d;d	d
Zd<ddZdd Zdddedddddddf
ddZddddd deddddddfddZdd Zdddddeddddf	dd Zdd!d"dedd#ddddf
d$d%Zddd!d"dd deddddfd&d'Zd d(eddddfd)d*Zd=d,d-Zd>d.d/Zdddd d0eddfd1d2Zdddddd3edd4d5d6d"d!ddfd7d8Z ddddddd3edd4d5d6d"d!dddddfd9d:Z!dS )?    N)tqdm)glob)Image)linalg)*)build_feature_extractorget_reference_statisticsư>c                 C   s4  t | } t |}t |}t |}| j|jks<J d|j|jksPJ d| | }tj||dd\}}t | sd| }t	| t 
|jd | }	t||	 ||	 }t |rt jt |jdddst t |j}
td	|
|j}t |}||t | t | d
|  S )Nz5Training and test mean vectors have different lengthsz7Training and test covariances have different dimensionsF)ZdispzQfid calculation produces singular product; adding %s to diagonal of cov estimatesr   gMbP?)ZatolzImaginary component {}   )npZ
atleast_1dZ
atleast_2dshaper   ZsqrtmdotisfiniteallprintZeyeZiscomplexobjZallcloseZdiagonalimagmaxabs
ValueErrorformatrealtrace)mu1sigma1mu2sigma2ZepsdiffZcovmean_msgoffsetmZ
tr_covmean r!   U/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/cleanfid/fid.pyfrechet_distance    s4    




r#   d     c                 C   s   | j d }tt| j d |j d |}d}t|D ]}|tjj|j d |dd }| tjj| j d |dd }	||j | d d |	|	j | d d  }
||	j | d d }||
 t|
  |d  | d |  7 }q2|| | }t	|S )N   r   F)replace   r
   )
r   minranger   randomchoiceTsumZdiagfloat)feats1feats2Znum_subsetsZmax_subset_sizenr    tZ_subset_idxxyabZkidr!   r!   r"   kernel_distanceE   s    
,4r8   c                 C   sF   t   || |}W d    n1 s,0    Y  |   S )N)torchno_gradtodetachcpunumpy)batchmodeldevicefeatr!   r!   r"   get_batch_featuresV   s    
,rC         Zcudaclean Tc                 C   s   t | ||d}|
d ur|
|_|d ur*||_tjjj||dd|d}g }|	rXt||d}n|}|D ]}|t	||| q`t
|}|S )N)fdirmodeF)
batch_sizeshuffleZ	drop_lastnum_workersdesc)ZResizeDatasetcustom_image_tranform	fn_resizer9   utilsdataZ
DataLoaderr   appendrC   r   concatenate)Zl_filesr@   rL   rJ   rA   rI   custom_fn_resizedescriptionrH   verboserO   ZdatasetZ
dataloaderl_featspbarr?   np_featsr!   r!   r"   get_files_features_   s"    

r[   Fc                    s   d v r.t tt  }dd |D }nt fddtD }|r`tdt| d   |d ur|rt	
| t	| |d | }t|||||||	||
 |d}|S )Nz.zipc                 S   s0   g | ](}t j|d   d d tv r|qS )r&   N)ospathsplitextlower
EXTENSIONS).0r4   r!   r!   r"   
<listcomp>       z'get_folder_features.<locals>.<listcomp>c                    s2   g | ]*}t tj d | ddD ]}|q$qS )z**/*.T)	recursive)r   r\   r]   join)ra   extfilerH   r!   r"   rb      s    zFound z images in the folder )	rL   rJ   rA   rI   rU   rO   rV   rH   rW   )listsetzipfileZipFilenamelistsortedr`   r   lenr+   seedrK   r[   )rH   r@   rL   numrK   rp   rJ   rA   rI   rU   rV   rW   rO   filesrZ   r!   rh   r"   get_folder_features   s$    

rs   c                 C   sJ   t j| ddt j| dd }}t j|ddt j|dd }}t||||S )Nr   ZaxisFZrowvar)r   meancovr#   )r0   r1   r   Zsig1r   Zsig2r!   r!   r"   fid_from_feats   s    rx   inception_v3c                 C   sv   t ||||d|d\}}tj| }t| ||||	|d| d|
||d
}tj|dd}tj|dd}t||||}|S )	Nr   rI   
model_namerp   splitFID  : rL   rJ   rA   rI   rV   rW   rO   rU   rt   Fru   )	r   r\   r]   basenamers   r   rv   rw   r#   )rH   dataset_namedataset_resdataset_splitr@   rI   r{   rL   rJ   rA   rW   rO   rU   ref_mu	ref_sigmafbnamerZ   musigmafidr!   r!   r"   
fid_folder   s    
r   i   iP  zFID model: c              
   C   sp  |d u rt |}n|}tt|| }g }g }|rFtt||d}nt|}|D ]}t  t||f	|}|	r|
| | |}|dkrg }t|D ]R}|| }|  d}|
d ur|
|}||}|
t|dd qtj|dd}n|}t|||}W d    n1 s*0    Y  |
| qRt|d | }|	rlt|d}||fS |S )NrM   Zlegacy_tensorflow)r&   r
   r   )r
   r   r&   r   )Zdim)Zbuild_resizerintr   ceilr   r*   r9   r:   Zrandnr;   rS   r=   r>   Z	transposeZtensorZ	unsqueezecatrC   rT   )Gr@   rI   z_dimnum_genrJ   rA   rN   rW   Zreturn_zrO   rU   rP   Z	num_itersrX   ZlatentsrY   idxZz_batchZ	img_batchZl_resized_batchZcurr_imgZimg_npZ
img_resizeZresized_batchrB   rZ   r!   r!   r"   get_model_features   sB    



,r   c                 C   sb   t ||||d|d\}}t| |||||
||||d
}tj|dd}tj|dd}t||||}|S )Nr   rz   )rI   r   r   rJ   rA   rW   rO   rU   rt   Fru   )r   r   r   rv   rw   r#   )r   r   r   r   r@   r{   r   r   rI   rL   rJ   rA   rW   rO   rU   r   r   rZ   r   r   r   r!   r!   r"   	fid_model   s    
r      c
                 C   s   t j| }
t| |||||d|
 d|||	d
}tj|dd}tj|dd}t j|}t||||||d| d|||	d
}tj|dd}tj|dd}t||||}|S )Nr}   r~   r   r   rt   Fru   )r\   r]   r   rs   r   rv   rw   r#   )fdir1fdir2
feat_modelrI   rL   rJ   rA   rW   rO   rU   fbname1	np_feats1r   r   fbname2	np_feats2r   r   r   r!   r!   r"   compare_folders  s(    r   FIDc           
   	   C   s   t jt jtjd}d\}}|dkr.d}nd| }|dkr`|  d| | d| d| d	}n(|dkr|  d| | d| d| d		}t j||}	t j|	S )
NstatsZcustomnary   rG   r   r   .npzKID_kid.npz)r\   r]   re   dirnamecleanfid__file__exists)
namerI   r{   metricstats_folderr|   resmodel_modifierfnameZfpathr!   r!   r"   test_stats_exists$  s    " r   c           	      C   s   t jt jtjd}d\}}|dkr.d}nd| }t j||  d| | d| d| d	 }t j|sd|  d}t|t 	| t j||  d| | d| d| d		}t j|sd|  d}t|t 	| d S )
Nr   r   ry   rG   r   r   zThe stats file z does not exist.r   )
r\   r]   re   r   r   r   r_   r   	Exceptionremove)	r   rI   r{   r   r|   r   r   outfr   r!   r!   r"   remove_custom_stats6  s    .
*r   @   c	                 C   s  t jt jtjd}	t j|	dd d\}
}|dkr<d}nd| }t j|	|  d| | d|
 d| d	 }t j|rd	|  d
}|d7 }t	||dkrt
||}d }d }n>|dkrddlm}m} |d}|}|}d }ntd| dt||||||||dt j| d||d}tj|dd}tj|dd}td|  tj|||d t j|	|  d| | d|
 d| d	 }td|  tj||d d S )Nr   T)exist_okr   ry   rG   r   r   zThe statistics file z already exists. z4Use remove_custom_stats function to delete it first.clip_vit_b_32r   CLIP_fximg_preprocess_clipViT-B/32zThe entered model name - z was not recognized.zcustom stats: r~   )	rL   rq   rJ   rA   rW   rI   rV   rO   rU   rt   Fru   zsaving custom FID stats to )r   r   r   zsaving custom KID stats to )Zfeats)r\   r]   re   r   r   r   makedirsr_   r   r   r   cleanfid.clip_featuresr   r   r   rs   r   r   rv   rw   r   Zsavez_compressed)r   rH   rq   rI   r{   rL   rJ   rA   rW   r   r|   r   r   r   r   r   rU   rO   r   r   clip_fxrZ   r   r   r!   r!   r"   make_custom_statsN  sF    .

.r       ZFFHQi   Ztrainc                 C   s  t |||d}| d ur|d ur|r*td tj| }t| |||||d| d|d}tj|}t||||||d| d|d}t||}|S | d ur|d u r|rtd| d t|||d|	d	d
}tj| }t| |||||d| d|d}t||}|S |d urx|d urx|r(td tj|}t||||||d| dd}t|||||
d||d}t||}|S |d ur|rtd| d| d t|||d|	d	d
}t|||||
d|||d	}t||}|S t	dd S )Nuse_dataparallelzcompute KID between two folderszKID r~   )rL   rJ   rA   rI   rV   rW   zcompute KID of a folder with  statisticsr   r   )rI   rp   r|   r   z1compute KID of a model, using references in fdir2)rL   rJ   rA   rI   rV   zKID model: )rI   r   r   rN   rJ   rA   zcompute KID of a model with -)rI   r   r   rN   rJ   rA   rW   5invalid combination of directories and models entered)
r   r   r\   r]   r   rs   r8   r   r   r   )r   r   genrI   rL   rJ   rA   r   r   r   r   r   rW   r   r   r   r   r   r   scoreZ	ref_featsr   rZ   r!   r!   r"   compute_kid|  sp    





r   c                 C   s  |d u r |dkr t |||d}n:|d u rV|dkrVddlm}m} |d|d}|}|}n|}| d ur|d ur|rvtd t| |||||||||d	
}|S | d ur|d u r|rtd
| d t| ||	|
|||||||||d}|S |d ur|d ur|rtd tj	|}t
||||||d| d|||d
}tj|dd}tj|dd}t||||||||||d
}tj|dd}tj|dd}t||||}|S |d ur|rtd| d|	 d t|||	|
|||||||||||d}|S tdd S )Nry   r   r   r   r   r   )rA   zcompute FID between two folders)rI   rJ   rL   rA   rO   rU   rW   zcompute FID of a folder with r   )	r@   rI   r{   rU   rO   rL   rJ   rA   rW   z1compute FID of a model, using references in fdir2r}   r~   )rL   rJ   rA   rI   rV   rW   rU   rO   rt   Fru   )rI   r   r   rU   rO   rJ   rA   rW   zcompute FID of a model with r   )r@   r{   r   r   rI   rL   rJ   rO   rU   rA   rW   r   )r   r   r   r   r   r   r   r\   r]   r   rs   r   rv   rw   r   r#   r   r   )r   r   r   rI   r{   rL   rJ   rA   r   r   r   r   r   Zcustom_feat_extractorrW   rO   rU   r   r   r   r   r   r   r   r   r   r   rZ   r   r   r   r!   r!   r"   compute_fid  sz    


r   )r	   )r$   r%   )ry   r   )rF   ry   )"r\   r+   r   r   r9   r>   r   ZPILr   Zscipyr   rk   r   Zcleanfid.utilsZcleanfid.featuresr   r   Zcleanfid.resizer#   r8   rC   rA   r[   rs   rx   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s~   
%
	

 


3





.

M