
    j'                        d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	 d dl
mZmZmZmZmZ d dlmZ dZ ej        d          Zd	d	d
dZdedefdZdee         fdZdee         deeef         fdZdededee         deeef         dee         dedz  fdZdedee         dee         fdZdedee         dede eee         ef         fdZ!	 	 	 	 d!dedee         dede"dededefd Z#dS )"    N)Iterable)Image)loggermodel_supports_text_promptresolve_model_path)get_datasetget_dataset_assetis_asset_labeledlist_dataset_assetssave_asset_annotation)predict_image_boxes_batch   z
[^a-z0-9]+)
multiriderrider)multipersonperson)r   r   multipeoplevaluereturnc                     t                               dt          | pd                                                                                    S )N )	_TOKEN_REsubstrstriplower)r   s    Q/home/longshao/multi-rider-rag/modules/training/services/auto_annotate_service.py_normalize_tokenr      s:    ==S"--3355;;==>>>    c                 J   t          | t                    r| }n$t          j        dt	          | pd                    }g }|D ]a}d                    t	          |pd                                                                                    }|r|                    |           b|S )Nz	[,;\n\r]+r    )
isinstancelistresplitr   joinr   append)r   	raw_itemsitemsraw_itemitems        r   _parse_name_listr,      s    % =		H\3u{+;+;<<	E  xxHN++113399;;<< 	LLLr   dataset_classesc                 8   d t          |          D             }i }t          | t                    r|                                 }nst	          |           }g }g }|D ][}d|vr|                    dd          \  }}	|                    |                                |	                                f           \|}|D ]\  }
}t          |
          }|sd }t          |t                    s3t          |                                                                          rNt          t          |                                                    }d|cxk    rt          |          k     rn n+|}n(t          t          |                    }||v r||         }||||<   |S )Nc                 4    i | ]\  }}t          |          |S  r   .0indexnames      r   
<dictcomp>z(_parse_class_mapping.<locals>.<dictcomp>.   '    bbbt&t,,ebbbr   =   r   )	enumerater"   dictr)   r,   r%   r'   r   r   intr   isdigitlen)r   r-   dataset_lookupmappingpairslinesparsed_pairslineleftright
raw_source
raw_target
source_keytarget_index	candidate
target_keys                   r   _parse_class_mappingrM   -   s   bbyQ`GaGabbbN G% .3kkmm ''.0 	? 	?D$**S!,,KD%u{{}} =>>>>"' / /
J%j11
 	j#&& 	:#j//*?*?*A*A*I*I*K*K 	:C
OO113344II4444O 4 444444()#j//::J^++-j9#".GJNr   
pred_index	pred_nameclass_mappingprompt_classesc                    t          |          }t          t          |                     }||v r||         S |r||v r||         S |r?t          |          t          |          k    rd| cxk    rt          |          k     rn n| S d t	          |          D             }|r||v r||         S t
                              |d          D ]}||v r
||         c S d S )Nr   c                 4    i | ]\  }}t          |          |S r0   r1   r2   s      r   r6   z0_resolve_dataset_class_index.<locals>.<dictcomp>e   r7   r   r0   )r   r   r<   r>   r:   _ALIASESget)	rN   rO   r-   rP   rQ   name_key	index_keyr?   aliass	            r   _resolve_dataset_class_indexrY   S   s(     	**HC
OO$$IM!!Y'' 'H--X&& #n--_1E1EEE!zJpJpJpJp\_`o\p\pJpJpJpJpJpbbyQ`GaGabbbN (H..h''h++ ) )N""!%(((( # 4r   	model_keyc                     t          |           sg S |rt          |          nt          |          }|st          d          |S )Nu-   开放词表模型需要至少一个提示词)r   r,   r#   
ValueError)rZ   r-   prompt_valuerQ   s       r   _prepare_prompt_classesr^   p   sU    %i00 	7C^%l333oI^I^N JHIIIr   
dataset_id	asset_ids	overwritec                    t          |           }d t          | d          D             }g }d}|D ]T}|                    |          pt          | |          }|st	          ||          r|dz  }?|                    |           U|||fS )Nc                      i | ]}|d          |S )idr0   )r3   r+   s     r   r6   z#_collect_assets.<locals>.<dictcomp>{   s    ZZZddTZZZr   i  )limitr   r9   )r   r   rU   r	   r
   r'   )	r_   r`   ra   dataset	all_itemsselected_itemsskipped_existingasset_idr+   s	            r   _collect_assetsrk   y   s    *%%GZZ.A*TX.Y.Y.YZZZI!#N $ $}}X&&Q*;J*Q*Q 	-gt<< 	!d####N$444r   Fconf_threshimgszc	                 r   |st          d          t          |          }	t          j                            |	          st          d          t          | ||          \  }
}}|s)t          |          r |ddd|dd           |
dd|dg dS |
                    d          pg }t          |||          }t          ||          }d}d}d}g }t          |          }t          |          r ||||||d           t          dt          |          t                    D ]}|||t          z            }g }g }|D ]}|                    d          pd}|rt          j                            |          s;	 t          j        |          5 }|                    |                    d	                     d d d            n# 1 swxY w Y   |                    |           # t"          $ r }t%          j        d
||           Y d }~d }~ww xY w|st)          |||||pd           }t+          ||          D ]\  }}|dz  }g }|D ]} t-          t/          |                     dd                    t1          |                     dd                    |||          }!|![|                    |!d|!cxk    rt          |          k     rn n||!         ndt3          |                     dd          pd          | d         | d         | d         | d         d           |s'|dz  }t          |          r ||||||d           t5          | |d         |          }"|"d         }#t7          |#          D ]T\  }$}%|$t          |          k     r<t9          t3          ||$                             dd          pd          d          |%d<   U|dz  }|                    |"d         |#|"d         |"d         d           t          |          r ||||||d            t;          |           }
|
|||||dS )Nu   至少选择一张图片u   预标注模型不存在r   )total	processedupdatedri   no_detection)rf   rp   rq   ri   rr   r)   class_names	file_pathr   RGBz9failed to open dataset asset for auto annotation: %s (%s))imagesrZ   rl   rm   rQ   r9   class_index
class_name)rN   rO   r-   rP   rQ   
confidenceg        x1y1x2y2)rw   rx   ry   rz   r{   r|   r}   rd   boxes   asset
is_labeled
label_path)r   r~   r   r   )r\   r   ospathisfilerk   callablerU   r^   rM   r>   rangeAUTO_ANNOTATE_BATCH_SIZEr   openr'   convert	Exceptionr   warningr   ziprY   r<   r   floatr   r:   roundr   )&r_   r`   rZ   rl   rm   r]   class_mapping_valuera   progress_callback
model_pathrf   rh   ri   r-   rQ   rP   rp   rq   rr   updated_itemsro   startchunkrv   image_itemsr+   r   imageexcpredictions
pred_boxesmapped_boxesboxrJ   savedsaved_boxesr4   	saved_boxs&                                         r   auto_annotate_dataset_assetsr      s     53444#I..J7>>*%% 534440?
IW`0a0a-G^- 
%&& 		!" (8$%     0
 
 	
 kk-006BO,YVVN()<oNNMIGL "ME!"" 	
&"$4 , 	
 	
 	
 q#n--/GHH X Xuu/G'GGH$&"$ 		g 		gD88K((.BD rw~~d33 gZ%% 8MM%--"6"67778 8 8 8 8 8 8 8 8 8 8 8 8 8 8""4(((( g g gZ\`beffffffffg  	/#)1T
 
 
 !$K = = >	 >	D*NIL!  ;"377=!#<#<==!#'',";";<<$3"/#1       '##'3GHLGoGoGoGo[^_n[o[oGoGoGoGoGool&C&Cuw&+CGGL#,F,F,M#&N&N!$i!$i!$i!$i 
 
 
 
   !-.. 	%%%*)2'.0@,8    )*d4j,OOE.K$-k$:$: q q y3|,,,,.3E,u:M:Q:QR^`c:d:d:khk4l4lno.p.pIl+qLG  "7^("'"5"'"5	    )** 	!!!&%.#*,<(4   m>	@ *%%G,$  s<   8G")G5G"GG"G	G""
H,HH)NNFN)$r   r$   typingr   PILr   shared.config.configr   r   r   )modules.training.services.dataset_servicer   r	   r
   r   r   shared.inference.infer_servicer   r   compiler   rT   r   r   r#   r,   r;   r<   rM   rY   r^   booltuplerk   r   r   r0   r   r   <module>r      s   				 				             W W W W W W W W W W              E D D D D D  BJ}%%	$), ?C ?C ? ? ? ?tCy    #c #tCH~ # # # #L #Y S>	
 I 	4Z   :s T#Y Y]^aYb    5 5S	 5d 5uUY[_`d[egjUjOk 5 5 5 5* ^ ^^Cy^ ^ 	^
 ^ ^ 
^ ^ ^ ^ ^ ^r   