#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:
- получить список имен файлов в алфавитном порядке, используя
os.walk(directory)
- прочитайте файл CSV и сгенерируйте
labels_list
список с метками классов в том же порядке, что и имена файлов. использовать - использовать
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. если на обучение данных уходит больше времени, это нормально, но на манипулирование данными также уходит больше времени, что не имеет смысла