





import argparse

import requests
import torch
from PIL import Image

from transformers import ViTMAEConfig, ViTMAEForPreTraining, ViTMAEImageProcessor






def 							_lowerCAmelCase (  _a   :					List[Any]			)	->			Dict:
     if "cls_token" in name:
          lowerCAmelCase_					:       Tuple    =		name.replace("""cls_token"""					,   """vit.embeddings.cls_token"""			)
     if "mask_token" in name:
          lowerCAmelCase_					:       Optional[int]    =		name.replace("""mask_token"""					,   """decoder.mask_token"""			)
     if "decoder_pos_embed" in name:
          lowerCAmelCase_					:       Dict    =		name.replace("""decoder_pos_embed"""					,   """decoder.decoder_pos_embed"""			)
     if "pos_embed" in name and "decoder" not in name:
          lowerCAmelCase_					:       List[str]    =		name.replace("""pos_embed"""					,   """vit.embeddings.position_embeddings"""			)
     if "patch_embed.proj" in name:
          lowerCAmelCase_					:       str    =		name.replace("""patch_embed.proj"""					,   """vit.embeddings.patch_embeddings.projection"""			)
     if "patch_embed.norm" in name:
          lowerCAmelCase_					:       Dict    =		name.replace("""patch_embed.norm"""					,   """vit.embeddings.norm"""			)
     if "decoder_blocks" in name:
          lowerCAmelCase_					:       List[Any]    =		name.replace("""decoder_blocks"""					,   """decoder.decoder_layers"""			)
     if "blocks" in name:
          lowerCAmelCase_					:       List[str]    =		name.replace("""blocks"""					,   """vit.encoder.layer"""			)
     if "attn.proj" in name:
          lowerCAmelCase_					:       Optional[int]    =		name.replace("""attn.proj"""					,   """attention.output.dense"""			)
     if "attn" in name:
          lowerCAmelCase_					:       List[str]    =		name.replace("""attn"""					,   """attention.self"""			)
     if "norm1" in name:
          lowerCAmelCase_					:       Optional[Any]    =		name.replace("""norm1"""					,   """layernorm_before"""			)
     if "norm2" in name:
          lowerCAmelCase_					:       str    =		name.replace("""norm2"""					,   """layernorm_after"""			)
     if "mlp.fc1" in name:
          lowerCAmelCase_					:       Any    =		name.replace("""mlp.fc1"""					,   """intermediate.dense"""			)
     if "mlp.fc2" in name:
          lowerCAmelCase_					:       Union[str, Any]    =		name.replace("""mlp.fc2"""					,   """output.dense"""			)
     if "decoder_embed" in name:
          lowerCAmelCase_					:       Any    =		name.replace("""decoder_embed"""					,   """decoder.decoder_embed"""			)
     if "decoder_norm" in name:
          lowerCAmelCase_					:       Tuple    =		name.replace("""decoder_norm"""					,   """decoder.decoder_norm"""			)
     if "decoder_pred" in name:
          lowerCAmelCase_					:       int    =		name.replace("""decoder_pred"""					,   """decoder.decoder_pred"""			)
     if "norm.weight" in name and "decoder" not in name:
          lowerCAmelCase_					:       Union[str, Any]    =		name.replace("""norm.weight"""					,   """vit.layernorm.weight"""			)
     if "norm.bias" in name and "decoder" not in name:
          lowerCAmelCase_					:       Union[str, Any]    =		name.replace("""norm.bias"""					,   """vit.layernorm.bias"""			)

     return name






def 							_lowerCAmelCase (  _a   :					str					,   _a   :					str			)	->			List[str]:
     for key in orig_state_dict.copy().keys():
          lowerCAmelCase_					:       Optional[int]    =		orig_state_dict.pop(_a			)

          if "qkv" in key:
               lowerCAmelCase_					:       str    =		key.split("""."""			)
               lowerCAmelCase_					:       List[str]    =		int(key_split[1]			)
               if "decoder_blocks" in key:
                    lowerCAmelCase_					:       Optional[int]    =		config.decoder_hidden_size
                    lowerCAmelCase_					:       Dict    =		"""decoder.decoder_layers."""
                    if "weight" in key:
                         lowerCAmelCase_					:       Dict    =		val[:dim, :]
                         lowerCAmelCase_					:       str    =		val[dim : dim * 2, :]
                         lowerCAmelCase_					:       Dict    =		val[-dim:, :]
                    elif "bias" in key:
                         lowerCAmelCase_					:       Optional[int]    =		val[:dim]
                         lowerCAmelCase_					:       Union[str, Any]    =		val[dim : dim * 2]
                         lowerCAmelCase_					:       List[Any]    =		val[-dim:]
               else:
                    lowerCAmelCase_					:       List[str]    =		config.hidden_size
                    lowerCAmelCase_					:       int    =		"""vit.encoder.layer."""
                    if "weight" in key:
                         lowerCAmelCase_					:       Optional[int]    =		val[:dim, :]
                         lowerCAmelCase_					:       Tuple    =		val[dim : dim * 2, :]
                         lowerCAmelCase_					:       Union[str, Any]    =		val[-dim:, :]
                    elif "bias" in key:
                         lowerCAmelCase_					:       Dict    =		val[:dim]
                         lowerCAmelCase_					:       Optional[int]    =		val[dim : dim * 2]
                         lowerCAmelCase_					:       Union[str, Any]    =		val[-dim:]

          else:
               lowerCAmelCase_					:       Tuple    =		val

     return orig_state_dict






def 							_lowerCAmelCase (  _a   :					Optional[Any]					,   _a   :					List[str]			)	->			Optional[int]:
     lowerCAmelCase_					:       List[Any]    =		ViTMAEConfig()
     if "large" in checkpoint_url:
          lowerCAmelCase_					:       int    =		10_24
          lowerCAmelCase_					:       Tuple    =		40_96
          lowerCAmelCase_					:       Tuple    =		24
          lowerCAmelCase_					:       Any    =		16
     elif "huge" in checkpoint_url:
          lowerCAmelCase_					:       List[Any]    =		14
          lowerCAmelCase_					:       Optional[Any]    =		12_80
          lowerCAmelCase_					:       Dict    =		51_20
          lowerCAmelCase_					:       int    =		32
          lowerCAmelCase_					:       Dict    =		16

     lowerCAmelCase_					:       Optional[Any]    =		ViTMAEForPreTraining(_a			)

     lowerCAmelCase_					:       Tuple    =		torch.hub.load_state_dict_from_url(_a					,   map_location="""cpu"""			)["""model"""]

     lowerCAmelCase_					:       List[Any]    =		ViTMAEImageProcessor(size=config.image_size			)

     lowerCAmelCase_					:       Any    =		convert_state_dict(_a					,   _a			)

     model.load_state_dict(_a			)
     model.eval()

     lowerCAmelCase_					:       Optional[int]    =		"""https://user-images.githubusercontent.com/11435359/147738734-196fd92f-9260-48d5-ba7e-bf103d29364d.jpg"""

     lowerCAmelCase_					:       List[str]    =		Image.open(requests.get(_a					,   stream=_a			).raw			)
     lowerCAmelCase_					:       List[Any]    =		ViTMAEImageProcessor(size=config.image_size			)
     lowerCAmelCase_					:       List[Any]    =		image_processor(images=_a					,   return_tensors="""pt"""			)

     # forward pass
     torch.manual_seed(2			)
     lowerCAmelCase_					:       int    =		model(**_a			)
     lowerCAmelCase_					:       List[str]    =		outputs.logits

     if "large" in checkpoint_url:
          lowerCAmelCase_					:       int    =		torch.tensor(
              [[-0.7_309, -0.7_128, -1.0_169], [-1.0_161, -0.9_058, -1.1_878], [-1.0_478, -0.9_411, -1.1_911]]			)
     elif "huge" in checkpoint_url:
          lowerCAmelCase_					:       Optional[int]    =		torch.tensor(
              [[-1.1_599, -0.9_199, -1.2_221], [-1.1_952, -0.9_269, -1.2_307], [-1.2_143, -0.9_337, -1.2_262]]			)
     else:
          lowerCAmelCase_					:       str    =		torch.tensor(
              [[-0.9_192, -0.8_481, -1.1_259], [-1.1_349, -1.0_034, -1.2_599], [-1.1_757, -1.0_429, -1.2_726]]			)

     # verify logits
     assert torch.allclose(logits[0, :3, :3]					,   _a					,   atol=1E-4			)

     print(F'Saving model to {pytorch_dump_folder_path}'			)
     model.save_pretrained(_a			)

     print(F'Saving image processor to {pytorch_dump_folder_path}'			)
     image_processor.save_pretrained(_a			)


if __name__ == "__main__":
      UpperCAmelCase_					:   Optional[int] 							=						argparse.ArgumentParser()
      # Required parameters
      parser.add_argument(
          """--checkpoint_url""",
          default="""https://dl.fbaipublicfiles.com/mae/visualize/mae_visualize_vit_base.pth""",
          type=str,
          help="""URL of the checkpoint you'd like to convert.""",
      )
      parser.add_argument(
          """--pytorch_dump_folder_path""", default=None, type=str, help="""Path to the output PyTorch model directory."""
      )

      UpperCAmelCase_					:   List[str] 							=						parser.parse_args()
      convert_vit_mae_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)







import unittest

from transformers import MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING, AutoTokenizer, is_vision_available
from transformers.pipelines import pipeline
from transformers.pipelines.document_question_answering import apply_tesseract
from transformers.testing_utils import (
    is_pipeline_test,
    nested_simplify,
    require_detectrona,
    require_pytesseract,
    require_tf,
    require_torch,
    require_vision,
    slow,
)

from .test_pipelines_common import ANY


if is_vision_available():
      from PIL import Image

      from transformers.image_utils import load_image
else:





      class      lowercase__    :







        @staticmethod
        def 	UpperCAmelCase__		(	*_lowercase    ,						**_lowercase						):
             pass






      def 							_lowerCAmelCase (  _a   :					List[str]			)	->			Any:
           return None


# This is a pinned image from a specific revision of a document question answering space, hosted by HuggingFace,
# so we can expect it to be available.
UpperCAmelCase_					:   Optional[Any] 							=						(
    """https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png"""
)





@is_pipeline_test
@require_torch
@require_vision
class      lowercase__    (							unittest.TestCase  ):
  __UpperCamelCase	     =  MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING







  @require_pytesseract
  @require_vision
  def 	UpperCAmelCase__		(	self    ,						_lowercase    ,						_lowercase    ,						_lowercase						):
       lowerCAmelCase_					:       Optional[int]    =		pipeline(
           """document-question-answering"""    ,						model=_lowercase    ,						tokenizer=_lowercase    ,						image_processor=_lowercase						)

       lowerCAmelCase_					:       List[str]    =		INVOICE_URL
       lowerCAmelCase_					:       str    =		list(zip(*apply_tesseract(load_image(_lowercase						)    ,						_lowercase    ,						""""""						)						)						)
       lowerCAmelCase_					:       int    =		"""What is the placebo?"""
       lowerCAmelCase_					:       str    =		[
           {
               """image""": load_image(_lowercase						),
               """question""": question,
           },
           {
               """image""": image,
               """question""": question,
           },
           {
               """image""": image,
               """question""": question,
               """word_boxes""": word_boxes,
           },
       ]
       return dqa_pipeline, examples







  def 	UpperCAmelCase__		(	self    ,						_lowercase    ,						_lowercase						):
       lowerCAmelCase_					:       List[str]    =		dqa_pipeline(_lowercase    ,						top_k=2						)
       self.assertEqual(
           _lowercase    ,						[
               [
                   {"""score""": ANY(_lowercase						), """answer""": ANY(_lowercase						), """start""": ANY(_lowercase						), """end""": ANY(_lowercase						)},
                   {"""score""": ANY(_lowercase						), """answer""": ANY(_lowercase						), """start""": ANY(_lowercase						), """end""": ANY(_lowercase						)},
               ]
           ]
           * 3    ,						)







  @require_torch
  @require_detectrona
  @require_pytesseract
  def 	UpperCAmelCase__		(	self						):
       lowerCAmelCase_					:       Tuple    =		pipeline("""document-question-answering"""    ,						model="""hf-internal-testing/tiny-random-layoutlmv2"""						)
       lowerCAmelCase_					:       str    =		INVOICE_URL
       lowerCAmelCase_					:       int    =		"""How many cats are there?"""

       lowerCAmelCase_					:       List[Any]    =		[
           {"""score""": 0.0001, """answer""": """oy 2312/2019""", """start""": 38, """end""": 39},
           {"""score""": 0.0001, """answer""": """oy 2312/2019 DUE""", """start""": 38, """end""": 40},
       ]
       lowerCAmelCase_					:       Optional[Any]    =		dqa_pipeline(image=_lowercase    ,						question=_lowercase    ,						top_k=2						)
       self.assertEqual(nested_simplify(_lowercase    ,						decimals=4						)    ,						_lowercase						)

       lowerCAmelCase_					:       Any    =		dqa_pipeline({"""image""": image, """question""": question}    ,						top_k=2						)
       self.assertEqual(nested_simplify(_lowercase    ,						decimals=4						)    ,						_lowercase						)

       # This image does not detect ANY text in it, meaning layoutlmv2 should fail.
       # Empty answer probably
       lowerCAmelCase_					:       List[Any]    =		"""./tests/fixtures/tests_samples/COCO/000000039769.png"""
       lowerCAmelCase_					:       Any    =		dqa_pipeline(image=_lowercase    ,						question=_lowercase    ,						top_k=2						)
       self.assertEqual(_lowercase    ,						[]						)

       # We can optionnally pass directly the words and bounding boxes
       lowerCAmelCase_					:       int    =		"""./tests/fixtures/tests_samples/COCO/000000039769.png"""
       lowerCAmelCase_					:       int    =		[]
       lowerCAmelCase_					:       List[Any]    =		[]
       lowerCAmelCase_					:       List[Any]    =		dqa_pipeline(image=_lowercase    ,						question=_lowercase    ,						words=_lowercase    ,						boxes=_lowercase    ,						top_k=2						)
       self.assertEqual(_lowercase    ,						[]						)







  @slow
  @require_torch
  @require_detectrona
  @require_pytesseract
  def 	UpperCAmelCase__		(	self						):
       lowerCAmelCase_					:       Optional[Any]    =		pipeline(
           """document-question-answering"""    ,						model="""tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa"""    ,						revision="""9977165"""    ,						)
       lowerCAmelCase_					:       Dict    =		INVOICE_URL
       lowerCAmelCase_					:       int    =		"""What is the invoice number?"""

       lowerCAmelCase_					:       Union[str, Any]    =		dqa_pipeline(image=_lowercase    ,						question=_lowercase    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               {"""score""": 0.9944, """answer""": """us-001""", """start""": 16, """end""": 16},
               {"""score""": 0.0009, """answer""": """us-001""", """start""": 16, """end""": 16},
           ]    ,						)

       lowerCAmelCase_					:       List[Any]    =		dqa_pipeline({"""image""": image, """question""": question}    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               {"""score""": 0.9944, """answer""": """us-001""", """start""": 16, """end""": 16},
               {"""score""": 0.0009, """answer""": """us-001""", """start""": 16, """end""": 16},
           ]    ,						)

       lowerCAmelCase_					:       List[str]    =		dqa_pipeline(
           [{"""image""": image, """question""": question}, {"""image""": image, """question""": question}]    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               [
                   {"""score""": 0.9944, """answer""": """us-001""", """start""": 16, """end""": 16},
                   {"""score""": 0.0009, """answer""": """us-001""", """start""": 16, """end""": 16},
               ],
           ]
           * 2    ,						)







  @slow
  @require_torch
  @require_detectrona
  @require_pytesseract
  def 	UpperCAmelCase__		(	self						):
       lowerCAmelCase_					:       Optional[int]    =		pipeline(
           """document-question-answering"""    ,						model="""tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa"""    ,						revision="""9977165"""    ,						max_seq_len=50    ,						)
       lowerCAmelCase_					:       List[str]    =		INVOICE_URL
       lowerCAmelCase_					:       Optional[int]    =		"""What is the invoice number?"""

       lowerCAmelCase_					:       List[Any]    =		dqa_pipeline(image=_lowercase    ,						question=_lowercase    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               {"""score""": 0.9974, """answer""": """1110212019""", """start""": 23, """end""": 23},
               {"""score""": 0.9948, """answer""": """us-001""", """start""": 16, """end""": 16},
           ]    ,						)

       lowerCAmelCase_					:       Optional[Any]    =		dqa_pipeline({"""image""": image, """question""": question}    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               {"""score""": 0.9974, """answer""": """1110212019""", """start""": 23, """end""": 23},
               {"""score""": 0.9948, """answer""": """us-001""", """start""": 16, """end""": 16},
           ]    ,						)

       lowerCAmelCase_					:       List[Any]    =		dqa_pipeline(
           [{"""image""": image, """question""": question}, {"""image""": image, """question""": question}]    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               [
                   {"""score""": 0.9974, """answer""": """1110212019""", """start""": 23, """end""": 23},
                   {"""score""": 0.9948, """answer""": """us-001""", """start""": 16, """end""": 16},
               ]
           ]
           * 2    ,						)







  @slow
  @require_torch
  @require_pytesseract
  @require_vision
  def 	UpperCAmelCase__		(	self						):
       lowerCAmelCase_					:       int    =		AutoTokenizer.from_pretrained(
           """impira/layoutlm-document-qa"""    ,						revision="""3dc6de3"""    ,						add_prefix_space=_lowercase						)
       lowerCAmelCase_					:       Any    =		pipeline(
           """document-question-answering"""    ,						model="""impira/layoutlm-document-qa"""    ,						tokenizer=_lowercase    ,						revision="""3dc6de3"""    ,						)
       lowerCAmelCase_					:       int    =		INVOICE_URL
       lowerCAmelCase_					:       Union[str, Any]    =		"""What is the invoice number?"""

       lowerCAmelCase_					:       Optional[Any]    =		dqa_pipeline(image=_lowercase    ,						question=_lowercase    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               {"""score""": 0.4251, """answer""": """us-001""", """start""": 16, """end""": 16},
               {"""score""": 0.0819, """answer""": """1110212019""", """start""": 23, """end""": 23},
           ]    ,						)

       lowerCAmelCase_					:       int    =		dqa_pipeline({"""image""": image, """question""": question}    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               {"""score""": 0.4251, """answer""": """us-001""", """start""": 16, """end""": 16},
               {"""score""": 0.0819, """answer""": """1110212019""", """start""": 23, """end""": 23},
           ]    ,						)

       lowerCAmelCase_					:       Union[str, Any]    =		dqa_pipeline(
           [{"""image""": image, """question""": question}, {"""image""": image, """question""": question}]    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               [
                   {"""score""": 0.4251, """answer""": """us-001""", """start""": 16, """end""": 16},
                   {"""score""": 0.0819, """answer""": """1110212019""", """start""": 23, """end""": 23},
               ]
           ]
           * 2    ,						)

       lowerCAmelCase_					:       int    =		list(zip(*apply_tesseract(load_image(_lowercase						)    ,						_lowercase    ,						""""""						)						)						)

       # This model should also work if `image` is set to None
       lowerCAmelCase_					:       List[Any]    =		dqa_pipeline({"""image""": None, """word_boxes""": word_boxes, """question""": question}    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               {"""score""": 0.4251, """answer""": """us-001""", """start""": 16, """end""": 16},
               {"""score""": 0.0819, """answer""": """1110212019""", """start""": 23, """end""": 23},
           ]    ,						)







  @slow
  @require_torch
  @require_pytesseract
  @require_vision
  def 	UpperCAmelCase__		(	self						):
       lowerCAmelCase_					:       int    =		AutoTokenizer.from_pretrained(
           """impira/layoutlm-document-qa"""    ,						revision="""3dc6de3"""    ,						add_prefix_space=_lowercase						)
       lowerCAmelCase_					:       Optional[Any]    =		pipeline(
           """document-question-answering"""    ,						model="""impira/layoutlm-document-qa"""    ,						tokenizer=_lowercase    ,						revision="""3dc6de3"""    ,						max_seq_len=50    ,						)
       lowerCAmelCase_					:       Tuple    =		INVOICE_URL
       lowerCAmelCase_					:       Tuple    =		"""What is the invoice number?"""

       lowerCAmelCase_					:       Optional[int]    =		dqa_pipeline(image=_lowercase    ,						question=_lowercase    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               {"""score""": 0.9999, """answer""": """us-001""", """start""": 16, """end""": 16},
               {"""score""": 0.9998, """answer""": """us-001""", """start""": 16, """end""": 16},
           ]    ,						)

       lowerCAmelCase_					:       int    =		dqa_pipeline(
           [{"""image""": image, """question""": question}, {"""image""": image, """question""": question}]    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               [
                   {"""score""": 0.9999, """answer""": """us-001""", """start""": 16, """end""": 16},
                   {"""score""": 0.9998, """answer""": """us-001""", """start""": 16, """end""": 16},
               ]
           ]
           * 2    ,						)

       lowerCAmelCase_					:       Union[str, Any]    =		list(zip(*apply_tesseract(load_image(_lowercase						)    ,						_lowercase    ,						""""""						)						)						)

       # This model should also work if `image` is set to None
       lowerCAmelCase_					:       List[str]    =		dqa_pipeline({"""image""": None, """word_boxes""": word_boxes, """question""": question}    ,						top_k=2						)
       self.assertEqual(
           nested_simplify(_lowercase    ,						decimals=4						)    ,						[
               {"""score""": 0.9999, """answer""": """us-001""", """start""": 16, """end""": 16},
               {"""score""": 0.9998, """answer""": """us-001""", """start""": 16, """end""": 16},
           ]    ,						)







  @slow
  @require_torch
  def 	UpperCAmelCase__		(	self						):
       lowerCAmelCase_					:       int    =		pipeline(
           """document-question-answering"""    ,						model="""naver-clova-ix/donut-base-finetuned-docvqa"""    ,						tokenizer=AutoTokenizer.from_pretrained("""naver-clova-ix/donut-base-finetuned-docvqa"""						)    ,						feature_extractor="""naver-clova-ix/donut-base-finetuned-docvqa"""    ,						)

       lowerCAmelCase_					:       Union[str, Any]    =		INVOICE_URL
       lowerCAmelCase_					:       int    =		"""What is the invoice number?"""
       lowerCAmelCase_					:       str    =		dqa_pipeline(image=_lowercase    ,						question=_lowercase    ,						top_k=2						)
       self.assertEqual(nested_simplify(_lowercase    ,						decimals=4						)    ,						[{"""answer""": """us-001"""}]						)







  @require_tf
  @unittest.skip("""Document question answering not implemented in TF"""						)
  def 	UpperCAmelCase__		(	self						):
       pass
