一、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. 生成ImageSets\Main文件夾下的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] + '\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()
參考地址:
https://blog.csdn.net/qq_36301716/article/details/79018170