'''simple docstring'''

import argparse
import collections

import jax
import jax.numpy as jnp
import torch
import torch.nn as nn
from clip.model import CLIP
from flax.training import checkpoints
from huggingface_hub import Repository

from transformers import (
    CLIPTokenizer,
    OwlViTConfig,
    OwlViTForObjectDetection,
    OwlViTImageProcessor,
    OwlViTModel,
    OwlViTProcessor,
)


_lowerCamelCase :				Optional[Any]														= {
    """vit_b32""": {
        """embed_dim""": 5_12,
        """image_resolution""": 7_68,
        """context_length""": 16,
        """vocab_size""": 4_94_08,
        """vision_layers""": 12,
        """vision_width""": 7_68,
        """vision_patch_size""": 32,
        """transformer_width""": 5_12,
        """transformer_heads""": 8,
        """transformer_layers""": 12,
    },
    """vit_b16""": {
        """embed_dim""": 5_12,
        """image_resolution""": 7_68,
        """context_length""": 16,
        """vocab_size""": 4_94_08,
        """vision_layers""": 12,
        """vision_width""": 7_68,
        """vision_patch_size""": 16,
        """transformer_width""": 5_12,
        """transformer_heads""": 8,
        """transformer_layers""": 12,
    },
    """vit_l14""": {
        """embed_dim""": 7_68,
        """image_resolution""": 8_40,
        """context_length""": 16,
        """vocab_size""": 4_94_08,
        """vision_layers""": 24,
        """vision_width""": 10_24,
        """vision_patch_size""": 14,
        """transformer_width""": 7_68,
        """transformer_heads""": 12,
        """transformer_layers""": 12,
    },
}



def  _lowerCAmelCase				(				__a			,      __a=""			,      __a="/"      )  ->      Any:
     '''simple docstring'''







     _UpperCamelCase  :Dict       =[]

     for k, v in params.items():
          _UpperCamelCase  :int       =parent_key + sep + k if parent_key else k

          if isinstance(__a			,      collections.MutableMapping      ):
               items.extend(flatten_nested_dict(__a			,      __a			,      sep=__a      ).items()      )
          else:
               items.append((new_key, v)      )
     return dict(__a      )



def  _lowerCAmelCase				(				__a      )  ->      Optional[int]:
     '''simple docstring'''







     return jax.tree_util.tree_map(lambda __a      : x.astype(jnp.floataa      ) if x.dtype == jnp.bfloataa else x			,      __a      )



def  _lowerCAmelCase				(				__a			,      __a      )  ->      int:
     '''simple docstring'''







     _UpperCamelCase       ,      _UpperCamelCase       ,      _UpperCamelCase  :int       =pt_attn_layer.in_proj_weight.chunk(3			,      dim=0      )
     _UpperCamelCase       ,      _UpperCamelCase       ,      _UpperCamelCase  :List[Any]       =pt_attn_layer.in_proj_bias.chunk(3			,      dim=0      )

     _UpperCamelCase  :Tuple       =pt_attn_layer.out_proj.weight
     _UpperCamelCase  :Optional[int]       =pt_attn_layer.out_proj.bias

     _UpperCamelCase  :Union[str, Any]       =q_proj
     _UpperCamelCase  :Dict       =q_proj_bias

     _UpperCamelCase  :str       =k_proj
     _UpperCamelCase  :Any       =k_proj_bias

     _UpperCamelCase  :int       =v_proj
     _UpperCamelCase  :Optional[Any]       =v_proj_bias

     _UpperCamelCase  :str       =out_proj_weights
     _UpperCamelCase  :List[str]       =out_proj_bias



def  _lowerCAmelCase				(				__a			,      __a      )  ->      Tuple:
     '''simple docstring'''







     copy_linear(hf_mlp.fca			,      pt_mlp.c_fc      )
     copy_linear(hf_mlp.fca			,      pt_mlp.c_proj      )



def  _lowerCAmelCase				(				__a			,      __a      )  ->      str:
     '''simple docstring'''







     _UpperCamelCase  :List[Any]       =pt_linear.weight
     _UpperCamelCase  :List[Any]       =pt_linear.bias



def  _lowerCAmelCase				(				__a			,      __a      )  ->      Optional[Any]:
     '''simple docstring'''







     copy_linear(hf_layer.layer_norma			,      pt_layer.ln_a      )
     copy_linear(hf_layer.layer_norma			,      pt_layer.ln_a      )

     # copy MLP
     copy_mlp(hf_layer.mlp			,      pt_layer.mlp      )

     # copy attn
     copy_attn_layer(hf_layer.self_attn			,      pt_layer.attn      )



def  _lowerCAmelCase				(				__a			,      __a      )  ->      Tuple:
     '''simple docstring'''







     for hf_layer, pt_layer in zip(__a			,      __a      ):
          copy_layer(__a			,      __a      )



def  _lowerCAmelCase				(				__a			,      __a      )  ->      Union[str, Any]:
     '''simple docstring'''







     _UpperCamelCase  :List[str]       =pt_model.token_embedding.weight
     _UpperCamelCase  :int       =pt_model.positional_embedding

     # copy layer norm
     copy_linear(hf_encoder.final_layer_norm			,      pt_model.ln_final      )

     # copy hidden layers
     copy_layers(hf_encoder.encoder.layers			,      pt_model.transformer.resblocks      )



def  _lowerCAmelCase				(				__a			,      __a      )  ->      List[str]:
     '''simple docstring'''







     _UpperCamelCase  :List[str]       =pt_model.text_projection.data.T

     # copy text encoder
     copy_encoder(hf_model.text_model			,      __a      )



def  _lowerCAmelCase				(				__a			,      __a      )  ->      Union[str, Any]:
     '''simple docstring'''







     _UpperCamelCase  :int       =pt_model.visual.proj.data.T

     # copy layer norms
     copy_linear(hf_model.vision_model.pre_layernorm			,      pt_model.visual.ln_pre      )
     copy_linear(hf_model.vision_model.post_layernorm			,      pt_model.visual.ln_post      )

     # copy embeds
     _UpperCamelCase  :Dict       =pt_model.visual.conva.weight.data
     _UpperCamelCase  :Tuple       =pt_model.visual.class_embedding
     _UpperCamelCase  :Tuple       =pt_model.visual.positional_embedding.data

     # copy encoder
     copy_layers(hf_model.vision_model.encoder.layers			,      pt_model.visual.transformer.resblocks      )



def  _lowerCAmelCase				(				__a			,      __a      )  ->      List[Any]:
     '''simple docstring'''







     _UpperCamelCase  :List[str]       =flatten_nested_dict(flax_params["""backbone"""]["""merged_class_token"""]      )

     _UpperCamelCase  :List[Any]       =torch.from_numpy(flax_class_token_params["""scale"""]      )
     _UpperCamelCase  :Optional[Any]       =torch.from_numpy(flax_class_token_params["""bias"""]      )
     _UpperCamelCase  :str       =nn.Parameter(__a      )
     _UpperCamelCase  :Optional[Any]       =nn.Parameter(__a      )



def  _lowerCAmelCase				(				__a			,      __a      )  ->      Dict:
     '''simple docstring'''







     _UpperCamelCase  :Any       =hf_model.state_dict()
     _UpperCamelCase  :List[Any]       ={}

     # Rename class prediction head flax params to pytorch HF
     _UpperCamelCase  :Any       =flatten_nested_dict(flax_params["""class_head"""]      )

     for flax_key, v in flax_class_params.items():
          _UpperCamelCase  :int       =flax_key.replace("""/"""			,      """."""      )
          _UpperCamelCase  :Union[str, Any]       =torch_key.replace(""".kernel"""			,      """.weight"""      )
          _UpperCamelCase  :Dict       =torch_key.replace("""Dense_0"""			,      """dense0"""      )
          _UpperCamelCase  :Optional[Any]       ="""class_head.""" + torch_key

          if "weight" in torch_key and v.ndim == 2:
               _UpperCamelCase  :Tuple       =v.T

          _UpperCamelCase  :Optional[Any]       =nn.Parameter(torch.from_numpy(__a      )      )

     # Rename box prediction box flax params to pytorch HF
     _UpperCamelCase  :Optional[Any]       =flatten_nested_dict(flax_params["""obj_box_head"""]      )

     for flax_key, v in flax_box_params.items():
          _UpperCamelCase  :str       =flax_key.replace("""/"""			,      """."""      )
          _UpperCamelCase  :Union[str, Any]       =torch_key.replace(""".kernel"""			,      """.weight"""      )
          _UpperCamelCase  :Optional[int]       =torch_key.replace("""_"""			,      """"""      ).lower()
          _UpperCamelCase  :List[Any]       ="""box_head.""" + torch_key

          if "weight" in torch_key and v.ndim == 2:
               _UpperCamelCase  :str       =v.T

          _UpperCamelCase  :List[str]       =nn.Parameter(torch.from_numpy(__a      )      )

     # Copy flax params to PyTorch params
     for name, param in new_params.items():
          if name in pt_params.keys():
               pt_params[name].copy_(__a      )



def  _lowerCAmelCase				(				__a			,      __a      )  ->      Any:
     '''simple docstring'''







     for k, v in flax_attn_params.items():
          if k.startswith("""transformer"""      ):
               _UpperCamelCase  :int       =k.replace("""transformer.resblocks"""			,      """text_model.encoder.layers"""      )
          else:
               _UpperCamelCase  :Optional[Any]       =k.replace("""visual.transformer.resblocks"""			,      """vision_model.encoder.layers"""      )

          _UpperCamelCase  :str       =torch_key.replace("""attn"""			,      """self_attn"""      )
          _UpperCamelCase  :int       =torch_key.replace("""key"""			,      """k_proj"""      )
          _UpperCamelCase  :List[Any]       =torch_key.replace("""value"""			,      """v_proj"""      )
          _UpperCamelCase  :str       =torch_key.replace("""query"""			,      """q_proj"""      )
          _UpperCamelCase  :List[str]       =torch_key.replace("""out"""			,      """out_proj"""      )

          if "bias" in torch_key and v.ndim == 2:
               _UpperCamelCase  :Dict       =v.shape[0] * v.shape[1]
               _UpperCamelCase  :Union[str, Any]       =v.reshape(__a      )

          if "weight" in torch_key and "out" in torch_key:
               _UpperCamelCase  :Union[str, Any]       =(v.shape[0] * v.shape[1], v.shape[2])
               _UpperCamelCase  :Optional[Any]       =v.reshape(__a      ).T

          if "weight" in torch_key and "out" not in torch_key:
               _UpperCamelCase  :Tuple       =(v.shape[0], v.shape[1] * v.shape[2])
               _UpperCamelCase  :List[Any]       =v.reshape(__a      ).T

          # Copy flax CLIP attn params to HF PyTorch params
          _UpperCamelCase  :List[str]       =torch.from_numpy(__a      )
          hf_backbone.state_dict()[torch_key].copy_(__a      )



def  _lowerCAmelCase				(				__a      )  ->      Tuple:
     '''simple docstring'''







     _UpperCamelCase  :Optional[int]       ={}
     _UpperCamelCase  :Any       =[]

     for k, v in params.items():
          if "attn." in k:
               _UpperCamelCase  :Optional[Any]       =k[: k.rindex("""attn."""      ) + 5]
               if base in processed_attn_layers:
                    continue

               processed_attn_layers.append(__a      )
               _UpperCamelCase  :Optional[int]       =params[base + """out.weight"""].shape[-1]
               _UpperCamelCase  :Optional[Any]       =params[base + """out.weight"""].reshape(__a			,      __a      ).T
               _UpperCamelCase  :Tuple       =params[base + """out.bias"""]
          else:
               _UpperCamelCase  :Tuple       =v
     return new_params



def  _lowerCAmelCase				(				__a			,      __a      )  ->      Dict:
     '''simple docstring'''







     _UpperCamelCase  :Optional[int]       =CLIP(**__a      )
     torch_model.eval()
     _UpperCamelCase  :str       =torch_model.state_dict()

     _UpperCamelCase  :Optional[Any]       =flatten_nested_dict(flax_params["""backbone"""]["""clip"""]      )
     _UpperCamelCase  :int       ={}

     for flax_key, v in flax_clip_params.items():
          _UpperCamelCase  :Union[str, Any]       =flax_key.replace("""/"""			,      """."""      )
          _UpperCamelCase  :str       =torch_key.replace("""text.token_embedding.embedding"""			,      """token_embedding.kernel"""      )

          if (
              torch_key.startswith("""text.transformer"""      )
              or torch_key.startswith("""text.text_projection"""      )
              or torch_key.startswith("""text.ln_final"""      )
              or torch_key.startswith("""text.positional_embedding"""      )
          ):
               _UpperCamelCase  :List[str]       =torch_key[5:]

          _UpperCamelCase  :List[Any]       =torch_key.replace("""text_projection.kernel"""			,      """text_projection"""      )
          _UpperCamelCase  :Dict       =torch_key.replace("""visual.proj.kernel"""			,      """visual.proj"""      )
          _UpperCamelCase  :Tuple       =torch_key.replace(""".scale"""			,      """.weight"""      )
          _UpperCamelCase  :List[Any]       =torch_key.replace(""".kernel"""			,      """.weight"""      )

          if "conv" in torch_key or "downsample.0.weight" in torch_key:
               _UpperCamelCase  :List[str]       =v.transpose(3			,      2			,      0			,      1      )

          elif "weight" in torch_key and v.ndim == 2 and "embedding" not in torch_key:
               # Fully connected layers are transposed, embeddings are not
               _UpperCamelCase  :List[Any]       =v.T

          _UpperCamelCase  :Union[str, Any]       =v

     _UpperCamelCase  :List[str]       =_convert_attn_layers(__a      )
     new_torch_params.update(__a      )
     _UpperCamelCase  :Dict       ={}

     # Copy flax CLIP backbone params to PyTorch params
     for name, param in new_torch_params.items():
          if name in torch_clip_params.keys():
               _UpperCamelCase  :List[str]       =torch.from_numpy(new_torch_params[name]      )
               torch_clip_params[name].copy_(__a      )
          else:
               _UpperCamelCase  :Optional[int]       =param

     return torch_clip_params, torch_model, attn_params



@torch.no_grad()
def  _lowerCAmelCase				(				__a			,      __a			,      __a			,      __a			,      __a=None      )  ->      Any:
     '''simple docstring'''







     _UpperCamelCase  :Union[str, Any]       =Repository(__a			,      clone_from=F'''google/{pytorch_dump_folder_path}'''      )
     repo.git_pull()

     if config_path is not None:
          _UpperCamelCase  :List[Any]       =OwlViTConfig.from_pretrained(__a      )
     else:
          _UpperCamelCase  :Any       =OwlViTConfig()

     _UpperCamelCase  :Optional[Any]       =OwlViTModel(__a      ).eval()
     _UpperCamelCase  :List[str]       =OwlViTForObjectDetection(__a      ).eval()

     copy_text_model_and_projection(__a			,      __a      )
     copy_vision_model_and_projection(__a			,      __a      )
     _UpperCamelCase  :int       =pt_backbone.logit_scale
     copy_flax_attn_params(__a			,      __a      )

     _UpperCamelCase  :Optional[int]       =hf_backbone
     copy_class_merge_token(__a			,      __a      )
     copy_class_box_heads(__a			,      __a      )

     # Save HF model
     hf_model.save_pretrained(repo.local_dir      )

     # Initialize image processor
     _UpperCamelCase  :List[Any]       =OwlViTImageProcessor(
         size=config.vision_config.image_size			,      crop_size=config.vision_config.image_size      )
     # Initialize tokenizer
     _UpperCamelCase  :List[Any]       =CLIPTokenizer.from_pretrained("""openai/clip-vit-base-patch32"""			,      pad_token="""!"""			,      model_max_length=16      )

     # Initialize processor
     _UpperCamelCase  :Any       =OwlViTProcessor(image_processor=__a			,      tokenizer=__a      )
     image_processor.save_pretrained(repo.local_dir      )
     processor.save_pretrained(repo.local_dir      )

     repo.git_add()
     repo.git_commit("""Upload model and processor"""      )
     repo.git_push()


if __name__ == "__main__":
      _lowerCamelCase :				Dict														= argparse.ArgumentParser()
      # Required parameters
      parser.add_argument(
          """--owlvit_version""",
          default=None,
          type=str,
          required=True,
          help="""OWL-ViT model name [clip_b16, clip_b32, clip_l14].""",
      )
      parser.add_argument(
          """--owlvit_checkpoint""", default=None, type=str, required=True, help="""Path to flax model checkpoint."""
      )
      parser.add_argument("""--hf_config""", default=None, type=str, required=True, help="""Path to HF model config.""")
      parser.add_argument(
          """--pytorch_dump_folder_path""", default="""hf_model""", type=str, help="""Path to the output PyTorch model."""
      )
      _lowerCamelCase :				int														= parser.parse_args()

      # Initialize PyToch clip model
      _lowerCamelCase :				Any														= args.owlvit_version
      if model_name == "clip_b16":
            _lowerCamelCase :				Tuple														= CONFIGS["""vit_b16"""]
      elif model_name == "clip_b32":
            _lowerCamelCase :				int														= CONFIGS["""vit_b32"""]
      elif model_name == "clip_l14":
            _lowerCamelCase :				Optional[int]														= CONFIGS["""vit_l14"""]

      # Load from checkpoint and convert params to float-32
      _lowerCamelCase :				Optional[int]														= checkpoints.restore_checkpoint(args.owlvit_checkpoint, target=None)["""optimizer"""]["""target"""]
      _lowerCamelCase :				Any														= jax.tree_util.tree_map(lambda x: x.astype(jnp.floataa) if x.dtype == jnp.bfloataa else x, variables)
      del variables

      # Convert CLIP backbone
      _lowerCamelCase							,    _lowerCamelCase							,    _lowerCamelCase :				Union[str, Any]														= convert_clip_backbone(flax_params, torch_config)

      convert_owlvit_checkpoint(clip_pt, flax_params, attn_params, args.pytorch_dump_folder_path, args.hf_config)



'''simple docstring'''


from collections import OrderedDict
from typing import Mapping

from packaging import version

from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfig
from ...utils import logging
from ...utils.backbone_utils import BackboneConfigMixin, get_aligned_output_features_output_indices


lowerCamelCase__     						=  logging.get_logger(__name__)

lowerCamelCase__     						=  {
    'facebook/convnext-tiny-224': 'https://huggingface.co/facebook/convnext-tiny-224/resolve/main/config.json',
    # See all ConvNeXT models at https://huggingface.co/models?filter=convnext
}






class 						lowerCAmelCase__      (      UpperCAmelCase__     ,							UpperCAmelCase__						):
			lowerCAmelCase			:						Optional[Any]							 =  "convnext"




			def __init__(		self	:  Optional[int]						,	lowerCamelCase__	:  List[str]=3						,	lowerCamelCase__	:  List[str]=4						,	lowerCamelCase__	:  Optional[int]=4						,	lowerCamelCase__	:  Dict=None						,	lowerCamelCase__	:  Tuple=None						,	lowerCamelCase__	:  List[str]="gelu"						,	lowerCamelCase__	:  List[Any]=0.0_2						,	lowerCamelCase__	:  Dict=1E-12						,	lowerCamelCase__	:  Tuple=1E-6						,	lowerCamelCase__	:  Dict=0.0						,	lowerCamelCase__	:  Optional[int]=2_24						,	lowerCamelCase__	:  List[Any]=None						,	lowerCamelCase__	:  Any=None						,	**lowerCamelCase__	:  int						,	) ->str:



					'''simple docstring'''







					super().__init__(**lowerCamelCase__			)

					_UpperCAmelCase		:							Optional[int]             =   num_channels
					_UpperCAmelCase		:							Tuple             =   patch_size
					_UpperCAmelCase		:							Dict             =   num_stages
					_UpperCAmelCase		:							Optional[int]             =   [96, 1_92, 3_84, 7_68] if hidden_sizes is None else hidden_sizes
					_UpperCAmelCase		:							Dict             =   [3, 3, 9, 3] if depths is None else depths
					_UpperCAmelCase		:							Union[str, Any]             =   hidden_act
					_UpperCAmelCase		:							Tuple             =   initializer_range
					_UpperCAmelCase		:							Tuple             =   layer_norm_eps
					_UpperCAmelCase		:							Tuple             =   layer_scale_init_value
					_UpperCAmelCase		:							str             =   drop_path_rate
					_UpperCAmelCase		:							str             =   image_size
					_UpperCAmelCase		:							Tuple             =   ["stem"] + [F"""stage{idx}""" for idx in range(1						,	len(self.depths			) + 1			)]
					_UpperCAmelCase       ,     _UpperCAmelCase		:							str             =   get_aligned_output_features_output_indices(
					    out_features=lowerCamelCase__						,	out_indices=lowerCamelCase__						,	stage_names=self.stage_names			)






class 						lowerCAmelCase__      (      UpperCAmelCase__						):
			lowerCAmelCase			:						str							 =  version.parse("1.11"						)




			@property
			def 				lowerCAmelCase__     (		self	:  Dict			) ->Mapping[str, Mapping[int, str]]:



					'''simple docstring'''







					return OrderedDict(
					    [
					        ("pixel_values", {0: "batch", 1: "num_channels", 2: "height", 3: "width"}),
					    ]			)






			@property
			def 				lowerCAmelCase__     (		self	:  str			) ->float:



					'''simple docstring'''







					return 1E-5



