
    "f                     V    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y)
    N)kmeans)tqdm)colorstrc                    | j                   j                  d      j                  d      }|d   |d   z
  }| j                  d   | j                  d   z
  }|j	                         |j	                         k7  r\t        d       | j                  j                  d      | j                  d d  | j                   j                  d      | j                   d d  y y )Nr   zReversing anchor order)anchor_gridprodviewstridesignprintanchorsflip)madadss       4C:\work2\python\work_new2\yolov7\utils\autoanchor.pycheck_anchor_orderr      s    	2##B'A	
21B	
"	#B	wwyBGGI&'yy~~a(		!==--a0a     c                 <   t        d      }t        d| dd       t        |d      r|j                  j                  d   n|j                  d   }|| j
                  z  | j
                  j                  dd	
      z  }t        j                  j                  dd|j                  d   df      }t        j                  t        j                  t        ||z  | j                        D 	cg c]  \  }}	|	d d ddf   |z   c}	}            j!                         fd}
|j"                  j%                         j'                         j)                  dd      } |
|      \  }}t        d|dd|dd       |dk  rdt        d       |j"                  j+                         dz  }	 t-        | ||dd      } |
|      d   }||kD  rt        j                  ||j0                  j2                        j5                  |j0                        }|j%                         j7                  |j"                        |j"                  d d  t9        |       |j%                         j7                  |j0                        |j:                  j=                  |j0                  j2                        j)                  ddd      z  |j0                  d d  t        | d       nt        | d       t        d       y c c}	}w # t.        $ r}t        | d|        Y d }~[d }~ww xY w) Nautoanchor: 
zAnalyzing anchors...  endmoduler      Tkeepdims?g?r   )size      c                 V   d d d f   | d    z  }t        j                  |d|z        j                  d      d   }|j                  d      d   }|dz  kD  j                         j	                  d      j                         }|dz  kD  j                         j                         }||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    q$wK!D'!IIaa $$Q'*uuQx{28|""$((+002b3h%%',,.Cxr   r(   zanchors/target = .2fz, Best Possible Recall (BPR) = .4fg\(\?z/. Attempting to improve anchors, please wait...  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.)r   r   hasattrr   modelshapesr+   nprandomuniformshaper)   tensorconcatenateziplabelsr,   r   clonecpur
   numelkmean_anchors	Exceptionr   r?   type_asview_asr   r   to)datasetrA   r5   imgszprefixr   rB   scaleslr7   r   r4   r3   naenew_bprr6   s     `              @r   check_anchorsr\      s   n%F	Bvh+
,"5")%":2BAW^^#gnn&8&8T&8&JJFIIc3fll1oq-ABE	bnnFUNT[TbTb@c%d@c1a1Q3i!m@c%de	f	l	l	nB mm!!#'')..r15GgHC	c#Y&Ec#Y
OUWX
Tz?@]]  "a'	)#GrEsPT^cdG /!$S=ll71993C3CDLLQYYWG&}}66q}}EAMM!q!"==?22199=AIIL\L\@]@b@bceghjk@llAIIaLVHopqVHghi	"I; &e$  	)VHGA3'((	)s   +K1*K7 7	L LLc           
         dz  t        d      d fd}fd}t        | t              rNt        |       5 }t	        j
                  |t        j                        }	ddd       dd	lm}
  |
	d
   dd      }n| }|j                  z  |j                  j                  dd      z  }t        j                  t        ||j                        D cg c]  \  }}|ddddf   |z   c}}      dk  j                  d      j!                         }|rt#         d| dt%               d       dk\  j                  d         t#         d dt%               d       j'                  d      }t)        |z  d      \  }}t%        |      k(  s!J t#         d dt%        |                    ||z  }t+        j,                  t*        j.                        t+        j,                  t*        j.                         ||      }t        j0                  } ||      |j2                  ddf\  }}}}t5        t7        |       d !      }|D ]  }t        j8                  |      }|dk(  j;                         r_|j1                  |      |k  |j1                         z   |j<                  | z  |z  dz   j?                  d"d      }|dk(  j;                         r_|jA                         |z  j?                  d#      } ||      }||kD  s||jA                         }} d$|d%|_!        |s ||         ||      S # 1 sw Y   xY wc c}}w )&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()
    r'   r   c                     |d d d f   | d    z  }t        j                  |d|z        j                  d      d   }||j                  d      d   fS r&   )r)   r*   r+   )r/   r6   r0   r1   s       r   r7   zkmean_anchors.<locals>.metricR   sR    q$wK!D'!IIaa $$Q'*!%%(1+~r   c                      t        j                  | t         j                              \  }}||kD  j                         z  j	                         S )Ndtype)r)   rG   float32r,   r.   )r/   _r2   r7   r5   r6   s      r   anchor_fitnessz%kmean_anchors.<locals>.anchor_fitnessX   sC    au}}=rB4s
))++1133r   c                 p   | t        j                  | j                  d               }  |       \  }}|
kD  j                         j	                         |
kD  j                         j	                         z  }}t        	 d
dd|dd|dd       t        	 d d	 d
|j	                         dd|j	                         dd||
kD     j	                         ddd       t        |       D ]B  \  }}t        dt        |d         t        |d         fz  |t        |       dz
  k  rdnd       D | S )Nr   zthr=r8   z: r9   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   )	rC   argsortr	   r,   r.   r   	enumerateroundlen)r/   r1   r2   r4   r3   ir<   r7   r;   rU   r5   wh0s         r   print_resultsz$kmean_anchors.<locals>.print_results\   s9   bjj#$C.43J%%',,.S0A0F0F0H10LSSIRCy0GCyPabc1#[
-~Qtyy{[^N_ `AG*//+C09>@	BaLDAq'U1Q4[%!+66QQRS^EY]^ !r   )LoaderNr   )LoadImagesAndLabelstrainT)augmentrectr   r   r#   r$   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 r`   r!   g?z(Evolving anchors with Genetic Algorithm:)descg333333?)r*   z3Evolving anchors with Genetic Algorithm: fitness = r9   )"r   
isinstancestropenyamlload
SafeLoaderutils.datasetsro   rB   r+   rC   rH   rI   rJ   anyr-   r   rj   stdr   r)   rG   rb   rD   rF   r   rangeonesallrandnclipcopyru   )pathr;   r<   r5   r=   r>   rd   rm   f	data_dictro   rS   rB   rW   rX   rk   r/   distnprshmppbarrc   vkgfgr7   rU   r6   rl   s    ```                      @@@@r   rN   rN   >   s"   " s(Cn%F4	 	 $$Z1		!DOO<I 6%i&8$TR &););A);)MMF
..C4OP4ODAq!AqsF)a-4OP
QC 
s A@4CzQpqr	cSja 	!B 
VH's,s2wiz
JK
q	AR!VQR(GAtq6Q;x(QRSQTTnorstounvwxx;FA	b	.B
,,s%--
0CaA ))C!!$aggsC7LAr2qc
F8+S!TUDGGBKAvlln**R.2%5			2FJQNTTUXZ]^A Avllnffhl  S )B6rwwyqA!("UVWX[U\]DIa   q Z Qs   &M!M#
M )      @  )z./data/coco.yaml	   r   r   r:   T)numpyrC   r)   ry   scipy.cluster.vqr   r   utils.generalr   r   r\   rN    r   r   <module>r      s*       #  "1$Nbr   