o
    Ďi?                  	   @   s   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e	de	de	de	fdd	Z
de	defd
dZde	de	de	de	fddZde	de	de	de	fddZde	de	fddZde	fddZ	dde	de	de	de	fddZdde	de	de	de	fddZdS )    N)Callable)*print_warn_for_wrong_dependencies_versions
model_type
model_pathfilenamereturnc                 C   s   t | }|| ||S N)_get_processor_function)r   r   r   	processor r   Y/home/jeff/fluffinator/venv/lib/python3.10/site-packages/roboflow/util/model_processor.pyprocess   s   r   c                    s   g d}t  fdd|D std  d|  dr<t  fdddD r:g d} |vr:t  d	| tS d
 v rBtS d v rHtS tS )N)yolov5yolov7z
yolov7-segyolov8yolov9yolov10yolov11yolov12yolo26yolonas	paligemma
paligemma2
florence-2rfdetrc                 3       | ]}| v V  qd S r   r   ).0supported_modelr   r   r   	<genexpr>#       z*_get_processor_function.<locals>.<genexpr>Model type z% not supported. Supported models are )r   r   r   c                 3   r   r   r   )r   modelr   r   r   r   '   r    )zflorence-2-basezflorence-2-largezpaligemma-3b-pt-224zpaligemma-3b-pt-448zpaligemma-3b-pt-896zpaligemma2-3b-pt-224zpaligemma2-3b-pt-448zpaligemma2-3b-pt-896zpaligemma2-3b-pt-224-peftzpaligemma2-3b-pt-448-peftzpaligemma2-3b-pt-896-peftzB not supported for this type of upload.Supported upload types are r   r   )any
ValueError
startswithRuntimeError_process_huggingface_process_yolonas_process_rfdetr_process_yolo)r   supported_modelssupported_hf_typesr   r   r   r	      s$   
r	   c              
   C   s  d| v r"z
dd l }dd l}W n ty   tdw tdgdd nd| v r<z
dd l }dd l}W n ty;   tdw d	| v sHd
| v sHd| v r^zdd l }W nq ty]   td|  dw d| v rz
dd l }dd l}W n tyw   tdw tdgdd n@d| v rz
dd l }dd l}W n ty   tdw td tdgdd nd| v rz
dd l }dd l}W n ty   tdw |jtj	||dd}d|v r|d d ur|d n|d }t
|jtr|j}n%g }t|jD ]\}}	||	|j|	 f q|jdd d dd |D }d| v s&d| v s&d| v s&d| v s&d| v rd | v sC| dsC| dsC| dsC| drM|jd! }
|d" }n|j}
|j}z||j|
d#d$ | D |j| d%}W nn ty   ||j|
d&d$ |j D |j| d%}Y nRw d	| v sd
| v sd| v rttj	|d'}t|}W d    n	1 sw   Y  ||jd(|v r|d( n|d) |d* d+| d,}t|d-r|j|d-< ttj	|d.d/}t|| W d    n	1 sw   Y  || tj	|d0 g d1}d2}t tj	||d/8}|D ],}tj!tj	||r6|j"tj	|||tj#d3 q|d4v rCt$d5| d6qW d    |S 1 sQw   Y  |S )7Nr   r   ztThe ultralytics python package is required to deploy yolov8 models. Please install it with `pip install ultralytics`)ultralytics==z8.0.196T)ask_to_continuer   zuThe ultralytics python package is required to deploy yolov10 models. Please install it with `pip install ultralytics`r   r   r   z/The torch python package is required to deploy z3 models. Please install it with `pip install torch`r   zuThe ultralytics python package is required to deploy yolov11 models. Please install it with `pip install ultralytics`)r-   z>=z8.3.0r   zThe ultralytics python package is required to deploy yolov12 models. Please install it from `https://github.com/sunsmarterjie/yolov12`z
!!! ATTENTION !!!
Model must be trained and uploaded using ultralytics from https://github.com/sunsmarterjie/yolov12
or through the Roboflow platform
!!! ATTENTION !!!
)r-   r.   z8.3.63r   ztThe ultralytics python package is required to deploy yolo26 models. Please install it with `pip install ultralytics`F)weights_onlyr"   emac                 S   s   | d S )Nr   r   )xr   r   r   <lambda>   s    z_process_yolo.<locals>.<lambda>)keyc                 S   s   g | ]}|d  qS )   r   )r   r2   r   r   r   
<listcomp>   s    z!_process_yolo.<locals>.<listcomp>z-clsnc
train_argsc                 S   .   i | ]\}}|d ks|dks|dkr||qS r"   imgszbatchr   r   kvalr   r   r   
<dictcomp>   s   . z!_process_yolo.<locals>.<dictcomp>)namesyamlr7   argsultralytics_versionr   c                 S   r9   r:   r   r=   r   r   r   r@      s    (opt.yamlr;   img_size
batch_size)r;   r<   rA   r7   rC   r   rB   model_artifacts.jsonwstate_dict.pt)results.csvresults.pngrI   rK   roboflow_deploy.ziparcnamecompress_type)rI   rK   File ; not found. Please make sure to provide a valid model path.)%torchr-   ImportErrorr&   r   printloadospathjoin
isinstancerA   list	enumerateappendsortr%   rB   r7   rC   items__version__	Exception__dict__open	safe_loadhasattrjsondumpsave
state_dictzipfileZipFileexistswriteZIP_DEFLATEDr$   )r   r   r   rT   r-   r"   model_instanceclass_namesir?   r7   rC   model_artifactsstreamoptsfp
list_fileszip_file_namezipMefiler   r   r   r*   E   s  
$









	



r*   c                 C   sP  g d}| |vrt d|  d| tj|s td| dt|}tdd |D d }|d u r7tdt|| |d	krPt	
tj||tj|d	 d	g}g d
}d}ttj||d:}	|D ]}
|	jtj||
|
tjd qg|D ]}
tjtj||
r|	jtj||
|
tjd qzW d    |S 1 sw   Y  |S )N)zrfdetr-basezrfdetr-nanozrfdetr-smallzrfdetr-mediumzrfdetr-largezrfdetr-xlargezrfdetr-2xlargezrfdetr-seg-nanozrfdetr-seg-smallzrfdetr-seg-mediumzrfdetr-seg-largezrfdetr-seg-xlargezrfdetr-seg-2xlarger!   z$ not supported. Supported types are Model path  does not exist.c                 s   s(    | ]}| d s| dr|V  qdS )z.ptz.pthNendswith)r   fr   r   r   r     s   & z"_process_rfdetr.<locals>.<genexpr>z4No .pt or .pth model file found in the provided pathz
weights.pt)rL   rM   rI   class_names.txtrN   rJ   rO   )r$   rX   rY   rm   FileNotFoundErrorlistdirnextr&   get_classnames_txt_for_rfdetrshutilcopyrZ   rk   rl   rn   ro   )r   r   r   _supported_typesmodel_filespt_filerequired_filesoptional_filesrx   ry   rz   r   r   r   r)      s6   

 
r)   r   c                 C   s   t j| d}t j|rt| |S dd l}|jt j| |ddd}t|d }d|v rWt|d}|d D ]	}|	|d	  q8W d    n1 sLw   Y  t| |S t
d
|  d)Nr   r   cpuF)map_locationr0   rC   rq   rJ   
z,No class_names.txt file found in model path a  .
This should only happen on rfdetr models trained before version 1.1.0.
Please re-train your model with the latest version of the rfdetr library, or
please create a class_names.txt file in the model path with the class names
in new lines in the order of the classes in the model.
)rX   rY   rZ   rm   maybe_prepend_dummy_classrT   rW   varsrd   rn   r   )r   r   class_names_pathrT   r"   rC   r   
class_namer   r   r   r   +  s$   
r   class_name_filec                 C   s   t | }| }W d    n1 sw   Y  d}||vrA|d| t | d}|| W d    d S 1 s:w   Y  d S d S )Nzbackground_class83422
r   rJ   )rd   	readlinesinsert
writelines)r   r   rq   dummy_classr   r   r   r   E  s   

"r   &fine-tuned-paligemma-3b-pt-224.f16.npzc                 C   s  t j|std| dt |}td| d|  g }tdd |D d }tdd |D retd	|  d
 g d}|D ]}||vrYtd| td}|	 dkrYt
d q@|D ]}|| q\n|d urwtd| d || ntd| dt|dkrtd| dtd|  dd l}	d}
|	t j||
d}|D ]}|jt j|||d qW d    n1 sw   Y  td |
S )Nr{   r|   zModel files found in z: c                 s   s    | ]
}| d r|V  qdS )z.npzNr}   r   rz   r   r   r   r   \  s    z'_process_huggingface.<locals>.<genexpr>c                 S   s   g | ]}| d qS )z.safetensorsr}   r   r   r   r   r6   ]  s    z(_process_huggingface.<locals>.<listcomp>z9Found .safetensors file in model path. Deploying PyTorch z model.)zpreprocessor_config.jsonzspecial_tokens_map.jsonztokenizer_config.jsonztokenizer.jsonzMissing necessary filezDo you want to continue? (y/n)yr5   zFound .npz file z. in model path. Deploying JAX PaliGemma model.z1No .npz or .safetensors file found in model path .r   z#No valid files found in model path zZipping files for deploy: zroboflow_deploy.tarrJ   )rP   z2Uploading to Roboflow... May take several minutes.)rX   rY   rm   r   r   rV   r   r#   inputlowerexitr^   lentarfilerd   rZ   add)r   r   r   r   files_to_deploynpz_filenamenecessary_filesrz   resr   tar_file_nametarr   r   r   r'   P  sF   

r'   weights/best.ptc                 C   s$  zdd l }W n ty   tdw |jtj||dd}|d d }tj|d}tj|s>tdtj|d	 d
ttj|d}t	
|}W d    n1 sWw   Y  g d}	|	D ]}
|
|vrtt| d|
 d|	 qb|t|d|v r|d n|d |d |d d| d}ttj|dd}t|| W d    n1 sw   Y  ttj||tj|d g d}d}ttj||d6}|D ]*}tjtj||r|jtj|||tjd q|d|fv rtd| dqW d    |S 1 sw   Y  |S )Nr   ziThe torch python package is required to deploy yolonas models. Please install it with `pip install torch`r   )r   processing_paramsrq   rE   z$You must create an opt.yaml file at  z of the format:
imgsz: <resolution of model>
batch_size: <batch size of inference model>
architecture: <one of [yolo_nas_s, yolo_nas_m, yolo_nas_l].s, m, l refer to small, medium, large architecture sizes, respectively>
)r;   rG   architecturez lacks required key z. Required keys: r;   rF   rG   r   )r;   r<   r   rH   rI   rJ   rK   )zresults.jsonrM   rI   rK   rN   rO   rR   rS   )rT   rU   r&   rW   rX   rY   rZ   rm   rd   rB   re   r   rg   rh   r   r   rk   rl   rn   ro   r$   )r   r   r   rT   r"   rq   opt_pathrt   ru   required_keysr4   rs   rv   rw   rx   ry   rz   r   r   r   r(     sh    
r(   )r   )r   )rg   rX   r   rk   typingr   rB   roboflow.util.versionsr   strr   r	   r*   r)   r   r   r'   r(   r   r   r   r   <module>   s2    4 34
 4