
    ]j4                        d dl Z d dl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
mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZm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 dlm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7  ejp                  e9      Z: G d de;      Z< G d de      Z= G d de>      Z?y)    N)defaultdict)deepcopy)datetime)Enum)glob)copy2)OptionalListTuple)Image)brush)convert_to_asr_json_manifest)process_keypoints_for_cocobuild_kp_orderupdate_categories_for_keypointskeypoints_in_label_config!get_yolo_categories_for_keypoints)csv2)parse_configcreate_tokens_and_tagsdownloadget_image_size_and_channels
ensure_dirget_polygon_areaget_polygon_bounding_boxget_annotatorget_json_root_typeprettify_resultconvert_annotation_to_yoloconvert_annotation_to_yolo_obb)get_local_path)!process_and_save_yolo_annotationsc                       e Zd Zy)FormatNotSupportedErrorN)__name__
__module____qualname__     N/root/env/lib/python3.12/site-packages/label_studio_sdk/converter/converter.pyr$   r$   +   s    r)   r$   c                   f    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZd Zed        Zy)Format                        	   
                        c                     | j                   S N)nameselfs    r*   __str__zFormat.__str__B   s    yyr)   c                 D    	 t         |   S # t        $ r t               w xY wr?   )r,   KeyError
ValueError)clsss     r*   from_stringzFormat.from_stringE   s(    	!9 	,	s    N)r%   r&   r'   JSONJSON_MINCSVTSV	CONLL2003COCOVOCBRUSH_TO_NUMPYBRUSH_TO_PNGASR_MANIFESTYOLOYOLO_OBBCSV_OLDYOLO_WITH_IMAGESCOCO_WITH_IMAGESYOLO_OBB_WITH_IMAGESBRUSH_TO_COCOrC   classmethodrI   r(   r)   r*   r,   r,   /   ss    DH
C
CID
CNLLDHGM  r)   r,   c                   J   e Zd Zi ej                  ddddej
                  ddddej                  dd	d
dej                  ddddej                  dddg ddej                  dddg ddej                  dddg ddej                  dddddgdej                  ddd g ddej                  d!d"d g ddej                  d#d$d ddgdej                  d%d&d ddgdej                   d'd(d)dgdej"                  d*d+d)dgdej$                  d,d-d.d/gdej&                  d0d1ddd2gdZd3 Z	 	 	 	 	 dKd5ZdLd6ZdMd7Zd8 Zed9        Zd: Zd; Zd<ed=ee   fd>Z d? Z!e"d@        Z#dA Z$dLdBZ%dLdCZ&dLdDZ'dLdEZ(	 dNdFZ)	 	 	 	 	 dOdGZ*e"dH        Z+	 dNdIZ,dJ Z-y4)P	ConverterrJ   zList of items in raw JSON format stored in one JSON file. Use to export both the data and the annotations for a dataset. It's Label Studio Common Formatz+https://labelstud.io/guide/export.html#JSON)titledescriptionlinkzJSON-MINzList of items where only "from_name", "to_name" values from the raw JSON format are exported. Use to export only the annotations for a dataset.z/https://labelstud.io/guide/export.html#JSON-MINrL   zResults are stored as comma-separated values with the column names specified by the values of the "from_name" and "to_name" fields.z*https://labelstud.io/guide/export.html#CSVrM   zlResults are stored in tab-separated tabular file with column names specified by "from_name" "to_name" valuesz*https://labelstud.io/guide/export.html#TSVrN   zJPopular format used for the CoNLL-2003 named entity recognition challenge.z0https://labelstud.io/guide/export.html#CONLL2003)zsequence labelingztext taggingznamed entity recognition)r^   r_   r`   tagsrO   zPopular machine learning format used by the COCO dataset for object detection and image segmentation tasks with polygons and rectangles.z+https://labelstud.io/guide/export.html#COCO)image segmentationobject detection	keypointszCOCO with Imagesz#COCO format with images downloaded.zPascal VOC XMLzRPopular XML format used for object detection and polygon image segmentation tasks.z5https://labelstud.io/guide/export.html#Pascal-VOC-XMLrb   rc   rT   zPopular TXT format is created for each image file. Each txt file contains annotations for the corresponding image file, that is object class, object coordinates, height & width.z+https://labelstud.io/guide/export.html#YOLOzYOLO with Imagesz#YOLO format with images downloaded.z
YOLOv8 OBBa  Popular TXT format is created for each image file. Each txt file contains annotations for the corresponding image file. The YOLO OBB format designates bounding boxes by their four corner points with coordinates normalized between 0 and 1, so it is possible to export rotated objects.zYOLOv8 OBB with Imagesz)YOLOv8 OBB format with images downloaded.zBrush labels to NumPyzMExport your brush labels as NumPy 2d arrays. Each label outputs as one image.zDhttps://labelstud.io/guide/export.html#Brush-labels-to-NumPy-amp-PNGzBrush labels to PNGzHExport your brush labels as PNG images. Each label outputs as one image.zASR Manifestz~Export audio transcription labels for automatic speech recognition as the JSON manifest format expected by NVIDIA NeMo models.z3https://labelstud.io/guide/export.html#ASR-MANIFESTzspeech recognitionzBrush labels to COCOzlExport your brush labels as COCO format for segmentation tasks. Converts RLE encoded masks to COCO polygons.zbrush annotationsc                     | j                   S r?   )_FORMAT_INFOrA   s    r*   all_formatszConverter.all_formats   s       r)   Nc                 D   || _         || _        || _        d| _        || _        || _        d| _        t        |t              r|| _        npt        |t              r`t        j                  j                  |      r/t        j                  |      5 }|j                         }	ddd       n|}	t!        	      | _        | j                  t"        j%                  d       i | _        | j'                  |      \  | _        | _        | j-                         | _        y# 1 sw Y   uxY w)a2  Initialize Label Studio Converter for Exports

        :param config: string or dict: XML string with Label studio labeling config or path to this file or parsed_config
        :param project_dir: upload root directory for images, audio and other labeling files
        :param output_tags: it will be calculated automatically, contains label names
        :param upload_dir: upload root directory with files that were imported using LS GUI
        :param download_resources: if True, LS will try to download images, audio, etc and include them to export
        NzLabel config or schema for Converter is not provided, it might be critical for some export formats, now set schema to empty dict)project_dir
upload_dirdownload_resources_schemaaccess_tokenhostnameis_keypoints
isinstancedictstrospathisfileioopenreadr   loggerwarning_get_data_keys_and_output_tags
_data_keys_output_tags_get_supported_formats_supported_formats)
rB   configri   output_tagsrj   rk   rm   rn   fconfig_strings
             r*   __init__zConverter.__init__   s    $ '$"4(  fd#!DL$ww~~f%WWV_ -$%FFHM- - !''6DL<<NN] DL-1-P-P.
** #'"="="?!- -s   DDc           
      
   t        |t              rt        j                  |      }|t        j                  k(  r| j                  |||       y |t        j                  k(  r| j                  |||       y |t        j                  k(  r;|j                  dd      }|j                  dd      }| j                  |||||       y |t        j                  k(  r;|j                  dd      }|j                  dd      }| j                  |||||       y |t        j                  k(  r| j                  |||       y |t        j                  t        j                  fv r?|j                  d      }|t        j                  k(  | _        | j#                  ||||	       y |t        j$                  t        j&                  t        j(                  t        j*                  fv r|j                  d      }|j                  d
      }	|t        j*                  t        j(                  fv | _        | j-                  ||||	||t        j&                  t        j(                  fv        y |t        j.                  k(  r'|j                  d      }| j1                  ||||	       y |t        j2                  k(  r=|r| j5                  |      n| j7                  |      }
t9        j:                  |
|d       y |t        j<                  k(  r=|r| j5                  |      n| j7                  |      }
t9        j:                  |
|d       y |t        j>                  k(  ra|r| j5                  |      n| j7                  |      }
tA        |
|| jB                  d   | jD                  | jF                  | j                          y |t        jH                  k(  rG|r| j5                  |      n| j7                  |      }
ddl%m} |j                  d      } ||
||       y y )N)is_dir
csv_headerTcsv_separator,)sepheaderr   		image_dir)output_image_dirr   	label_dir)r   output_label_dirr   is_obbnumpy)
out_formatpngr   )data_keyri   rj   rk   )convert_to_coco)r   )&rp   rr   r,   rI   rJ   convert_to_jsonrK   convert_to_json_minrL   getconvert_to_csvrM   rN   convert_to_conll2003rO   rX   rk   r   rT   rU   rY   rW   convert_to_yolorP   convert_to_vocrQ   iter_from_diriter_from_json_filer   convert_task_dirrR   rS   r   r|   ri   rj   rZ   0label_studio_sdk.converter.exports.brush_to_coco)rB   
input_dataoutput_dataformatr   kwargsr   r   r   r   itemsr   s               r*   convertzConverter.convert   s   fc"''/FV[[   [ Hv&$$ZV$Lvzz!ZZd3F**_c2CKS    vzz!ZZd3F**_d3CKS    v'''%%j+f%MV%<%<==

;/I&,0G0G&GD#  K)F !  V__f6Q6QSYSjSjkk

;/I

;/I&,1H1H&JeJe0f&fD#  !*!*6??F4O4O"PP !  vzz!

;/IK)F    v,,,  "":.--j9 
 ""5+'Jv***  "":.--j9 
 ""5+%Hv***  "":.--j9 
 )+ ,,??#'#:#: v+++  "":.--j9 
 Y

;/I!* ,r)   c                    t               }g }|f|D ]a  }|| j                  vst        j                  dj	                  |t        t        | j                  j                                                  c | j                  j                         D ]G  \  }}|||vr|d   D ]"  }dD ]  }||v s|j                  ||           $ |j                  |       I t        |      |fS )NzUSpecified tag "{tag}" not found in config schema: available options are {schema_keys})tagschema_keysinputs)value	valueList)setrl   ry   debugr   rr   listkeysr   addappend)	rB   r   	data_keysoutput_tag_namesr   r@   info	input_tagvalue_key_names	            r*   r{   z(Converter._get_data_keys_and_output_tagsA  s    E	"" dll*LL>>Df #T$,,:K:K:M5N1O ?E ? ,,,,. 	*JD$&4{+B!(^ A	&< AN%2!i&?@AA ##D)	* I 000r)   c                 &   d}t        | j                        dkD  rft        j                  j                  t        j
                  j                  t        j                  j                  t        j                  j                  gS t               }t               }| j                  j                         D ]y  }|j                  |d          |d   D ][  }|j                  d      rd}|d   dk(  r*|j                  d      d	k(  rt        j                  d
       H|j                  |d          ] { t        D cg c]  }|j                   }}d|v }d|v }	|r|	st        j                  j                  |v r)|j!                  t        j                  j                         t        j"                  j                  |v r)|j!                  t        j"                  j                         t        j$                  j                  |v r)|j!                  t        j$                  j                         t        j&                  j                  |v r)|j!                  t        j&                  j                         d|v rd|v s)|j!                  t        j(                  j                         |sd|v rd|v s1d|v rd|v s)|j!                  t        j*                  j                         |s.d|v rd|v sSd|v sNd|v sId|v rd|v s@d|v rd|v s7d|v rd|v s.|j!                  t        j                  j                         |j!                  t        j"                  j                         |j!                  t        j$                  j                         |j!                  t        j&                  j                         t        j,                  j                  |v r)|j!                  t        j,                  j                         t        j.                  j                  |v r)|j!                  t        j.                  j                         d|v rd|v sd|v sd|v rd|v s{|j!                  t        j0                  j                         |j!                  t        j2                  j                         |j!                  t        j4                  j                         d|v sd|v rd|v s)|j!                  t        j6                  j                         |sd|v rd|v rt        j,                  j                  |v r)|j!                  t        j,                  j                         t        j.                  j                  |v r)|j!                  t        j.                  j                         |S c c}w )NFr-   typer   r   TText	valueTypeurlz1valueType="url" are not supported for text inputsKeyPointLabelsRectangleLabelsLabelsr   	RectanglePolygonLabelsBrushLabelsbrushlabelsBrushAudio	AudioPlusTextAreaVideoTimelineLabels)lenr|   r,   rJ   r@   rK   rL   rM   r   rl   valuesr   r   ry   errorrO   removerX   rT   rW   rN   rP   rU   rY   rQ   rR   rZ   rS   )
rB   is_migoutput_tag_typesinput_tag_typesr   r   r   rg   has_keypoint_labelshas_rectangle_labelss
             r*   r~   z Converter._get_supported_formatsX  s   t!#  $$



	  5%LL'') 	7D  f.!(^ 7	==-!FV$.9==3MQV3VLL!TU##If$567	7 (..!qvv.. /2BB04DD ';{{;.""6;;#3#34&&++{:""6#:#:#?#?@{{;.""6;;#3#34&&++{:""6#:#:#?#?@/)h:J.Jv//445&!%55"22 00 vzz/&!%55"&66#'77..,,"22,,#33,,v{{//0v66;;<v{{//0v66;;<##{2""6??#7#78**//;>""6#>#>#C#CD&!11 $44.. 00 v4499:v22778v33889';/+I..v22778g05EIY5Y##{2""6??#7#78**//;>""6#>#>#C#CDU /s   3Vc                     | j                   S r?   )r   rA   s    r*   supported_formatszConverter.supported_formats  s    &&&r)   c              #     K   t         j                  j                  |      st        dj	                  |            t        t         j                  j                  |d            D ]  }| j                  |      D ]	  }|s|  ! y w)Nz{input_dir} doesn't exist)	input_dir*.json)rs   rt   existsFileNotFoundErrorr   r   joinr   )rB   r   	json_fileitems       r*   r   zConverter.iter_from_dir  s{     ww~~i(#+22Y2G  bggll9h?@ 	I00; J	s   A=B	 	B	c              #     K   t        |      }|dk(  rEt        |d      5 }t        j                  |      }ddd       | j	                        D ]  }|  y|dk(  rt        j                  |d      5 }t        j                  dt        j                          t        j                  |dd	      }|D ]  }| j	                  |      D ]	  }||  ! 	 ddd       yy# 1 sw Y   xY w# 1 sw Y   yxY ww)
zwExtract annotation results from json file

        param json_file: path to task list or dict with annotations
        rq   rNr   rbzijson backend in use: r   T)	use_float)r   rw   jsonloadannotation_result_from_taskrv   ry   r   ijsonbackendr   )rB   r   	data_typedatar   r   tasks          r*   r   zConverter.iter_from_json_file  s    
 'y1	 i% ,yy+,88> 
 & D) 'Q5emm_EF{{v ! 'D $ @ @ F '+"&J''' ' !, ,' 's:   C9C!>C93AC-C-
C9!C*&C9-C62C9	from_namereturnc                 x   d}d}| j                   j                         D ]  \  }}||k(  r|c S |j                  d      s!|}|d   j                         D ]  \  }}|j                  ||      } t	        j
                  |      j                  |      x}	swt        |      |kD  x}
s|}t        |      } |r|S dS )a  If the from name exactly matches an output tag from the schema, return that tag.

        Otherwise, certain tags (like those from Repeater) contain
        placeholders like {{idx}}. Such placeholders are mapped to a regex in self._schema.
        For example, if "my_output_tag_{{idx}}" is a tag in the schema,
        then the from_name "my_output_tag_0" should match it, and we should return "my_output_tag_{{idx}}".
        Nr   regex)rl   r   r   replacerecompilematchr   )rB   r   
best_matchbest_match_lentag_nametag_infotag_name_patternvariabler   r   	match_lens              r*   _maybe_matching_tag_from_schemaz)Converter._maybe_matching_tag_from_schema  s     
"&,,"4"4"6 	;Hh9$<<('#+G#4#:#:#< M%#3#;#;He#L M JJ/066yAAqA #$4 5 FF9F!)J%()9%:N	;" (z1T1r)   c              #     K   d|v xs d|v }|st         j                  d       y d|v r|d   n|d   }|st        j                  |i i       }| d }t	        t        ||            }|sy t        |d d      }|D ]O  }|j                  d      xs g }t        t              }|D ]  }	|	j                  d	      }
|
| j                  |
      nd }|
r|rt        |	d
         }| j                  |   d   |d<   d|	v r|	d   |d<   d|	v r|	d   |d<   ||
   j                  |       | j                  s|	j                  d      |d<   |	j                  d      |d<   |
rI|	j                  d      dk(  r5t        |	j                  d
i             }d|d<   ||
   j                  |        t        j                  |||      }d|v r|d   |d<   | R y w)NcompletionsannotationszlEach task dict item should contain "annotations" or "completions" [deprecated], where value is list of dictsc                 P    | j                  dd      xs | j                  dd       S )NskippedFwas_cancelledr   xs    r*   <lambda>z7Converter.annotation_result_from_task.<locals>.<lambda>  s'    EE)U#Dquu_e'D
 r)   c                 &    | j                  dd      S )N
created_atr   r   r  s    r*   r  z7Converter.annotation_result_from_task.<locals>.<lambda>  s    quu\1'= r)   T)keyreverseresultr   r   r   original_widthoriginal_heightidparentIDchatmessage	agreement)ry   rz   r]   get_datar   filtersortedr   r   r   r   rl   r   ro   )rB   r   has_annotationsr   r   	cancelled
annotationr  outputsr   r   r   vs                r*   r   z%Converter.annotation_result_from_task   s'    '4/H=D3HNN/  $1D#8Dd=>Q 	
 %%dB3DJ
	 6)[9: =t
 & #	J^^H-3F!$'G  EE+.	 !, 88C 
  7,A $X 6v >AfI'1,./0@.A*+(A-/01B/C+,I&--a0(("#%%+$()j(9*155=M#A w!34A -AfII&--a0 36 %%dGZ@Dd"$($5[!JG#	s   D,G/B!Gc                    | d   | d   |xs i |j                  di       |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      d	
S )
Nr  r   completed_byr  
updated_at	lead_timehistoryr   )
r  inputoutputr  annotation_idr  r  r  r  r   r   )r   r  r  s      r*   r  zConverter.get_dataE  sy     t*&\m&NN>2>'^^D1$..6$..6#4!~~i0'^^O<
 	
r)   c                      y r?   r(   )rB   fmts     r*   _check_formatzConverter._check_formatT  s    r)   c           	         | j                  t        j                         t        |       t        j
                  j                  |d      }|rt        j                  |dd      5 }|j                  d       d}t        t        j
                  j                  |d            D ]f  }t        j                  |d      5 }t        j                  |      }	|s|j                  d	       t        j                  |	|d
d       d}~	d d d        h |j                  d       d d d        y t        ||       y # 1 sw Y   xY w# 1 sw Y   y xY w)Nresult.jsonwutf8modeencoding[
Tr   r(  ,
r.   Findentensure_ascii
])r!  r,   rJ   r   rs   rt   r   rv   rw   writer   r   r   dumpr   )
rB   r   
output_dirr   output_filefoutfirst_recordr   r   records
             r*   r   zConverter.convert_to_jsonW  s   6;;':ggll:}=3@ "D

5!#!%bggll:x&H!I 
#IV< 	#!%1+ JJu-		&$quM', #	# 	#
# 

5!!" "$ *k*	# 	#" "s&   %AD><AD2D>2D;7D>>Ec                 8   | j                  t        j                         t        |       t        j
                  j                  |d      }|r| j                  n| j                  }t        j                  |dd      5 }|j                  d       d} ||      D ]  }t        j                  t        j                  |d               }	|j                  d      |d   |	d<   |d	   j!                         D ]  \  }
}t#        |      |	|
<    t%        |d
      |	d<   |d   |	d<   |d   |	d<   |d   |	d<   |d   |	d<   d|v r|d   |	d<   |s|j                  d       t        j&                  |	|dd       d}~	 |j                  d       d d d        y # 1 sw Y   y xY w)Nr#  r$  r%  r&  r)  Tr  r  r  )int_id	annotatorr  r  r  r  r  r+  r.   Fr,  r/  )r!  r,   rK   r   rs   rt   r   r   r   rv   rw   r0  r   loadsdumpsr   r   r   r   r1  )rB   r   r2  r   r3  item_iteratorr4  r5  r   r6  r@   r   s               r*   r   zConverter.convert_to_json_minr  s   6??+:ggll:}=.4**$:R:RWW[sV< 	JJuL%j1  DJJtG}$=>88D>-#':F4L#'>#7#7#9 :KD%#25#9F4L:&3D&F{#*.*?''+L'9|$'+L'9|$&*;&7{#$&*.{*;F;' $JJu%		&$quE$ 14 JJu=	 	 	s   =D
FFc                     | j                  t        j                         |r| j                  n| j                  }t        j                  |||fi |S r?   )r!  r,   rL   r   r   r   r   )rB   r   r2  r   r   r<  s         r*   r   zConverter.convert_to_csv  sA    6::&.4**$:R:R||M:zLVLLr)   c           
         | j                  t        j                         t        |       t        j
                  j                  |d      }| j                  d   }t        j                  |dd      5 }|j                  d       |r| j                  n| j                  } ||      D ]  }t        t        d |d   j                                     }	t!        |d	   |   t#        t%        |	      d       
      \  }
}t'        |
|      D ]'  \  }}|j                  dj)                  ||             ) |j                  d        	 d d d        y # 1 sw Y   y xY w)Nzresult.conllr   r$  r%  r*  z-DOCSTART- -X- O
c                 4    | d   d   j                         dk(  S )Nr   r   labels)lowerr  s    r*   r  z0Converter.convert_to_conll2003.<locals>.<lambda>  s    !A$v,"4"4"6("B r)   r  r  )textspansz{token} -X- _ {tag}
)tokenr   
)r!  r,   rN   r   rs   rt   r   r|   rv   rw   r0  r   r   r   r  r   r   nextiterzipr   )rB   r   r2  r   r3  r   r4  r<  r   filtered_outputtokensra   rD  r   s                 r*   r   zConverter.convert_to_conll2003  s4   6++,:ggll:~>??1%WW[#7 	!4JJ+,28D..d>V>VM%j1 !"&BX--/#  6gx0tO4d;  #&fd"3 UJE3JJ6==Es=STU

4 !		! 	! 	!s   2CEEc                    d }| j                  t        j                         t        |       t        j
                  j                  |d      }|t        |       n7t        j
                  j                  |d      }t	        j                  |d       g g g }	}}| j                         \  }}
t        ||
| j                        \  }}
| j                  d   }|r| j                  |      n| j                  |      }t        |      D ]  \  }}|d   |   }|d   }t        |      }d }d }t        j
                  j!                  |      sf	 t#        || j$                  | j&                  | j(                  || j*                  | j,                  |	      }t        j
                  j/                  ||      }	 t7        j8                  t        j
                  j                  ||            5 }|j:                  \  }}d d d         ||||||      }|d   s(|s ||||||      }t0        j=                  d|       -g }|d   D ]  }||d   |   z  } t        |      dk(  r t0        j?                  d|d    d|       rg }|D ]  }d }dD ]"  }||v st        ||         dkD  s||   d   } n |t0        j=                  d       E|r|s:d|vsd|vrt0        j?                  d| d|       m|d   |d   }} ||||||      }||
vr$t        |      }||
|<   |jA                  ||d       |
|   }t        |	      }d|v sd|v ri| jC                  |      }||\  }}}} ||d   z  dz  }||d   z  dz  }||d   z  dz  }| |d   z  dz  } |	jA                  |||g |||| gdd|| z  d       nd|v rw|d   D cg c]  \  }}|dz  |z  |dz  |z  f }!}}tE        |! \  }}|	jA                  ||||!D "#cg c]  }"|"D ]  }#|#  c}#}"gtG        ||      ddtI        ||      d       n!d|v r|jA                  |       ntK        d      t	        jL                  d       s|	d!   jO                  d"tQ        |      i         |s{tS        | j                        }$|	jA                  tU        ||$t        |	      ||
#              tW        j8                  |d$d%&      5 }%tY        jZ                  |||	t]        j^                         j`                  d'd(d)d(tc        t]        j^                               d*d+|%d,-       d d d        y #  t0        j3                  d
j5                  ||      d       Y xY w# 1 sw Y   ~xY w#  t0        j3                  dj5                  ||      d       Y xY wc c}}w c c}#}"w # 1 sw Y   y xY w).Nc                 2    | j                  ||||d       | S )N)widthheightr  	file_name)r   )imagesrM  rN  image_id
image_paths        r*   	add_imagez,Converter.convert_to_coco.<locals>.add_image  s&    MM"$"!+	 Mr)   r#  rP  Texist_okr   r  r  r   rn   ri   r   	cache_dirrk   rm   task_idzDUnable to download {image_path}. The image of {item} will be skippedrR  r   exc_infozKUnable to open {image_path}, can't extract width and height for COCO exportr  z&No annotations found for item task_id=Empty bboxes for 	 task_id=)rectanglelabelspolygonlabelskeypointlabelsr@  z1Unknown label type or labels are empty {task_id=}r	  r
  /original_width or original_height not found in r  r@   r^  r@  d   )r  rQ  category_idsegmentationbboxignoreiscrowdarear_  pointsr`  zUnknown label type#LABEL_STUDIO_FORCE_ANNOTATOR_EXPORTr9  )r  rQ  category_name_to_idr$  r%  r&  1.0 Label Studio)yearversionr_   contributorr   date_created)rP  
categoriesr   r   r.   r-  )2r!  r,   rO   r   rs   rt   r   makedirs_get_labelsr   rl   r|   r   r   	enumerater   r   r!   rn   ri   rj   rk   rm   relpathry   r   r   r   rw   sizerz   r   r   rotated_rectanglerH  r   r   rF   getenvupdater   r   r   rv   r   r1  r   nowrq  rr   )&rB   r   r2  r   r   rS  r3  rP  ru  r   rm  r   r<  item_idxr   rR  rX  rQ  rM  rN  imgr@  r  keypoint_labelslabelcategory_namerd  r  xywhr  yr$  h
points_abspointcoordkp_orderr4  s&                                         r*   r   zConverter.convert_to_coco  sl   		 	6;;':ggll:}=''(!ww||JAKK(48*,b"K
*.*:*:*<'
'*I*Vikokwkw*x'
'??1%  z*))*5 	
 (6 S	NHdgx0J4jG6{HEF77>>*-!/&!%$($4$4"&//"2+/+B+B%)%6%6 '	"J "$Z!HJ
ZZZ DE -$'HHME6-"65&(JO >&vufh
SF!HzJK FH~ .$x.--. 6{a0h0@
'LM O NO $[ Ce|E#J!(;(-c
1
 !(NN#VWU'u48IQV8VMj\Yc[bZde !$)*:$;UCT=U6E&vufh
SF (;;"%j/K9D'6%%[-&PQ1-@ #K 0$-U1B11%8D| !%JAq!QE"233c9AE"344s:AE"233c9AE"344s:A&&"/(0+6,.%&1aL&''($%E	 %-HMh"@D1S5!c'F*:;"J " 
+DAq&&"/(0+64> R5E R5 R R- %=Q$B&''($4Q$: &.#**51$%9::99BCO**Kt9L+MN]NO^ )$,,7""#=#"%k"2%(;$ [S	j WW[sV< 	II$",#. ( 3 3#(')'5!(+HLLN(;	 	 	AKK^ee'1 f  "&	   - -ahh#-D i  "	  ^" !S2	 	sJ   A%T<-3U9 U,0U92V)
-V/AV5<*U),U6	1U99*V&5V>c                 
   |r | j                  t        j                         n| j                  t        j                         t	        |       t
        j                  j                  |d      }t
        j                  j                  |d      }	|t	        |       n7t
        j                  j                  |d      }t        j                  |d       |t	        |       n7t
        j                  j                  |d      }t        j                  |d       t        | j                        }
|
r d| _        t        | j                        \  }}n| j                         \  }}| j                  d   }|r| j                  |      n| j!                  |      }t#        |      D ]v  \  }}|d	   |   }t%        |t&              r|gn|}d}|d
   }t)        |      D ]  }t
        j                  j+                  |      r#	 t-        || j.                  | j0                  | j2                  || j4                  | j6                  |      }t
        j                  j9                  ||      } |st:        jA                  d|       |rt'        |d         nd}t        j                  t
        j                  j                  ||      d       t
        j                  jC                  t
        j                  jE                  |            d   }|dd }t
        j                  j                  |||dz         }|d   sOt:        jG                  d|       t
        j                  j+                  |      stI        |d      5  	 ddd       g }|d   D ]  }||d   |   z  } tK        |      dk(  rUt:        jG                  d|d    d|       t
        j                  j+                  |      stI        |d      5  	 ddd       YtM        ||||||
| j                        \  }}y tI        |	dd      5 }|D ]  }|jO                  |d   dz           	 ddd       tQ        jH                  |dd      5 }tS        jT                  |tW        jX                         jZ                  dd d!d"|d#$       ddd       y#  t:        j=                  dj?                  ||      d       Y xY w# 1 sw Y   jxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)%a  Convert data in a specific format to the YOLO format.

        Parameters
        ----------
        input_data : str
            The input data, either a directory or a JSON file.
        output_dir : str
            The directory to store the output files in.
        output_image_dir : str, optional
            The directory to store the image files in. If not provided, it will default to a subdirectory called 'images' in output_dir.
        output_label_dir : str, optional
            The directory to store the label files in. If not provided, it will default to a subdirectory called 'labels' in output_dir.
        is_dir : bool, optional
            A boolean indicating whether `input_data` is a directory (True) or a JSON file (False).
        split_labelers : bool, optional
            A boolean indicating whether to create a dedicated subfolder for each labeler in the output label directory.
        obb : bool, optional
            A boolean indicating whether to convert to Oriented Bounding Box (OBB) format.
        z
notes.jsonzclasses.txtNrP  TrT  r@  r   r  r  rV  @Unable to download {image_path}. The item {item} will be skippedrY  rZ  z No image path found for task_id=r  ro     z.txtr  z!No completions found for task_id=r  r\  z in task_id=r$  r%  r*  r@   rE  r&  rn  rp  )rq  rr  rs  )ru  r   r.   rv  ).r!  r,   rU   rT   r   rs   rt   r   rw  r   rl   ro   r   rx  r|   r   r   ry  rp   rr   reversedr   r!   rn   ri   rj   rk   rm   rz  ry   r   r   r   splitextbasenamerz   rw   r   r"   r0  rv   r   r1  r   r  rq  )rB   r   r2  r   r   r   split_labelersr   
notes_file
class_filero   ru  rm  r   r<  r  r   image_pathsrR  rX  labeler_subfolderfilename
label_pathr@  r  r   cr4  s                               r*   r   zConverter.convert_to_yolo|  s   : v/v{{+:WW\\*l;
WW\\*m<
''(!ww||JAKK(48''(!ww||JAKK(480> $D.OPTP\P\.]+J+.2.>.>.@+J+??1%  z*))*5 	
 (6 F	iNHdw-1K+5k3+G;-[KJ4jG '{3 
ww~~j1%3 *%)]](,(8(8&*oo&6/3/F/F)-):):$+	&
 &(WW__Z%L
, @zBC >LD$8 9QSKK-/@AD
 ww''(8(8(DEaHHGH  "3X5FJ
 >!C7*EFww~~j1j#.  FH~ .$x.--. 6{a!24>2B-wjQRww~~j1j#. .OPVXbdw  zD  FL  NZ  \`  \h  \h  /i+J+MF	iN *cF3 	*q *&	D()*	* WWZcF; 	tII", ( 3 3#('5 	 	e^ee+5D f  &*	 $ :  
	* 	*	 	s=   9A%R,2S,S)'S5'<T,*SS&	)S2	5S>T
c                 F   d| v rd| v rd| v rd| v sy | d   | d   | d   | d   d| v r| d   ndf\  }}}}}t        |      dkD  rZt        j                  ||z        }t        j                  |dz  z  }t        j                  |d	z  d	z  |d	z  d	z  z         }||t        j
                  t        j                  |z
  |z
        t        j
                  t        j                  |z
        z
  z  z
  |d	z  z   }	||t        j                  t        j                  |z
  |z
        t        j                  t        j                  |z
        z
  z  z   |d	z  z   }
||z   }t        j                  |z
  |z   }t        j                  |z   |z   }d	t        j                  z  |z
  |z   }|	|t        j
                  |      z  z   |	|t        j
                  |      z  z   |	|t        j
                  |      z  z   |	|t        j
                  |      z  z   g}|
|t        j                  |      z  z   |
|t        j                  |      z  z   |
|t        j                  |      z  z   |
|t        j                  |      z  z   g}t        |      }t        |      }t        |      |z
  }t        |      |z
  }||||fS )
Nr  r  rM  rN  rotationg        r      r.   )	absmathatanpisqrtcossinminmax)r  label_xlabel_ylabel_wlabel_hlabel_ralphabetaradiusx_0y_0theta_1theta_2theta_3theta_4x_coordy_coords                    r*   r|  zConverter.rotated_rectangle  s    5LSE\g.>8uCT #J#J'N(O!+u!4E*#7
3'7G w<!IIg/0E77#D YY!1Wq[Q4FFGF 88DGGeOd23dhhtww6OOQQ A+  88DGGeOd23dhhtww6OOQQ A+  dlGggo,Gggo,G$''kE)D0G ftxx000ftxx000ftxx000ftxx000	G ftxx000ftxx000ftxx000ftxx000	G 'lG'lG'lW,G'lW,G'11r)   c           
         t        |       |t        |       |}n9t        j                  j                  |d      }t        j                  |d       d}d }| j
                  d   }|r| j                  |      n| j                  |      }t        |      D ]  \  }	}
|
d   |   }t        j                  j                  |d      }t        j                  j                  |      st        j                  |       d}|
d	   }t        j                  j                  |      s}	 t        ||| j                  | j                  d| j                  
      }t        j                  j                  |t        j                  j                  |            }	 t        |      \  }}}|
d   st         j#                  d|       %t        j                  j                  |      }t        j                  j)                  |      d   dz   }g }|
d   D ]  }||
d   |   z  } t+        |      dk(  r t         j-                  d|
d    d|       d|d   vsd|d   vrt         j-                  d| d|       |d   d   |d   d   }}t        j                  j                  ||      }t.        j0                  j3                         }|j5                  d dd       }|j6                  } ||d||        ||d||       |j9                  d      } ||dd|        ||dd|        ||dd|        ||d d!|        ||d"t;        |
d#      |       |j=                  |       |j9                  d$      } ||d d!|        ||d%d&|       |j=                  |       |j9                  d'      } ||d(t?        |      |        ||d)t?        |      |        ||d*t?        |      |       |j=                  |        ||d+d,|       |D ]C  }d-|v rd-nd.|v rd.nd }|t+        ||         dk(  r&||   d   }tA        |d/   d0z  |z        } tA        |d1   d0z  |z        }!tA        |d(   d0z  |z        }"tA        |d)   d0z  |z        }#|j9                  d2      }$ ||d%||$        ||d3d4|$        ||d5d,|$        ||d6d,|$       |j9                  d7      }% ||d8t?        |       |%        ||d9t?        |!      |%        ||d:t?        | |"z         |%        ||d;t?        |!|#z         |%       |$j=                  |%       |j=                  |$       F tC        jD                  |d<d=>      5 }&|jG                  |&d#d?d@A       d d d         y #  t         j#                  d|       Y xY w#  t         j%                  dj'                  ||
      d       Y *xY w# 1 sw Y   =xY w)BNrP  TrT  c                     | j                  |      }| j                  |      }|j                  |       |j                  |       y r?   )createElementcreateTextNodeappendChild)docr   attrparent_node
child_node	text_nodes         r*   create_child_nodez3Converter.convert_to_voc.<locals>.create_child_nodeZ  s>    **3/J**40I""9-##J/r)   r   r  Annotationsr/   r  )ri   rj   return_relative_pathrk   z'Can't read channels from image task_id=r  rY  rZ  r  z!No annotations found for task_id=z.xmlr\  r]  r	  r
  ra  r  folderr  sourcedatabase
MyDatabaseCOCO2017imageflickrflickridNULLr9  ro  ownerr@   rp  r{  rM  rN  depth	segmented0r^  r@  r  rc  r  objectposeUnspecified	truncated	difficultbndboxxminyminxmaxymaxr$  r%  r&  rE  zutf-8)	addindentnewlr(  )$r   rs   rt   r   rw  r|   r   r   ry  r   r   ri   rj   rk   r  r   ry   rz   r   r   r  r   r   xmldomgetDOMImplementationcreateDocumentdocumentElementr  r   r  rr   intrv   rw   writexml)'rB   r   r2  r   r   output_image_dir_relr  r   r<  r  r   rR  annotations_dirchannelsrX  full_image_path_
image_namexml_namebboxesr  rM  rN  xml_filepathmy_domr  	root_nodesource_node
owner_node	size_noderf  r@   r  r  r$  r  object_nodebndbox_noder4  s'                                          r*   r   zConverter.convert_to_vocN  s    	:''(#3 !ww||JAKK(48#+ 	0 ??1%  z*))*5 	
 (6 t	RNHdgx0J ggll:}EO77>>/2O,H4jG77>>*-U!)"($($4$4#'??-1+/+B+B"J  ')ggll("''*:*::*F'OU)D_)U1h
 >!C7*EF))*5Jww''
3A6?H FH~ .$x.--. 6{a0h0@
'LMvay04EVTUY4VEj\Q[SZR\] "1I&67CT9U6E77<<BLWW113F''lDAC++Ic8-A9Mc:z9E++H5Kc:|[Ic<[Ic7HkBc:v{Cc;dB0GU!!+.**73Jc:vzBc6>:F!!*-))&1Ic7CJ	Bc8S[)Dc7CM9E!!),c;Y? 3 )D0 &&.$&6(D 
 ;#d3i.A"5Cy|S	C%/0S	C&01W+e34X,v56!//9!#vt[A!#v}kJ!#{CE!#{CE!//9!#vs1v{C!#vs1v{C!#vs1q5z;G!#vs1q5z;G''4%%k273: C&A RTTV$QR Rgt	R@U)Q
'STKKZaa'1 b  "&	   @R Rs$    /VU9W	9V*W	W	c                 ,   t               }t               }t               }| j                  j	                         D ]t  \  }}|t        |d         z  }|d   }|D ]T  }||   j                  d      s|j                  ||   j                  d      |d       ||   j                  d      ||<   V v t        |      t        t        |j                                     z
  }t        t        |            }d}	|	t        |j                               v r!|	dz  }	|	t        |j                               v r!|D ]]  }|j                  |	|d       |	||<   |	dz  }	|	t        |j                               v s=|	dz  }	|	t        |j                               v r!_ ||fS )Nr@  labels_attrscategoryrb  r   r-   )
r   r   rq   rl   r   r   r   r   r  r   )
rB   r@  ru  rm  r@   r   attrsr  labels_to_addidxs
             r*   rx  zConverter._get_labels  s   V
"f,,,,. 	NJD$c$x.))F(E N<##J/%%$U|//
;UK 27u1A1A*1M'.N	N Fc$/B/G/G/I*J&KKtM23T-446771HC T-44677" 	ES%89),&1HC188:;;q 188:;;		 ...r)   )NNTNN)Tr?   )NT)NNTFF).r%   r&   r'   r,   rJ   rK   rL   rM   rN   rO   rX   rP   rT   rW   rU   rY   rQ   rR   rS   rZ   rf   rg   r   r   r{   r~   propertyr   r   r   rr   r	   r   r   staticmethodr  r!  r   r   r   r   r   r   r|  r   rx  r(   r)   r*   r]   r]   M   sF   gQA	
g 	JE	
g 	

>@	
g& 	

+@	
'g2 	 gFU	
3g> 	?AK
?gL 	'@AK	"
MgX 	

%oK)+=>	
Ygd 	fAK
egr 	'@AK	"
sg~ 	!h B)+=>
gN 	##-FA)+=>	&
OgZ 	,jZ)*	 
[gf 	*eZ)*	
ggr 	#5I)*
sg@ 	+ JA)+>?
AgLR! .@`Un1._B ' ''42 2# 2>CJ 
 
+6$LM
!2 EIEV Rh ;2 ;2| EILR\/r)   r]   )@rv   loggingr  rs   r   xml.domr  xml.dom.minidomcollectionsr   copyr   r   enumr   r   shutilr   typingr	   r
   r   r   ujsonr   PILr   label_studio_sdk.converterr    label_studio_sdk.converter.audior   $label_studio_sdk.converter.keypointsr   r   r   r   r   "label_studio_sdk.converter.exportsr    label_studio_sdk.converter.utilsr   r   r   r   r   r   r   r   r   r   r   r    =label_studio_sdk._extensions.label_studio_tools.core.utils.ior!   'label_studio_sdk.converter.exports.yolor"   	getLoggerr%   ry   NotImplementedErrorr$   r,   r  r]   r(   r)   r*   <module>r     s    	   	 	   #      ( (    , I {  { 3    Y U			8	$	1 	T <h/ h/r)   