Загрузить набор данных изображений

#python #tensorflow #jupyter-notebook #google-colaboratory #image-manipulation

#python #тензорный поток #jupyter-ноутбук #google-совместная лаборатория #обработка изображений

Вопрос:

Я пытаюсь загрузить данные из определенного каталога, который содержит более 10 миллионов изображений и 10 тысяч классов, но проблема в том, что у меня нет другого каталога для всех классов, все изображения находятся только в одном каталоге. У меня есть ярлык файла CSV, который содержит идентификатор и метку. и я пытаюсь использовать VGG16 модель.

 CSV:
id,lable
abf20a,CAR
dsf8sd,BIKE
  

здесь abf20a — это имя изображения "abf20a.jpg"

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

Спасибо

Вишал

Ответ №1:

Вы можете использовать метод flow_from_dataframe ImageDataGenerator для загрузки изображений с использованием файла CSV.
Код:

 import tensorflow as tf
import pandas as pd

df = pd.read_csv('data/img/new.csv')

# Data augmentation pipeline
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator()

# Reading files from path in data frame
train_ds = train_datagen.flow_from_dataframe(df,directory = 'data/img/new', x_col = 'filename', y_col = 'label')
  

Фрейм данных выглядит следующим образом:

     filename    label
0   Capture.PNG 0
  

Если у вас есть только идентификатор в вашем имени файла. Вы можете использовать метод pandas apply для добавления расширения jpg.

 df['id'] = df['id'].apply(lambda x: '{}.jpg'.format(x))
  

Для получения полного набора опций увеличения данных, предоставляемых ImageDataGenerator , вы можете посмотреть на это.

Для получения полного набора опций для flow_from_dataframe вы можете посмотреть на это.

Благодаря этому вам не нужно беспокоиться о несоответствии меток, поскольку это встроенный метод TensorFlow. Кроме того, файлы загружаются по мере необходимости, что позволяет избежать загромождения вашей основной памяти.

Для обучения вы можете просто использовать:

 model.fit(
        train_ds,
        steps_per_epoch=2000,
        epochs=50,
        validation_data=validation_ds,
        validation_steps=800)
  

Комментарии:

1. train_datagen.flow_from_dataframe(df,directory = 'data/img/new', x_col = 'filename', y_col = 'label') если я не передам каталог и передам весь путь к изображению в x_col в качестве пути к файлу вместо имени файла, как train_datagen.flow_from_dataframe(df,x_col = 'filepath', y_col = 'label') будет ли это работать?

2. Да, поскольку мой df содержит только capture.png и этот файл находится в data/img/new , я использовал аргумент directory. Но если у вас есть полные пути к файлам, как data/img/new/capture.png вы можете пропустить использование directory атрибута. Обратите внимание, что x_col и y_col являются именами столбцов фрейма данных.

Ответ №2:

  1. получить список имен файлов в алфавитном порядке, используя os.walk(directory)
  2. прочитайте файл CSV и сгенерируйте labels_list список с метками классов в том же порядке, что и имена файлов. использовать
  3. использовать tf.keras.preprocessing.image_dataset_from_directory() с параметром label=labels_list

Это даст вам tf.data.Dataset , который вы можете передать в обучающую функцию.

Ответ №3:

Я думаю, что вы можете выполнить итерацию файла CSV, используя идентификационную метку для чтения изображений. Например:

 import csv 

csv_path = 'your_csv_path'
images_base_path = 'your_images_path'

images=[]
labels=[] 

with open(csv_path, newline='',encoding="utf8") as csvfile:
      spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
      for row in spamreader:
          # And than you can do like this:
          # images_complete_path = images_base_path    row[0]
          # images.append(imread(images_complete_path))
          # labels.append(row[1])
  

И чем вы получаете изображения и ярлыки.
Это всего лишь идея, вы можете легко реализовать ее.
Надеюсь, это может быть полезно.

Комментарии:

1. да, это будет работать, но для большого набора данных требуется больше вычислительной мощности

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

3. Я использую записную книжку Kaggle, если я запускаю цикл, это занимает слишком много времени для работы со всеми данными. поскольку я запускаю данные на 10 тыс., это заняло почти 7 минут.

4. Я думаю, это нормально, что такой большой набор данных требует слишком много времени. Другим решением может быть следующее: если используемый вами набор данных является известным набором данных, возможно, вы сможете найти онлайн-версию, уже помеченную (набор данных h5py).

5. если на обучение данных уходит больше времени, это нормально, но на манипулирование данными также уходит больше времени, что не имеет смысла