从目录中为 CNN 加载 Keras 中的图像,但在 CSV 文件中添加标签
Posted
技术标签:
【中文标题】从目录中为 CNN 加载 Keras 中的图像,但在 CSV 文件中添加标签【英文标题】:Loading images in Keras for CNN from directory but label in CSV file 【发布时间】:2020-04-15 06:41:34 【问题描述】:我在train_images = './data/images'
和train_labels = './data/labels.csv'
目录中有一组图像文件
例如 - train_images
中有 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
这里的 I.D 是图像文件名,类是它关联的类。
我本来可以用很平常的
ImageDataGenerator().flow_from_directory(train_images, class_mode='binary', batch_size=64)
但问题是标签位于 CSV 文件中。我可以做的是使用os
重命名所有文件并将不同的文件放在不同的目录中然后加载它,但它看起来很不成熟和愚蠢。
如何在 Keras for CNN 中加载数据,其中每个图像的维度为 (h,w,c)
?
【问题讨论】:
贴几行csv文件 @abhilb 当然。我做到了 【参考方案1】:这是我使用 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
所以使用 pandas 读取 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 上看到人们以各种方式这样做!但这似乎是最简单的!
【讨论】:
【参考方案2】:然后您可以使用pandas
将csv
文件读取为DataFrame
使用函数read_csv
:
import pandas as pd
df = pd.read_csv('csvfilename', delimiter=',')
然后使用ImageDataGenerator
类的flow_from_dataframe
函数。
这里有教程link
flow_from_dataframe(dataframe, directory=None, x_col='filename', y_col='class', weight_col=None, 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, interpolation='nearest', validate_filenames=True)
【讨论】:
否,但图像是完整的图像,并存储在一起。这些只是存储在 CSV 文件中的标签和类名。这意味着名为 377.jpg 的图像属于 Middle 类。 我想我的问题可能还不清楚。 没关系。标签将从指定为y_col
参数的column name
中读取。
它将x_col
中的文件名与y_col
中的类相关联
否,但图像不在数据框中。它们位于单独的目录中。会工作吗?以上是关于从目录中为 CNN 加载 Keras 中的图像,但在 CSV 文件中添加标签的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Keras 中为维度 (2505,10) 的数据设计 CNN?