
    ՏkhJ                         d Z dZddl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ZddlmZ ddlZej                  d   Zedk(  rddlmZ ned	k(  rddlmZ d
 Z G d d      Zy)tylinz2.0    N   )mask)defaultdict   )urlretrieve   c                 6    t        | d      xr t        | d      S )N__iter____len__)hasattr)objs    L/var/www/teggl/fontify/venv/lib/python3.12/site-packages/pycocotools/coco.py_isArrayLiker   ?   s    3
#?Y(??    c                       e Zd ZddZd Zd Zg g g dfdZg g g fdZg g fdZg fdZ	g fd	Z
g fd
ZddZd Zdg fdZd Zd Zd Zy)COCONc                 x   t               t               t               t               f\  | _        | _        | _        | _        t        t              t        t              c| _        | _        |dk(  st        d       t        j                         }t        |d      5 }t        j                  |      }ddd       t              t         k(  sJ dj                  t        |                   t        dj                  t        j                         |z
               || _        | j!                          yy# 1 sw Y   xY w)a  
        Constructor of Microsoft COCO helper class for reading and visualizing annotations.
        :param annotation_file (str): location of annotation file
        :param image_folder (str): location to the folder that hosts images.
        :return:
        Nz"loading annotations into memory...rz'annotation file format {} not supportedzDone (t={:0.2f}s))dictdatasetannscatsimgsr   list	imgToAnns	catToImgsprinttimeopenjsonloadtypeformatcreateIndex)selfannotation_fileticfr   s        r   __init__zCOCO.__init__D   s     6:VDF46$&5P2TYty)4T):K<M&$&67))+Cos+ 'q))A,'=$&g(Q(X(XY]^eYf(gg&%,,TYY[#-=>?"DL '' 's   D00D9c                 |   t        d       i i i }}}t        t              t        t              }}d| j                  v r3| j                  d   D ]!  }||d      j	                  |       |||d   <   # d| j                  v r| j                  d   D ]
  }|||d   <    d| j                  v r| j                  d   D ]
  }|||d   <    d| j                  v r<d| j                  v r.| j                  d   D ]  }||d      j	                  |d           t        d       || _        || _        || _        || _        || _	        y )	Nzcreating index...annotationsimage_ididimages
categoriescategory_idzindex created!)
r   r   r   r   appendr   r   r   r   r   )	r&   r   r   r   r   r   annimgcats	            r   r%   zCOCO.createIndexX   sX   !"r2Dd)$/D0A)	DLL(||M2 &#j/*11#6"%SY& t||#||H- &"%SY& 4<<'||L1 &"%SY& DLL(\T\\-I||M2 F#m,-44S_EF 	 	""		r   c                     | j                   d   j                         D ]   \  }}t        dj                  ||             " y)zO
        Print information about the annotation file.
        :return:
        infoz{}: {}N)r   itemsr   r$   )r&   keyvalues      r   r7   z	COCO.infow   s<    
 ,,v.446 	/JC(//#u-.	/r   c                     t        |      r|n|g}t        |      r|n|g}t        |      t        |      cxk(  rt        |      cxk(  rdk(  rn n| j                  d   }nt        |      dk(  sT|D cg c]   }|| j                  v s| j                  |   " }}t	        t
        j                  j                  |            }n| j                  d   }t        |      dk(  r|n|D cg c]  }|d   |v s| c}}t        |      dk(  r|n'|D cg c]  }|d   |d   kD  s|d   |d   k  s| c}}|dk(  s|D cg c]  }|d   |k(  s|d    }	}|	S |D cg c]  }|d   	 }	}|	S c c}w c c}w c c}w c c}w c c}w )	a  
        Get ann ids that satisfy given filter conditions. default skips that filter
        :param imgIds  (int array)     : get anns for given imgs
               catIds  (int array)     : get anns for given cats
               areaRng (float array)   : get anns for given area range (e.g. [0 inf])
               iscrowd (boolean)       : get anns for given crowd label (False or True)
        :return: ids (int array)       : integer array of ann ids
        r   r,   r1   arear   Niscrowdr.   )r   lenr   r   r   	itertoolschainfrom_iterable)
r&   imgIdscatIdsareaRngr=   r   imgIdlistsr3   idss
             r   	getAnnIdszCOCO.getAnnIds   s    (/fX'/fXv;#f+:W::<<.Dv;!#<B^5et~~F].^^IOO99%@A||M2v;1,4$2g3#mJ\`fJf32gDw<1,4$  3A3#f+X_`aXbJbgjkqgru|}~ug3  3AD$(,JI'0I3t9JCJ 
 )--3t9-C-
 _ 3h 3AJ-s<   2E'E'%E,2E,E1E1*E1:E6E6E;c                 >   t        |      r|n|g}t        |      r|n|g}t        |      r|n|g}t        |      t        |      cxk(  rt        |      cxk(  rdk(  rn n| j                  d   }n| j                  d   }t        |      dk(  r|n|D cg c]  }|d   |v s| c}}t        |      dk(  r|n|D cg c]  }|d   |v s| c}}t        |      dk(  r|n|D cg c]  }|d   |v s| c}}|D cg c]  }|d   	 }}|S c c}w c c}w c c}w c c}w )aN  
        filtering parameters. default skips that filter.
        :param catNms (str array)  : get cats for given cat names
        :param supNms (str array)  : get cats for given supercategory names
        :param catIds (int array)  : get cats for given cat ids
        :return: ids (int array)   : integer array of cat ids
        r   r0   namesupercategoryr.   )r   r>   r   )r&   catNmssupNmsrC   r   r5   rG   s          r   	getCatIdszCOCO.getCatIds   s    (/fX'/fX'/fXv;#f+9V99<<-D<<-Dv;!+41h#VagIg#1hDv;!+41h#_I]agIg#1hDv;!+41h#TagIg#1hD$()Ss4y))
	 2i1h1h)s*   D D;DD#D0D;Dc                    t        |      r|n|g}t        |      r|n|g}t        |      t        |      cxk(  rdk(  r(n n%| j                  j                         }t        |      S t	        |      }t        |      D ]L  \  }}|dk(  r't        |      dk(  rt	        | j                  |         }2|t	        | j                  |         z  }N t        |      S )z
        Get img ids that satisfy given filter conditions.
        :param imgIds (int array) : get imgs for given ids
        :param catIds (int array) : get imgs with all given cats
        :return: ids (int array)  : integer array of img ids
        r   )r   r>   r   keysset	enumerater   r   )r&   rB   rC   rG   icatIds         r   	getImgIdszCOCO.getImgIds   s     (/fX'/fXv;#f+**)).."C Cy f+C%f- 656c#h!mdnnU34C3t~~e455C	6
 Cyr   c                     t        |      r|D cg c]  }| j                  |    c}S t        |      t        k(  r| j                  |   gS yc c}w )z
        Load anns with the specified ids.
        :param ids (int array)       : integer ids specifying anns
        :return: anns (object array) : loaded ann objects
        N)r   r   r#   intr&   rG   r.   s      r   loadAnnszCOCO.loadAnns   L     ,/0bDIIbM00#Y#IIcN##  1   Ac                     t        |      r|D cg c]  }| j                  |    c}S t        |      t        k(  r| j                  |   gS yc c}w )z
        Load cats with the specified ids.
        :param ids (int array)       : integer ids specifying cats
        :return: cats (object array) : loaded cat objects
        N)r   r   r#   rW   rX   s      r   loadCatszCOCO.loadCats   rZ   r[   c                     t        |      r|D cg c]  }| j                  |    c}S t        |      t        k(  r| j                  |   gS yc c}w )z
        Load anns with the specified ids.
        :param ids (int array)       : integer ids specifying img
        :return: imgs (object array) : loaded img objects
        N)r   r   r#   rW   rX   s      r   loadImgszCOCO.loadImgs   rZ   r[   c           
         t        |      dk(  ryd|d   v sd|d   v rd}nd|d   v rd}nt        d      |dk(  rddlm} dd	lm} dd
lm} |j                         }|j                  d       g }g }	|D ]p  }
t        j                  j                  d      dz  dz   j                         d   }d|
v rt        |
d         t        k(  ro|
d   D ]e  }t        j                  |      j!                  t#        t        |      dz        df      }|j%                   ||             |	j%                  |       g n;| j&                  |
d      }t        |
d   d         t        k(  r"t)        j*                  |
d   g|d   |d         }n|
d   g}t)        j,                  |      }t        j.                  |j0                  d   |j0                  d   df      }|
d   dk(  rt        j                  g d      dz  }|
d   dk(  r0t        j                  j                  d      j                         d   }t3        d      D ]  }|   |dddd|f<    |j5                  t        j6                  ||dz  f             d|
v rt        |
d         t        k(  rt        j                  | j9                  |
d         d   d         dz
  }t        j                  |
d         }|ddd   }|ddd   }|ddd   }|D ]9  }t        j:                  ||   dkD        s|j=                  ||   ||   d|       ; |j=                  ||dkD     ||dkD     dd|dd        |j=                  ||dkD     ||dkD     dd||d        |s|
d!   \  }}}}||g|||z   g||z   ||z   g||z   |gg}t        j                  |      j!                  d"      }|j%                   ||             |	j%                  |       s  |||	dd#      }|j?                  |        ||d$|	d%      }|j?                  |       y|dk(  r|D ]  }
tA        |
d           yy)&z
        Display the specified annotations.
        :param anns (array of object): annotations to display
        :return: None
        r   segmentation	keypoints	instancescaptioncaptionszdatasetType not supportedN)PatchCollection)PolygonF)r   r	   g333333?g?r   r-   countsheightwidthr   r	   r=   )g       @g     d@g     @Y@   g      ?r1   skeleton)	linewidthcoloro   k)
markersizemarkerfacecolormarkeredgecolormarkeredgewidthbbox)   r   )	facecolor
linewidthsalphanone)rx   
edgecolorsry   )!r>   	Exceptionmatplotlib.pyplotpyplotmatplotlib.collectionsrf   matplotlib.patchesrg   gcaset_autoscale_onnprandomtolistr#   r   arrayreshaperW   r2   r   	maskUtilsfrPyObjectsdecodeonesshaperangeimshowdstackr]   allplotadd_collectionr   ) r&   r   	draw_bboxdatasetTypepltrf   rg   axpolygonsrn   r3   csegpolytrlemr4   
color_maskrS   skskpxyvskbbox_xbbox_ybbox_wbbox_hnp_polyps                                    r   showAnnszCOCO.showAnns   s\    t9>T!W$tAw(>%K$q'!$K788+%+>2B&HE +$YY%%f-c1#5==?B!S(C/0D8#&~#6 ,C#%88C=#8#8#c#hqj/19M#ND$OOGDM:!LLO, !IIc*o6N 3H =>$F"+"7"7^9L8MqQY{\]^e\f"gC#&~#6"7C%,,S1 gg
AGGAJ'BDy>Q.)+2C)DS)HJy>Q.)+)9)9&)A)H)H)J1)MJ!&q 7A)3AC!AJ7		"))c1S5\";<#%$s;/?*@D*H((4==]1C#DQ#G
#STUVVC#k"23B14a4A14a4A14a4A! H66!B%'?HHQrU1R5AQHGH HHQqsVQqsVC1aaduvHwHHQqsVQqsVC1aabtuHv7:6{4VVVV#V,vvf}.EvW]^dWdGehnouhuw}g~D hhtn44U;GOOGG$45LLOW+$Z  EasSAa FuYZ[Aa J& &c)n%& 'r   c           	      *	   t               }t        j                  | j                  d         |j                  d<   | j                  d   D cg c]  }| c}|j                  d<   t	        d       t        j
                         }t        |      t        k(  st        dk(  r<t        |      t        k(  r*t        |      5 }t        j                  |      }ddd       n0t        |      t        j                  k(  r| j                  |      }n|}t              t         k(  sJ d       |D cg c]  }|d   	 }}t#        |      t#        |      t#        | j%                               z  k(  sJ d       d	|d
   v rt#        |j                  d   D cg c]  }|d   	 c}      t#        |D cg c]  }|d   	 c}      z  }	|j                  d   D cg c]  }|d   |	v s| c}|j                  d<   t'        |      D ]  \  }
}|
dz   |d<    nd|d
   v r|d
   d   g k(  st        j                  | j                  d         |j                  d<   t'        |      D ]Z  \  }
}|d   }|d
   |d
   |d   z   |d   |d   |d   z   g\  }}}}d|vr||||||||gg|d<   |d   |d   z  |d<   |
dz   |d<   d
|d<   \ nkd|d
   v rt        j                  | j                  d         |j                  d<   t'        |      D ]L  \  }
}t)        j*                  |d         |d<   d|vrt)        j,                  |d         |d<   |
dz   |d<   d
|d<   N nd|d
   v rt        j                  | j                  d         |j                  d<   t'        |      D ]  \  }
}|d   }|d
dd   }|ddd   }t        j.                  |      t        j0                  |      t        j.                  |      t        j0                  |      f\  }}}}||z
  ||z
  z  |d<   |
dz   |d<   ||||z
  ||z
  g|d<    t	        dj3                  t        j
                         |z
               ||j                  d<   |j5                          |S c c}w # 1 sw Y   txY wc c}w c c}w c c}w c c}w )z
        Load result file and return a result api object.
        :param   resFile (str)     : file name of result file
        :return: res (obj)         : result api object
        r7   r/   z Loading and preparing results...r   Nz"results in not an array of objectsr-   z-Results do not correspond to current coco setrd   r   r.   r   rv   r0   r	   ra   r<   r=   rb   zDONE (t={:0.2f}s)r,   )r   copydeepcopyr   r   r   r#   strPYTHON_VERSIONunicoder    r!   r"   r   ndarrayloadNumpyAnnotationsr   rQ   rU   rR   r   r<   toBboxminmaxr$   r%   )r&   resFileresr4   r(   r)   r   r3   
annsImgIdsrB   r.   bbx1x2y1y2sr   r   x0y0s                        r   loadReszCOCO.loadRes3  sy    f"mmDLL,@AF04X0F G GH01iik=CNa$7DMW<Tg $!yy|$ $']bjj(,,W5DDDzT!G#GG!156#c*o6
6:3z?S9I5J#JK 	?>	?KQs{{8/DE#d)EFimMnbecR\oMnIooF47KK4I$aSSQUYZ`M`S$aCKK!$T? !CqDD	!tAwtAwv"'<(,dll<6P(QCKK%$T? #C["$Q%Ar!ubeRU2a5[!IBB%,,.BBB+K*LC' eBqEkFqDD	!"I# tAw&(,dll<6P(QCKK%$T? #C'nnS-@AF}"+"2"23~3F"GCKqDD	!"I# DG#(,dll<6P(QCKK%$T? 2C$addGaddG ffQiBFF1IrvvayH2b!"ur"uoFFD	!"RU2b51F2 	!((c)9:;%)M"
k !H
$ $ 7 FMn$as0   	Q/;Q4'R
R%R
RR4Q>c           	      d   |t        d       yt        |      dk(  r| j                  j                         }n| j	                  |      }t        |      }t
        j                  j                  |      st        j                  |       t        |      D ]  \  }}t        j                         }t
        j                  j                  ||d         }t
        j                  j                  |      st        |d   |       t        dj                  ||t        j                         |z
                y)z
        Download COCO images from mscoco.org server.
        :param tarDir (str): COCO results directory name
               imgIds (list): images to be downloaded
        :return:
        NzPlease specify target directoryr   	file_namecoco_urlz$downloaded {}/{} images (t={:0.1f}s))r   r>   r   valuesr_   ospathexistsmakedirsrR   r   joinr   r$   )	r&   tarDirrB   r   NrS   r4   r(   fnames	            r   downloadzCOCO.downloadr  s     >34v;!99##%D==(DIww~~f%KKo 	YFAs))+CGGLL[)9:E77>>%(C
OU38??1diikSVFVWX	Yr   c           
         t        d       t        |      t        j                  k(  sJ t        |j                         |j                  d   dk(  sJ |j                  d   }g }t        |      D ]i  }|dz  dk(  rt        dj                  ||             |t        ||df         ||df   ||df   ||df   ||d	f   g||d
f   t        ||df         dgz  }k |S )z
        Convert result data from a numpy array [Nx7] where each row contains {imageID,x1,y1,w,h,score,class}
        :param  data (numpy.ndarray)
        :return: annotations (python nested list)
        zConverting ndarray to lists...r      r   i@B z{}/{}r   r	   rw         )r-   rv   scorer1   )r   r#   r   r   r   r   r$   rW   )r&   datar   r3   rS   s        r   r   zCOCO.loadNumpyAnnotations  s     	./DzRZZ'('djjzz!}!"!JJqMq 	A7{agnnQq)*!$q!t*o AJQT
DAJQT
Lq!t*"41:	  C	 
r   c                 .   | j                   |d      }|d   |d   }}|d   }t        |      t        k(  r.t        j                  |||      }t        j
                  |      }|S t        |d         t        k(  rt        j                  |||      }|S |d   }|S )z
        Convert annotation which can be polygons, uncompressed RLE to RLE.
        :return: binary mask (numpy 2D array)
        r-   ri   rj   ra   rh   )r   r#   r   r   r   merge)r&   r3   r   hwsegmrlesr   s           r   annToRLEzCOCO.annToRLE  s    
 IIc*o&{AgJ1>": ((q!4D//$'C 
 $x.!T)''a3C 
 n%C
r   c                 R    | j                  |      }t        j                  |      }|S )z
        Convert annotation which can be polygons, uncompressed RLE, or RLE to binary mask.
        :return: binary mask (numpy 2D array)
        )r   r   r   )r&   r3   r   r   s       r   	annToMaskzCOCO.annToMask  s'    
 mmC S!r   )N)F)__name__
__module____qualname__r*   r%   r7   rH   rN   rU   rY   r]   r_   r   r   r   r   r   r    r   r   r   r   C   s    (>/  ""b$ 8  ""R ,  "" *  	$  	$  	$J&X=~ !%r Y0.*r   r   )
__author____version__r!   r   numpyr   r   r?    r   r   r   collectionsr   sysversion_infor   urllibr   urllib.requestr   r   r   r   r   <module>r      se   
Z       	 # 
!!!$Q"q*@z zr   