U
    Hc                     @   sl   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m	Z	m
Z
 e	dZdd Zdd
dZdddZdS )z
AutoAnchor utils
    N)tqdm)LOGGERcolorstremojiszAutoAnchor: c                 C   sp   | j dd}|d |d  }| jd | jd  }| | krltt d | j d| j d d < d S )Nr   zReversing anchor order)	anchorsprodviewstridesignr   infoPREFIXflip)madads r   F/var/www/html/VideoAnalyticsDashboard/src/./yolov5/utils/autoanchor.pycheck_anchor_order   s    r         @  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jddd }|| dd\}	}
dt |
dd|	dd}|	dkrtt| d ntt| d |j d }zt| || ddd}W n8 tk
rx } ztt d|  W 5 d }~X Y nX ||d }||	krt	j
||jjd|j}| |j|j|jjddd |jd d < t| tt d ntt d 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>!   s     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summean)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_sizer5   genverbosezERROR: )devicezSNew anchors saved to model. Update model *.yaml to use these anchors in the future.zKOriginal anchors better than new anchors. Proceeding with original anchors.) hasattrr   modelshapesr*   nprandomuniformshaper(   tensorconcatenateziplabelsr+   r   cloner
   tor@   r	   cpur   r   r   r   numelkmean_anchors	Exceptiontype_asview_asr   )datasetrB   r5   imgszr   rC   scaler7   r   r3   r2   r#   naeZnew_bprr   r4   r   check_anchors   s.     *$
&
4rY   ./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 5 Q R X 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t d dt d d}|| ddd | }t|krtt dt| d d t|d d  }tjtjd tjtjd |	|d!d"}|||jd#d$f\}
}}}tt |t d%d&}|D ]}t!|}|dk" rT|||k t  |j#|  | d $d'd}q|% | j$dd(}||}||
kr||%  }
}t d)|
d*|_&|r|	|| q|	|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*   )r.   r6   r/   r0   r   r   r   r7   W   s    zkmean_anchors.<locals>.metricc                    s.    t j| t jd\}}||k   S )Ndtype)r(   rH   float32r+   r-   )r.   _r1   )r7   r5   r6   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}t| D ](\}}|dt|d t|d f 7 }q|rt	|d d  | S )Nr   zthr=r9   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   )
rD   argsortr   r+   r-   r   	enumerateroundr   r   )r.   r?   r0   r1   r3   r2   r#   i)r=   r7   r<   r5   wh0r   r   print_resultsa   s    &`"z$kmean_anchors.<locals>.print_resultsignore)errors)LoadImagesAndLabelstrain)augmentrectr   c                 S   s(   g | ] \}}|d d ddf | qS r   r   r!   r   r   r   r%   v   s     z!kmean_anchors.<locals>.<listcomp>g      @z(WARNING: Extremely small objects found. z of z labels are < 3 pixels in size.g       @zRunning kmeans for z anchors on z
 points...   )iterz/WARNING: scipy.cluster.vq.kmeans returned only z requested pointsr'   r]   F)r?   r   g?z(Evolving anchors with Genetic Algorithm:)descg333333?)r)   z3Evolving anchors with Genetic Algorithm: fitness = rb   )T)'Zscipy.cluster.vqr\   rD   rE   
isinstancestropenyaml	safe_loadutils.datasetsrm   rC   r*   rI   rJ   rK   anyr,   r   r   r   lenstdwarningsortrandreshaper(   rH   r_   rG   r   rangeonesallrandnclipcopyrs   )rT   r<   r=   r5   r>   r?   r\   Znprra   rj   f	data_dictrm   rC   rh   r#   r.   shmppbarr`   vkgfgr   )r=   r7   r<   r5   r6   ri   r   rP   A   sP    
  
  
4
rP   )r   r   )rZ   r[   r   r   r;   T)__doc__rE   numpyrD   r(   rw   r   utils.generalr   r   r   r   r   rY   rP   r   r   r   r   <module>   s   

%