# SLANet

## 概述

**SLANet** 和 **SLANet_plus** 是一系列专为表格结构识别设计的轻量级模型，专注于准确识别文档和自然场景中的表格结构。有关 SLANet 系列模型的更多详细信息，请参阅[官方文档](https://www.paddleocr.ai/latest/en/version3.x/module_usage/table_structure_recognition.html)。

## 模型架构

SLANet 是由百度 PaddlePaddle 视觉团队开发的表格结构识别模型。该模型采用了适用于 CPU 的轻量级骨干网络 PP-LCNet、高低层特征融合模块 CSP-PAN 以及对齐结构与位置信息的特征解码模块 SLA Head，从而显著提升了表格结构识别的准确率和推理速度。

## 用法

### 单输入推理

下面的示例演示了如何使用 [AutoModel](/docs/transformers/v5.23.0/zh/model_doc/auto#transformers.AutoModel) 通过 SLANet 检测文本。

```python
from io import BytesIO

from huggingface_hub.utils import httpx
from PIL import Image

from transformers import AutoImageProcessor, AutoModelForTableRecognition

model_path="PaddlePaddle/SLANet_plus_safetensors"
model = AutoModelForTableRecognition.from_pretrained(model_path, device_map="auto")
image_processor = AutoImageProcessor.from_pretrained(model_path)

image = Image.open(BytesIO(httpx.get(image_url).content))
inputs = image_processor(images=image, return_tensors="pt").to(model.device)
outputs = model(**inputs)

results = image_processor.post_process_table_recognition(outputs)

print(result['structure'])
print(result['structure_score'])
```

## SLANetConfig[[transformers.SLANetConfig]]

#### transformers.SLANetConfig[[transformers.SLANetConfig]]

```python
transformers.SLANetConfig(transformers_version: str | None = None, architectures: list[str] | None = None, output_hidden_states: bool | None = False, return_dict: bool | None = True, dtype: str | torch.dtype | None = None, chunk_size_feed_forward: int = 0, is_encoder_decoder: bool = False, id2label: dict[int, str] | dict[str, str] | None = None, label2id: dict[str, int] | dict[str, str] | None = None, problem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = None, post_conv_out_channels: int = 96, out_channels: int = 50, hidden_size: int = 256, max_text_length: int = 500, backbone_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None, hidden_act: str = 'hardswish', csp_kernel_size: int = 5, csp_num_blocks: int = 1)
```

[来源](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/slanet/configuration_slanet.py#L31)

**参数：**

post_conv_out_channels (`int`, *可选*，默认为 96)：编码器后卷积层的输出通道数。

out_channels (`int`，*可选*，默认为 50)：表格结构标记预测头的词汇表大小，即模型可以预测的不同结构标记的数量。

hidden_size (`int`，*可选*，默认为 256)：注意力 GRU 单元以及结构/位置预测头中隐藏状态的维度。

max_text_length (`int`，*可选*，默认值为 500)：结构和位置解码器自回归解码步骤（token）的最大数量。

backbone_config (`Union[dict, ~configuration_utils.PreTrainedConfig]`，*可选*)：骨干模型的配置。

hidden_act (`str`，*可选*，默认为 `hardswish`)：解码器中的非线性激活函数（函数或字符串）。例如，`"gelu"`、`"relu"`、`"silu"` 等。

csp_kernel_size (`int`, *可选*，默认为 5)：Cross Stage Partial (CSP) 层的卷积核大小。

csp_num_blocks (`int`，*可选*，默认为 1)：Cross Stage Partial (CSP) 层中的块数。

这是用于存储 SlanetModel 配置的类。它根据指定的参数实例化 Slanet 模型，并定义模型架构。使用默认值实例化配置将得到与 [PaddlePaddle/SLANet_plus_safetensors](https://huggingface.co/PaddlePaddle/SLANet_plus_safetensors) 类似的配置。

配置对象继承自 [PreTrainedConfig](/docs/transformers/v5.23.0/zh/main_classes/configuration#transformers.PreTrainedConfig)，可用于控制模型输出。有关更多信息，请参阅 [PreTrainedConfig](/docs/transformers/v5.23.0/zh/main_classes/configuration#transformers.PreTrainedConfig) 的文档。

## SLANetForTableRecognition[[transformers.SLANetForTableRecognition]]

#### transformers.SLANetForTableRecognition[[transformers.SLANetForTableRecognition]]

```python
transformers.SLANetForTableRecognition(config: SLANetConfig)
```

[来源](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/slanet/modeling_slanet.py#L455)

**参数：**

config ([SLANetConfig](/docs/transformers/v5.23.0/zh/model_doc/slanet#transformers.SLANetConfig))：模型配置类，包含模型的所有参数。使用配置文件进行初始化时，不会加载与模型关联的权重，仅加载配置。请查看 [from_pretrained()](/docs/transformers/v5.23.0/zh/main_classes/model#transformers.PreTrainedModel.from_pretrained) 方法以加载模型权重。

用于表格识别任务的 SLANet Table Recognition 模型。封装了核心的 SLANetPreTrainedModel，并返回与 Transformers 表格识别 API 兼容的输出。

该模型继承自 [PreTrainedModel](/docs/transformers/v5.23.0/zh/main_classes/model#transformers.PreTrainedModel)。请查阅父类文档，了解该库为所有模型实现的通用方法（例如下载或保存、调整输入嵌入大小、剪枝头等）。

该模型也是 PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) 的子类。请将其作为常规的 PyTorch Module 使用，有关通用用法和行为的所有事项，请参阅 PyTorch 文档。

#### forward[[transformers.SLANetForTableRecognition.forward]]

```python
forward(pixel_values: Tensor, **kwargs: *<class 'transformers.utils.generic.TransformersKwargs'>)
```

[来源](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/slanet/modeling_slanet.py#L464)

**参数：**

pixel_values (`torch.Tensor`，形状为 `(batch_size, num_channels, image_size, image_size)`)：与输入图像对应的张量。可以使用 [SLANeXtImageProcessor](/docs/transformers/v5.23.0/zh/model_doc/slanext#transformers.SLANeXtImageProcessor) 获取像素值。有关详细信息，请参阅 [SLANeXtImageProcessor.__call__()](/docs/transformers/v5.23.0/zh/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__)（`processor_class` 使用 [SLANeXtImageProcessor](/docs/transformers/v5.23.0/zh/model_doc/slanext#transformers.SLANeXtImageProcessor) 处理图像）。

**返回：** `SLANetForTableRecognitionOutput` 或 `tuple(torch.Tensor)`

`SLANetForTableRecognitionOutput` 或 `torch.Tensor` 元组（如果传入 `return_dict=False` 或 `config.return_dict=False`），其包含的元素取决于配置（[SLANetConfig](/docs/transformers/v5.23.0/zh/model_doc/slanet#transformers.SLANetConfig)）和输入。

[SLANetForTableRecognition](/docs/transformers/v5.23.0/zh/model_doc/slanet#transformers.SLANetForTableRecognition) 的 forward 方法重写了 `__call__` 特殊方法。

尽管前向传播的实现需要在此函数中定义，但之后应调用 `Module` 实例，而不是直接调用此函数，因为前者会负责执行预处理和后处理步骤，而后者会静默地忽略这些步骤。

- **last_hidden_state**（形状为 `(batch_size, num_channels, height, width)` 的 `torch.Tensor`）-- 模型最后一层输出的隐藏状态序列。
- **hidden_states** (`tuple(torch.Tensor)`，*可选*，在传入 `output_hidden_states=True` 或 `config.output_hidden_states=True` 时返回) -- 一个 `torch.Tensor` 元组（如果模型具有嵌入层，则包含嵌入层输出的一个张量，以及每个层输出的一个张量），形状为 `(batch_size, num_channels, height, width)`。

  模型在每一层输出处的隐藏状态，以及可选的初始嵌入输出。
- **head_hidden_states** (`tuple(torch.Tensor)`，*可选*，在传入 `output_hidden_states=True` 或 `config.output_hidden_states=True` 时返回) -- SLANetSLAHead 在每个预测步骤的隐藏状态，最多可包含 `self.config.max_text_length` 个状态（取决于提前退出）。
- **head_attentions** (`tuple(torch.Tensor)`，*可选*，在传入 `output_attentions=True` 或 `config.output_attentions=True` 时返回) -- SLANetSLAHead 在每个预测步骤的注意力，最多可包含 `self.config.max_text_length` 个注意力（取决于提前退出）。

## SLANetBackbone[[transformers.SLANetBackbone]]

#### transformers.SLANetBackbone[[transformers.SLANetBackbone]]

```python
transformers.SLANetBackbone(config: SLANetConfig)
```

[来源](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/slanet/modeling_slanet.py#L428)

#### forward[[transformers.SLANetBackbone.forward]]

```python
forward(hidden_states: Tensor, **kwargs: *<class 'transformers.utils.generic.TransformersKwargs'>)
```

[来源](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/slanet/modeling_slanet.py#L436)

**参数：**

hidden_states (`torch.Tensor`) : 该层的输入，形状为 `(batch, seq_len, embed_dim)`

**返回：** `BaseModelOutputWithNoAttention` 或 `tuple(torch.Tensor)`

`BaseModelOutputWithNoAttention` 或 `torch.Tensor` 元组（如果传入 `return_dict=False` 或 `config.return_dict=False`），其包含的元素取决于配置（[SLANetConfig](/docs/transformers/v5.23.0/zh/model_doc/slanet#transformers.SLANetConfig)）和输入。

[SLANetBackbone](/docs/transformers/v5.23.0/zh/model_doc/slanet#transformers.SLANetBackbone) 的 forward 方法重写了 `__call__` 特殊方法。

尽管前向传播的实现需要在此函数中定义，但之后应调用 `Module` 实例，而不是直接调用此函数，因为前者会负责执行预处理和后处理步骤，而后者会静默地忽略这些步骤。

- **last_hidden_state**（形状为 `(batch_size, num_channels, height, width)` 的 `torch.Tensor`）-- 模型最后一层输出的隐藏状态序列。
- **hidden_states** (`tuple(torch.Tensor)`，*可选*，在传入 `output_hidden_states=True` 或 `config.output_hidden_states=True` 时返回) -- 一个 `torch.Tensor` 元组（如果模型具有嵌入层，则包含嵌入层输出的一个张量，以及每个层输出的一个张量），形状为 `(batch_size, num_channels, height, width)`。

  模型在每一层输出处的隐藏状态，以及可选的初始嵌入输出。

## SLANetSLAHead[[transformers.SLANetSLAHead]]

#### transformers.SLANetSLAHead[[transformers.SLANetSLAHead]]

```python
transformers.SLANetSLAHead(config: dict | None = None, **kwargs)
```

[来源](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/slanet/modeling_slanet.py#L138)

