一、數據集文件夾
新建一個文件夾,用來存放整個數據集,或者和voc2007一樣的名字:VOC2007
然后在文件夾里面新建如下文件夾:
二、將訓練圖片放到JPEGImages
將所有的訓練圖片放到該文件夾里,然后將圖片重命名為VOC2007的“000005.jpg”形式
重命名的python代碼為:

import os path = r"D:\VOC2007\JPEGImages" filelist = os.listdir(path) #該文件夾下所有的文件(包括文件夾) count=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=‘.jpg’ #文件擴展名 Newdir=os.path.join(path,str(count).zfill(6)+filetype) #用字符串函數zfill 以0補全所需位數 os.rename(Olddir,Newdir)#重命名 count+=1
三、標注圖片,標注文件保存到Annotations
使用Github上的labelimg:https://github.com/tzutalin/labelImg
這一步需要安裝Pyqt and lxml 下載地址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#PyQt4
https://www.lfd.uci.edu/~gohlke/pythonlibs/#Lxml
然后在labelImage 的目錄下 shift+右鍵打開PowerShell 運行一下命令:
pyrcc4 -py3 -o resources.py resources.qrc
python labelImg.py
這個時候,就會出現labelimage的窗口
labelimg窗口的使用方法:
• 源碼文件夾中使用notepad++打開data/predefined_classes.txt,可以修改默認類別,比如改成bus、car、building三個類別。 先修改,再打開labelimage
• 修改默認的XML文件保存位置,可以用“Ctrl+R”,改為自定義位置(D:\VOC2007\Annotations 數據集的Annotations 文件夾),這里的路徑不能包含中文,否則無法保存。
•“Open Dir”打開需要標注的樣本圖片文件夾,會自動打開第一張圖片,開始進行標注
• 使用“Create RectBox”開始畫框
• 完成一張圖片后點擊“Save”,此時XML文件已經保存到本地了。
• 點擊“Next Image”轉到下一張圖片。
• 標注過程中可隨時返回進行修改,后保存的文件會覆蓋之前的。
• 完成標注后打開XML文件,發現確實和PASCAL VOC所用格式一樣。
PS:
每個圖片和標注得到的xml文件,JPEGImages文件夾里面的一個訓練圖片,對應Annotations里面的一個同名XML文件,一 一 對應,命名一致
標注自己的圖片的時候,類別名稱請用小寫字母,比如汽車使用car,不要用Car
pascal.py中讀取.xml文件的類別標簽的代碼:
cls = self._class_to_ind[obj.find('name').text.lower().strip()]
寫的只識別小寫字母,如果你的標簽含有大寫字母,可能會出現KeyError的錯誤。
四、ImageSets\Main里的四個txt文件
在ImageSets里再新建文件夾,命名為Main,在Main文件夾中生成四個txt文件,即:
test.txt是測試集
train.txt是訓練集
val.txt是驗證集
trainval.txt是訓練和驗證集
VOC2007中,trainval大概是整個數據集的50%,test也大概是整個數據集的50%;train大概是trainval的50%,val大概是trainval的50%。
txt文件中的內容為樣本圖片的名字(不帶后綴),格式如下:
根據已生成的xml,制作VOC2007數據集中的trainval.txt ; train.txt ; test.txt ; val.txt
trainval占總數據集的50%,test占總數據集的50%;train占trainval的50%,val占trainval的50%;
上面所占百分比可根據自己的數據集修改,如果數據集比較少,test和val可少一些
在自己的VOC2007文件夾下創建.py文件,運行以下程序

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() -------------------
或者

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);
至此,VOC2007數據集制作完成,后續會將此數據集用於tensorflow faster rcnn中使用。
參考文章:https://blog.csdn.net/u011574296/article/details/78953681
https://blog.csdn.net/weixin_38124357/article/details/78425890