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

时间:2019-12-24 05:54:44

标签: python python-3.x keras scikit-learn conv-neural-network

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

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

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

>>
    ID          Class

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

此处I.D是图像文件名,而class是与之关联的类。

我本可以使用通常的

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

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

如何在Keras for CNN中加载数据,其中每个图像的尺寸为(h,w,c)

2 个答案:

答案 0 :(得分:5)

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

x_col="Image"
y_col="Id"

因此第一列是文件名,例如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

因此,请使用熊猫阅读CSV:

traindf=pd.read_csv('../input/humpback-whale- 
identification/train.csv',dtype=str)

现在使用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))

现在,有时CSV中的文件名/ ID没有扩展名。因此,我使用以下代码向 他们:

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

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

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

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

注意:我已经看到人们在kaggle上以各种方式进行此操作!但这似乎是最简单的!

答案 1 :(得分:1)

然后,您可以使用pandas使用csv函数,以DataFrame的形式读取read_csv文件:

import pandas as pd

df = pd.read_csv('csvfilename', delimiter=',')

然后使用flow_from_dataframe类的ImageDataGenerator函数。

link上有一个教程

  

flow_from_dataframe(数据帧,目录=无,x_col ='文件名',y_col ='类',weight_col =无,target_size =(256,256),color_mode ='rgb',classes = None,class_mode ='categorical' ,batch_size = 32,shuffle = True,seed = None,save_to_dir = None,save_prefix ='',save_format ='png',subset = None,插值='nearest',validate_filenames = True)