Labelimg制作数据集
1、 安装labelimg
① 下载源码自行安装,安装步骤参考搜索文章
下载地址:https://github.com/tzutalin/labelImg
② 下载打包版直接运行,Windows和Linux平台可用,无需编译
下载地址:https://tzutalin.github.io/labelImg/
2、 图片标注
① 仿照VOC2007在py-faster-rcnn-master\data目录下新建文件夹“VOCdevkit2007”,在VOCdevkit2007\VOC2007目录下新建如图5个文件夹(前3个必须有)。JPEGImages存放训练图片,Annotations存放使用labelimg标注图片后生成的.xml文件,ImageSets中新建Main文件夹。
② 使用打包版labelimg时直接打开labelImg.exe,先点击“Change Save Dir”修改保存路径为文件夹Annotations(路径不能包含中文)。使用notepad++打开data文件夹中的predefined_classes.txt,修改分类的类别。
打开需要标记的图片文件夹JPEGImages,Ctrl+u
修改保存路径(.xml文件夹)为Annotations,Ctrl+r
标注ROI区域填写标签,w:开始画框
保存.xml文件,有弹框提醒,Ctrl+s
d: 下一张
a: 上一张
del: 删除画的框
Ctrl++: 图片放大
Ctrl–: 图片缩小
↑→↓←: 对框进行移动
Ctrl+d: 复制当前框的标签和框
③ 文件夹JPEGImages中的图片命名格式要求为“xxxxxx.jpg”,从000000.jpg开始,图片重命名代码以Python为例,可参考:https://blog.csdn.net/u011574296/article/details/72956446
import os
path = "F:\caffe\py-faster-rcnn-master\data\VOCdevkit\VOC2007\JPEGImages"
filelist = os.listdir(path) # 该文件夹下所有的文件(包括文件夹)
count=0 # 编号从0开始
for file in filelist:
print(file)
for file in filelist:
# 遍历所有文件
Olddir=os.path.join(path,file) # 原来的文件路径
if os.path.isdir(Olddir): # 如果是文件夹则跳过
continue
filename=os.path.splitext(file)[0] # 文件名
filetype=os.path.splitext(file)[1] # 文件扩展名
Newdir=os.path.join(path,str(count).zfill(6)+filetype) # 用字符串函数zfill 以0补全所需位数
os.rename(Olddir,Newdir) # 重命名
count+=1
3、 生成数据集所需txt
使用代码在ImageSets\Main目录下生成test.txt(测试集)、train.txt(训练集)、val.txt(验证集)、trainval.txt(训练验证集,由train.txt和val.txt组成)。VOC2007中, test大概是整个数据集的50%,trainval是整个数据集剩下的50%;train大概是trainval的50%,val是trainval剩下的50%。所占比例可在代码中修改,以Python为例(其中trainval是整个数据集的70%):
import os
import random
trainval_percent = 0.7 # trainval占总数的比例
train_percent = 0.5 # train占trainval的比例
xmlfilepath = r'F:\caffe\py-faster-rcnn-master\data\VOCdevkit2007\VOC2007\Annotations'
txtsavepath = r'F:\caffe\py-faster-rcnn-master\data\VOCdevkit2007\VOC2007\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(txtsavepath + r'\trainval.txt', 'w')
ftest = open(txtsavepath + r'\test.txt', 'w')
ftrain = open(txtsavepath + r'\train.txt', 'w')
fval = open(txtsavepath + r'\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()