
    NgI                         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dS )tylinz2.0    N   )mask)defaultdict   )urlretrieve   c                 B    t          | d          ot          | d          S )N__iter____len__)hasattr)objs    L/var/www/html/ai-engine/env/lib/python3.11/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dS )COCONc                    t                      t                      t                      t                      f\  | _        | _        | _        | _        t          t                    t          t                    c| _        | _        |dk    st          d           t          j
                    }t          |d          5 }t          j        |          }ddd           n# 1 swxY w Y   t          |          t           k    s*J d                    t          |                                t          d                    t          j
                    |z
                       || _        |                                  dS dS )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   sn    6:VVDFF466$&&5P2TYty)4T):):K<M<M&$&&6777)++Cos++ 'q)A,,' ' ' ' ' ' ' ' ' ' ' ' ' ' '==$&&&(Q(X(XY]^eYfYf(g(g&&&%,,TY[[#-=>>???"DL '&s   ;CC #C c                    t          d           i i i }}}t          t                    t          t                    }}d| j        v r<| j        d         D ].}||d                                      |           |||d         <   /d| j        v r| j        d         D ]}|||d         <   d| j        v r| j        d         D ]}|||d         <   d| j        v r@d| j        v r7| j        d         D ])}||d                                      |d                    *t          d           || _        || _        || _        || _        || _	        d S )	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)$//D0A0A)	DL((|M2 & &#j/*11#666"%SYt|##|H- & &"%SY4<''|L1 & &"%SYDL((\T\-I-I|M2 F F#m,-44S_EEEE 	""				r   c                     | j         d                                         D ](\  }}t          d                    ||                     )dS )zO
        Print information about the annotation file.
        :return:
        infoz{}: {}N)r   itemsr   r$   )r&   keyvalues      r   r7   z	COCO.infow   sS    
 ,v.4466 	/ 	/JC(//#u--....	/ 	/r   c                 z    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    s; fd|D             }t          t          j                            |                    }n j        d         }t                    dk    r|nfd|D             }t                    dk    r|nfd|D             }dk    sfd|D             }nd |D             }|S )	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,   c                 <    g | ]}|j         v j         |         S  )r   ).0imgIdr&   s     r   
<listcomp>z"COCO.getAnnIds.<locals>.<listcomp>   s,    ^^^5et~F]F].F]F]F]r   c                 (    g | ]}|d          v |S )r1   r=   )r>   r3   catIdss     r   r@   z"COCO.getAnnIds.<locals>.<listcomp>   s)    2g2g2g3#mJ\`fJfJf3JfJfJfr   c                 \    g | ](}|d          d         k    |d          d         k     &|)S )arear   r   r=   )r>   r3   areaRngs     r   r@   z"COCO.getAnnIds.<locals>.<listcomp>   sO      3A  3A  3A3#f+X_`aXbJbJbgjkqgru|}~ugg3gggr   Nc                 8    g | ]}|d          k    |d         S )iscrowdr.   r=   )r>   r3   rG   s     r   r@   z"COCO.getAnnIds.<locals>.<listcomp>   s+    JJJI'0I0I3t90I0I0Ir   c                     g | ]
}|d          S r.   r=   r>   r3   s     r   r@   z"COCO.getAnnIds.<locals>.<listcomp>   s    ---3t9---r   )r   lenr   r   	itertoolschainfrom_iterable)r&   imgIdsrB   rE   rG   r   listsidss   ` ```   r   	getAnnIdszCOCO.getAnnIds   s    (//=fX'//=fXv;;#f++::::W:::::::::<.DDv;;!##^^^^F^^^IO99%@@AA|M2v;;1,,442g2g2g2g$2g2g2gDw<<1,,44  3A  3A  3A  3A$  3A  3A  3AD$JJJJJJJCC-----C
r   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         }nv| j        d         }t                    dk    r|nfd|D             }t                    dk    r|nfd|D             }t                    dk    r|nfd|D             }d |D             }|S )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   c                 (    g | ]}|d          v |S )namer=   )r>   r5   catNmss     r   r@   z"COCO.getCatIds.<locals>.<listcomp>   s(    1h1h1h#VagIgIg#IgIgIgr   c                 (    g | ]}|d          v |S )supercategoryr=   )r>   r5   supNmss     r   r@   z"COCO.getCatIds.<locals>.<listcomp>   s)    1h1h1h#_I]agIgIg#IgIgIgr   c                 (    g | ]}|d          v |S rI   r=   )r>   r5   rB   s     r   r@   z"COCO.getCatIds.<locals>.<listcomp>   s(    1h1h1h#TagIgIg#IgIgIgr   c                     g | ]
}|d          S rI   r=   )r>   r5   s     r   r@   z"COCO.getCatIds.<locals>.<listcomp>   s    )))Ss4y)))r   )r   rK   r   )r&   rV   rY   rB   r   rQ   s    ```  r   	getCatIdszCOCO.getCatIds   sM    (//=fX'//=fX'//=fXv;;#f++9999V999999999<-DD<-Dv;;!++441h1h1h1h1h1h1hDv;;!++441h1h1h1h1h1h1hDv;;!++441h1h1h1h1h1h1hD))D)))
r   c                    t          |          r|n|g}t          |          r|n|g}t          |          t          |          cxk    rdk    rn n| j                                        }nut	          |          }t          |          D ]V\  }}|dk    r.t          |          dk    rt	          | j        |                   }9|t	          | j        |                   z  }Wt          |          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   rK   r   keysset	enumerater   r   )r&   rO   rB   rQ   icatIds         r   	getImgIdszCOCO.getImgIds   s     (//=fX'//=fXv;;#f++*********)..""CCf++C%f-- 6 6566c#hh!mmdnU344CC3t~e4555CCCyyr   c                      t          |          r fd|D             S t          |          t          k    r j        |         gS dS )z
        Load anns with the specified ids.
        :param ids (int array)       : integer ids specifying anns
        :return: anns (object array) : loaded ann objects
        c                 *    g | ]}j         |         S r=   )r   r>   r.   r&   s     r   r@   z!COCO.loadAnns.<locals>.<listcomp>       000bDIbM000r   N)r   r#   intr   r&   rQ   s   ` r   loadAnnszCOCO.loadAnns   W      	$0000C0000#YY#IcN## r   c                      t          |          r fd|D             S t          |          t          k    r j        |         gS dS )z
        Load cats with the specified ids.
        :param ids (int array)       : integer ids specifying cats
        :return: cats (object array) : loaded cat objects
        c                 *    g | ]}j         |         S r=   )r   rf   s     r   r@   z!COCO.loadCats.<locals>.<listcomp>   rg   r   N)r   r#   rh   r   ri   s   ` r   loadCatszCOCO.loadCats   rk   r   c                      t          |          r fd|D             S t          |          t          k    r j        |         gS dS )z
        Load anns with the specified ids.
        :param ids (int array)       : integer ids specifying img
        :return: imgs (object array) : loaded img objects
        c                 *    g | ]}j         |         S r=   )r   rf   s     r   r@   z!COCO.loadImgs.<locals>.<listcomp>   rg   r   N)r   r#   rh   r   ri   s   ` r   loadImgszCOCO.loadImgs   rk   r   Fc           
      &
   t          |          dk    rdS 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} |                                }|	                    d           g }g }	|D ]}
t          j                            d          dz  dz                                   d         }d|
v rt          |
d                   t          k    r|
d         D ]{}t          j        |                              t#          t          |          dz            df          }|                     ||                     |	                    |           |nc| j        |
d                  }t          |
d         d                   t          k    r*t)          j        |
d         g|d         |d                   }n	|
d         g}t)          j        |          }t          j        |j        d         |j        d         df          }|
d         dk    rt          j        g d          dz  }|
d         dk    r7t          j                            d                                          d         }t3          d          D ]}||         |dddd|f<   |                    t          j        ||dz  f                     d|
v r>t          |
d                   t          k    rt          j        |                     |
d                   d         d                   dz
  }t          j        |
d                   }|ddd         }|ddd         }|ddd         }|D ]E}t          j        ||         dk              r%|                    ||         ||         d|           F|                    ||dk             ||dk             dd|dd            |                    ||dk             ||dk             dd||d            |r|
d!         \  }}}}||g|||z   g||z   ||z   g||z   |gg}t          j        |                              d"          }|                     ||                     |	                    |            |||	dd#          }|                    |            ||d$|	d%          }|                    |           dS |dk    r|D ]}
tA          |
d                    dS dS )&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	   rG   )g       @g     d@g     @Y@   g      ?r1   skeleton)	linewidthcoloro   k)
markersizemarkerfacecolormarkeredgecolormarkeredgewidthbbox)   r   )	facecolor
linewidthsalphanone)r   
edgecolorsr   )!rK   	Exceptionmatplotlib.pyplotpyplotmatplotlib.collectionsrx   matplotlib.patchesry   gcaset_autoscale_onnprandomtolistr#   r   arrayreshaperh   r2   r   	maskUtilsfrPyObjectsdecodeonesshaperangeimshowdstackrn   allplotadd_collectionr   ) r&   r   	draw_bboxdatasetTypepltrx   ry   axpolygonsr   r3   csegpolytrlemr4   
color_maskra   skskpxyvskbbox_xbbox_ybbox_wbbox_hnp_polyps                                    r   showAnnszCOCO.showAnns   sn    t99>>1T!W$$tAw(>(>%KK$q'!!$KK7888+%%++++++>>>>>>222222B&&&HE +$ +$Y%%f--c1#5==??B!S((C/00D88#&~#6 , ,C#%8C==#8#8#c#hhqj//19M#N#ND$OOGGDMM:::!LLOOOO, !Ic*o6N 3H =>>$FF"+"7^9L8MqQY{\]^e\f"g"gCC#&~#6"7C%,S11 g
AGAJ'BDDy>Q..)+2C2C2C)D)DS)HJy>Q..)+)9)9&)A)A)H)H)J)J1)MJ!&q 7 7A)3AC!!!AJJ		")c1S5\";";<<<#%%$s;/?*@*@D*H*H(4==]1C#D#DQ#G
#STTUVVC#k"233B14a4A14a4A14a4A! H H6!B%'?? HHHQrU1R5AQHGGGHHQqsVQqsVC1aaduvHwwwHHQqsVQqsVC1aabtuHvvv $7:6{4VVVV#V,vvf}.EvW]^dWdGehnouhuw}g~D htnn44U;;GOOGGG$4$4555LLOOOEasSSSAa   FuYZ[[[Aa     J&& & &c)n%%%% '&& &r   c           	      	   t                      }d | j        d         D             |j        d<   t          d           t          j                    }t	          |          t
          k    s#t          dk    rTt	          |          t          k    r<t          |          5 }t          j
        |          }ddd           n# 1 swxY w Y   n5t	          |          t          j        k    r|                     |          }n|}t	          |          t          k    s
J d            d |D             }t          |          t          |          t          |                                           z  k    s
J d            d	|d
         v r~t          d |j        d         D                       t          d |D                       z  fd|j        d         D             |j        d<   t#          |          D ]\  }}|dz   |d<   n8d|d
         v r|d
         d         g k    st%          j        | j        d                   |j        d<   t#          |          D ]u\  }}|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<   vnnd|d
         v rt%          j        | j        d                   |j        d<   t#          |          D ]P\  }}t)          j        |d                   |d<   d|vrt)          j        |d                   |d<   |dz   |d<   d
|d<   Qnd|d
         v rt%          j        | j        d                   |j        d<   t#          |          D ]\  }}|d         }|d
dd         }|ddd         }t          j        |          t          j        |          t          j        |          t          j        |          f\  }}
}}|
|z
  ||z
  z  |d<   |dz   |d<   |||
|z
  ||z
  g|d<   t          d                    t          j                    |z
                       ||j        d<   |                                 |S )z
        Load result file and return a result api object.
        :param   resFile (str)     : file name of result file
        :return: res (obj)         : result api object
        c                     g | ]}|S r=   r=   r>   r4   s     r   r@   z COCO.loadRes.<locals>.<listcomp>:  s     G G G G G Gr   r/   z Loading and preparing results...r   Nz"results in not an array of objectsc                     g | ]
}|d          S r-   r=   rJ   s     r   r@   z COCO.loadRes.<locals>.<listcomp>F  s    666#c*o666r   z-Results do not correspond to current coco setrv   r   c                     g | ]
}|d          S rI   r=   r   s     r   r@   z COCO.loadRes.<locals>.<listcomp>J  s    EEE#d)EEEr   c                     g | ]
}|d          S r   r=   rJ   s     r   r@   z COCO.loadRes.<locals>.<listcomp>J  s    MnMnMnbecR\oMnMnMnr   c                 (    g | ]}|d          v |S rI   r=   )r>   r4   rO   s     r   r@   z COCO.loadRes.<locals>.<listcomp>K  s)    $a$a$aSSQUYZ`M`M`SM`M`M`r   r   r.   r   r0   r	   rs   rD   rG   rt   zDONE (t={:0.2f}s)r,   )r   r   r   r   r#   strPYTHON_VERSIONunicoder    r!   r"   r   ndarrayloadNumpyAnnotationsr   r_   rc   r`   copydeepcopyr   rD   toBboxminmaxr$   r%   )r&   resFileresr(   r)   r   
annsImgIdsr.   r3   bbx1x2y1y2sr   r   x0y0rO   s                      @r   loadReszCOCO.loadRes3  s    ff G GX0F G G GH0111ikk==CNa$7$7DMMW<T<Tg $!y||$ $ $ $ $ $ $ $ $ $ $ $ $ $ $']]bj((,,W55DDDDzzT!!!#G!!!66666
:3z??S9I9I5J5J#JKKK> LKKQEEs{8/DEEEFFMnMnimMnMnMnIoIooF$a$a$a$aCK4I$a$a$aCK!$T?? ! !CqDD		!tAwtAwv"'<'<(,dl<6P(Q(QCK%$T?? # #C["$Q%Ar!ubeRU2a5[!IBB%,,,.BBB+K*LC' eBqEkFqDD	!"I# tAw&&(,dl<6P(Q(QCK%$T?? # #C'nS-@AAF}}"+"23~3F"G"GCKqDD	!"I# DG##(,dl<6P(Q(QCK%$T?? 2 2C$addGaddG fQiiBF1IIrvayyH2b!"ur"uoFFD	!"RU2b51F!((c)9::;;;%)M"
s   B<<C C c           	         |t          d           dS t          |          dk    r| j                                        }n|                     |          }t          |          }t
          j                            |          st          j        |           t          |          D ]\  }}t          j
                    }t
          j                            ||d                   }t
          j                            |          st          |d         |           t          d                    ||t          j
                    |z
                       dS )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   rK   r   valuesrq   ospathexistsmakedirsr`   r   joinr   r$   )	r&   tarDirrO   r   Nra   r4   r(   fnames	            r   downloadzCOCO.downloadq  s+    >34442v;;!9##%%DD==((DIIw~~f%% 	 Koo 	Y 	YFAs)++CGLL[)9::E7>>%(( 4C
OU3338??1dikkSVFVWWXXXX	Y 	Yr   c           
         t          d           t          |          t          j        k    sJ t          |j                   |j        d         dk    sJ |j        d         }g }t          |          D ]}|dz  dk    r#t          d                    ||                     |t          ||df                   ||df         ||df         ||df         ||d	f         g||d
f         t          ||df                   dgz  }|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	   r         )r-   r   scorer1   )r   r#   r   r   r   r   r$   rh   )r&   datar   r3   ra   s        r   r   zCOCO.loadNumpyAnnotations  s    	.///DzzRZ''''djz!}!!!!JqMq 	 	A7{agnnQq))***!$q!t*oo AJQT
DAJQT
Lq!t*"41:	   CC 
r   c                 \   | j         |d                  }|d         |d         }}|d         }t          |          t          k    r+t          j        |||          }t          j        |          }n=t          |d                   t          k    rt          j        |||          }n|d         }|S )z
        Convert annotation which can be polygons, uncompressed RLE to RLE.
        :return: binary mask (numpy 2D array)
        r-   r{   r|   rs   rz   )r   r#   r   r   r   merge)r&   r3   r   hwsegmrlesr   s           r   annToRLEzCOCO.annToRLE  s    
 Ic*o&{AgJ1>":: (q!44D/$''CC$x.!!T))'a33CC n%C
r   c                 X    |                      |          }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   rR   r\   rc   rj   rn   rq   r   r   r   r   r   r   r=   r   r   r   r   C   s]          (  >/ / /  ""b$    8  ""R    ,  ""    *  	$ 	$ 	$ 	$  	$ 	$ 	$ 	$  	$ 	$ 	$ 	$J& J& J& J&X< < <| !%r Y Y Y Y0  .  *    r   r   )
__author____version__r!   r   numpyr   r   rL    r   r   r   collectionsr   sysversion_infor   urllibr   urllib.requestr   r   r=   r   r   <module>r     s  
Z                  				 # # # # # # 



!!$Q"""""""q******@ @ @y y y y y y y y y yr   