从不同的子文件夹加载用于图像分类的图像数据
Load Images Data for Images Classification from different subfolders
我有训练图像数据和一个包含图像标签的 csv 文件。我的数据目录如下所示:
Train data/
...1/
......1_1.jpg
......1_2.jpg
......1_3.jpg
...2/
......2_1.jpg
......2_2.jpg
......2_3.jpg
etc.
因此,每个子文件夹中有 3 张不同的图像,它们包含同一个人的图像并具有相同的标签。
我的 csv 文件格式如下:
subfolder,labels
1,0
2,1
3,0
etc.
我知道有 tf.keras.preprocessing ImageDataGenerator 可以从数据帧中读取,但所需的格式与我的目录格式不匹配。
关于如何加载我的图像以有效训练我的模型的任何线索?提前致谢
我认为这可以满足您的需求。我创建了一个名为 new_people 的目录。在其中我创建了 7 个子目录,子目录名称分别为 1、2、3、4、5、6、7。在每个子目录中,我放置了 3 个图像文件。在下面的代码中,我首先以您为 csv 文件描述的形式创建了一个数据框 df 。然后在代码中,我创建了一个数据框 data_df,其中包含列文件路径、标签。 filepaths 列是图像文件的完整文件路径,labels 列具有图像的关联标签。
我测试了代码,它似乎可以工作。代码如下所示
import os
import pandas as pd
folder=[1,2,3,4,5,6,7] # this is a list of the folders
labels=[2,3,1,0,6,4,5] # this is a list of the labels associated with each folder
Fseries=pd.Series(folder, name='folder')
Lseries=pd.Series(labels, name='labels')
df=pd.concat([Fseries, Lseries], axis=1) # this is the data frame that should be like your csv file
print (df.head(7))
打印出来的是
folder labels
0 1 2
1 2 3
2 3 1
3 4 0
4 5 6
5 6 4
6 7 5
其余代码如下
sdir=r'c:\temp\new_people' # main directory where class sub directories are present
filepaths=[]
labels=[]
class_list=os.listdir(sdir) # list of class sub directories
for klass in class_list: # iterate over the class subdirectories
class_path=os.path.join(sdir,klass) # path to class sub directory
for i in range(len(df)): # iterate through the data set
if str(df['folder'].iloc[i] )== klass: #convert folder name to a string and compare to current klass
label=df['labels'].iloc[i] # get the associated label
flist=os.listdir(class_path) # get a list of all the files in the klass sub directory
for f in flist: # iterate through the list of files
fpath=os.path.join(class_path,f) # get the full path to the file
filepaths.append(fpath) # append the full file path
labels.append(str(label)) # append the label as a string
Fseries=pd.Series(filepaths, name='filepaths')
Lseries=pd.Series(labels, name='labels')
data_df=pd.concat([Fseries, Lseries], axis=1) # create data frame with columns filepaths, labels
print(data_df.head(28))
# Now data_df can be partitioned into a train_df, a test_df and a valid_df using train_test_split
结果 data_df 数据框的打印输出是
filepaths labels
0 c:\temp\new_people[=13=]01.jpg 2
1 c:\temp\new_people[=13=]02.jpg 2
2 c:\temp\new_people[=13=]03.jpg 2
3 c:\temp\new_people[=13=]04.jpg 3
4 c:\temp\new_people[=13=]05.jpg 3
5 c:\temp\new_people[=13=]06.jpg 3
6 c:\temp\new_people[=13=]07.jpg 1
7 c:\temp\new_people[=13=]08.jpg 1
8 c:\temp\new_people[=13=]09.jpg 1
9 c:\temp\new_people[=13=]10.jpg 0
10 c:\temp\new_people[=13=]11.jpg 0
11 c:\temp\new_people[=13=]12.jpg 0
12 c:\temp\new_people[=13=]13.jpg 6
13 c:\temp\new_people[=13=]14.jpg 6
14 c:\temp\new_people[=13=]15.jpg 6
15 c:\temp\new_people[=13=]16.jpg 4
16 c:\temp\new_people[=13=]17.jpg 4
17 c:\temp\new_people[=13=]18.jpg 4
18 c:\temp\new_people[=13=]19.jpg 5
19 c:\temp\new_people[=13=]20.jpg 5
20 c:\temp\new_people[=13=]21.jpg 5
数据框似乎正确反映了 df 数据框中的文件夹标签。 data_df 数据框现在可以与 train_test_split 一起使用来创建 train_df、test_df 和 valid_df。这些然后可以与 ImageDataGeneratory.flow_from_dataframe 一起使用来创建一个 train_generator、一个 test_generator 和一个 valid_generator 以与 model.fit 和 model.evaluate 或 model.predict。如果您需要有关如何操作的帮助,请告诉我。
我有训练图像数据和一个包含图像标签的 csv 文件。我的数据目录如下所示:
Train data/
...1/
......1_1.jpg
......1_2.jpg
......1_3.jpg
...2/
......2_1.jpg
......2_2.jpg
......2_3.jpg
etc.
因此,每个子文件夹中有 3 张不同的图像,它们包含同一个人的图像并具有相同的标签。 我的 csv 文件格式如下:
subfolder,labels
1,0
2,1
3,0
etc.
我知道有 tf.keras.preprocessing ImageDataGenerator 可以从数据帧中读取,但所需的格式与我的目录格式不匹配。 关于如何加载我的图像以有效训练我的模型的任何线索?提前致谢
我认为这可以满足您的需求。我创建了一个名为 new_people 的目录。在其中我创建了 7 个子目录,子目录名称分别为 1、2、3、4、5、6、7。在每个子目录中,我放置了 3 个图像文件。在下面的代码中,我首先以您为 csv 文件描述的形式创建了一个数据框 df 。然后在代码中,我创建了一个数据框 data_df,其中包含列文件路径、标签。 filepaths 列是图像文件的完整文件路径,labels 列具有图像的关联标签。 我测试了代码,它似乎可以工作。代码如下所示
import os
import pandas as pd
folder=[1,2,3,4,5,6,7] # this is a list of the folders
labels=[2,3,1,0,6,4,5] # this is a list of the labels associated with each folder
Fseries=pd.Series(folder, name='folder')
Lseries=pd.Series(labels, name='labels')
df=pd.concat([Fseries, Lseries], axis=1) # this is the data frame that should be like your csv file
print (df.head(7))
打印出来的是
folder labels
0 1 2
1 2 3
2 3 1
3 4 0
4 5 6
5 6 4
6 7 5
其余代码如下
sdir=r'c:\temp\new_people' # main directory where class sub directories are present
filepaths=[]
labels=[]
class_list=os.listdir(sdir) # list of class sub directories
for klass in class_list: # iterate over the class subdirectories
class_path=os.path.join(sdir,klass) # path to class sub directory
for i in range(len(df)): # iterate through the data set
if str(df['folder'].iloc[i] )== klass: #convert folder name to a string and compare to current klass
label=df['labels'].iloc[i] # get the associated label
flist=os.listdir(class_path) # get a list of all the files in the klass sub directory
for f in flist: # iterate through the list of files
fpath=os.path.join(class_path,f) # get the full path to the file
filepaths.append(fpath) # append the full file path
labels.append(str(label)) # append the label as a string
Fseries=pd.Series(filepaths, name='filepaths')
Lseries=pd.Series(labels, name='labels')
data_df=pd.concat([Fseries, Lseries], axis=1) # create data frame with columns filepaths, labels
print(data_df.head(28))
# Now data_df can be partitioned into a train_df, a test_df and a valid_df using train_test_split
结果 data_df 数据框的打印输出是
filepaths labels
0 c:\temp\new_people[=13=]01.jpg 2
1 c:\temp\new_people[=13=]02.jpg 2
2 c:\temp\new_people[=13=]03.jpg 2
3 c:\temp\new_people[=13=]04.jpg 3
4 c:\temp\new_people[=13=]05.jpg 3
5 c:\temp\new_people[=13=]06.jpg 3
6 c:\temp\new_people[=13=]07.jpg 1
7 c:\temp\new_people[=13=]08.jpg 1
8 c:\temp\new_people[=13=]09.jpg 1
9 c:\temp\new_people[=13=]10.jpg 0
10 c:\temp\new_people[=13=]11.jpg 0
11 c:\temp\new_people[=13=]12.jpg 0
12 c:\temp\new_people[=13=]13.jpg 6
13 c:\temp\new_people[=13=]14.jpg 6
14 c:\temp\new_people[=13=]15.jpg 6
15 c:\temp\new_people[=13=]16.jpg 4
16 c:\temp\new_people[=13=]17.jpg 4
17 c:\temp\new_people[=13=]18.jpg 4
18 c:\temp\new_people[=13=]19.jpg 5
19 c:\temp\new_people[=13=]20.jpg 5
20 c:\temp\new_people[=13=]21.jpg 5
数据框似乎正确反映了 df 数据框中的文件夹标签。 data_df 数据框现在可以与 train_test_split 一起使用来创建 train_df、test_df 和 valid_df。这些然后可以与 ImageDataGeneratory.flow_from_dataframe 一起使用来创建一个 train_generator、一个 test_generator 和一个 valid_generator 以与 model.fit 和 model.evaluate 或 model.predict。如果您需要有关如何操作的帮助,请告诉我。