https://blog.csdn.net/u011956147/article/details/53239325
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
# -*- 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()