Изменение размеров изображений в наборе данных Malaria Tensorflow | Работа с нечистыми данными Tensorflow

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

Я пытаюсь создать систему распознавания изображений на основе CNN для набора данных о малярии Tensorflow. Я загрузил набор данных (~27k RGB изображений) с использованием стандартного синтаксиса tensorflow_datasets.

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

import tensorflow_datasets as tfds

ds_train, ds_info = tfds.load('malaria', split="train", as_supervised=True,with_info=True)

ds = ds_train.take(5)  #выбор 5 изображений

for image, label in tfds.as_numpy(ds):
  print(type(image),image.shape, type(label), label)

ВЫВОД

<class 'numpy.ndarray'> (103, 103, 3) <class 'numpy.int64'> 1
<class 'numpy.ndarray'> (106, 121, 3) <class 'numpy.int64'> 1
<class 'numpy.ndarray'> (139, 142, 3) <class 'numpy.int64'> 0
<class 'numpy.ndarray'> (130, 118, 3) <class 'numpy.int64'> 1

Разные размеры изображений в наборе данных влияют на начальный слой CNN, так как выравнивание каждого тензора изображения приводит к массиву разного размера.

Я понимаю, что все изображения необходимо преобразовать в общий аспект перед этапом моделирования, и мы можем добиться этого с помощью паддинга или других техник предварительной обработки из keras.preprocessing.image, но я не уверен в шагах для эффективной реализации этого.

Я буду признателен, если кто-то сможет предложить элегантный способ решения этой проблемы.

Заранее спасибо!

#Здесь изображение является вашей партией.
# Добавьте размеры "партии" и "каналов"
image = image[tf.newaxis, ..., tf.newaxis]
image.shape.as_list()  # [партия, высота, ширина, каналы]


tf.image.resize(image, [height,width])[0,...,0].numpy()

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

Обработка изображений с различными размерами в наборе данных Malaria с использованием TensorFlow

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

Почему размеры изображений имеют значение

Разные размеры изображений могут вызвать несовместимость в архитектуре вашей модели. Основные слои CNN требуют, чтобы входные данные имели одинаковую форму, поэтому важно привести все изображения к единому размеру. Необходима предварительная обработка изображений, чтобы сделать их подходящими для подачи в модель.

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

Есть несколько методов, которые можно использовать для изменения размера изображений в TensorFlow, включая обрезку, масштабирование и добавление границ (padding). В этом ответе мы рассмотрим каждый из методов и приведем пример кода для реализации.

  1. Изменение размера (Resizing)

    Используйте функцию tf.image.resize, чтобы изменить размер изображений до фиксированных значений ширины и высоты. Это наиболее простой и распространенный метод.

    import tensorflow as tf
    
    def resize_image(image, target_height, target_width):
       image = tf.image.resize(image, [target_height, target_width])
       return image
  2. Добавление границ (Padding)

    Добавление границ позволяет сохранить соотношение сторон изображения. Вы можете использовать tf.image.pad_to_bounding_box.

    def pad_image(image, target_height, target_width):
       original_shape = tf.shape(image)
       height_padding = max(0, target_height - original_shape[0])
       width_padding = max(0, target_width - original_shape[1])
    
       padded_image = tf.image.pad_to_bounding_box(image, 
                                 offset_height=height_padding // 2, 
                                 offset_width=width_padding // 2,
                                 target_height=target_height, 
                                 target_width=target_width)
       return padded_image
  3. Комбинирование методов

    Для получения наилучших результатов вы можете комбинировать изменение размера и добавление границ. Например, вы можете сначала изменить размер к минимальному размеру, а затем добавить границы для достижения желаемого конечного размера.

Пример реализации обработки изображений

Давайте объединим все подходы в одном примере.

import tensorflow_datasets as tfds
import tensorflow as tf

# Загрузка данных
ds_train, ds_info = tfds.load('malaria', split="train", as_supervised=True, with_info=True)

def preprocess(image, label):
    target_height, target_width = 128, 128  # Задайте желаемые размеры
    image = resize_image(image, target_height, target_width)
    return image, label

# Применяем предварительную обработку
ds_train = ds_train.map(preprocess)

# Пример выборки
for image, label in ds_train.take(3):
    print(image.shape, label)

Заключение

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

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

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