
    j3                        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mZmZ d dlmZmZmZ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	 	 	 	 d0d1d"Zd2d3d$Z d2d4d'Z!d5d6d*Z"d+ Z#dS )7    )annotations)partial)PathN)DetectPosePose26)LINUXLOGGERMACOS)check_apt_requirementscheck_requirementscheck_versionis_sudo_available)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      f/var/www/html/Carbon-Document/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tensorr6   reshapedecode_bboxesdfl	unsqueeze)	selfr%   r7   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   r3   r4   r5   Ng       @r2      )	kpt_shaper7   viewr=   r>   r6   r?   r<   r:   r;   catsigmoidnk)rC   rI   r   ndimbsyrD   rE   rF   rG   r0   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_dir
Path | strint8imagesnp.ndarray | Nonedisable_group_convolutionprefixc                   t           j                                        }	 ddl}n## t          $ r t          d           ddl}Y nw xY wt          ddddt          rdnd	z   d
dd|rdnddf	d           t          j        d| d|j	         d           t          |j	        dddd           t          |          }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 ),ad  Convert an ONNX model to TensorFlow SavedModel format using onnx2tf.

    Args:
        onnx_file (str): ONNX file path.
        output_dir (Path | str): Output directory path for the SavedModel.
        int8 (bool, optional): Enable INT8 quantization. Defaults to False.
        images (np.ndarray | None, 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:
        - Auto-installs tensorflow, onnx2tf, and all required dependencies if not present.
        - Downloads calibration data if INT8 quantization is enabled.
        - Removes temporary files and renames quantized models after conversion.
    r   Nztensorflow>=2.0.0,<=2.19.0ztf_keras<=2.19.0zsng4onnx>=1.0.1zonnx_graphsurgeon>=0.3.26zai-edge-litert>=1.2.0z,<1.4.0rV   zonnx>=1.12.0,<2.0.0zonnx2tf>=1.26.3,<1.29.0zonnxslim>=0.1.71zonnxruntime-gpuonnxruntimezprotobuf>=5z---extra-index-url https://pypi.ngc.nvidia.com)cmds
! starting export with tensorflow ...z>=2.0.0
tensorflowTz6https://github.com/ultralytics/ultralytics/issues/5161)nameverbosemsgz6calibration_image_sample_data_20x128x128x3_float32.npyz.zip)unzipdeletez&tmp_tflite_int8_calibration_images.npy)parentsexist_okr\   )r   r   r   )   rn   rn   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"   ro   z-onnx2saved_model.<locals>.float32_to_bfloat16   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_signaturedefsr^   )
missing_okz*_dynamic_range_quant.tflite_dynamic_range_quant_int8z%*_integer_quant_with_int16_act.tflite) r=   cudais_availablerf   ImportErrorr   r   r
   info__version__r   r   existsr   mkdirnpsaverX   onnx.helperhasattrhelperrv   ro   onnx2tfconvertunlinkrglobrename	with_namestemreplacesuffix)rW   rY   r[   r\   r^   r_   r   tfonnx2tf_filenp_datatmp_fileonnxro   r   keras_modelfilerv   s                   @r"   onnx2saved_modelr   =   s?   4 :""$$D       7888  '#E'AyyrB!%!%8=
	
 =    KQVQQbnQQQRRR
D    j!!J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&*(!"; " 
 
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s   & AAoutput_filec                    ddl }ddlm} t          j        d| d|j         d           |                     fd          }|                    |                     j	        d         j
         j	        d         j                            } ||          }|j                                         t          |          }|j                            |j        t#          |j                  |j        d	           t#          |          S )
a  Convert a Keras model to TensorFlow GraphDef (.pb) format.

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

    Returns:
        (str): Path to the exported ``.pb`` file.

    Notes:
        Creates a frozen graph by converting variables to constants for inference optimization.
    r   N)!convert_variables_to_constants_v2rc   rd   re   c                     |           S )N )r%   r   s    r"   <lambda>zkeras2pb.<locals>.<lambda>   s    kk!nn r$   F)graph_or_graph_deflogdirrg   as_text)rf   0tensorflow.python.framework.convert_to_constantsr   r
   r   r   functionget_concrete_function
TensorSpecinputsr7   dtypegraphas_graph_defr   iowrite_graphrX   parentrg   )r   r   r_   r   r   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""$$${##KE&,S9K5L5LS^Scmr     {r$   tflite_file
str | Pathc                   ddl }d}d}t          sJ d|             |                    ||j        |j        d          j        dk    rgt          j        d| d	|            t                      rd
nd}| dd| dd| dfD ]}|                    |dd           t          dg           |                    |ddd          j	        
                                                    d          d         }t          j        d| d| d           d| d|  d}	t          j        | d|	 d           |                    |	d           t          t          |          t          |           j         dz            S ) aP  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 "".

    Returns:
        (str): Path to the exported Edge TPU model file.

    Notes:
        Auto-installs the Edge TPU compiler if not found. The function compiles the TFLite model
        for optimal performance on Google's Edge TPU hardware accelerator.
    r   Nzedgetpu_compiler --versionz'https://coral.ai/docs/edgetpu/compiler/z$export only supported on Linux. See T)stdoutstderrshellrc   z< export requires Edge TPU compiler. Attempting install from zsudo rV   zmkdir -p /etc/apt/keyringszCcurl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | z6gpg --no-tty --dearmor -o /etc/apt/keyrings/google.gpgzvecho "deb [signed-by=/etc/apt/keyrings/google.gpg] https://packages.cloud.google.com/apt coral-edgetpu-stable main" | z.tee /etc/apt/sources.list.d/coral-edgetpu.list)r   checkzedgetpu-compiler)r   capture_outputr   r-   )maxsplitrL   z( starting export with Edge TPU compiler re   zedgetpu_compiler --out_dir "zS" --show_operations --search_delegate --delegate_search_step 30 --timeout_sec 180 ""
 running ''r   z_edgetpu.tflite)
subprocessr	   runDEVNULL
returncoder
   r   r   r   r   decodersplitrX   r   r   )
r   rY   r_   r   	check_cmdhelp_urlsudocvercmds
             r"   tflite2edgetpur      s     -I8HCCCCCCC5~~i
(::CU]a~bbmqrrrggg]egghhh+--5ww2/// ORV  O  O  O z  FJ  z  z  z
 	6 	6A
 NN1DN5555 23444
..$t4.
P
P
W
^
^
`
`
g
gqr
g
s
stv
wC
KMVMMSMMMNNN	 	 	 	 	 	  K6++S+++,,,NN3dN###tJT+%6%6%;"L"L"LLMMMr$   pb_filehalfc                d   ddl }t          d           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           t#          |          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 "".

    Returns:
        (str): Path to the exported TensorFlow.js model directory.

    Notes:
        Auto-installs tensorflowjs if not present. Uses tensorflowjs_converter command-line tool for conversion.
        Handles spaces in file paths and warns if output directory contains spaces.
    r   Ntensorflowjsrc   z# starting export with tensorflowjs re   rb,z output node names: z--quantize_float16z--quantize_uint8rV   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   rf   r   r
   r   r   Graphr   openParseFromStringreadjoin
gd_outputsr   r   warningrX   )r   rY   r   r[   r_   r   r   tfjsgdfoutputsquantizationfpb_f_r   s                  r"   pb2tfjsr      s   " ~&&&
KUVUU@PUUUVVV		 	 	"	"B	gt		 %
16688$$$% % % % % % % % % % % % % % %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z??sI   2(B&&B*-B*E:AE#E:#E'	'E:*E'	+E::E>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"   r1   zgd_outputs.<locals>.<genexpr>*  s=      ggqRSR^R^_eRfRfgQ(((ggggggr$   )nodeappendrg   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)rI   r'   r   rJ   r   r'   )FNFrV   )rW   rX   rY   rZ   r[   rJ   r\   r]   r^   rJ   r_   rX   )rV   )r   rZ   r_   rX   r   rX   )r   r   rY   r   r_   rX   r   rX   )FFrV   )r   rX   rY   rX   r   rJ   r[   rJ   r_   rX   r   rX   )$
__future__r   	functoolsr   pathlibr   numpyr   r=   ultralytics.nn.modulesr   r   r   ultralytics.utilsr	   r
   r   ultralytics.utils.checksr   r   r   r   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 2 2 2 2 q q q q q q q q q q q q > > > > > > 2 2 2 2 2 2 . . . . . .
 
 
 
   # # # # #$  $&+i i i i iX    :.N .N .N .N .Nb* * * * *Zh h h h hr$   