跟我这样做:
Let’s do it!
import os
import random
train_parameters = {
"label_dict":{
}, # 标签信息
'class_dim':0, # 类别个数
"train_list_path": "/home/data/train.txt", #train.txt路径
"eval_list_path": "/home/data/eval.txt", #eval.txt路径
"readme_path": "/home/data/readme.json", #readme.json路径
}
def get_data_list(dataPath, train_list_path, eval_list_path):
class_infor = [] # 存放所有类别,如:dog, cat, car……
class_label = 0 # 标记类别标签
class_num = 0 # 每一类多少张图片
class_dim = 0 # 一共多少类
all_class_images = 0 # 总的图片数量
data_list_path = dataPath + "dataName/" # 数据地址
class_dirs = os.listdir(data_list_path) # 读取类别目录名称
trainer_list = [] # 用于存储训练的文件地址,之后转成txt
eval_list = [] # 用于推理训练的文件地址,之后转成txt
for class_dir in class_dirs: # 遍历目标地址下的所有目录文件,一个目录一个类别
class_dim += 1 # 统计一共多少个文件夹,就是多少个类
class_detail_list = {
} # 创建一个存储类别相关信息的字典,比如类别名称以及对应的标签等
eval_sum = 0 # 某一类中的推理图片数量(类的相关信息之一)
trainer_sum = 0 # 某一类的训练图片数量(类的相关信息之一)
path = data_list_path + class_dir # 某一类对应文件夹的路径
img_paths = os.listdir(path) # 某一类文件夹里的图片名称
for img_path in img_paths: # 遍历某一类文件里的每一张图片
name_path = path + '/' + img_path # 每张图片的路径
if class_num % 10 == 0: # 每10张取一个做验证数据
eval_sum += 1
eval_list.append(name_path + '\t%d' % class_label + '\n')
else:
trainer_sum += 1
trainer_list.append(name_path + '\t%d' % class_label + '\n')
class_num += 1 # 遍历一张图片,统计该类的有多上张图片的变量增1
all_class_images += 1
# 遍历完一类后,将该类的相关信息存储到字典中
# 说明的json文件的class_detail数据
class_detail_list['class_name'] = class_dir #类别名称,如jiangwen
class_detail_list['class_label'] = class_label #类别标签
class_detail_list['class_eval_images'] = eval_sum #该类数据的测试集数目
class_detail_list['class_trainer_images'] = trainer_sum #该类数据的训练集数目
class_detail.append(class_detail_lis)
#初始化标签列表
train_parameters['label_dict'][str(class_label)] = class_dir
class_label += 1 # 遍历完一个文件夹后,对应类别标签加1
#初始化分类数
train_parameters['class_dim'] = class_dim
# 打乱文件顺序
random.shuffle(eval_list)
# 将打乱后的文件地址写入txt文件保存
with open(eval_list_path, 'a') as f:
for path in eval_list:
f.write(path)
random.shuffle(trainer_list)
with open(train_list_path, 'a') as f:
for path in eval_list:
f.write(path)
# 说明的json文件信息
readjson = {
}
readjson['all_class_name'] = data_list_path #文件父目录
readjson['all_class_images'] = all_class_images
readjson['class_detail'] = class_detail
jsons = json.dumps(readjson, sort_keys=True, indent=4, separators=(',', ': '))
with open(train_parameters['readme_path'],'w') as f:
f.write(jsons)
print ('生成数据列表完成!')