o
    eK                     @   s   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	Z	d dl
Z
dd Z		dd	d
Z					dddZ				dddZ						dddZ							dddZdd Zedkrde  dS dS )    )	text_type)program)ConverterCheckNc                  C   sj  t  } | jddtd dd | jddtd dd | jdd	td d
d | jddtd dd | jddtd dd | jddtd dd | jdddddd | jdddddd | jddtd dd | jd d!dd"d# | jd$d%td d&d | jd'd(td d)d | jd*d+dd,d- | jd.d/d0d1d- | jd2d3dd4d- | jd5d6dd7d- | jd8d9td:d;d | jd<d=td>d?d | S )@Nz--modelz-mz-define model file path for tensorflow or onnx)typedefaulthelpz
--prototxtz-pzprototxt file of caffe modelz--weightz-wzweight file of caffe modelz
--save_dirz-szpath to save translated modelz--frameworkz-fzFdefine which deeplearning framework(tensorflow/caffe/onnx/paddle2onnx)z--caffe_protoz-czBoptional: the .py file compiled by caffe proto file of caffe modelz	--versionz-v
store_trueFzget version of x2paddle)actionr   r   z--define_input_shapez-dzdefine input shape for tf modelz--input_shape_dictz-isdzdefine input shapes, e.g --input_shape_dict="{'image':[1, 3, 608, 608]}" or--input_shape_dict="{'image':[1, 3, 608, 608], 'im_shape': [1, 2], 'scale_factor': [1, 2]}"z--convert_torch_projectz-tpzConvert the PyTorch Project.)r	   r   z--project_dirz-pdz&define project folder path for pytorchz--pretrain_modelz-pmz$pretrain model file of pytorch modelz--enable_code_optimz-cozTurn on code optimization)r   r   z--enable_onnx_checkerz-ocTzTurn on onnx model checkerz--disable_feedbackz-dfz&Tune off feedback of model conversion.z	--to_litez-tlzconvert to Paddle-Lite formatz--lite_valid_placesz-vparmz+Specify the executable backend of the modelz--lite_model_typez-mtnaive_bufferzThe type of lite model)argparseArgumentParseradd_argument
_text_type)parser r   @D:\Projects\ConvertPro\env\Lib\site-packages\x2paddle/convert.py
arg_parser   s   r   r
   r   c                 C   sN   ddl m} | }|| d  || || || d  |  dS )zConvert to Paddle-Lite format.r   )Optz/inference_modelz/optN)Zpaddlelite.liter   Zset_model_dirZset_valid_placesZset_model_typeZset_optimize_outrun)save_dirlite_valid_placeslite_model_typer   optr   r   r   convert2lite   s   

r   Fc                 C   s  t t }|std|dd  z"dd l}d|jd< dd l}	|	j}
|
dks*|
dk r2t	d	 W d S W n   t	d
 Y d S ddl
m} ddlm} t	d || |d}||}|j  t	d ddlm} |dd}||j t	d |j| t	d |std|dd  |rt	d |std|dd  t||| t	d |std|dd  t	d t	d t	d t	d t	d d S )NZ
TensorFlowStarttask	time_infoZconvert_stater   3ZTF_CPP_MIN_LOG_LEVELz2.0.0z1.0.0zG[ERROR] 1.0.0<=TensorFlow<2.0.0 is required, and v1.14.0 is recommendedzB[ERROR] TensorFlow is not installed, use "pip install TensorFlow".)	TFDecoder)
TFOpMapperz0Now translating model from TensorFlow to Paddle.)define_input_shapeModel optimizing ...GraphOptimizertfsource_frameModel optimized!0Successfully exported Paddle static graph model!Success4Now translating model from Paddle to Paddle Lite ...r   r   Z
lite_state0Successfully exported Paddle Lite support model!0================================================ cModel Converted! Fill this survey to help X2Paddle better, https://iwenjuan.baidu.com/?code=npyd51 )inttimer   startosenviron
tensorflow__version__logginginfoZx2paddle.decoder.tf_decoderr    Z)x2paddle.op_mapper.tf2paddle.tf_op_mapperr!   paddle_graphbuildx2paddle.optimizer.optimizerr%   optimize	gen_modelr   )
model_pathr   r"   convert_to_liter   r   disable_feedbackr   r5   r&   versionr    r!   modelmapperr%   	graph_optr   r   r   	tf2paddle   s   











rG   c                 C   s  t t }|std|dd  ddlm}	 ddlm}
 dd lm	} |j
d}d}t |d d	kr;t |d
 dksCt |d d	krEd}|sKJ dtd |	| ||}|
|}|j  td ddlm} |dd}||j td |j| td |std|dd  |rtd |std|dd  t||| td |std|dd  td td td td td d S )NZCaffer   r   r   )CaffeDecoder)CaffeOpMapper.F         Tz,[ERROR] google.protobuf >= 3.6.0 is requiredz+Now translating model from caffe to paddle.r#   r$   caffer'   r)   r*   r+   r,   r-   r.   r/   r0   r1   )r2   r3   r   r4   Zx2paddle.decoder.caffe_decoderrH   Z/x2paddle.op_mapper.caffe2paddle.caffe_op_mapperrI   Zgoogle.protobufprotobufr8   splitr9   r:   r;   r<   r=   r%   r>   r?   r   )Z
proto_fileZweight_filer   caffe_protorA   r   r   rB   r   rH   rI   ZgpbZver_partZversion_satisfyrD   rE   r%   rF   r   r   r   caffe2paddle   sh   	 










rR   Tc                 C   s  t t }|std|dd  z.dd l}	|	jj}
|
d\}}}t |d t |d  t | }|dk r>td	 W d S W n   td
 Y d S td ddl	m
} ddlm} || ||}||}|j  td ddlm} |dd}||j td |j| td |std|dd  |rtd |std|dd  t||| td |std|dd  td td td td td d S )NZONNXr   r   r   rJ   d   
      z[ERROR] onnx>=1.6.0 is requiredz=[ERROR] onnx is not installed, use "pip install onnx==1.6.0".z*Now translating model from onnx to paddle.)ONNXDecoder)ONNXOpMapperr#   r$   onnxr'   zModel optimized.r*   r+   r,   r-   r.   r/   r0   r1   )r2   r3   r   r4   rX   rC   rP   r9   r:   Zx2paddle.decoder.onnx_decoderrV   Z-x2paddle.op_mapper.onnx2paddle.onnx_op_mapperrW   r;   r<   r=   r%   r>   r?   r   )r@   r   input_shape_dictrA   r   r   rB   enable_onnx_checkerr   rX   rC   v0v1v2version_sumrV   rW   rD   rE   r%   rF   r   r   r   onnx2paddle  sv   	 











r_   tracec	                 C   s  t t }	|std|	dd  zAdd l}
|
j}|d\}}}d|v r,|dd }t |d t |d  t | }|d	k rHtd
 W d S |dkrQtd W n   td Y d S td ddl	m
}m} ddlm} |dkr{|| |}n|| |}||}|j  td ddlm} |d|d}||j td |jj|||d td |std|	dd  |rtd |std|	dd  t||| td |std|	dd  td td td td td d S ) NZPyTorchr   r   r   rJ   +rS   rT      zA[ERROR] PyTorch>=1.5.0 is required, 1.6.0 is the most recommendedrU   z'[WARNING] PyTorch==1.6.0 is recommendedzM[ERROR] PyTorch is not installed, use "pip install torch==1.6.0 torchvision".z-Now translating model from PyTorch to Paddle.)ScriptDecoderTraceDecoder)PyTorchOpMapperr`   r#   r$   Zpytorch)r(   jit_typer)   )rf   enable_code_optimr*   r+   r,   r-   r.   r/   r0   r1   )r2   r3   r   r4   torchr8   rP   r9   r:   Z x2paddle.decoder.pytorch_decoderrc   rd   Z3x2paddle.op_mapper.pytorch2paddle.pytorch_op_mapperre   r;   r<   r=   r%   r>   r?   r   )moduler   rf   Zinput_examplesrg   rA   r   r   rB   r   rh   rC   r[   r\   r]   r^   rc   rd   re   rD   rE   r%   rF   r   r   r   pytorch2paddleP  s   
 











rj   c            
   
   C   s  t jt jd ttjdk rt d t d t d d S t } |  }|j	r8dd l
}t d|j d S |jsD|jd usDJ d|jd usMJ d	z`dd l}| d
\}}}t|dkrht|dkspt d W d S dd l}|jd
\}}}t d|j |dkr|dkr|dkrt d nt|dkst|dk rt d W d S W n	   t d Y |jr|jd usJ dddlm} || d S |jdkr|jd usJ dd}	|jrd}	t|j|j|	|j|j|j|jd d S |jdkr#|jd ur	|j d usJ dt!|j|j |j|j"|j|j|j|jd d S |jdkrI|jd us3J dt#|j|j|j$|j|j|j|j|j%d d S |jdkrVt d  d S t&d!)"N)level   z/Use "x2paddle -h" to print the help informationz;For more information, please follow our github repo below:)z6
Github: https://github.com/PaddlePaddle/X2Paddle.git
r   z2x2paddle-{} with python>=3.5, paddlepaddle>=1.6.0
z9--framework is not defined(support tensorflow/caffe/onnx)z--save_dir is not definedrJ   rK      z[ERROR] python>=3.5 is requiredzpaddle.__version__ = {}0z5[WARNING] You are use develop version of paddlepaddlez'[ERROR] paddlepaddle>=2.0.0 is requiredzB[ERROR] paddlepaddle not installed, use "pip install paddlepaddle"zA--project_dir should be defined while translating pytorch project)mainr7   z<--model should be defined while translating tensorflow modelFT)rA   r   r   rB   rN   zG--prototxt and --weight should be defined while translating caffe modelrX   z6--model should be defined while translating onnx model)rY   rA   r   r   rB   rZ   Zpaddle2onnxzdPaddle to ONNX tool has been migrated to the new github: https://github.com/PaddlePaddle/paddle2onnxz2--framework only support tensorflow/caffe/onnx now)'r9   basicConfigINFOlensysargvr:   r   
parse_argsrC   x2paddleformatr8   Zconvert_torch_projectZ	frameworkr   platformpython_versionrP   r2   paddleZproject_dirZ*x2paddle.project_convertor.pytorch.convertro   rD   r"   rG   Zto_liter   r   rB   ZprototxtweightrR   rQ   r_   rY   rZ   	Exception)
r   argsrv   rx   r[   r\   r]   rz   Zconvert_torchr"   r   r   r   ro     s   





	 
	
	ro   __main__)r
   r   )FFr
   r   F)Fr
   r   F)NFr
   r   FT)r`   NFFr
   r   F)sixr   r   rv   r   Zx2paddle.utilsr   r   rs   r9   r3   r   r   rG   rR   r_   rj   ro   __name__r   r   r   r   <module>   sR   n

J
:
A
O]
