Transformers 文档

Nougat

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Nougat

PyTorch TensorFlow Flax

概述

Nougat模型由Lukas Blecher、Guillem Cucurull、Thomas Scialom和Robert Stojnic在论文 Nougat:面向学术文档的神经光学理解(Nougat: Neural Optical Understanding for Academic Documents)中提出。Nougat使用了与 Donut 相同的架构,即一个图像Transformer编码器和一个自回归文本Transformer解码器,将科学PDF文档翻译为Markdown,使其更易于访问。

论文摘要如下:

科学知识主要储存在书籍和科学期刊中,通常以PDF格式存在。然而,PDF格式会导致语义信息的丢失,尤其是对于数学表达式。我们提出了Nougat(面向学术文档的神经光学理解),这是一个视觉Transformer模型,它执行光学字符识别(OCR)任务,将科学文档处理成标记语言,并在一个新的科学文档数据集上展示了我们模型的有效性。通过弥合人类可读文档与机器可读文本之间的差距,该方法为增强数字时代科学知识的可访问性提供了一个有前景的解决方案。我们发布了模型和代码,以加速未来在科学文本识别方面的工作。

drawing Nougat高层级概述。图片来自原始论文

该模型由 nielsr 贡献。原始代码可在此处找到。

使用技巧

  • 开始使用Nougat最快的方法是查看教程笔记本,其中展示了如何在推理时使用该模型以及如何在自定义数据上进行微调。
  • Nougat始终在VisionEncoderDecoder框架内使用。该模型的架构与Donut相同。

推理

Nougat的`VisionEncoderDecoder`模型接受图像作为输入,并利用generate()根据输入图像自回归地生成文本。

NougatImageProcessor类负责预处理输入图像,而NougatTokenizerFast将生成的目标词元解码为目标字符串。NougatProcessorNougatImageProcessorNougatTokenizerFast类包装成一个单一实例,用于提取输入特征和解码预测的词元ID。

  • 分步PDF转录
>>> from huggingface_hub import hf_hub_download
>>> import re
>>> from PIL import Image

>>> from transformers import NougatProcessor, VisionEncoderDecoderModel
>>> from datasets import load_dataset
>>> import torch

>>> processor = NougatProcessor.from_pretrained("facebook/nougat-base")
>>> model = VisionEncoderDecoderModel.from_pretrained("facebook/nougat-base")

>>> device = "cuda" if torch.cuda.is_available() else "cpu"
>>> model.to(device)
>>> # prepare PDF image for the model
>>> filepath = hf_hub_download(repo_id="hf-internal-testing/fixtures_docvqa", filename="nougat_paper.png", repo_type="dataset")
>>> image = Image.open(filepath)
>>> pixel_values = processor(image, return_tensors="pt").pixel_values

>>> # generate transcription (here we only generate 30 tokens)
>>> outputs = model.generate(
...     pixel_values.to(device),
...     min_length=1,
...     max_new_tokens=30,
...     bad_words_ids=[[processor.tokenizer.unk_token_id]],
... )

>>> sequence = processor.batch_decode(outputs, skip_special_tokens=True)[0]
>>> sequence = processor.post_process_generation(sequence, fix_markdown=False)
>>> # note: we're using repr here such for the sake of printing the \n characters, feel free to just print the sequence
>>> print(repr(sequence))
'\n\n# Nougat: Neural Optical Understanding for Academic Documents\n\n Lukas Blecher\n\nCorrespondence to: lblecher@'

请参阅模型中心以查找Nougat检查点。

该模型的架构与Donut相同。

NougatImageProcessor

class transformers.NougatImageProcessor

< >

( do_crop_margin: bool = True do_resize: bool = True size: typing.Optional[dict[str, int]] = None resample: Resampling = <Resampling.BILINEAR: 2> do_thumbnail: bool = True do_align_long_axis: bool = False do_pad: bool = True do_rescale: bool = True rescale_factor: typing.Union[int, float] = 0.00392156862745098 do_normalize: bool = True image_mean: typing.Union[float, list[float], NoneType] = None image_std: typing.Union[float, list[float], NoneType] = None **kwargs )

参数

  • do_crop_margin (bool, 可选, 默认为 True) — 是否裁剪图像边缘。
  • do_resize (bool, 可选, 默认为 True) — 是否将图像的(高,宽)尺寸调整到指定的 `size`。可在 `preprocess` 方法中通过 `do_resize` 参数覆盖。
  • size (dict[str, int] 可选, 默认为 `{"height": 896, "width": 672}`):调整大小后图像的尺寸。可在 `preprocess` 方法中通过 `size` 参数覆盖。
  • resample (PILImageResampling, 可选, 默认为 `Resampling.BILINEAR`) — 调整图像大小时使用的重采样滤波器。可在 `preprocess` 方法中通过 `resample` 参数覆盖。
  • do_thumbnail (bool, 可选, 默认为 `True`) — 是否使用缩略图方法调整图像大小。
  • do_align_long_axis (bool, 可选, 默认为 `False`) — 是否通过旋转90度将图像的长轴与 `size` 的长轴对齐。
  • do_pad (bool, 可选, 默认为 `True`) — 是否将图像填充到批次中最大图像的尺寸。
  • do_rescale (bool, 可选, 默认为 `True`) — 是否按指定的 `rescale_factor` 缩放图像。可在 `preprocess` 方法中通过 `do_rescale` 参数覆盖。
  • rescale_factor (intfloat, 可选, 默认为 `1/255`) — 缩放图像时使用的比例因子。可在 `preprocess` 方法中通过 `rescale_factor` 参数覆盖。
  • do_normalize (bool, 可选, 默认为 `True`) — 是否对图像进行归一化。可在 `preprocess` 方法中通过 `do_normalize` 参数覆盖。
  • image_mean (floatlist[float], 可选, 默认为 `IMAGENET_DEFAULT_MEAN`) — 归一化图像时使用的均值。这是一个浮点数或浮点数列表,长度与图像通道数相同。可在 `preprocess` 方法中通过 `image_mean` 参数覆盖。
  • image_std (floatlist[float], 可选, 默认为 `IMAGENET_DEFAULT_STD`) — 图像标准差。

构建一个Nougat图像处理器。

预处理

< >

( images: typing.Union[ForwardRef('PIL.Image.Image'), numpy.ndarray, ForwardRef('torch.Tensor'), list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor']] do_crop_margin: typing.Optional[bool] = None do_resize: typing.Optional[bool] = None size: typing.Optional[dict[str, int]] = None resample: Resampling = None do_thumbnail: typing.Optional[bool] = None do_align_long_axis: typing.Optional[bool] = None do_pad: typing.Optional[bool] = None do_rescale: typing.Optional[bool] = None rescale_factor: typing.Union[int, float, NoneType] = None do_normalize: typing.Optional[bool] = None image_mean: typing.Union[float, list[float], NoneType] = None image_std: typing.Union[float, list[float], NoneType] = None return_tensors: typing.Union[str, transformers.utils.generic.TensorType, NoneType] = None data_format: typing.Optional[transformers.image_utils.ChannelDimension] = <ChannelDimension.FIRST: 'channels_first'> input_data_format: typing.Union[str, transformers.image_utils.ChannelDimension, NoneType] = None )

参数

  • images (`ImageInput`) — 待预处理的图像。需要单个或一批像素值在0到255之间的图像。
  • do_crop_margin (bool, 可选, 默认为 `self.do_crop_margin`) — 是否裁剪图像边缘。
  • do_resize (bool, 可选, 默认为 `self.do_resize`) — 是否调整图像大小。
  • size (dict[str, int], 可选, 默认为 `self.size`) — 调整大小后图像的尺寸。图像的最短边将被调整为min(size[“height”], size[“width”]),最长边则按比例调整以保持输入宽高比。
  • resample (int, 可选, 默认为 `self.resample`) — 调整图像大小时使用的重采样滤波器。可以是 `PILImageResampling` 枚举中的一个。仅当 `do_resize` 设置为 `True` 时有效。
  • do_thumbnail (bool, 可选, 默认为 `self.do_thumbnail`) — 是否使用缩略图方法调整图像大小。
  • do_align_long_axis (bool, 可选, 默认为 `self.do_align_long_axis`) — 是否通过旋转90度将图像的长轴与 `size` 的长轴对齐。
  • do_pad (bool, 可选, 默认为 `self.do_pad`) — 是否将图像填充到批次中最大图像的尺寸。
  • do_rescale (bool, 可选, 默认为 `self.do_rescale`) — 是否按指定的 `rescale_factor` 缩放图像。
  • rescale_factor (intfloat, 可选, 默认为 `self.rescale_factor`) — 缩放图像时使用的比例因子。
  • do_normalize (bool, 可选, 默认为 `self.do_normalize`) — 是否对图像进行归一化。
  • image_mean (float 或 `list[float]`, 可选, 默认为 `self.image_mean`) — 归一化时使用的图像均值。
  • image_std (float 或 `list[float]`, 可选, 默认为 `self.image_std`) — 归一化时使用的图像标准差。
  • return_tensors (`str` 或 `TensorType`, 可选) — 返回张量的类型。可以是以下之一:
    • 未设置:返回 `np.ndarray` 列表。
    • `TensorType.TENSORFLOW` 或 `'tf'`:返回 `tf.Tensor` 批次。
    • `TensorType.PYTORCH` 或 `'pt'`:返回 `torch.Tensor` 批次。
    • `TensorType.NUMPY` 或 `'np'`:返回 `np.ndarray` 批次。
    • `TensorType.JAX` 或 `'jax'`:返回 `jax.numpy.ndarray` 批次。
  • data_format (`ChannelDimension` 或 `str`, 可选, 默认为 `ChannelDimension.FIRST`) — 输出图像的通道维度格式。可以是以下之一:
    • `ChannelDimension.FIRST`:图像格式为 (num_channels, height, width)。
    • `ChannelDimension.LAST`:图像格式为 (height, width, num_channels)。
    • 未设置:默认为输入图像的通道维度格式。
  • input_data_format (`ChannelDimension` 或 `str`, 可选) — 输入图像的通道维度格式。如果未设置,则从输入图像中推断通道维度格式。可以是以下之一:
    • `"channels_first"` 或 `ChannelDimension.FIRST`:图像格式为 (num_channels, height, width)。
    • `"channels_last"` 或 `ChannelDimension.LAST`:图像格式为 (height, width, num_channels)。
    • `"none"` 或 `ChannelDimension.NONE`:图像格式为 (height, width)。

预处理一张或一批图像。

NougatTokenizerFast

class transformers.NougatTokenizerFast

< >

( vocab_file = None tokenizer_file = None clean_up_tokenization_spaces = False unk_token = '<unk>' bos_token = '<s>' eos_token = '</s>' pad_token = '<pad>' **kwargs )

参数

  • vocab_file (`str`, 可选) — SentencePiece 文件(通常扩展名为 .model),其中包含实例化分词器所需的词汇表。
  • tokenizer_file (`str`, 可选) — tokenizers 文件(通常扩展名为 .json),其中包含加载分词器所需的一切。
  • clean_up_tokenization_spaces (`str`, 可选, 默认为 `False`) — 是否在解码后清理空格,清理操作包括移除可能的多余空格等伪影。
  • unk_token (`str`, 可选, 默认为 `""`) — 未知词元。不在词汇表中的词元无法转换为ID,将被设置为此词元。
  • bos_token (str, 可选, 默认为 "<s>") — 预训练期间使用的序列开始标记。可用作序列分类器标记。
  • eos_token (str, 可选, 默认为 "</s>") — 序列结束标记。
  • pad_token (str, 可选, 默认为 "<pad>") — 用于填充的标记,例如在批处理不同长度的序列时。
  • model_max_length (int, 可选) — Transformer 模型输入的最大长度(以标记数量计)。当使用 from_pretrained() 加载分词器时,此值将设置为相关模型在 `max_model_input_sizes` 中存储的值(见上文)。如果未提供值,将默认为 VERY_LARGE_INTEGER (`int(1e30)`)。
  • padding_side (str, 可选) — 模型应在其上应用填充的一侧。应在 ['right', 'left'] 之间选择。默认值取自同名的类属性。
  • truncation_side (str, 可选) — 模型应在其上应用截断的一侧。应在 ['right', 'left'] 之间选择。默认值取自同名的类属性。
  • chat_template (str, 可选) — 一个 Jinja 模板字符串,用于格式化聊天消息列表。有关完整描述,请参阅 https://huggingface.co/docs/transformers/chat_templating
  • model_input_names (list[string], 可选) — 模型的前向传播接受的输入列表(如 `"token_type_ids"` 或 `"attention_mask"`)。默认值取自同名的类属性。
  • bos_token (str or tokenizers.AddedToken, 可选) — 表示句子开头的特殊标记。将与 `self.bos_token` 和 `self.bos_token_id` 关联。
  • eos_token (str or tokenizers.AddedToken, 可选) — 表示句子结尾的特殊标记。将与 `self.eos_token` 和 `self.eos_token_id` 关联。
  • unk_token (str or tokenizers.AddedToken, 可选) — 表示词汇表外标记的特殊标记。将与 `self.unk_token` 和 `self.unk_token_id` 关联。
  • sep_token (str or tokenizers.AddedToken, 可选) — 用于在同一输入中分隔两个不同句子的特殊标记(例如 BERT 使用)。将与 `self.sep_token` 和 `self.sep_token_id` 关联。
  • pad_token (str or tokenizers.AddedToken, 可选) — 一种特殊标记,用于使标记数组具有相同的大小以便于批处理。之后将被注意力机制或损失计算忽略。将与 `self.pad_token` 和 `self.pad_token_id` 关联。
  • cls_token (str or tokenizers.AddedToken, 可选) — 表示输入类别的特殊标记(例如 BERT 使用)。将与 `self.cls_token` 和 `self.cls_token_id` 关联。
  • mask_token (str or tokenizers.AddedToken, 可选) — 表示掩码标记的特殊标记(用于掩码语言建模预训练目标,如 BERT)。将与 `self.mask_token` 和 `self.mask_token_id` 关联。
  • additional_special_tokens (tuple or list of str or tokenizers.AddedToken, 可选) — 一个元组或列表,包含额外的特殊标记。在此处添加它们以确保在使用 `skip_special_tokens` 设置为 True 进行解码时跳过它们。如果它们不属于词汇表,将被添加到词汇表的末尾。
  • clean_up_tokenization_spaces (bool, 可选, 默认为 True) — 模型是否应清理在分词过程中分割输入文本时添加的空格。
  • split_special_tokens (bool, 可选, 默认为 False) — 特殊标记在分词过程中是否应被分割。传递此参数将影响分词器的内部状态。默认行为是不分割特殊标记。这意味着如果 `<s>` 是 `bos_token`,那么 `tokenizer.tokenize("<s>") = ['<s>']`。否则,如果 `split_special_tokens=True`,那么 `tokenizer.tokenize("<s>")` 将得到 `['<','s', '>']`。
  • tokenizer_object (tokenizers.Tokenizer) — 一个来自 🤗 tokenizers 的 `tokenizers.Tokenizer` 对象,用于实例化。更多信息请参阅使用 🤗 tokenizers 的分词器
  • tokenizer_file (str) — 一个本地 JSON 文件的路径,该文件代表先前序列化的来自 🤗 tokenizers 的 `tokenizers.Tokenizer` 对象。

Nougat 的快速分词器(由 HuggingFace tokenizers 库支持)。

此分词器继承自 PreTrainedTokenizerFast,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。此类主要添加了 Nougat 特有的方法,用于后处理生成的文本。

类属性(由派生类覆盖)

  • vocab_files_names (dict[str, str]) — 一个字典,其键为模型所需的每个词汇表文件的 `__init__` 关键字名称,其关联值为保存相应文件的文件名(字符串)。
  • pretrained_vocab_files_map (dict[str, dict[str, str]]) — 一个字典的字典,顶层键为模型所需的每个词汇表文件的 `__init__` 关键字名称,底层为预训练模型的 `short-cut-names`,其关联值为相应预训练词汇表文件的 `url`。
  • model_input_names (list[str]) — 模型正向传播中预期的输入列表。
  • padding_side (str) — 模型应该应用填充的侧面的默认值。应为 'right''left'
  • truncation_side (str) — 模型应该应用截断的侧面的默认值。应为 'right''left'

correct_tables

< >

( generation: str ) str

参数

  • generation (str) — 需要后处理的生成文本。

返回

字符串

后处理后的文本。

接收一个生成的字符串,并修复其中的表格/制表环境,使其符合所需的 markdown 格式。

示例

correct_tables("\begin{table} \begin{tabular}{l l} & \ \end{tabular} \end{table}")
"\begin{table}
abular}{l l} & \ \end{tabular}
le}"

post_process_generation

< >

( generation: typing.Union[str, list[str]] fix_markdown: bool = True num_workers: typing.Optional[int] = None ) Union[str, list[str]]

参数

  • generation (Union[str, list[str]]) — 生成的文本或生成的文本列表。
  • fix_markdown (bool, 可选, 默认为 True) — 是否执行 Markdown 格式修复。
  • num_workers (int, 可选) — 可选的工作进程数,用于利用多进程(并行后处理多个文本)。

返回

Union[str, list[str]]

后处理后的文本或后处理后的文本列表。

对一个生成的文本或一系列生成的文本进行后处理。

此函数可用于对生成的文本进行后处理,例如修复 Markdown 格式。

后处理相当慢,因此建议使用多进程来加速该过程。

post_process_single

< >

( generation: str fix_markdown: bool = True ) str

参数

  • generation (str) — 需要后处理的生成文本。
  • fix_markdown (bool, 可选) — 是否执行 Markdown 格式修复。默认为 True。

返回

字符串

后处理后的文本。

对单个生成的文本进行后处理。这里使用的正则表达式直接取自 Nougat 文章的作者。为清晰起见,这些表达式都有注释,并在大多数情况下进行了端到端测试。

remove_hallucinated_references

< >

( text: str ) str

参数

  • text (str) — 包含引用的输入文本。

返回

字符串

移除了幻觉引用的文本。

从文本中移除幻觉或缺失的引用。

此函数识别并从输入文本中移除被标记为缺失或幻觉的引用。

NougatProcessor

class transformers.NougatProcessor

< >

( image_processor tokenizer )

参数

构建一个 Nougat 处理器,它将一个 Nougat 图像处理器和一个 Nougat 分词器包装成一个单一的处理器。

NougatProcessor 提供了 NougatImageProcessorNougatTokenizerFast 的所有功能。有关更多信息,请参阅 __call__()decode()

__call__

< >

( images = None text = None do_crop_margin: typing.Optional[bool] = None do_resize: typing.Optional[bool] = None size: typing.Optional[dict[str, int]] = None resample: PILImageResampling = None do_thumbnail: typing.Optional[bool] = None do_align_long_axis: typing.Optional[bool] = None do_pad: typing.Optional[bool] = None do_rescale: typing.Optional[bool] = None rescale_factor: typing.Union[int, float, NoneType] = None do_normalize: typing.Optional[bool] = None image_mean: typing.Union[float, list[float], NoneType] = None image_std: typing.Union[float, list[float], NoneType] = None data_format: typing.Optional[ForwardRef('ChannelDimension')] = 'channels_first' input_data_format: typing.Union[str, ForwardRef('ChannelDimension'), NoneType] = None text_pair: typing.Union[str, list[str], list[list[str]], NoneType] = None text_target: typing.Union[str, list[str], list[list[str]]] = None text_pair_target: typing.Union[str, list[str], list[list[str]], NoneType] = None add_special_tokens: bool = True padding: typing.Union[bool, str, transformers.utils.generic.PaddingStrategy] = False truncation: typing.Union[bool, str, transformers.tokenization_utils_base.TruncationStrategy] = None max_length: typing.Optional[int] = None stride: int = 0 is_split_into_words: bool = False pad_to_multiple_of: typing.Optional[int] = None return_tensors: typing.Union[str, transformers.utils.generic.TensorType, NoneType] = None return_token_type_ids: typing.Optional[bool] = None return_attention_mask: typing.Optional[bool] = None return_overflowing_tokens: bool = False return_special_tokens_mask: bool = False return_offsets_mapping: bool = False return_length: bool = False verbose: bool = True )

from_pretrained

< >

( pretrained_model_name_or_path: typing.Union[str, os.PathLike] cache_dir: typing.Union[str, os.PathLike, NoneType] = None force_download: bool = False local_files_only: bool = False token: typing.Union[str, bool, NoneType] = None revision: str = 'main' **kwargs )

参数

  • pretrained_model_name_or_path (str or os.PathLike) — 这可以是以下之一:

    • 一个字符串,即托管在 huggingface.co 的模型仓库中的预训练特征提取器的 模型 ID
    • 一个包含使用 save_pretrained() 方法保存的特征提取器文件的 目录 路径,例如 `./my_model_directory/`。
    • 一个已保存的特征提取器 JSON 文件 的路径或 URL,例如 `./my_model_directory/preprocessor_config.json`。
  • **kwargs — 传递给 from_pretrained() 和 `~tokenization_utils_base.PreTrainedTokenizer.from_pretrained` 的附加关键字参数。

实例化与预训练模型关联的处理器。

这个类方法只是调用特征提取器的 from_pretrained() 方法、图像处理器的 ImageProcessingMixin 方法和分词器的 `~tokenization_utils_base.PreTrainedTokenizer.from_pretrained` 方法。有关更多信息,请参阅上述方法的文档字符串。

save_pretrained

< >

( save_directory push_to_hub: bool = False **kwargs )

参数

  • save_directory (str or os.PathLike) — 将保存特征提取器 JSON 文件和分词器文件的目录(如果目录不存在,则会创建)。
  • push_to_hub (bool, 可选, 默认为 False) — 是否在保存模型后将其推送到 Hugging Face 模型中心。您可以使用 `repo_id` 指定要推送到的仓库(默认为您命名空间中 `save_directory` 的名称)。
  • kwargs (dict[str, Any], 可选) — 传递给 push_to_hub() 方法的附加关键字参数。

将此处理器的属性(特征提取器、分词器等)保存在指定目录中,以便可以使用 from_pretrained() 方法重新加载。

此方法只是调用 save_pretrained()save_pretrained()。有关更多信息,请参阅上述方法的文档字符串。

batch_decode

< >

( *args **kwargs )

此方法将其所有参数转发给 NougatTokenizer 的 batch_decode()。有关更多信息,请参阅该方法的文档字符串。

解码

< >

( *args **kwargs )

此方法将其所有参数转发给 NougatTokenizer 的 decode()。请参阅该方法的文档字符串以获取更多信息。

post_process_generation

< >

( *args **kwargs )

此方法将其所有参数转发给 NougatTokenizer 的 ~PreTrainedTokenizer.post_process_generation。请参阅该方法的文档字符串以获取更多信息。

< > 在 GitHub 上更新