o
    Ďi:                     @   s   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 h dZh dZ	h dZ
d	d
 Zd0ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ ZdS )1    N)defaultdict)tqdm   )load_labelmap>   .bmp.jpg.png.tif.avif.heic.jpeg.tiff>   .txt.xml.csv.json.jsonl>   .yml.yaml.labelsc                 C   s   |  ddS )zm
    Replace Windows style slashes to keep filenames consistent.

    Roboflow depend on it server side.
    \/)replace)filename r   V/home/jeff/fluffinator/venv/lib/python3.10/site-packages/roboflow/util/folderparser.py
_patch_sep   s   r   Fc                 C   s   t |  d} tj| std|  t| }dd |D }t| t	| dd |D }dd |D }t
| |}t|| t||sPt| |}t|| |rVt| | |dS )Nr   zfolder does not exist. c                 S      g | ]
}|d  t v r|qS 	extension)IMAGE_EXTENSIONS.0fr   r   r   
<listcomp>       zparsefolder.<locals>.<listcomp>c                 S   r   r   )ANNOTATION_EXTENSIONSr!   r   r   r   r$       r%   c                 S   r   r   )LABELMAPS_EXTENSIONSr!   r   r   r   r$   !   r%   )locationimages)r   striprstripospathexists	Exception_list_files_add_indices_decide_split_load_labelmaps_map_labelmaps_to_annotations_map_annotations_to_images_1to1_loadAnnotations"_map_annotations_to_images_1tomany)_infer_classification_labels_from_folders)folderis_classificationfilesr)   annotations	labelmapsr   r   r   parsefolder   s&   




r>   c                 C   sT   t j| d } td| }|r&|d}|d}|r t|nd}||fS | dfS )Nr   z(.*?)(\d*)$r      )r,   r-   splitextrematchgroupint)srB   
alpha_partnum_partr   r   r   _alphanumkey/   s   

rH   c                 C   sh   g }t | D ]"\}}}|D ]}t j||}t j|| }|td|  qqt|dd d}|S )Nr   c                 S   s   t | d S )Nfile)rH   )xr   r   r   <lambda>C   s    z_list_files.<locals>.<lambda>)key)r,   walkr-   joinrelpathappend_describe_filesorted)r9   filedescriptorsrootdirsr;   rI   	file_pathrelr   r   r   r0   <   s   r0   c                 C   s   t | D ]\}}||d< qd S )Nindex)	enumerate)r;   ir#   r   r   r   r1   G   s   
r1   c                 C   sz   t | } | dd }tj| }tj| \}}|dddd}tj|d }| ||| | | | dS )Nr   z/labels z/imagesr   )rI   dirnamenamer   rL   fullkeyfullkey2)r   splitr,   r-   r]   r@   r   lower)r#   r^   r]   r_   r   r`   rL   r   r   r   rQ   L   s   rQ   c                 C   s   dd | D }d}|D ]}| |d }|r||d< |d7 }q|dkr%dS dd | D }|D ]}| |d	 }|rA||d< |d7 }q.|dkS )
Nc                 S      i | ]}|d  |qS )r_   r   r"   rZ   r   r   r   
<dictcomp>_       z3_map_annotations_to_images_1to1.<locals>.<dictcomp>r   r_   annotationfiler   Tc                 S   rc   )r`   r   rd   r   r   r   re   h   rf   r`   get)r)   r<   imgmapcountmappedannimager   r   r   r5   ^   s$   r5   c                 C   s   t |}t|\}}t| D ]:}|d d}||g p.||d g p.||d g p.|}|D ]}|d }	t|||	||}
|
rG|
|d<  nq1qd S )NrI   r   r^   rL   
parsedTyperg   )$_build_image_to_annotationfile_index _build_image_and_annotation_mapsr   lstripri   _filterIndividualAnnotations)r)   annotationFilesimage_path_to_annotation_files	imgRefMapannotationMaprm   rel_pathcandidate_annotationsannotationFileformatfiltered_annotationsr   r   r   r7   q   s(   r7   c                 C   s  t t}| D ]}|d}|d}|r|du rq|dkrX|dg D ]3}t|ddd}|s3q#tj|}tj|d	 }|| 	| || 	| || 	| q#q|d
krq|D ]}	|	d}
|
shq^||
 	| q^q|dkr|dg D ]}|d}
|
sq{||
 	| q{q|dkr|dg D ]}|d}
|
sq||
 	| qq|dkr|D ]}	|	d}
|
sq||
 	| qq|S )a  Create an index mapping possible image path keys to annotation files that reference them.

    Keys include full relative path, basename, and stem to improve robustness across
    different dataset layouts. Supports coco, createml, csv, multilabel_csv, jsonl.
    rn   parsedNcocor)   	file_namer\   r   r   createmlrm   csvlinesmultilabel_csvrowsjsonl)
r   listri   r   rq   r,   r-   basenamer@   rP   )rs   rX   ry   rn   r|   imageRefr~   r   stementry
image_nameldrowr   r   r   ro      s\   






ro   c                 C   s   i }t t}| D ]a}|d |d |d }}}|dkri|d D ]3}t|d d}tj|}	tj|	d }
|| d| || d|	 || d|
 |i q |d	 D ]}|| d|d
   	| qXq||fS )NrI   r|   rn   r}   r)   r~   r   r   r<   image_id)
r   r   r   rq   r,   r-   r   r@   updaterP   )rs   ru   rv   annFiler   r|   rn   r   r~   r   r   
annotationr   r   r   rp      s,   
rp   c                    s  |d }|dkrp d  d}||d  d| p6||d  d d  p6||d  d d  }|rndddd	g dd
}ddi}	||d  d|d  g }
t|d |d |d |g|
pf|gd|	d< |	S d S |dkr fdd|D }t|d	krtd d  d|d   |r|d }dt|gd}	|	S d S |dkrȇ fdd|d D }|r|d }dd|g| d}	|	S d S |dkr fd d|d! D }|r|d d" }d#|d$S d S |d%kr fd&d|D }|rd'd(|d}	|	S d S ))Nr|   r}   rI   r   r^   rL   iɚ;r   r   )idr   category_idareasegmentationiscrowdzannotation.coco.jsonr   infolicenses
categories)r   r   r   r)   r<   rawTextr   c                        g | ]}|d   d kr|qS rm   r^   r   rd   rm   r   r   r$           z0_filterIndividualAnnotations.<locals>.<listcomp>z0warning: found multiple image entries for image z in zannotation.createml.json)r^   r   r   c                    s$   g | ]}|d   d kr|d qS )r~   r^   liner   r"   r   r   r   r   r$   	     $ r   headerszannotation.csvr\   r   c                    r   )r~   r^   r   )r"   rr   r   r   r$     r   r   labelsclassification_multilabel)typer   r   c                    s&   g | ]}|d   d krt |qS r   )jsondumps)r"   r   r   r   r   r$     s   & zannotation.jsonl
)rq   ri   r   r   lenprintrN   )rm   r   rz   ru   rv   r|   rw   imgReferencefake_annotation_annotationannotations_for_imageimgReferencesimgLinesr   r   r   
jsonlLinesr   r   r   rr      sx   	#

rr   c              	      s   h d  fdd|D }|D ]h}|d }|dkrHt |  |d  }t|}t||}|r8||d< ||d< W d    n1 sBw   Y  q|d	kr]t|  |d  |d< d
|d< q|dkrwt|  |d  }||d< |dd|d< q|S )N>   r   r   r   c                    s   g | ]
}|d   v r|qS r   r   )r"   avalid_extensionsr   r   r$   $  r%   z$_loadAnnotations.<locals>.<listcomp>r   r   rI   r|   rn   r   r   r   r   r   )openr   load_guessAnnotationFileFormat_read_jsonl_parseAnnotationCSVri   )r9   r<   rl   r   r#   r|   rn   r   r   r   r6   "  s.   


r6   c              
   C   s   g }t | 8}t|dD ])\}}|sqzt| }|| W q tjy5   td|  d|  Y qw W d    |S 1 sAw   Y  |S )Nr   z'Warning: Skipping invalid JSON line in :)r   rY   r   loadsr*   rP   JSONDecodeErrorr   )r-   datarI   linenumr   json_objectr   r   r   r   8  s    

		r   c           	         s   t | }| }W d    n1 sw   Y  dd |d dD  tj| dkrdg }|dd  D ])}dd |dD }|d } fddt|dd  dd	D }|||d
 q4d| dS |d }dd |dd  D }||dS )Nc                 S      g | ]}|  qS r   r*   )r"   hr   r   r   r$   J      z'_parseAnnotationCSV.<locals>.<listcomp>r   ,z_classes.csvr   c                 S   r   r   r   )r"   pr   r   r   r$   O  r   c                    s    g | ]\}}|d kr | qS )1r   )r"   rZ   vr   r   r   r$   Q  r   )start)r~   r   r   )r   r   r   c                 S   s$   g | ]}| d d  |dqS )r   r   )r~   r   )ra   r*   r   r   r   r   r$   U  r   )r   r   )r   	readlinesra   r,   r-   r   rY   rP   )	r   r#   r   parsed_linesr   partsr~   r   header_liner   r   r   r   F  s"   

"r   c                 C   sL   |dkr$t | trt | dtrt | dtrdS d S t | tr$dS d S )Nr   r<   r)   r}   r   )
isinstancedictri   r   )r|   r   r   r   r   r   \  s   
 
r   c                 C   sz   |sd S dd |D }| d}t|t|k r%td tdd |D  | D ]}| |d p1|}|r:|d |d< q'd S )	Nc                 S   rc   )r]   r   r"   lmr   r   r   re   i  rf   z1_map_labelmaps_to_annotations.<locals>.<dictcomp>r   z<warning: unexpectedly found multiple labelmaps per directoryc                 S   s   g | ]}|d  qS )rI   r   r   r   r   r   r$   m  r   z1_map_labelmaps_to_annotations.<locals>.<listcomp>r]   labelmap)ri   r   r   )r<   r=   labelmapmaprootLabelmaprl   r   r   r   r   r4   f  s   
r4   c              	   C   sF   |D ]}zt |  |d  |d< W q ty   Y qw dd |D S )NrI   r   c                 S   s   g | ]	}| d r|qS )r   rh   r   r   r   r   r$   {  s    z#_load_labelmaps.<locals>.<listcomp>)r   r/   )r9   r=   r   r   r   r   r3   t  s   r3   c                 C   sT   | D ]%}|d }d|v rd|d< qd|v rd|d< qd|v r#d|d< qd|d< qd S )Nr_   validra   traintestr   )r)   rZ   r_   r   r   r   r2   ~  s   



r2   c                 C   s`   | D ]+}| dr
q| ddd}|r|dkrqtj|}|r-|dkr-|dd|d< qd S )Nrg   r]   r\   r   .classification_folder)classification_labelr   )ri   r*   r,   r-   r   )r)   rm   r]   
class_namer   r   r   r8     s   
r8   )F)r   r,   rA   collectionsr   r   image_utilsr   r    r&   r'   r   r>   rH   r0   r1   rQ   r5   r7   ro   rp   rr   r6   r   r   r   r4   r3   r2   r8   r   r   r   r   <module>   s8    
	7G

