Как подготовить данные для классификации изображений из .txt файла?

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

В общем, моя проблема в том, что я строю модель классификации изображений, используя AlexNet. У меня есть заранее разбитый набор данных, который уже разделен на обучение, тест и валидацию. Однако проблема в том, что эти разбивки находятся в .txt файлах (например, trainingsplit.txt), и внутри .txt файла есть список файлов image_001.png и т. д. Как мне извлечь эти данные и передать их через мой препроцессор? Это то, что я обычно делал бы для предварительной обработки:

train_dir="/content/gdrive/My Drive/alexNet/Training"
validation_dir="/content/gdrive/My Drive/alexNet/Validation"

train_datagen = ImageDataGenerator(
      rescale=1./255,
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode="nearest",
      )

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        train_dir,  # Это исходный каталог для обучающих изображений
        target_size=(224, 224),  
        batch_size=20,
        class_mode="binary")

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(224, 224),
        batch_size=20,
        class_mode="binary")

Редактировать: Содержимое training.txt

image_001.jpg
image_002.jpg
image_014.jpg
image_017.jpg
и т. д.

Обучающие данные – это файл .txt, содержащий несколько строк текста, которые являются названиями различных изображений. Этот файл txt находится внутри основного каталога Dataset, который содержит классовые каталоги, такие как Apples, Bananas, Oranges и т. д.

Я предполагаю, исходя из описания, что в основном каталоге есть другие каталоги Apples, Bananas, Oranges и т. д., и внутри них есть файлы .txt, содержащие информацию об изображениях.

import shutil

with open(file_path, 'r') as f:
    img_names = f.readlines()
    img_names = [img.strip() for img in img_names]

for i in range(len(img_names)): shutil.move(img_names[i], folder_path)

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

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

Предобработка данных для классификации изображений из файла .txt: Подробное руководство

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

Шаг 1: Понимание структуры данных

Для начала важно понимать, как организованы ваши данные:

  1. Структура директорий: Предположим, что у вас есть главная директория, содержащая подкаталоги для различных классов (например, "Яблоки", "Бананы", "Апельсины"). В каждом из этих подкаталогов вы можете найти файлы .txt, перечисляющие изображения, причем каждый файл содержит имена изображений, необходимых для соответствующего класса.

  2. Пример содержимого файла:

    image_001.jpg
    image_002.jpg
    image_014.jpg
    image_017.jpg

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

Шаг 2: Извлечение имен изображений из файла .txt

Чтобы извлечь данные из файла .txt, можно воспользоваться следующим кодом на Python:

def load_image_names(file_path):
    with open(file_path, 'r') as f:
        img_names = f.readlines()
        img_names = [img.strip() for img in img_names]
    return img_names

Здесь мы открываем файл, читаем его содержимое и убираем пробелы и переносы строк из имен изображений.

Шаг 3: Копирование изображений в соответствующие директории

Следующий шаг — это копирование изображений в соответствующие папки классов. Например, предположим, что у вас есть директория Dataset, которая содержит подкаталоги классов. Мы будем использовать библиотеку shutil, чтобы переместить изображения из исходного местоположения в правильные каталоги.

import os
import shutil

def organize_images(txt_file_path, class_folder_path):
    img_names = load_image_names(txt_file_path)

    for img_name in img_names:
        source_path = os.path.join(original_images_directory, img_name)  # Исходный путь к изображениям
        destination_path = os.path.join(class_folder_path, img_name)     # Целевой путь
        shutil.move(source_path, destination_path)

Шаг 4: Использование класса ImageDataGenerator для предобработки изображений

Теперь, когда изображения организованы по классам, вы можете использовать ImageDataGenerator для их загрузки и предобработки. Вот как это можно сделать:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_dir = "/content/gdrive/My Drive/alexNet/Training"
validation_dir = "/content/gdrive/My Drive/alexNet/Validation"

train_datagen = ImageDataGenerator(
      rescale=1./255,
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode="nearest",
      )

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        train_dir,  
        target_size=(224, 224),  
        batch_size=20,
        class_mode="binary")

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(224, 224),
        batch_size=20,
        class_mode="binary")

Заключение

Подготовка данных для классификации изображений — это критически важный этап, который требует внимательной организации и предобработки. С помощью представленных шагов вы сможете эффективно извлечь имена изображений из файлов .txt, организовать их в соответствующие директории и использовать мощный механизм ImageDataGenerator для дальнейшей работы с данными. Стратегически подходя к предобработке данных, вы сможете значительно улучшить производительность своей модели AlexNet.

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

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