从不同的子文件夹加载用于图像分类的图像数据

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。如果您需要有关如何操作的帮助,请告诉我。