制作自己的數據集(VOC2007格式)用於Faster-RCNN訓練


一、數據集文件夾

新建一個文件夾,用來存放整個數據集,或者和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() 
-------------------
Main

 或者

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); 
Main

 

 至此,VOC2007數據集制作完成,后續會將此數據集用於tensorflow faster rcnn中使用。

 

 

 

 

參考文章:https://blog.csdn.net/u011574296/article/details/78953681

      https://blog.csdn.net/weixin_38124357/article/details/78425890

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM