制作属于自己的数据集
labelImg安装
由于在上一篇中已经安装有Anaconda,因此可打开cmd直接通过pip指令进行安装。安装的 pip指令
及其对应的结果如下。
// pip指令
pip install labelImg
手动制作数据集
创建数据集文件夹
以埋地目标的数据集为例:
建立一个叫做【dataset】的文件夹,里面包括:
-
【JPEGImages】文件夹:用于存放原图片,jpg还是png的都可以,同时需要注意为每张图片进行重命名标号。部分的数据集示意图如下。
-
【Annotations】文件夹:用于存储原图片加标签后后生成的对应的xml文件,具体的xml文件内容如下。
-
【ImageSets】文件夹:用来存放训练和测试网络所需的训练集、验证集、以及测试集。注意,这里为了使得自制的数据集与官方的Pascal VOC数据集的形式高度一致,需要在【ImageSets】文件夹下再建立一个 【Main】文件夹 ,用于存放将数据集划分后生成的【trainval.txt】、【test.txt】、【train.txt】、以及【val.txt】。(划分数据集所用的python代码在后面会给出)
-
【classes.txt】:用于列出需要分类的类别。这里只有 埋地目标[object] 这一个类别,因此只在txt文件中写下“object”即可。
进入labelImg手动加标签
- Step1: 在所建【dataset】文件夹的路径下,按下 【shift+鼠标右键】 ,接着打开 【Windows PowerShell】 界面,最后输入下面的指令。
labelImg ./JPEGImages ./classes.txt
对应的操作界面如下。
-
Step2: 进入labelImg界面后,首先点击 【change save Dir】,选取之前创建好的【Annotations】文件夹,这样生成的xml文件会自动存入到该文件夹中。
-
Step3: 点击 【create RectBox】 来框定图片中的目标,并给出所属类别,对应的示意图如下。
-
Step4: 框好该图片中所有需要标注的类别后,点击 【save】 即可将对应的xml文件存入【Annotations】文件夹中。接着点击 【Next Image】 继续处理下一张图片,直到处理完毕全部图片,完成后的文件夹中所存内容示意图如下。
利用制作好的数据集训练网络
划分数据集的python代码如下:
import os
import random
#################################################需要修改的位置##########################################
xmlfilepath = 'C:/Users/gaojiaxin/Desktop/assignment/dataset/annotations' #读取标签文件(xml文件)所在的位置。
saveBasePath = r"C:/Users/gaojiaxin/Desktop/assignment/dataset/ImageSets/Main/" #将划分好的数据集依次存储在路径里。
#划分原则为:test数据集与trainval数据集各占总数据集的一半;接着trainval数据集中,train数据集与val数据集各占一半。
trainval_percent = 0.5
train_percent = 0.5
#########################################################################################################
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)
print("train and val size", tv)
print("traub suze", tr)
ftrainval = open(os.path.join(saveBasePath, 'trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath, 'test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath, 'train.txt'), 'w')
fval = open(os.path.join(saveBasePath, '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()
将对应的数据集划分完毕后,可用 【dataset】文件夹 去替换Faster-RCNN源码中的 【VOCdevkit】文件夹 对网络进行训练。