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


https://blog.csdn.net/u011956147/article/details/53239325

https://blog.csdn.net/u011574296/article/details/78953681

版權聲明:本文為博主原創文章,歡迎轉載,請注明出處 https://blog.csdn.net/u011574296/article/details/78953681

一、數據集文件夾

新建一個文件夾,用來存放整個數據集,或者和voc2007一樣的名字:VOC2007 
然后像voc2007一樣,在文件夾里面新建如下文件夾:

這里寫圖片描述

二、將訓練圖片放到JPEGImages

將所有的訓練圖片放到該文件夾里,然后將圖片重命名為VOC2007的“000005.jpg”形式

圖片重命名的代碼(c++,python,matlab),參考:http://blog.csdn.net/u011574296/article/details/72956446

三、標注圖片,標注文件保存到Annotations

使用labelIImg 標注自己的圖片

1、在git上下載源碼:https://github.com/tzutalin/labelImg

2、按照網頁上的使用方法使用 
(1)安裝PyQt4和Lxml

(2)在labelImage 的目錄下 shift+右鍵打開cmd 運行一下命令:

pyrcc4 -o resources.py resources.qrc 
python labelImg.py

注:這個時候,就會出現labelimage的窗口

(3)labelimg窗口的使用方法: 
• 修改默認的XML文件保存位置,可以用“Ctrl+R”,改為自定義位置,這里的路徑不能包含中文,否則無法保存。

• 源碼文件夾中使用notepad++打開data/predefined_classes.txt,可以修改默認類別,比如改成bus、car、building三個類別。

•“Open Dir”打開需要標注的樣本圖片文件夾,會自動打開第一張圖片,開始進行標注

• 使用“Create RectBox”開始畫框

• 完成一張圖片后點擊“Save”,此時XML文件已經保存到本地了。

• 點擊“Next Image”轉到下一張圖片。

• 標注過程中可隨時返回進行修改,后保存的文件會覆蓋之前的。

• 完成標注后打開XML文件,發現確實和PASCAL VOC所用格式一樣。

每個圖片和標注得到的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可少一些

代碼如下:

%注意修改下面四個值 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); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
 python代碼:
# -*- coding:utf-8 -*-
import os
import random
trainval_percent = 0.66
train_percent = 0.5
xmlfilepath = 'C:/Users/Administrator/Desktop/VOC2007-train/Annotations'
txtsavepath = 'C:/Users/Administrator/Desktop/VOC2007-train/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('C:/Users/Administrator/Desktop/VOC2007-train/ImageSets/Main/trainval.txt', 'w')
ftest = open('C:/Users/Administrator/Desktop/VOC2007-train/ImageSets/Main/test.txt', 'w')
ftrain = open('C:/Users/Administrator/Desktop/VOC2007-train/ImageSets/Main/train.txt', 'w')
fval = open('C:/Users/Administrator/Desktop/VOC2007-train/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()

 


免責聲明!

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



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