一、VOC数据集的简介
PASCAL VOC为图像的识别和分类提供了一整套标准化的优秀数据集,基本上就是目标检测数据集的模板。现在有VOC2007,VOC2012。主要有20个类。而现在主要的模型评估就是建立在VOC数据集和COCO数据集上(80个类),其指标主要是mAP和fps(帧率)。
VOC数据集有五个文件夹
├── Annotations # 存放xml文件,主要是记录标记框位置信息
├── ImageSets # 存放的都是txt文件,txt文件中每一行包含一个图片的名称,末尾会加上+1或者-1表示正负样本
├── Action
├── Layout
├── Main
└── Segmentation
├── JPEGImages # 存放源图片
├── SegmentationClass
└── SegmentationObject
制作自己的数据集时只需要用到Annotations、ImageSets、JPEGImages三个文件夹
二、数据制作流程
1. 把所有图片放入JPEGImages文件中,后缀名一般为 .jpg .png .JPG。需要批量重命名文件夹中图片文件。使用rename.py
# -*- coding:utf8 -*- import os class BatchRename(): ''' 批量重命名文件夹中的图片文件 ''' def __init__(self): self.path = '/home/z/work/train' #存放图片的文件夹路径 def rename(self): filelist = os.listdir(self.path) total_num = len(filelist) i = 1 for item in filelist: if item.endswith('.jpg') or item.endswith('.JPG'): #图片格式为jpg、JPG src = os.path.join(os.path.abspath(self.path), item) dst = os.path.join(os.path.abspath(self.path), str(i).zfill(5) + '.jpg') #设置新的图片名称 try: os.rename(src, dst) print ("converting %s to %s ..." % (src, dst)) i = i + 1 except: continue print ("total %d to rename & converted %d jpgs" % (total_num, i)) if __name__ == '__main__': demo = BatchRename() demo.rename()
只需要修改图片路径、增添图片格式、zfill(5)表示图片名称从00001~99999,可以按照自己的图片数量进行修改。
2. 使用LabelImg标注图片
推荐在Ubuntu内安装LabelImg,Windows中感觉安装有很多bug,安装流程如下:
二、安装labelImg
下载地址:https://github.com/tzutalin/labelImg labelImg-master.zip
由于我的虚拟机没法解压zip
安装apt-get install zip
解压:unzip labelImg-master.zip
cd labelImg-master/
我使用的:Python 3 + Qt5
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
还要执行
sudo pip3 install lxml(labelImg需要PyQt和lxml的支持)
make qt5py3
将会执行 pyrcc5 -o resources.py resources.qrc
python3 labelImg.py出现错误
No module named PyQt5
解决方案:没有将pyqt5设为默认
sudo apt-get install qt5-default
再次执行 python3 labelImg.py 成功 建议把labelImg锁定左侧框,方便下次使用
3. 将标注好的xml文件放到Annotations文件夹下
4. 生成ImageSetsMain文件夹下的4个txt文件:test.txt,train.txt,trainval.txt,val.txt
这四个文件存储的是上一步xml文件的文件名。trainval和test内容相加为所有xml文件,train和val内容相加为trainval。使用CreateTxt.py生成。要将该文件与ImageSets和Annotations放在同一目录下
import os import random trainval_percent = 0.8 # trainval数据集占所有数据的比例 train_percent = 0.5 # train数据集占trainval数据的比例 xmlfilepath = 'Annotations' txtsavepath = 'ImageSets/Main' total_xml = os.listdir(xmlfilepath) num = len(total_xml) print('total number is ', num) list = range(num) tv = int(num * trainval_percent) print('trainVal number is ', tv) tr = int(tv * train_percent) print('train number is ', tr) print('test number is ', num - tv) 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] + ' ' 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()
参考地址:
https://blog.csdn.net/qq_36301716/article/details/79018170