Вопрос или проблема
Я пытаюсь создать систему распознавания изображений на основе 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). В этом ответе мы рассмотрим каждый из методов и приведем пример кода для реализации.
-
Изменение размера (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
-
Добавление границ (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
-
Комбинирование методов
Для получения наилучших результатов вы можете комбинировать изменение размера и добавление границ. Например, вы можете сначала изменить размер к минимальному размеру, а затем добавить границы для достижения желаемого конечного размера.
Пример реализации обработки изображений
Давайте объединим все подходы в одном примере.
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. Обеспечение однородности размеров изображений можно выполнить с помощью методов изменения размера, обрезки или добавления границ. Выбор подхода зависит от ваших конкретных потребностей и требований к модели. Используйте представленный код как основу, чтобы адаптировать его под ваши специфические задачи. В заключение, успешная подготовка данных может значительно повысить точность классификации и ускорить обучение модели.