多目录数据集
注:本文用的是Oulu_CASIA_NIR_VIS人脸数据集
如下图:有些数据集的目录非常多,对于这种数据集,我们仔细分析在第三层目录的时候表示的是真人数,我们根据这个来打标签
代码
思想:目录太多,直接遍历图片,然后得到想要的那一级的目录,去打标签;也可以是你自定义的其他标签。
#-*-coding:gb2312-*-
import os
def creat_filelist(img_path):
#创建三级目录
#index 一定是str类型,不可以为int
#num1 = img_path.split('/')[0] #一级目录
#num2 = img_path.split('/')[1] #一级目录
#num3 = img_path.split('/')[2] #一级目录
label = img_path.split('/')[3] #一级目录
#num5 = img_path.split('/')[4] #一级目录
#num6 = img_path.split('/')[5] #一级目录
file_list = []
#标签要从零开始,否则训练会报错,因为我的是目录是从1开始,所以这里要进行减一操作,
image_labe = img_path +' '+ str(int(label[-2:])-1)
file_list.append(image_labe)
#print(file_list)
return file_list
def creat_txtfile(output_path, file_list):
with open(output_path, 'a') as f:
for list in file_list:
print(list)
f.write(str(list) + '\n')
def get_list(output_path):
out_list = []
with open(output_path) as f:
out_list = f.read().splitlines()
return out_list
def main():
path = 'OULU/'
output_path = 'OULU.txt'
i = 0
for root,dirs,files in os.walk(path):
for f in files :
i = i +1
img_path = os.path.join(root,f)
print("给第{}张图片 {} 打标签 ".format(i,img_path))
file_list = creat_filelist(img_path)
creat_txtfile(output_path, file_list)
#从临时生成的txt文件获取总的一个list
out_list = get_list(output_path)
#给这个list按照label的大小排序
out_list.sort(key=lambda x:int(x[-2:]))
#print(out_list)
#删除原来未排序的txt文件
os.remove(output_path)
#创建新的排序后的txt文件
creat_txtfile(output_path,out_list)
if __name__ == '__main__':
main()
结果
未排序的结果:
排完序的结果:
其他
也可以根据图片的name进行打标签,只需要把打label部分的代码改一下就行。
特别注意:label要从零开始排序