
    жf                     X    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 d Z	ddZ
ddZdS )    N)kmeans)tqdm)colorstrc                    | j                             d                              d          }|d         |d         z
  }| j        d         | j        d         z
  }|                                |                                k    rYt          d           | j                            d          | j        d d <   | j                             d          | j         d d <   d S d S )Nr   zReversing anchor order)anchor_gridprodviewstridesignprintanchorsflip)madadss       (/var/www/html/yolov7/utils/autoanchor.pycheck_anchor_orderr      s    	2##B''A	
21B	
"	#B	wwyyBGGII&'''y~~a((	!!!=--a00aaa           @  c           	      >   t          d          }t          d| dd           t          |d          r|j        j        d         n|j        d         }|| j        z  | j                            dd	
          z  }t          j        	                    dd|j
        d         df          }t          j        t          j        d t          ||z  | j                  D                                                                 fd}|j                                                                                            dd          }	 ||	          \  }
}t          d|dd|
dd           |
dk     rt          d           |j                                        dz  }	 t-          | ||dd          }	n+# t.          $ r}t          | d|            Y d }~nd }~ww xY w ||	          d         }||
k    r t          j        |	|j        j                                      |j                  }	|	                                                    |j                  |j        d d <   t9          |           |	                                                    |j                  |j                            |j        j                                      ddd          z  |j        d d <   t          | d           nt          | d           t          d           d S )Nautoanchor: 
zAnalyzing anchors...  endmoduler      Tkeepdims?g?r   )sizec                 6    g | ]\  }}|d d ddf         |z  S N       .0sls      r   
<listcomp>z!check_anchors.<locals>.<listcomp>   s0    %d%d%d1a1Q3i!m%d%d%dr   c                    d d d f         | d          z  }t          j        |d|z                                d          d         }|                    d          d         }|dz  k                                                        d                                          }|dz  k                                                                    }||fS N      ?   r   r    )torchminmaxfloatsummean)krxbestaatbprthrwhs         r   metriczcheck_anchors.<locals>.metric    s    qqq$wK!D'!Iaa  $$Q''*uuQxx{28|""$$((++0022b3h%%'',,..Cxr   r2   zanchors/target = .2fz, Best Possible Recall (BPR) = .4fg\(\?z/. Attempting to improve anchors, please wait...  F)nimg_sizer?   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.)r   r   hasattrr   modelshapesr5   nprandomuniformshaper3   tensorconcatenateziplabelsr6   r   clonecpur
   numelkmean_anchors	Exceptionr   rI   type_asview_asr   r   to)datasetrK   r?   imgszprefixr   rL   scalerA   r   r>   r=   naenew_bprr@   s     `            @r   check_anchorsrd      s"   n%%F	
,v
,
,
,"5555")%":":O2BAW^#gn&8&8T&8&J&JJFIc3fl1oq-ABBE	bn%d%dFUNT[Tb@c@c%d%d%dee	f	f	l	l	n	nB      m!!##''))..r155GvgHC	
Oc
O
O
Oc
O
O
OUWXXXX
Tzz?@@@]  ""a'	)#GrEsPT^cdddGG 	) 	) 	)V''A''((((((((	)&//!$S==l7193CDDDLLQYWWG&}}66q}EEAM!!!q!!!"==??2219==AIL\@]@]@b@bceghjk@l@llAIaaaLVpppqqqqVhhhiii	"IIIIIs   #F9 9
G!GG!./data/coco.yaml	   rD   Tc           
      \   dz  t          d          d fd}fd}t          | t                    rbt          |           5 }t	          j        |t          j                  }	ddd           n# 1 swxY w Y   dd	lm}
  |
|	d
         dd          }n| }|j	        z  |j	        
                    dd          z  }t          j        d t          ||j                  D                       dk                         d                                          }|r%t#           d| dt%                     d           dk                        d                   t#           d dt%                     d                               d          }t)          |z  d          \  }}t%          |          k    s,J t#           d dt%          |                                 ||z  }t+          j        t*          j                  t+          j        t*          j                   ||          }t          j        } ||          |j        ddf\  }}}}t5          t7          |           d           }|D ]}t          j        |          }|dk                                    rk|                    |          |k     |                                z   |j        | z  |z  dz                       d!d          }|dk                                    k|                                 |z                      d"          } ||          }||k    r0||                                 }} d#|d$|_!        |r ||            ||          S )%aD   Creates kmeans-evolved anchors from training dataset

        Arguments:
            path: path to dataset *.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()
    r1   r   c                     |d d d f         | d          z  }t          j        |d|z                                d          d         }||                    d          d         fS r0   )r3   r4   r5   )r9   r@   r:   r;   s       r   rA   zkmean_anchors.<locals>.metricR   s\    qqq$wK!D'!Iaa  $$Q''*!%%((1+~r   c                      t          j        | t           j                            \  }}||k                                    z                                  S )Ndtype)r3   rQ   float32r6   r8   )r9   _r<   rA   r?   r@   s      r   anchor_fitnessz%kmean_anchors.<locals>.anchor_fitnessX   sP    &au}===rBB4s
))+++11333r   c                    | t          j        |                     d                             }  |           \  }}|
k                                                                    |
k                                                                    z  }}t          	 d
dd|dd|dd           t          	 d d	 d
|                                dd|                                dd||
k                                             ddd           t          |           D ]Y\  }}t          dt          |d                   t          |d                   fz  |t          |           dz
  k     rdnd           Z| S )Nr    zthr=rB   z: rC   z best possible recall, z anchors past thrzn=z, img_size=z, metric_all=z.3f/z-mean/best, past_thr=z-mean: r   r   z%i,%ir   z,  r   )	rM   argsortr	   r6   r8   r   	enumerateroundlen)r9   r;   r<   r>   r=   irF   rA   rE   r_   r?   wh0s         r   print_resultsz$kmean_anchors.<locals>.print_results\   s   bj##$&C..43J%%'',,..S0A0A0F0F0H0H10LSbbSbbbbbbbbbbccc 9 91 9 9 9 9l 9 9tyy{{l 9 9AG*//++89 9 9>@	B 	B 	B 	BaLL 	_ 	_DAq'U1Q4[[%!++66QQRS^^EEY]^^^^^r   )LoaderNr   )LoadImagesAndLabelstrainT)augmentrectr    r!   c                 6    g | ]\  }}|d d ddf         |z  S r&   r)   r*   s      r   r.   z!kmean_anchors.<locals>.<listcomp>q   s0    PPPDAq!AAAqsF)a-PPPr   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)ERROR: scipy.cluster.vq.kmeans requested z points but returned only rj   r#   g?z(Evolving anchors with Genetic Algorithm:)descg333333?)r4   z3Evolving anchors with Genetic Algorithm: fitness = rC   )"r   
isinstancestropenyamlload
SafeLoaderutils.datasetsry   rL   r5   rM   rR   rS   rT   anyr7   r   rt   stdr   r3   rQ   rl   rN   rP   r   rangeonesallrandnclipcopyr   )pathrE   rF   r?   rG   rH   rn   rw   f	data_dictry   r]   rL   ru   r,   r9   distnprshmppbarrm   vkgfgrA   r_   r@   rv   s    ```                     @@@@r   rX   rX   >   sT   " s(Cn%%F  4 4 4 4 4 4 4	 	 	 	 	 	 	 	 	 	 $ $ZZ 	=1	!DO<<<I	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=666666%%i&8$TRRR &););A);)M)MMF
.PPC4O4OPPP
Q
QC 
s  A sqqqqCqqqrrr	cSja  	!B 
V
J
J
J
Js2ww
J
J
JKKK
q		AR!VQR(((GAtq66Q;;;wwRSwworstououwwxx;;;FA	b	.	.	.B
,s%-
0
0
0CaA )C!>!$$agsC7LAr2qc

F!T!T!TUUUD 
! 
!GBKKAvllnn 	_**R..2%5		2FJQNTTUXZ]^^A Avllnn 	_ffhhl  S ))^B66rwwyyqA!]]VW]]]DI !a   =s   !BBB)r   r   )re   rf   r   r   rD   T)numpyrM   r3   r   scipy.cluster.vqr   r   utils.generalr   r   rd   rX   r)   r   r   <module>r      s          # # # # # #       " " " " " "1 1 1$ $ $ $Nb b b b b br   