
    j&                        d dl mZ d dlmZ d dlmZ d dlZd dlZd dl	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d+dZd,dZd-d.dZ	 	 	 	 d/d0d Zd1d2d"Zd1d3d&Zd4d5d)Zd* ZdS )6    )annotations)partial)PathN)DetectPosePose26)LOGGER)attempt_download_asset)spaces_in_path)make_anchorsmodeltorch.nn.Modulereturnc           	     X   |                                  D ]}t          |t                    sddl}|                    t
          |          |_        t          |t                    rC|                    t          t          t          |          t          u           |          |_        | S )z\A wrapper for TensorFlow export compatibility (TF-specific handling is now in head modules).r   N)	is_pose26)modules
isinstancer   types
MethodType_tf_decode_boxes_get_decode_boxesr   r   _tf_kpts_decodetyper   kpts_decode)r   mr   s      h/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/ultralytics/utils/export/tensorflow.py
tf_wrapperr      s    ]]__ g g!V$$ 	#../?CCa 	g!,,W_PTUVPWPW[aPa-b-b-bdeffAML    xdict[str, torch.Tensor]torch.Tensorc                B   |d         d         j         }|d         }| j        dk    rL| j        s| j         |k    r:d t          |d         | j        d          D             \  | _        | _        || _         |dd         \  }}t          j        ||||g|j	        	          
                    d
dd
          }| j        | j        d         |z  z  }|                     |                     |          |z  | j                            d          |ddddf         z            }|S )z,Decode bounding boxes for TensorFlow export.featsr   boxesimxc              3  B   K   | ]}|                     d d          V  dS )r      N)	transpose).0as     r   	<genexpr>z#_tf_decode_boxes.<locals>.<genexpr>$   s0      %l%lAakk!Q&7&7%l%l%l%l%l%lr         ?      devicer'   N)shapeformatdynamicr   strideanchorsstridestorchtensorr0   reshapedecode_bboxesdfl	unsqueeze)	selfr   r1   r$   grid_hgrid_w	grid_sizenormdboxs	            r   r   r      s'   gJqMEgJE{eu1D1D%l%laPWjZ^ZegjAkAk%l%l%l"dl
1Q3ZNFFffff=elSSS[[\]_`bcddI<4;q>I56Ddhhuoo4dl6L6LQ6O6ORVWXWXWXZ\[\Z\W\R]6]^^DKr   Fkptsr   boolc                F   | j         d         }|j        d         } |j        |g| j         dR  }| j        dd         \  }}t          j        ||g|j                                      ddd          }| j        | j        d         |z  z  }	|r|ddddddf         | j	        z   n|ddddddf         dz  | j	        d	z
  z   |	z  }
|d
k    r8t          j
        |
|dddddd
f                                         fd          }
|
                    || j        d          S )z'Decode keypoints for TensorFlow export.r'   r   r-   r.   r/   Ng       @r,      )	kpt_shaper1   viewr7   r8   r0   r9   r6   r4   r5   catsigmoidnk)r=   rC   r   ndimbsyr>   r?   r@   rA   r*   s              r   r   r   -   sC   >!D	AB	"*t~*r***AZ!_NFFff-ah???GG1aPPI<4;q>I56D)2	b!AAAqqq"1"H+
$
$111aaa!8s9Jdl]`N`9afjjAqyyIq!AAAqqq!A#I,..00115566"dgr"""r    	onnx_filestr
output_dirr   int8images
np.ndarraydisable_group_convolutionc                f   t          d          }|                                st          | ddd           d}|rQ|dz  }|J|                    dd           t	          j        t          |          |           d|g d	gggg d
ggggg}ddl}	t          |	j	        d          sddl
fd}
|
|	j	        _        ddl}t          j        | d|j         d           |                    | t          |          dd||| d|	  	        }|r|                    d           |                    d          D ]K}|                    |                    |j                            dd          |j        z                        L|                    d          D ]}|                                 |S )a  Convert an ONNX model to TensorFlow SavedModel format using onnx2tf.

    Args:
        onnx_file (str): ONNX file path.
        output_dir (Path): Output directory path for the SavedModel.
        int8 (bool, optional): Enable INT8 quantization. Defaults to False.
        images (np.ndarray, optional): Calibration images for INT8 quantization in BHWC format.
        disable_group_convolution (bool, optional): Disable group convolution optimization. Defaults to False.
        prefix (str, optional): Logging prefix. Defaults to "".

    Returns:
        (keras.Model): Converted Keras model.

    Notes:
        - Requires onnx2tf package. Downloads calibration data if INT8 quantization is enabled.
        - Removes temporary files and renames quantized models after conversion.
    z6calibration_image_sample_data_20x128x128x3_float32.npyz.zipT)unzipdeleteNz&tmp_tflite_int8_calibration_images.npy)parentsexist_okrU   )r   r   r   )   r]   r]   r   float32_to_bfloat16c                n                         d                    d|                     d         }|dz	  S )zBConvert float32 to bfloat16 (truncates lower 16 bits of mantissa).z=Iz=fr      )unpackpack)fvalivalstructs     r   r^   z-onnx2saved_model.<locals>.float32_to_bfloat16h   s3    ==v{{4'>'>??BD2:r   z% starting TFLite export with onnx2tf ...error)	input_onnx_file_pathoutput_folder_pathnot_use_onnxsim	verbosityoutput_integer_quantized_tflite!custom_input_op_name_np_data_pathenable_batchmatmul_unfoldoutput_signaturedefsrW   )
missing_okz*_dynamic_range_quant.tflite_dynamic_range_quant_int8z%*_integer_quant_with_int16_act.tflite)r   existsr
   mkdirnpsaverR   onnx.helperhasattrhelperre   r^   onnx2tfr	   info__version__convertunlinkrglobrename	with_namestemreplacesuffix)rQ   rS   rT   rU   rW   prefixonnx2tf_filenp_datatmp_fileonnxr^   rz   keras_modelfilere   s                 @r   onnx2saved_modelr   <   s&   4 PQQL   O,444DNNNNG U HHTD999GCMM6*** (yyyk]O?P>Q=RSTG 4; 566 >	 	 	 	 	
 +>'NNN
K6XX@SXXXYYY//&z??(,*1/38!"; " 
 
K  4((($$%CDD 	j 	jDKKty'8'89OQX'Y'Y\`\g'ghhiiii$$%LMM 	 	DKKMMMMr   r   c                    ddl }ddlm} t          j        d| d|j         d           |                     fd          }|                    |                     j	        d         j
         j	        d         j                            } ||          }|j                                         |j                            |j        t!          |j                  |j        d	           dS )
a  Convert a Keras model to TensorFlow GraphDef (.pb) format.

    Args:
        keras_model (keras.Model): Keras model to convert to frozen graph format.
        file (Path): Output file path (suffix will be changed to .pb).
        prefix (str, optional): Logging prefix. Defaults to "".

    Notes:
        Creates a frozen graph by converting variables to constants for inference optimization.
    r   N)!convert_variables_to_constants_v2
z! starting export with tensorflow rf   c                     |           S )N )r   r   s    r   <lambda>zkeras2pb.<locals>.<lambda>   s    kk!nn r   F)graph_or_graph_deflogdirnameas_text)
tensorflow0tensorflow.python.framework.convert_to_constantsr   r	   r{   r|   functionget_concrete_function
TensorSpecinputsr1   dtypegraphas_graph_defiowrite_graphrR   parentr   )r   r   r   tfr   r   frozen_funcs   `      r   keras2pbr      s     bbbbbb
KQVQQbnQQQRRR
,,,,--A	k.@.C.I;K]^_K`Kf g ghhA33A66K""$$$E):3t{CSCSZ^Zcmrsssssr   tflite_file
str | Pathr   c                    ddl }d| d|  d}t          j        | d| d           |                    |d	           dS )
a  Convert a TensorFlow Lite model to Edge TPU format using the Edge TPU compiler.

    Args:
        tflite_file (str | Path): Path to the input TensorFlow Lite (.tflite) model file.
        output_dir (str | Path): Output directory path for the compiled Edge TPU model.
        prefix (str, optional): Logging prefix. Defaults to "".

    Notes:
        Requires the Edge TPU compiler to be installed. The function compiles the TFLite model
        for optimal performance on Google's Edge TPU hardware accelerator.
    r   Nzedgetpu_compiler --out_dir "zS" --show_operations --search_delegate --delegate_search_step 30 --timeout_sec 180 ""
 running ''Tshell)
subprocessr	   r{   run)r   rS   r   r   cmds        r   tflite2edgetpur      sz     	 	 	 	 	 	  K6++S+++,,,NN3dN#####r   pb_filehalfc                0   ddl }ddl}ddl}t          j        d| d|j         d           |                                                                }t          | d          5 }	|	                    |	
                                           ddd           n# 1 swxY w Y   d                    t          |                    }
t          j        d| d|
            |rd	n|rd
nd}t          |           5 }t          |          5 }d| d|
 d| d| d	}t          j        | d| d           |                    |d           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   d|v rt          j        | d| d           dS dS )a  Convert a TensorFlow GraphDef (.pb) model to TensorFlow.js format.

    Args:
        pb_file (str): Path to the input TensorFlow GraphDef (.pb) model file.
        output_dir (str): Output directory path for the converted TensorFlow.js model.
        half (bool, optional): Enable FP16 quantization. Defaults to False.
        int8 (bool, optional): Enable INT8 quantization. Defaults to False.
        prefix (str, optional): Logging prefix. Defaults to "".

    Notes:
        Requires tensorflowjs package. Uses tensorflowjs_converter command-line tool for conversion.
        Handles spaces in file paths and warns if output directory contains spaces.
    r   Nr   z# starting export with tensorflowjs rf   rb,z output node names: z--quantize_float16z--quantize_uint8rP   z6tensorflowjs_converter --input_format=tf_frozen_model z --output_node_names=z "z" "r   r   r   Tr    z8 your model may not work correctly with spaces in path 'z'.)r   r   tensorflowjsr	   r{   r|   Graphr   openParseFromStringreadjoin
gd_outputsr   r   warning)r   rS   r   rT   r   r   r   tfjsgdr   outputsquantizationfpb_f_r   s                  r   pb2tfjsr      s    
KUVUU@PUUUVVV		 	 	"	"B	gt		 (
499;;'''( ( ( ( ( ( ( ( ( ( ( ( ( ( (hhz"~~&&G
K:V::::;;;+/W''45W5G5GUWL		 	  (D.*D*D (k.:k kQXk k\`k kegk k k 	 	v/////000s$'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( j&hhZdhhhiiiii sI   #(BBB7E+AEE+E	E+E	E++E/2E/c           	        g g }}| j         D ]6}|                    |j                   |                    |j                   7t          d t          t          |          t          |          z
            D                       S )z3Return TensorFlow GraphDef model output node names.c              3  J   K   | ]}|                     d           | dV  dS )NoOpz:0N)
startswith)r)   r   s     r   r+   zgd_outputs.<locals>.<genexpr>   s=      ggqRSR^R^_eRfRfgQ(((ggggggr   )nodeappendr   extendinputsortedlistset)r   	name_list
input_listr   s       r   r   r      s    zI & &###$*%%%%ggDY#j//)I$J$Jggggggr   )r   r   r   r   )r   r    r   r!   )F)rC   r!   r   rD   r   r!   )FNFrP   )
rQ   rR   rS   r   rT   rD   rU   rV   rW   rD   )rP   )r   r   )r   r   rS   r   r   rR   )FFrP   )
r   rR   rS   rR   r   rD   rT   rD   r   rR   )
__future__r   	functoolsr   pathlibr   numpyru   r7   ultralytics.nn.modulesr   r   r   ultralytics.utilsr	   ultralytics.utils.downloadsr
   ultralytics.utils.filesr   ultralytics.utils.talr   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   # " " " " "                  7 7 7 7 7 7 7 7 7 7 $ $ $ $ $ $ > > > > > > 2 2 2 2 2 2 . . . . . .
 
 
 
   # # # # #$ &+I I I I IXt t t t t,$ $ $ $ $6%j %j %j %j %jPh h h h hr   