> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo/curator/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nemo/curator/_mcp/server.

# nemo_curator.tasks.ocr

Task data classes for the OCR mixed dense pipeline.

## Module Contents

### Classes

| Name                                                   | Description                                              |
| ------------------------------------------------------ | -------------------------------------------------------- |
| [`OCRData`](#nemo_curator-tasks-ocr-OCRData)           | Task data for the OCR dense pipeline.                    |
| [`OCRDenseItem`](#nemo_curator-tasks-ocr-OCRDenseItem) | Single entry (word, line, or block) in dense OCR output. |

### API

```python
class nemo_curator.tasks.ocr.OCRData(
    image_path: pathlib.Path | str,
    image_id: str | None = None,
    is_valid: bool = True,
    error: str | None = None,
    ocr_is_word_level: bool = True,
    ocr_dense_prompt: str | None = None,
    ocr_dense: list[nemo_curator.tasks.ocr.OCRDenseItem] | None = None,
    ocr_scoring_prompt: str | None = None,
    ocr_scoring_model: str | None = None,
    ocr_scoring_response_raw: str | None = None,
    ocr_scoring_mode: str | None = None,
    ocr_scoring_missing: list[dict] | None = None
)
```

Dataclass

**Bases:** [ImageTaskData](/nemo-curator/nemo_curator/tasks/image#nemo_curator-tasks-image-ImageTaskData)

Task data for the OCR dense pipeline.

Fields are populated incrementally as the task moves through pipeline stages:

* OCR stage (NemotronOCR-v2): ocr\_dense
* Scoring QA stage (Nemotron-Nano-Omni): ocr\_scoring\_\*
* Conversationalize stage: conversation

**`ocr_dense`** `list[OCRDenseItem] | None = None`

---

**`ocr_dense_prompt`** `str | None = None`

---

**`ocr_is_word_level`** `bool = True`

---

**`ocr_scoring_missing`** `list[dict] | None = None`

---

**`ocr_scoring_mode`** `str | None = None`

---

**`ocr_scoring_model`** `str | None = None`

---

**`ocr_scoring_prompt`** `str | None = None`

---

**`ocr_scoring_response_raw`** `str | None = None`

---

```python
nemo_curator.tasks.ocr.OCRData.from_dict(
    data: dict[str, typing.Any]
) -> nemo_curator.tasks.ocr.OCRData
```

classmethod

Deserialize from a JSONL record (produced by JsonlSampleWriterStage).

```python
class nemo_curator.tasks.ocr.OCRDenseItem(
    bbox_2d: list[int] | tuple[int, int, int, int],
    text_content: str,
    quad: list[tuple[int, int]] | None = None,
    valid: bool = True,
    bbox_match: int | None = None,
    text_errors: int | None = None
)
```

Dataclass

Single entry (word, line, or block) in dense OCR output.

Coordinates are normalized 0-1000.

**`bbox_2d`** `list[int] | tuple[int, int, int, int]`

---

**`bbox_match`** `int | None = None`

---

**`quad`** `list[tuple[int, int]] | None = None`

---

**`text_content`** `str`

---

**`text_errors`** `int | None = None`

---

**`valid`** `bool = True`

---

```python
nemo_curator.tasks.ocr.OCRDenseItem.__post_init__() -> None
```

```python
nemo_curator.tasks.ocr.OCRDenseItem.from_dict(
    data: dict[str, typing.Any]
) -> nemo_curator.tasks.ocr.OCRDenseItem
```

classmethod

```python
nemo_curator.tasks.ocr.OCRDenseItem.join(
    items: collections.abc.Iterable[nemo_curator.tasks.ocr.OCRDenseItem],
    separator: str = ' '
) -> nemo_curator.tasks.ocr.OCRDenseItem
```

staticmethod

Merge multiple items into one by unioning their bboxes and joining text.