从目录中为 CNN 在 Keras 中加载图像,但在 CSV 文件中添加标签

Des*_*wal 1 python python-3.x scikit-learn conv-neural-network keras

我在一个目录中有一组图像文件,train_images = './data/images' 并且train_labels = './data/labels.csv'

例如 - train_imagesas 中有 1000 张图像377.jpg,17814.jpg ....,依此类推。并且它们对应的类保存在不同的 CSV 文件中。

编辑- 这是 CSV 文件中的几行 -

>>
    ID          Class

0   377.jpg     MIDDLE
1   17814.jpg   YOUNG
2   21283.jpg   MIDDLE
3   16496.jpg   YOUNG
4   4487.jpg    MIDDLE

Run Code Online (Sandbox Code Playgroud)

这里 ID 是图像文件名,类是它关联的类。

我可以使用非常平常的

ImageDataGenerator().flow_from_directory(train_images, class_mode='binary', batch_size=64)

Run Code Online (Sandbox Code Playgroud)

但问题是标签在 CSV 文件中。我能做的是使用重命名所有文件os并将不同的文件放在不同的目录中,然后加载它,但它看起来如此不成熟和愚蠢。

如何在 Keras 中为 CNN 加载数据,其中每个图像都是维度的(h,w,c)

Nei*_*dan 7

这是我使用 ImageDataGenerator 的示例,使用 ImageDataGenerator 中的 flow_from_dataframe 函数和 Pandas 来读取 CSV。我使用的 CSV 有两列:

x_col="Image"
y_col="Id"
Run Code Online (Sandbox Code Playgroud)

所以第一列是文件名,例如 xxxx.jpg,第二列是类。在这种情况下,既然是来自kaggle座头鲸挑战赛,那它是一种什么样的鲸鱼。图像文件位于“../input/humpback-whale-identification/train/”目录中

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, 
Conv2D, Flatten, Dropout, MaxPooling2D, BatchNormalization
from tensorflow.keras.preprocessing.image import 
ImageDataGenerator
from keras import regularizers, optimizers
import os
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
Run Code Online (Sandbox Code Playgroud)

所以使用pandas阅读CSV:

traindf=pd.read_csv('../input/humpback-whale- 
identification/train.csv',dtype=str)
Run Code Online (Sandbox Code Playgroud)

现在使用 ImageDataGenerator

datagen=ImageDataGenerator(rescale=1./255.,validation_split=0.25)
train_generator=datagen.flow_from_dataframe(
dataframe=traindf,
directory="../input/humpback-whale-identification/train/",
x_col="Image",
y_col="Id",
subset="training",
batch_size=32,
seed=42,
shuffle=True,
class_mode="categorical",
target_size=(100,100))
Run Code Online (Sandbox Code Playgroud)

现在有时 CSV 中的文件名/ID 没有扩展名。因此,我使用以下内容为它们添加扩展:

def append_ext(fn):
    return fn+".jpg"

traindf["Image"]=traindf["Image"].apply(append_ext)

Run Code Online (Sandbox Code Playgroud)

嗯,希望有帮助!这是我第一次尝试在这里回答问题 :-)

Kaggle 数据集/挑战在这里https://www.kaggle.com/c/humpback-whale-identification

注意:我在 kaggle 上看到人们以各种方式这样做!但这似乎是最简单的!