o
    E"j                     @   sR  d dl mZ d dlmZ d dlZd dlZdZdZdZ	g dZ
dd	d
d
d
dZdddddddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ ZeeZd0d1 e
D ZeeZd2d1 eD Z eeZ!eeeeZ"e#e"D ]\Z$Z%ee!e e$ e%Z&ee
e$ e& qdS )3    )FashionCLIP)ImageNzpatrickjohncyh/fashion-clipzquery_01.pngd   )z01.pngz02.pngz03.pngz04.pngz05.pngz06.pngz07.pngz08.pngz09.pngz10.pngz21.pngz22.pngz23.pnggffffff?g?g333333?clipcolor
brightnesstextureshapeg?ffffff?333333?)samesimilar	min_colormin_brightnessmin_texture	min_shapec                 C   s   t | dS )NRGB)r   openconvert)path r   htdocs/OOTD2/clothid/test.py
load_image/      r   c                 C   sz   t | }|d d d d df dk|d d d d df dk@ |d d d d df dk@ }| }| s;t j|jtd}|S )Nr            dtype)npasarrayanyonesr
   bool)imagergbwhitemaskr   r   r   get_cloth_mask3   s   
Nr)   c                 C   s.   |  d } tj| }|dkr| | S | S )Nfloat32r   )astyperavelr    linalgnorm)vectorr.   r   r   r   	normalize?   s   r0   c                 C   s6   |  d} tjj| ddd}d||dk< t| | S )Nr*   r   T)axiskeepdimsr   )r+   r    r-   r.   ascontiguousarray)matrixr.   r   r   r   normalize_rowsE   s   
r5   c                 C   s0   t | d}t j|| ddd\}}t|S )NHSV)      r8   )r      r9   r9   binsrange)r    r!   r   histogramddr0   )r%   r(   hsvhist_r   r   r   color_featureL   s   
rB   c                 C   sv   t | d}|d d d d df | d }t j|ddd\}}|d}| dkr2||  }|t| d	S )
Nr6   r        o@   r   r   r;   r*   r   )r@   mean)r    r!   r   	histogramr+   sumfloatrF   )r%   r(   r?   r   r@   rA   r   r   r   brightness_featureW   s   

rJ   c              	   C   s   t j| dt jdd }t |}|d d dd f  t t j|dd7  < |dd d d f  t t j|dd7  < t j|| ddd	\}}t|S )
NLr   rC   r   )r1   r   rD   rE   r;   )	r    r!   r   r*   
zeros_likeabsdiffrG   r0   )r%   r(   grayedger@   rA   r   r   r   texture_featureg   s   
,,rQ   c                 C   s   t | \}}| | | d | | d f }|j\}}ttdr+tjjntj}t	|d 
dd|}t j|t jdd }|t|d |dS )	Nr   
Resamplingr:   uint8)    rT   r   rC   )aspect
silhouette)r    whereminmaxr
   hasattrr   rR   BILINEAR	fromarrayr+   resizer!   r*   )r(   yxcropheightwidthresamplerV   r   r   r   shape_features   s   ,
rd   c                 C   s,   t | }t| |t| |t| |t|dS )N)r   r   r	   r
   )r)   rB   rJ   rQ   rd   )r%   r(   r   r   r   extract_features   s   re   c                 C   s   t t| |S N)rI   r    dot)abr   r   r   histogram_score   r   rj   c                 C   sN   t t| d |d  }tddt| d |d  d  }|d |d  S )Nr@                 ?rF         ?r   g333333?)rI   r    minimumrH   rY   rM   )rh   ri   
hist_score
mean_scorer   r   r   brightness_score   s   "rq   c                 C   s   t t| d d t|d d  }tdd|d  }t| d |d  }t| d |d  }|dkr?t|| nd}|d |d	  S )
NrU   gư>rk   rl   rm   rV   r   g?r   )rM   r    logrY   rn   rH   maximumrI   )rh   ri   aspect_diffaspect_scoreintersectionunionsilhouette_scorer   r   r   shape_score   s   (ry   c                 C   sz   t | j|t|d}t | j|gdd}t|jd }|| ||tt	t|\}}dd t
|d |d D S )N)
batch_sizer   c                 S   s    g | ]\}}t |t|fqS r   )intrI   ).0scoreidxr   r   r   
<listcomp>   s    z%search_with_faiss.<locals>.<listcomp>r   )r5   encode_imageslenfaissIndexFlatIPr
   addsearchrX   TOP_Kzip)fclipimagesquery_imageimage_vectorsquery_vectorindexscoresindicesr   r   r   search_with_faiss   s   
r   c                    sf   |t | d |d t| d |d t | d |d t| d |d d t fddtD  d<  S )	Nr   r   r	   r
   r   c                 3   s     | ]} | t |  V  qd S rf   )WEIGHTS)r|   namer   r   r   	<genexpr>   s    zcompare.<locals>.<genexpr>final)rj   rq   ry   rH   r   )query_featurescandidate_features
clip_scorer   r   r   compare   s   
r   c                 C   sl   | d t d kr*| d t d kr*| d t d kr*| d t d kr*| d	 t d
 kr*dS | d t d kr4dS dS )Nr   r   r   r   r   r   r	   r   r
   r   r   	different)
THRESHOLDSr   r   r   r   classify   s   r   c                 C   s^   t d| dt|d|d dd|d dd|d	 dd
|d dd|d dd|d d d S )Nzmatched image:zmatch:zfinal_score:r   z.3fzclip_score:r   zcolor_score:r   zbrightness_score:r   ztexture_score:r	   zshape_score:r
   )printr   )r   r   r   r   r   print_result   s   r   c                 C      g | ]}t |qS r   )r   )r|   r   r   r   r   r          r   c                 C   r   r   )re   )r|   r%   r   r   r   r      r   )'fashion_clip.fashion_clipr   PILr   r   numpyr    
MODEL_NAMEQUERY_IMAGEr   IMAGE_PATHSr   r   r   r)   r0   r5   rB   rJ   rQ   rd   re   rj   rq   ry   r   r   r   r   r   r   r   image_featuresr   faiss_resultssortedr~   r   r   r   r   r   r   <module>   s^    


