前言
深度学习中的与图片有关的任务,如图像识别,图像分类,目标检测,图像分割等,在准备图片数据集时,图片的序号和标签往往是由.txt文件获取的。本文将介绍如何给文件夹中的图片数据集上标签并保存的.txt文件中。
数据集格式
以二分类任务为例,我的数据集目录是:
E:/c/images/001.bad_apple
E:/c/images/002.good_apple
其中,001.bad_apple文件夹中包含若干张图片和一个Readme文件。图片命名格式是0.bmp、1.bmp、2.bmp……;Readme文件是一个.txt文件,用于说名该文件夹下的一些相关信息。002.bad_apple中的文件命名和格式与001.bad_apple完全相同。
一些细节:生成的.txt文件中,每一行的格式是"序号+空格+类别标签"。其中序号从1开始,类别标签从1开始。
Python实现
函数实现:
import os
def generate(dir,label):
'''
dir:输入的文件路径,本例是E:/c/images
label:要生成的标签
'''
#返回dir中的所有文件,本例中是001.bad_apple和002.good_apple
files = os.listdir(dir)
#文件夹中的数据是按序排好的,否则可以先排序
#files.sort()
#要写入的文件名,若没有则生成一个新的
listText = open('E:/image_class_labels.txt','a')
#序号i
i = 1
for file in files:
#返回路径和文件名
fileType = os.path.split(file)
#print(file)
#print(fileType)
#图片数据集中可能会有一个readme是.txt格式的,忽略它
#readme文件也可能是其他格式的文件,根据修改即可
#若没有readme即可删掉
if fileType[1] == '.txt':
#print(fileType[1])
continue
#生成序号和标签
#i和label必须是同类型的
name = str(i) + ' ' + str(int(label)) +'\n'
#生成文件名和标签
#name = file + ' ' + str(int(label)) +'\n'
listText.write(name)
i += 1
listText.close()
传参:
#图片数据集路径
out_path = 'E:/c/images'
#标签i
i = 1
#获取到该文件夹下的所有子文件夹,即每一类的图片文件夹
folderlist = os.listdir(out_path)
#遍历每一类中的每一张图片
for folder in folderlist:
#生成标签
generate(os.path.join(out_path, folder),i)
i += 1
注意事项
- 文件目录和格式根据自己的数据集的目录和格式结合代码修改(修改out_path)。若只有一个图片文件夹其中有不同类别的图片则去掉一个循环,且将图片顺序与序号对应好即可(可以排序等等)。
- .txt标签文件中的序号和类别标签根据自己的需要修改(修改两个i)。由于笔者是模仿cub-200数据集的标签格式,所以序号和标签都是从1开始,而不是从0开始。
没有硬件条件,需要云服务的同学可以扫码看看: