a
    Ad+                     @   s   d dl Z d dlZd dlZd dlZd dlmZ dZdZ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G dd dZG d d! d!ZdS )"    N)	ImageDrawz#0F0z#00Fz#F00c                 C   s  d}t | j| jr |j| j }n|t| j| jr<|j| j }n`t| j| jrt|j|jrf|j| j }n6t |j|jr|j| j }nt|j|jr|j| j }| t| j| t| j| f} | 	 }t
||}t|jd }t|jd }|j| }|dk rd}n||j | jkr$| j|j }|j| }|dk r>d}n||j | jkr\| j|j }||j }	||j }
|||	|
g}g }|| t| |jrt|}t|}|d  d8  < |d  d8  < |j|td || |jr|  |S )z3 Intelligently crop an image to the subject matter       r      outline)is_landscapewidthheightcrop_heightis_portrait
crop_width	is_squareresizeintcopyfocal_pointxyappendcroptupleannotate_imager   Drawlist	rectangleGREENdestop_view_imageshow)imsettingsscale_byZim_debugfocusZy_halfZx_halfx1y1x2y2r   resultsdrect r*   J/var/www/html/stable-diffusion-webui/modules/textual_inversion/autocrop.py
crop_image   sT    "








r,   c                 C   s  |j dkrt| |ng }|jdkr,t| |ng }|jdkrDt| |ng }g }d}|r^||j 7 }|rl||j7 }|rz||j7 }d }|rt|}|j | |_|| d }|rt|}|j| |_|| d }	|rt|}	|j| |	_||	 t	||}
|j
rt| }t| j| jd }|d urt}|||j }|j|d |d d fd|jd|d |j||d t|dkr|D ]}|j|d	|d q|d ur"d
}|||j }|j|d |d d fd|jd|d |j||d t|dkr"|D ]}|j|d	|d q|	d urt}|	||	j }|j|d |d d fd|	jd|d |j||d t|dkr|D ]}|j|d	|d q|j|
|td |
S )Nr   gQ?r      zEdge: z.02ffillr      z#ff0z	Entropy: zFace: )corner_points_weightimage_corner_pointsentropy_points_weightimage_entropy_pointsface_points_weightimage_face_pointscentroidweightr   poi_averager   r   r   minr	   r
   BLUEboundingtextellipselenr   REDr   )r   r    corner_pointsZentropy_pointsZface_pointspoisZweight_pref_totalZcorner_centroidZentropy_centroidZface_centroidZaverage_pointr(   max_sizecolorboxfr*   r*   r+   r   H   sp    








*
*
*r   c                    s  |j d urtj|j d| j| jfddd}|t| }g }|d d ur|d D ]^}|d }|d }|d }|d }	|	t
t||d	  t||	d
  |dt|d  d qR|S t| }
t|
tj}tjj ddgtjj ddgtjj ddgtjj ddgtjj ddgtjj ddgtjj ddgtjj ddgg}|D ]}t|d }tt| j| j|d  }z|j|dd||ftjd}W n ty   Y qVY n0 |rVdd |D   fdd D   S qVg S )N ?g333333?i  r   r   r   r         ?gQ?sizer8   zhaarcascade_eye.xmlg{Gz?z#haarcascade_frontalface_default.xmlg?zhaarcascade_profileface.xmlzhaarcascade_frontalface_alt.xmlz haarcascade_frontalface_alt2.xmlz$haarcascade_frontalface_alt_tree.xmlz#haarcascade_eye_tree_eyeglasses.xmlzhaarcascade_upperbody.xmlg?   )scaleFactorZminNeighborsminSizeflagsc                 S   s8   g | ]0}|d  |d |d  |d  |d |d  gqS )r   r   r   r   r*   ).0rF   r*   r*   r+   
<listcomp>       z%image_face_points.<locals>.<listcomp>c              	      sT   g | ]L}t |d  |d  d |d |d  d t|d  |d  dt  dqS )r   r   r   r   rJ   )PointOfInterestabsr?   )rP   rrectsr*   r+   rQ      rR   )dnn_model_pathcv2FaceDetectorYNcreater	   r
   detectnparrayr   rS   r   r?   cvtColorCOLOR_BGR2GRAYdatahaarcascadesCascadeClassifierr:   detectMultiScaleCASCADE_SCALE_IMAGE	Exception)r   r    detectorfacesr'   facer   r   whnp_imgraytriest
classifierZminsizer*   rV   r+   r6      sd    




r6   c           
   
   C   s   |  d}t|}|jd| jd | j| jgdd t|}tj	|ddt
|j|jd d	d
}|d u rlg S g }|D ].}| \}}	|t||	ddt| d qt|S )NLr   rH   z#999r.   d   g{Gz?gQ?F)Z
maxCornersZqualityLevelZminDistanceZuseHarrisDetectorr0   r   rJ   )convertr   r   r   r
   r	   r]   r^   rY   goodFeaturesToTrackr:   ravelr   rS   r?   )
r   r    	grayscalegdrl   pointsZfocal_pointspointr   r   r*   r*   r+   r2      s$    

 
 r2   c                 C   s  | j | jk }| j | jk}|r0ddg}| jd }n|rHddg}| jd }ng S d}dd|j|jg}|}||d  |k r| t|}	t|	}
|
|kr|
}t|}||d   d7  < ||d   d7  < qdt	|d |jd  }t	|d |jd  }t
||dddgS )	Nr   r   r   r   r0            ?rJ   )r
   r	   rK   r   r   r   r   image_entropyr   r   rS   )r   r    	landscapeportraitZmove_idxZmove_maxZe_maxZcrop_currentZ	crop_bestr   ex_midy_midr*   r*   r+   r4      s.    r4   c                 C   sR   t j| dt jd}t j|tddd\}}||dk }t ||    S )N1)dtyper      )bins)r]   asarrayrs   uint8	histogramrangelog2sum)r   bandhist_r*   r*   r+   r|      s    r|   c                 C   s>   dd | D }dd | D }t t|t|  t|t|  S )Nc                 S   s   g | ]
}|j qS r*   )r   rP   poir*   r*   r+   rQ   
  rR   zcentroid.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r*   )r   r   r*   r*   r+   rQ     rR   )rS   r   r?   )rB   r   r   r*   r*   r+   r7   	  s    r7   c                 C   sj   d}d}d}| D ].}||j 7 }||j|j  7 }||j|j  7 }qt|oL|| }t|o\|| }t||S )Ng        )r8   r   r   roundrS   )rB   r    r8   r   r   r   Zavg_xZavg_yr*   r*   r+   r9     s    
r9   c                 C   s   | |kS Nr*   rj   rk   r*   r*   r+   r     s    r   c                 C   s   || kS r   r*   r   r*   r*   r+   r   !  s    r   c                 C   s   | |kS r   r*   r   r*   r*   r+   r   %  s    r   c                 C   s   d}d}t j| dd t j| |}t j|std| d| d t|}t|d}|	|j
 W d    n1 s|0    Y  t j|r|S d S )	Nzhttps://github.com/opencv/opencv_zoo/blob/91fb0290f50896f38a0ab1e558b74b16bc009428/models/face_detection_yunet/face_detection_yunet_2022mar.onnx?raw=truezface_detection_yunet.onnxT)exist_okz'downloading face detection model from 'z' to ''wb)osmakedirspathjoinexistsprintrequestsgetopenwritecontent)dirnamedownload_urlZmodel_file_name
cache_fileresponserF   r*   r*   r+   download_and_cache_models)  s    
*r   c                   @   s   e Zd ZdddZdd ZdS )	rS   r{   
   c                 C   s   || _ || _|| _|| _d S r   )r   r   r8   rK   )selfr   r   r8   rK   r*   r*   r+   __init__<  s    zPointOfInterest.__init__c                 C   s4   | j |d  | j|d  | j |d  | j|d  gS )Nr   )r   r   )r   rK   r*   r*   r+   r<   B  s
    zPointOfInterest.boundingN)r{   r   )__name__
__module____qualname__r   r<   r*   r*   r*   r+   rS   ;  s   
rS   c                   @   s   e Zd ZdddZdS )Settings   rI   FNc                 C   s4   || _ || _|| _|| _|| _|| _d| _|| _d S )NF)r   r   r1   r3   r5   r   r   rX   )r   r   r   r1   r3   r5   r   rX   r*   r*   r+   r   L  s    zSettings.__init__)r   r   rI   rI   rI   FN)r   r   r   r   r*   r*   r*   r+   r   K  s   r   )rY   r   r   numpyr]   PILr   r   r;   r@   r,   r   r6   r2   r4   r|   r7   r9   r   r   r   r   rS   r   r*   r*   r*   r+   <module>   s*   <D8 	