a
    Df                     @   s   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZ edZdd Zee d	dddZdddZdS )z
AutoAnchor utils
    N)tqdm)	TryExcept)LOGGERTQDM_BAR_FORMATcolorstrzAutoAnchor: c                 C   sz   | j ddd}|d |d  }| jd | jd  }|rv| | krvtt d | j 	d| j d d < d S )Nr   zReversing anchor order)
anchorsprodmeanviewstridesignr   infoPREFIXflip)madads r   F/data/NAS7/SABIOD/METHODE/ermites/yolo-dyni/yolov5/utils/autoanchor.pycheck_anchor_order   s    r   ERROR      @  c                    s  t |dr|jjd n|jd }|| j | jjddd }tjjdd|jd dfd	}t	
td
d t|| | jD   fdd}|j|jjddd}|j | }	||	 dd\}
}dt |dd|
dd}|
dkrt| d nt| d |j d }t| || ddd}	||	d }||
krt	j
|	|jjd|j}	|	 |j|jd d < t| | j|  _t d}n
t d}t| d S )Nmoduler      Tkeepdims?g?r   )sizec                 S   s(   g | ] \}}|d d ddf | qS N      r   .0slr   r   r   
<listcomp>#       z!check_anchors.<locals>.<listcomp>c                    sv   d d d f | d   }t |d| dd }|dd }|d  k d }|d  k  }||fS Nr      r   )torchminmaxfloatsumr
   )krxbestaatbprthrwhr   r   metric%   s    zcheck_anchors.<locals>.metricr+   
.2fz anchors/target, .3fz Best Possible Recall (BPR). g\(\?u-   Current anchors are a good fit to dataset ✅uB   Anchors are a poor fit to dataset ⚠️, attempting to improve...  F)nimg_sizer8   genverbose)deviceuK   Done ✅ (optional: update model *.yaml to use these anchors in the future)uX   Done ⚠️ (original anchors better than new anchors, proceeding with original anchors))hasattrr   modelshapesr.   nprandomuniformshaper,   tensorconcatenateziplabelsr/   r   tor   rC   r   clonecpur   r   r   numelkmean_anchorstype_asview_asr   )datasetrE   r8   imgszr   rF   scaler:   r   r   r6   r5   r&   naZnew_bprr   r7   r   check_anchors   s.     *


rZ   ./data/coco128.yaml	   r>   Tc              	      s  ddl m} tj}d dd fdd}d+ fd	d
	}	t| trt| dd}
t|
}W d   n1 s~0    Y  ddl	m
} ||d ddd}  | j | jjddd }tdd t|| jD dk d }|rtt d| dt d dkd tjzltt d dt d tksbJ d}|| ddd | }t|ksJ W nD ty   tt d t|d d  }Y n0 d d! fD \|	|d"d#}|||jd$d%f\}
}}}tt |t!d&}|D ]}t"|}|dk# r|||k t  |j$|  | d %d'd}q>|& | j%dd(}||}||
kr0||&  }
}t d)|
d*|_'|r0|	|| q0|	|tjS ),aB   Creates kmeans-evolved anchors from training dataset

        Arguments:
            dataset: path to data.yaml, or a loaded dataset
            n: number of anchors
            img_size: image size used for training
            thr: anchor-label wh ratio threshold hyperparameter hyp['anchor_t'] used for training, default=4.0
            gen: generations to evolve anchors using genetic algorithm
            verbose: print all results

        Return:
            k: kmeans evolved anchors

        Usage:
            from utils.autoanchor import *; _ = kmean_anchors()
    r   )kmeansr   c                 S   sD   |d d d f | d   }t |d| dd }||dd fS r*   )r,   r-   r.   )r1   r9   r2   r3   r   r   r   r:   Y   s    zkmean_anchors.<locals>.metricc                    s.    t j| t jd\}}||k   S )Ndtype)r,   rK   float32r/   r
   )r1   _r4   )r:   r8   r9   r   r   anchor_fitness_   s    z%kmean_anchors.<locals>.anchor_fitnessTc                    s   | t | d } | \}}|k  |k    }}t ddd|dd|ddt d d	  d
| dd| dd||k  dd}| D ]$}|dt|d t|d f 7 }q|rt|d d  | S )Nr   zthr=r<   z: .4fz best possible recall, z anchors past thr
zn=z, img_size=z, metric_all=r=   /z-mean/best, past_thr=z-mean: z%i,%i, r   )	rG   argsortr	   r/   r
   r   roundr   r   )r1   rB   r3   r4   r6   r5   r&   )r@   r:   r?   r8   wh0r   r   print_resultsc   s*    &"z$kmean_anchors.<locals>.print_resultsignore)errorsN)LoadImagesAndLabelstrain)augmentrectr   c                 S   s(   g | ] \}}|d d ddf | qS r!   r   r$   r   r   r   r(   x   r)   z!kmean_anchors.<locals>.<listcomp>g      @u.   WARNING ⚠️ Extremely small objects found: z of z labels are <3 pixels in sizeg       @zRunning kmeans for z anchors on z
 points...   )iteru>   WARNING ⚠️ switching strategies from kmeans to random initr+   c                 s   s   | ]}t j|t jd V  qdS )r^   N)r,   rK   r`   )r%   r3   r   r   r   	<genexpr>   r)   z kmean_anchors.<locals>.<genexpr>F)rB   r   g?)
bar_formatg333333?)r-   z3Evolving anchors with Genetic Algorithm: fitness = rc   )T)(Zscipy.cluster.vqr]   rG   rH   
isinstancestropenyaml	safe_loadutils.dataloadersrl   rF   r.   rL   rM   rN   anyr0   r   r   r   lenastyper`   std	ExceptionwarningsortrandreshaperJ   r   ranger   onesallrandnclipcopydesc)rV   r?   r@   r8   rA   rB   r]   nprrb   ri   f	data_dictrl   rF   ir&   r1   shmppbarra   vkgfgr   )r@   r:   r?   r8   r9   rh   r   rS   C   sT    
(  
&
4
rS   )r   r   )r[   r\   r   r   r>   T)__doc__rH   numpyrG   r,   rw   r   utilsr   utils.generalr   r   r   r   r   rZ   rS   r   r   r   r   <module>   s   
%