



import argparse

import torch

from diffusers.pipelines.stable_diffusion.convert_from_ckpt import download_from_original_stable_diffusion_ckpt


if __name__ == "__main__":
					__snake_case    :    Optional[Any]         =     argparse.ArgumentParser()

					parser.add_argument(
					    """--checkpoint_path""", default=None, type=str, required=True, help="""Path to the checkpoint to convert."""
					)
					# !wget https://raw.githubusercontent.com/CompVis/stable-diffusion/main/configs/stable-diffusion/v1-inference.yaml
					parser.add_argument(
					    """--original_config_file""",
					    default=None,
					    type=str,
					    help="""The YAML config file corresponding to the original architecture.""",
					)
					parser.add_argument(
					    """--num_in_channels""",
					    default=None,
					    type=int,
					    help="""The number of input channels. If `None` number of input channels will be automatically inferred.""",
					)
					parser.add_argument(
					    """--scheduler_type""",
					    default="""pndm""",
					    type=str,
					    help="""Type of scheduler to use. Should be one of ['pndm', 'lms', 'ddim', 'euler', 'euler-ancestral', 'dpm']""",
					)
					parser.add_argument(
					    """--pipeline_type""",
					    default=None,
					    type=str,
					    help=(
					        """The pipeline type. One of 'FrozenOpenCLIPEmbedder', 'FrozenCLIPEmbedder', 'PaintByExample'"""
					        """. If `None` pipeline will be automatically inferred."""
					    ),
					)
					parser.add_argument(
					    """--image_size""",
					    default=None,
					    type=int,
					    help=(
					        """The image size that the model was trained on. Use 512 for Stable Diffusion v1.X and Stable Siffusion v2"""
					        """ Base. Use 768 for Stable Diffusion v2."""
					    ),
					)
					parser.add_argument(
					    """--prediction_type""",
					    default=None,
					    type=str,
					    help=(
					        """The prediction type that the model was trained on. Use 'epsilon' for Stable Diffusion v1.X and Stable"""
					        """ Diffusion v2 Base. Use 'v_prediction' for Stable Diffusion v2."""
					    ),
					)
					parser.add_argument(
					    """--extract_ema""",
					    action="""store_true""",
					    help=(
					        """Only relevant for checkpoints that have both EMA and non-EMA weights. Whether to extract the EMA weights"""
					        """ or not. Defaults to `False`. Add `--extract_ema` to extract the EMA weights. EMA weights usually yield"""
					        """ higher quality images for inference. Non-EMA weights are usually better to continue fine-tuning."""
					    ),
					)
					parser.add_argument(
					    """--upcast_attention""",
					    action="""store_true""",
					    help=(
					        """Whether the attention computation should always be upcasted. This is necessary when running stable"""
					        """ diffusion 2.1."""
					    ),
					)
					parser.add_argument(
					    """--from_safetensors""",
					    action="""store_true""",
					    help="""If `--checkpoint_path` is in `safetensors` format, load checkpoint with safetensors instead of PyTorch.""",
					)
					parser.add_argument(
					    """--to_safetensors""",
					    action="""store_true""",
					    help="""Whether to store pipeline in safetensors format or not.""",
					)
					parser.add_argument("""--dump_path""", default=None, type=str, required=True, help="""Path to the output model.""")
					parser.add_argument("""--device""", type=str, help="""Device to use (e.g. cpu, cuda:0, cuda:1, etc.)""")
					parser.add_argument(
					    """--stable_unclip""",
					    type=str,
					    default=None,
					    required=False,
					    help="""Set if this is a stable unCLIP model. One of 'txt2img' or 'img2img'.""",
					)
					parser.add_argument(
					    """--stable_unclip_prior""",
					    type=str,
					    default=None,
					    required=False,
					    help="""Set if this is a stable unCLIP txt2img model. Selects which prior to use. If `--stable_unclip` is set to `txt2img`, the karlo prior (https://huggingface.co/kakaobrain/karlo-v1-alpha/tree/main/prior) is selected by default.""",
					)
					parser.add_argument(
					    """--clip_stats_path""",
					    type=str,
					    help="""Path to the clip stats file. Only required if the stable unclip model's config specifies `model.params.noise_aug_config.params.clip_stats_path`.""",
					    required=False,
					)
					parser.add_argument(
					    """--controlnet""", action="""store_true""", default=None, help="""Set flag if this is a controlnet checkpoint."""
					)
					parser.add_argument("""--half""", action="""store_true""", help="""Save weights in half precision.""")
					parser.add_argument(
					    """--vae_path""",
					    type=str,
					    default=None,
					    required=False,
					    help="""Set to a path, hub id to an already converted vae to not convert it again.""",
					)
					__snake_case    :    Optional[int]         =     parser.parse_args()

					__snake_case    :    List[str]         =     download_from_original_stable_diffusion_ckpt(
					    checkpoint_path=args.checkpoint_path,
					    original_config_file=args.original_config_file,
					    image_size=args.image_size,
					    prediction_type=args.prediction_type,
					    model_type=args.pipeline_type,
					    extract_ema=args.extract_ema,
					    scheduler_type=args.scheduler_type,
					    num_in_channels=args.num_in_channels,
					    upcast_attention=args.upcast_attention,
					    from_safetensors=args.from_safetensors,
					    device=args.device,
					    stable_unclip=args.stable_unclip,
					    stable_unclip_prior=args.stable_unclip_prior,
					    clip_stats_path=args.clip_stats_path,
					    controlnet=args.controlnet,
					    vae_path=args.vae_path,
					)

					if args.half:
										pipe.to(torch_dtype=torch.floataa)

					if args.controlnet:
										# only save the controlnet model
										pipe.controlnet.save_pretrained(args.dump_path, safe_serialization=args.to_safetensors)
					else:
										pipe.save_pretrained(args.dump_path, safe_serialization=args.to_safetensors)













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     __SCREAMING_SNAKE_CASE					:






											@staticmethod
											def       UpperCamelCase__      (	*_UpperCamelCase     ,						**_UpperCamelCase   ):






																	"""simple docstring"""
																	pass







					def 	_UpperCamelCase   (    UpperCamelCase_       :					Tuple		)  ->   Any:

											"""simple docstring"""



											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.
__snake_case    :    List[str]         =     (
    """https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png"""
)


@is_pipeline_test
@require_torch
@require_vision
class     __SCREAMING_SNAKE_CASE					(   unittest.TestCase):
						_SCREAMING_SNAKE_CASE	:       Dict   =					MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING






						@require_pytesseract
						@require_vision
						def       UpperCamelCase__      (	self     ,						_UpperCamelCase     ,						_UpperCamelCase     ,						_UpperCamelCase   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						pipeline(
												    'document-question-answering'     ,						model=_UpperCamelCase     ,						tokenizer=_UpperCamelCase     ,						image_processor=_UpperCamelCase   )

												lowerCAmelCase__    						=						INVOICE_URL
												lowerCAmelCase__    						=						list(zip(*apply_tesseract(load_image(_UpperCamelCase   )     ,						_UpperCamelCase     ,						''   )   )   )
												lowerCAmelCase__    						=						'What is the placebo?'
												lowerCAmelCase__    						=						[
												    {
												        'image': load_image(_UpperCamelCase   ),
												        'question': question,
												    },
												    {
												        'image': image,
												        'question': question,
												    },
												    {
												        'image': image,
												        'question': question,
												        'word_boxes': word_boxes,
												    },
												]
												return dqa_pipeline, examples






						def       UpperCamelCase__      (	self     ,						_UpperCamelCase     ,						_UpperCamelCase   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						dqa_pipeline(_UpperCamelCase     ,						top_k=2   )
												self.assertEqual(
												    _UpperCamelCase     ,						[
												        [
												            {'score': ANY(_UpperCamelCase   ), 'answer': ANY(_UpperCamelCase   ), 'start': ANY(_UpperCamelCase   ), 'end': ANY(_UpperCamelCase   )},
												            {'score': ANY(_UpperCamelCase   ), 'answer': ANY(_UpperCamelCase   ), 'start': ANY(_UpperCamelCase   ), 'end': ANY(_UpperCamelCase   )},
												        ]
												    ]
												    * 3     ,						)






						@require_torch
						@require_detectrona
						@require_pytesseract
						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						pipeline('document-question-answering'     ,						model='hf-internal-testing/tiny-random-layoutlmv2'   )
												lowerCAmelCase__    						=						INVOICE_URL
												lowerCAmelCase__    						=						'How many cats are there?'

												lowerCAmelCase__    						=						[
												    {'score': 0.00_01, 'answer': 'oy 2312/2019', 'start': 38, 'end': 39},
												    {'score': 0.00_01, 'answer': 'oy 2312/2019 DUE', 'start': 38, 'end': 40},
												]
												lowerCAmelCase__    						=						dqa_pipeline(image=_UpperCamelCase     ,						question=_UpperCamelCase     ,						top_k=2   )
												self.assertEqual(nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						_UpperCamelCase   )

												lowerCAmelCase__    						=						dqa_pipeline({'image': image, 'question': question}     ,						top_k=2   )
												self.assertEqual(nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						_UpperCamelCase   )

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

												# We can optionnally pass directly the words and bounding boxes
												lowerCAmelCase__    						=						'./tests/fixtures/tests_samples/COCO/000000039769.png'
												lowerCAmelCase__    						=						[]
												lowerCAmelCase__    						=						[]
												lowerCAmelCase__    						=						dqa_pipeline(image=_UpperCamelCase     ,						question=_UpperCamelCase     ,						words=_UpperCamelCase     ,						boxes=_UpperCamelCase     ,						top_k=2   )
												self.assertEqual(_UpperCamelCase     ,						[]   )






						@slow
						@require_torch
						@require_detectrona
						@require_pytesseract
						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						pipeline(
												    'document-question-answering'     ,						model='tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'     ,						revision='9977165'     ,						)
												lowerCAmelCase__    						=						INVOICE_URL
												lowerCAmelCase__    						=						'What is the invoice number?'

												lowerCAmelCase__    						=						dqa_pipeline(image=_UpperCamelCase     ,						question=_UpperCamelCase     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        {'score': 0.99_44, 'answer': 'us-001', 'start': 16, 'end': 16},
												        {'score': 0.00_09, 'answer': 'us-001', 'start': 16, 'end': 16},
												    ]     ,						)

												lowerCAmelCase__    						=						dqa_pipeline({'image': image, 'question': question}     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        {'score': 0.99_44, 'answer': 'us-001', 'start': 16, 'end': 16},
												        {'score': 0.00_09, 'answer': 'us-001', 'start': 16, 'end': 16},
												    ]     ,						)

												lowerCAmelCase__    						=						dqa_pipeline(
												    [{'image': image, 'question': question}, {'image': image, 'question': question}]     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        [
												            {'score': 0.99_44, 'answer': 'us-001', 'start': 16, 'end': 16},
												            {'score': 0.00_09, 'answer': 'us-001', 'start': 16, 'end': 16},
												        ],
												    ]
												    * 2     ,						)






						@slow
						@require_torch
						@require_detectrona
						@require_pytesseract
						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						pipeline(
												    'document-question-answering'     ,						model='tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'     ,						revision='9977165'     ,						max_seq_len=50     ,						)
												lowerCAmelCase__    						=						INVOICE_URL
												lowerCAmelCase__    						=						'What is the invoice number?'

												lowerCAmelCase__    						=						dqa_pipeline(image=_UpperCamelCase     ,						question=_UpperCamelCase     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        {'score': 0.99_74, 'answer': '1110212019', 'start': 23, 'end': 23},
												        {'score': 0.99_48, 'answer': 'us-001', 'start': 16, 'end': 16},
												    ]     ,						)

												lowerCAmelCase__    						=						dqa_pipeline({'image': image, 'question': question}     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        {'score': 0.99_74, 'answer': '1110212019', 'start': 23, 'end': 23},
												        {'score': 0.99_48, 'answer': 'us-001', 'start': 16, 'end': 16},
												    ]     ,						)

												lowerCAmelCase__    						=						dqa_pipeline(
												    [{'image': image, 'question': question}, {'image': image, 'question': question}]     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        [
												            {'score': 0.99_74, 'answer': '1110212019', 'start': 23, 'end': 23},
												            {'score': 0.99_48, 'answer': 'us-001', 'start': 16, 'end': 16},
												        ]
												    ]
												    * 2     ,						)






						@slow
						@require_torch
						@require_pytesseract
						@require_vision
						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						AutoTokenizer.from_pretrained(
												    'impira/layoutlm-document-qa'     ,						revision='3dc6de3'     ,						add_prefix_space=_UpperCamelCase   )
												lowerCAmelCase__    						=						pipeline(
												    'document-question-answering'     ,						model='impira/layoutlm-document-qa'     ,						tokenizer=_UpperCamelCase     ,						revision='3dc6de3'     ,						)
												lowerCAmelCase__    						=						INVOICE_URL
												lowerCAmelCase__    						=						'What is the invoice number?'

												lowerCAmelCase__    						=						dqa_pipeline(image=_UpperCamelCase     ,						question=_UpperCamelCase     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        {'score': 0.42_51, 'answer': 'us-001', 'start': 16, 'end': 16},
												        {'score': 0.08_19, 'answer': '1110212019', 'start': 23, 'end': 23},
												    ]     ,						)

												lowerCAmelCase__    						=						dqa_pipeline({'image': image, 'question': question}     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        {'score': 0.42_51, 'answer': 'us-001', 'start': 16, 'end': 16},
												        {'score': 0.08_19, 'answer': '1110212019', 'start': 23, 'end': 23},
												    ]     ,						)

												lowerCAmelCase__    						=						dqa_pipeline(
												    [{'image': image, 'question': question}, {'image': image, 'question': question}]     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        [
												            {'score': 0.42_51, 'answer': 'us-001', 'start': 16, 'end': 16},
												            {'score': 0.08_19, 'answer': '1110212019', 'start': 23, 'end': 23},
												        ]
												    ]
												    * 2     ,						)

												lowerCAmelCase__    						=						list(zip(*apply_tesseract(load_image(_UpperCamelCase   )     ,						_UpperCamelCase     ,						''   )   )   )

												# This model should also work if `image` is set to None
												lowerCAmelCase__    						=						dqa_pipeline({'image': None, 'word_boxes': word_boxes, 'question': question}     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        {'score': 0.42_51, 'answer': 'us-001', 'start': 16, 'end': 16},
												        {'score': 0.08_19, 'answer': '1110212019', 'start': 23, 'end': 23},
												    ]     ,						)






						@slow
						@require_torch
						@require_pytesseract
						@require_vision
						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						AutoTokenizer.from_pretrained(
												    'impira/layoutlm-document-qa'     ,						revision='3dc6de3'     ,						add_prefix_space=_UpperCamelCase   )
												lowerCAmelCase__    						=						pipeline(
												    'document-question-answering'     ,						model='impira/layoutlm-document-qa'     ,						tokenizer=_UpperCamelCase     ,						revision='3dc6de3'     ,						max_seq_len=50     ,						)
												lowerCAmelCase__    						=						INVOICE_URL
												lowerCAmelCase__    						=						'What is the invoice number?'

												lowerCAmelCase__    						=						dqa_pipeline(image=_UpperCamelCase     ,						question=_UpperCamelCase     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        {'score': 0.99_99, 'answer': 'us-001', 'start': 16, 'end': 16},
												        {'score': 0.99_98, 'answer': 'us-001', 'start': 16, 'end': 16},
												    ]     ,						)

												lowerCAmelCase__    						=						dqa_pipeline(
												    [{'image': image, 'question': question}, {'image': image, 'question': question}]     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        [
												            {'score': 0.99_99, 'answer': 'us-001', 'start': 16, 'end': 16},
												            {'score': 0.99_98, 'answer': 'us-001', 'start': 16, 'end': 16},
												        ]
												    ]
												    * 2     ,						)

												lowerCAmelCase__    						=						list(zip(*apply_tesseract(load_image(_UpperCamelCase   )     ,						_UpperCamelCase     ,						''   )   )   )

												# This model should also work if `image` is set to None
												lowerCAmelCase__    						=						dqa_pipeline({'image': None, 'word_boxes': word_boxes, 'question': question}     ,						top_k=2   )
												self.assertEqual(
												    nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[
												        {'score': 0.99_99, 'answer': 'us-001', 'start': 16, 'end': 16},
												        {'score': 0.99_98, 'answer': 'us-001', 'start': 16, 'end': 16},
												    ]     ,						)






						@slow
						@require_torch
						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						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__    						=						INVOICE_URL
												lowerCAmelCase__    						=						'What is the invoice number?'
												lowerCAmelCase__    						=						dqa_pipeline(image=_UpperCamelCase     ,						question=_UpperCamelCase     ,						top_k=2   )
												self.assertEqual(nested_simplify(_UpperCamelCase     ,						decimals=4   )     ,						[{'answer': 'us-001'}]   )







						@require_tf
						@unittest.skip('Document question answering not implemented in TF'   )
						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												pass





