Отрисовка прозрачных ограничивающих рамок с помощью Torchvision

Вопрос или проблема

Я использую Torchvision в Python-скрипте для рисования ограничивающих рамок, а затем обрезаю изображения на основе нарисованных рамок. Скрипт работает хорошо, за исключением того, что ограничивающие рамки закрывают объекты на обрезанных изображениях, если более одного объекта находились близко друг к другу, поэтому я хотел бы сделать ограничивающие рамки прозрачными. Я проверил справку по функции draw_bounding_boxes от Torchvision, но не смог понять, как этого достичь.

Вот так я в настоящее время вызываю функцию:

box = draw_bounding_boxes(img, boxes=prediction["boxes"],
                                  labels=labels,
                                  colors=(255, 0, 0, 0),  # Красный с 100% прозрачностью
                                  width=4, font_size=30)

в строке 245 файла torchvision.utils.py

    if fill:
        draw = ImageDraw.Draw(img_to_draw, "RGBA")
    else:
        draw = ImageDraw.Draw(img_to_draw)

поскольку по умолчанию fill равно False, функция просто вызывает ImageDraw из библиотеки Pillow в режиме rgb вместо RGBA. Но даже если вы установите fill в True, функция просто добавляет 100 в конец вашего кортежа цвета, так что …

Вместо того чтобы вносить изменения в функцию draw_bounding_boxes, я думаю, что вы можете просто использовать Photoshop, чтобы наложить оригинальное изображение и изображение с ограничивающими рамками вместе, затем установить непрозрачность изображения с рамками на что-то вроде 60.

.

Ответ или решение

Для IT-специалиста, рассматривающего задачу рисования прозрачных ограничительных рамок с использованием библиотеки Torchvision, важно понять, как можно адаптировать стандартные функции для достижения желаемого эффекта прозрачности. Ваша текущая реализация может скрывать части изображения, что затрудняет восприятие, особенно если объекты находятся близко друг к другу. Давайте разберем процесс детально и предложим возможные решения.

Проблема:

Вы используете функцию draw_bounding_boxes из Torchvision для рисования ограничительных рамок на изображениях. Однако из-за того, что рамки непрозрачные, они могут загораживать важные детали изображений. Ваша попытка задать цвет с альфа-каналом (например, (255, 0, 0, 0) для полностью прозрачного красного цвета) не сработала, поскольку функция, кажется, работает в режиме RGB, а не RGBA.

Анализ:

Из анализа исходного кода функции draw_bounding_boxes видно, что Pillow используется для отрисовки изображений в режиме RGB, если только не установлен параметр fill. Даже при установке fill=True, к вашему цвету будет добавлено значение 100 для альфа-канала, что не обеспечивает полной прозрачности.

Решения:

  1. Изменение реализации draw_bounding_boxes:

    • Один из подходов — модифицировать исходный код функции так, чтобы она принимала глубину цвета в формате RGBA, однако это потребует вмешательства в код библиотеки, что может быть нежелательным для поддерживаемости кода.
  2. Работа с изображениями после отрисовки:

    • Вы можете использовать внешний инструмент, как предложено — наложить два изображения (оригинальное и с нарисованными рамками) в Photoshop или другом редакторе, устанавливая прозрачность слоя с рамками до необходимого уровня.
  3. Создание собственного метода рисования:

    • Напишите свою функцию рисования рамок с использованием библиотеки PIL (Python Imaging Library), которая позволит управлять прозрачностью более гибко. Сначала сконвертируйте изображение в режим RGBA, затем нарисуйте рамки с необходимым значением альфа-канала.
from PIL import Image, ImageDraw

def draw_transparent_bounding_boxes(image, boxes, color, alpha, width=1):
    # Конвертируем изображение в режим RGBA
    image = image.convert("RGBA")
    overlay = Image.new("RGBA", image.size, (255,255,255,0))
    draw = ImageDraw.Draw(overlay)

    # Рисуем рамки
    for box in boxes:
        draw.rectangle(box.tolist(), outline=color + (alpha,), width=width)

    # Объединяем изображение и наложение
    combined = Image.alpha_composite(image, overlay)
    return combined

# Используйте свою функцию для рисования
img_with_boxes = draw_transparent_bounding_boxes(img, prediction["boxes"], color=(255, 0, 0), alpha=100)

Заключение:

Адаптация или самостоятельная реализация функции рисования с поддержкой альфа-канала обеспечивает контроль над прозрачностью и улучшает интерпретируемость изображения. Важно выбрать наименее инвазивное и наиболее поддерживаемое решение, чтобы сохранить стабильность и долговременную поддержку вашего проекта.

Оцените материал
Добавить комментарий

Капча загружается...