Другое

Как изменить функцию save_to_img() в PaddleOCR для вывода одного изображения

Узнайте, как изменить функцию save_to_img() в DocPreprocessor PaddleOCR для вывода отдельных изображений вместо трех объединенных. Полное руководство с примерами кода.

Как изменить функцию save_to_img() в PaddleOCR DocPreprocessor для вывода одного изображения вместо трех конкатенированных изображений?

Я использую PaddleOCR DocPreprocessor для подготовки изображений для моего OCR-конвейера. Когда я использую функцию save_to_img(), она выводит три конкатенированных изображения вместо одного. Можно ли настроить функцию так, чтобы она выводила только одно изображение?

Вот моя текущая реализация:

python
from paddleocr import DocPreprocessor
docpp = DocPreprocessor(use_doc_orientation_classify=True, use_doc_unwarping=True, enable_hpi=True)
output = docpp.predict(r'C:\\Users\\quyas\\Desktop\\work_task\\Quyash\\typer\\test_pdf\\pages\\organized_2.jpg', use_doc_orientation_classify=True, use_doc_unwarping=True)
output.print()
output.save_to_json("./output/")
output.save_to_img("./output/")

Функция save_to_img() создает три конкатенированных изображения, но мне нужно, чтобы она выводила одно изображение. Как этого можно достичь?

Функция save_to_img() в DocPreprocessor PaddleOCR создает три склеенных изображения, так как она последовательно выводит все три этапа обработки (оригинал, предобработанный и результат OCR). Чтобы получить одно изображение, необходимо получить доступ к конкретному этапу обработки изображений, который вам нужен, и сохранить его отдельно с помощью атрибутов объекта, а не комбинированного метода save_to_img().


Содержание


Понимание трех выходных изображений

При использовании DocPreprocessor с save_to_img() генерируются три склеенных изображения, представляющие различные этапы конвейера обработки документов:

  1. Оригинальное изображение документа: Входное изображение в том виде, в котором оно было получено
  2. Предобработанное изображение: Изображение после классификации ориентации, разворачивания и других этапов предобработки
  3. Визуализация результата OCR: Конечный вывод с обнаруженными текстовыми блоками и аннотациями

Этот выбор дизайна позволяет пользователям визуально проверить весь конвейер обработки в одном представлении. Однако, когда вам нужен только один конкретный выходной этап, склеивание становится ненужным.

Согласно официальной документации PaddleOCR, функция save_to_img() разработана для предоставления комплексного обзора всех этапов обработки в целях отладки и проверки.


Доступ к индивидуальным этапам обработки

Объект вывода DocPreprocessor содержит конкретные атрибуты, которые предоставляют доступ к каждому этапу обработки индивидуально:

python
# После выполнения предсказания DocPreprocessor
output = docpp.predict(image_path)

# Доступ к индивидуальным этапам изображений
original_image = output.ori_img  # Оригинальное входное изображение
processed_image = output.img     # Предобработанное изображение
ocr_result_image = output.ocr_res_img  # Визуализация результатов OCR

Затем вы можете сохранить эти отдельные изображения с помощью стандартных библиотек обработки изображений:

python
from PIL import Image
import numpy as np

# Сохранение отдельных изображений
Image.fromarray(output.ori_img).save("./output/original_image.jpg")
Image.fromarray(output.img).save("./output/processed_image.jpg") 
Image.fromarray(output.ocr_res_img).save("./output/ocr_result_image.jpg")

Альтернативные подходы для вывода одного изображения

Метод 1: Пользовательская функция сохранения

Создайте пользовательскую функцию, которая сохраняет только предобработанное изображение:

python
def save_single_processed_image(output, save_path):
    """Сохранение только предобработанного изображения из вывода DocPreprocessor"""
    from PIL import Image
    import os
    
    # Убедитесь, что выходная директория существует
    os.makedirs(save_path, exist_ok=True)
    
    # Сохранение предобработанного изображения
    processed_img = Image.fromarray(output.img)
    processed_img.save(os.path.join(save_path, "processed_image.jpg"))

# Использование
save_single_processed_image(output, "./output/")

Метод 2: Модификация обработки вывода DocPreprocessor

Если вы хотите более полно модифицировать поведение, вы можете расширить класс DocPreprocessor:

python
from paddleocr import DocPreprocessor
from PIL import Image
import os

class CustomDocPreprocessor(DocPreprocessor):
    def save_single_processed_image(self, output, save_path):
        """Переопределение для сохранения только обработанного изображения"""
        os.makedirs(save_path, exist_ok=True)
        processed_img = Image.fromarray(output.img)
        processed_img.save(os.path.join(save_path, "processed_image.jpg"))

# Использование
docpp = CustomDocPreprocessor(use_doc_orientation_classify=True, use_doc_unwarping=True, enable_hpi=True)
output = docpp.predict(image_path)
docpp.save_single_processed_image(output, "./output/")

Метод 3: Прямой конвейер обработки изображений

Если вам нужны только конкретные этапы предобработки, вы можете использовать отдельные компоненты:

python
from paddleocr import DocPreprocessor
from paddleocr import PPStructure, draw_ocr

# Использование только конкретных этапов предобработки
docpp = DocPreprocessor(use_doc_orientation_classify=True, use_doc_unwarping=True)
output = docpp.predict(image_path)

# Сохранение только того, что нужно
img = output.img  # Это содержит предобработанное изображение
Image.fromarray(img).save("./output/single_processed.jpg")

Полные примеры реализации

Вот полный рабочий пример, демонстрирующий, как получить вывод одного изображения:

python
from paddleocr import DocPreprocessor
from PIL import Image
import numpy as np
import os

def setup_docpreprocessor():
    """Инициализация DocPreprocessor с желаемыми опциями предобработки"""
    return DocPreprocessor(
        use_doc_orientation_classify=True,
        use_doc_unwarping=True,
        enable_hpi=True
    )

def predict_and_save_single_image(docpp, image_path, output_dir="./output", stage="processed"):
    """
    Обработка изображения и сохранение одного выходного этапа
    
    Args:
        docpp: Экземпляр DocPreprocessor
        image_path: Путь к входному изображению
        output_dir: Директория для сохранения вывода
        stage: Какой этап сохранить ('original', 'processed', 'ocr_result')
    """
    # Создание выходной директории, если она не существует
    os.makedirs(output_dir, exist_ok=True)
    
    # Обработка изображения
    output = docpp.predict(image_path)
    
    # Сопоставление имен этапов с атрибутами вывода
    stage_mapping = {
        'original': output.ori_img,
        'processed': output.img,
        'ocr_result': output.ocr_res_img
    }
    
    if stage not in stage_mapping:
        raise ValueError(f"Неверный этап '{stage}'. Выберите из: {list(stage_mapping.keys())}")
    
    # Сохранение выбранного этапа
    selected_image = stage_mapping[stage]
    if isinstance(selected_image, np.ndarray):
        selected_image = Image.fromarray(selected_image)
    
    filename = f"output_{stage}.jpg"
    save_path = os.path.join(output_dir, filename)
    selected_image.save(save_path)
    
    print(f"Сохранено изображение этапа {stage} по адресу: {save_path}")
    return save_path

# Пример использования
if __name__ == "__main__":
    # Инициализация процессора
    docpp = setup_docpreprocessor()
    
    # Обработка и сохранение только предобработанного изображения
    result_path = predict_and_save_single_image(
        docpp, 
        r'C:\Users\quyas\Desktop\work_task\Quyash\typer\test_pdf\pages\organized_2.jpg',
        stage="processed"
    )

Рекомендации по производительности

При работе с DocPreprocessor учитывайте следующие последствия для производительности:

  1. Использование памяти: Доступ к отдельным изображениям не значительно снижает использование памяти, так как все этапы обработки вычисляются независимо от того, обращаетесь ли вы к отдельным этапам или используете склеенный вывод.

  2. Время обработки: Этапы предобработки (классификация ориентации, разворачивание) занимают одинаковое количество времени, независимо от того, обращаетесь ли вы к отдельным этапам или используете склеенный вывод.

  3. Размер файла: Отдельные изображения обычно меньше, чем склеенный вывод из трех изображений, что экономит место для хранения.

  4. Пакетная обработка: При обработке нескольких изображений учитывайте, какой этап вам чаще всего нужен, для оптимизации вашего конвейера.

Технический отчет PaddleOCR подчеркивает, что конвейер предобработки документов разработан для эффективной обработки нескольких этапов, что делает его подходящим как для анализа отдельных изображений, так и для рабочих процессов пакетной обработки.


Источники

  1. Документация PaddleOCR - Конвейер предобработки изображений документов
  2. Stack Overflow - Функция PaddleOCR DocPreprocessor save_to_img() выдает три изображения
  3. Технический отчет PaddleOCR 3.0
  4. Репозиторий GitHub PaddleOCR
  5. Учебник по использованию - Документация PaddleOCR

Заключение

Чтобы модифицировать функцию save_to_img() DocPreprocessor PaddleOCR для вывода одного изображения вместо трех склеенных изображений, у вас есть несколько эффективных подходов:

  1. Доступ к индивидуальным этапам обработки с помощью атрибутов объекта вывода (output.ori_img, output.img, output.ocr_res_img) и сохранение их отдельно с помощью PIL или подобных библиотек.

  2. Создание пользовательских функций сохранения, которые извлекают и сохраняют только конкретный этап изображения, предоставляя больше контроля над форматом вывода и именованием.

  3. Использование отдельных компонентов обработки, если вам нужны только конкретные этапы предобработки, а не полный конвейер.

Ключевое понимание заключается в том, что три склеенных изображения представляют различные этапы конвейера обработки документов, и вы можете получить доступ к каждому этапу индивидуально через атрибуты объекта вывода. Этот подход дает вам полный контроль над тем, какой результат обработки сохранять, сохраняя все преимущества передовых возможностей предобработки документов PaddleOCR.

В большинстве случаев обращение к output.img (предобработанному изображению) обеспечит оптимальный баланс качества предобработки и требования к выводу одного изображения.

Авторы
Проверено модерацией
Модерация