作者:ie岛课 | 来源:互联网 | 2023-09-17 18:22
按照前面三篇文章的顺序标注好数据后,现在需要将数据集进行划分,包括train,test,trainval,val等四个部分,也就是生成ImageSets文件夹中的主文件夹中的四个的
按照前面三篇文章的顺序标注好数据后,现在需要将数据集进行划分,包括train,test,trainval,val等四个部分,也就是生成ImageSets文件夹中的主文件夹中的四个的txt文件。四个TXT文件中都只包含对应图像的名称,不包含扩展名。内容如下
说明一下这四个文件的对应关系,即总的数据集分为trainval和test,在trainval又划分成train和val,所以我们需要根据自己数据情况来设置对应的比例。根据这个比例对XML文件进行划分得到对应的TXT文件来处理标注数据。下面贴出我制作时参考的大佬源码,写下来记录一下。
python版
import os
import random
trainval_percent = 0.66
train_percent = 0.5
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)
ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
for i in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
MATLAB版
xmlfilepath='E:\Annotations';
txtsavepath='E:\ImageSets\Main\';
trainval_percent=0.5; %%trainval占整个数据集的百分比,剩下部分就是test所占百分比
train_percent=0.5; %%train占trainval的百分比,剩下部分就是val所占百分比
xmlfile=dir(xmlfilepath);
numOfxml=length(xmlfile)-2; %%总的数据集大小,不包含.和..
trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent)));
test=sort(setdiff(1:numOfxml,trainval));
trainvalsize=length(trainval); #trainval的大小
train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent))));
val=sort(setdiff(trainval,train));
ftrainval=fopen([txtsavepath 'trainval.txt'],'w');
ftest=fopen([txtsavepath 'test.txt'],'w');
ftrain=fopen([txtsavepath 'train.txt'],'w');
fval=fopen([txtsavepath 'val.txt'],'w');
for i=1:numOfxml
if ismember(i,trainval)
fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4));
if ismember(i,train)
fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4));
else
fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4));
end
else
fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4));
end
end
fclose(ftrainval);
fclose(ftrain);
fclose(fval);
fclose(ftest);
至此,所有的数据制作工作结束,接下来就是运行train.py就OK了,但是再运行是又碰到了下面这个错误
这个问题也是耽误了一段时间,后来找到了答案
原来是我在之前利用标准VOC2007数据集训练网络时在Faster-RCNN-TensorFlow-Python3.5-master\lib\data\cache\文件夹下生成了一个后缀名为pkl文件,我们在训练之前需要将它删去,然后这个KeyError问题就解决了。至此终于看到了一点希望的曙光!
参考文章:
https://blog.csdn.net/gaohuazhao/article/details/60871886
https://blog.csdn.net/u011574296/article/details/78953681