o
    Ďi                     @   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   s   | j ddd}|d |d  }| jd | jd  }|r=| | kr?tt d | j 	d| j d d < d S d S d S )Nr   zReversing anchor order)
anchorsprodmeanviewstridesignr   infoPREFIXflip)madads r   S/home/jeff/fluffinator/venv/lib/python3.10/site-packages/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rt| d d S t| 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   (   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_sizer9   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labelsr0   r   tor   rD   r   clonecpur   r   r   numelkmean_anchorstype_asview_asr   )datasetrF   r9   imgszr   rG   scaler;   r   r   r7   r6   r'   nanew_bprr   r8   r   check_anchors   s.    *
r\   ./data/coco128.yaml	   r?   Tc              	      s  ddl m} tj}d dd fdd}d+ fd	d
	}	t| trSt| dd}
t|
}W d   n1 s?w   Y  ddl	m
} ||d ddd}  | j | jjddd }tdd t|| jD dk d }|rtt d| dt d dkd tjz4tt d dt d tksJ d}|| ddd | }t|ksJ W n! ty   tt d t|d d  }Y nw d d! fD \|	|d"d#}|||jd$d%f\}
}}}tt |t!d&}|D ]Y}t"|}|dk# rA|||k t  |j$|  | d %d'd}|dk# s"|& | j%dd(}||}||
krl||& }
}t d)|
d*|_'|rl|	|| q|	|tjS ),aI   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 yolov5.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/   )r2   r:   r3   r4   r   r   r   r;   Y   s   zkmean_anchors.<locals>.metricc                    s.    t j| t jd\}}||k   S )Ndtype)r-   rL   float32r0   r
   )r2   _r5   )r;   r9   r:   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 }qV|rtt|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   )	rH   argsortr	   r0   r
   r   roundr   r   )r2   rC   r4   r5   r7   r6   r'   )rA   r;   r@   r9   wh0r   r   print_resultsc   s*   &"z$kmean_anchors.<locals>.print_resultsignore)errorsN)LoadImagesAndLabelstrain)augmentrectr   c                 S   r!   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-   rL   rb   )r&   r4   r   r   r   	<genexpr>   s    z kmean_anchors.<locals>.<genexpr>F)rC   r   g?)
bar_formatg333333?)r.   z3Evolving anchors with Genetic Algorithm: fitness = re   )T)(scipy.cluster.vqr_   rH   rI   
isinstancestropenyaml	safe_loadyolov5.utils.dataloadersrn   rG   r/   rM   rN   rO   anyr1   r   r   r   lenastyperb   std	ExceptionwarningsortrandreshaperK   r   ranger   onesallrandnclipcopydesc)rW   r@   rA   r9   rB   rC   r_   nprrd   rk   f	data_dictrn   rG   ir'   r2   shmppbarrc   vkgfgr   )rA   r;   r@   r9   r:   rj   r   rT   C   s\   
  
$
0

rT   )r   r   )r]   r^   r   r   r?   T)__doc__rI   numpyrH   r-   rz   r   yolov5.utilsr   yolov5.utils.generalr   r   r   r   r   r\   rT   r   r   r   r   <module>   s   
%