Pascal VOC數據集標注
標注數據文件
目前流行的數據標注文件格式主要有VOC_2007、VOC_2012,該文本格式來源於Pascal VOC標准數據集,這是衡量圖像分類識別能力的重要基准之一。本文采用VOC_2007數據格式文件,以xml格式存儲。
1,首先安裝標注工具labelxml,相關教程可以參考如下鏈接:
https://www.cnblogs.com/kxqblog/p/16021711.html
2,安裝完畢后,新建一個文件夾,在文件夾下新建以下三個文件夾:
Annotations 文件夾
該文件夾下存放的是每一個圖片的標注信息,文件都是.xml
格式,文件名和圖片名是一致的對於該xml
的格式。
JPEGImages 文件夾
該文件夾下存放着所有的訓練集圖片,格式都是.jpg
。
ImageSets 文件夾
在這個文件夾中還有一個Main
文件夾,這個文件夾中主要有四個.txt
文件,分別是train.txt
、test.txt
、trainval.txt
、val.txt
。
test.txt
中保存的是測試所用的所有樣本的名字,不過沒有后綴(下同),一般測試的樣本數量占總數據集的50%
train.txt
中保存的是訓練所用的樣本名,樣本數量通常占trainval
的50%左右
val.txt
中保存的是驗證所用的樣本名,數量占trainval
的50%左右
trainval.txt
中保存的是訓練驗證樣本,是上面兩個的總和,一般數量占總數據集的50%
補充說明:一般VOC數據集組織如下:
└─VOCdevkit
└─VOC2012
├─Annotations
├─ImageSets
│ ├─Action
│ ├─Layout
│ ├─Main
│ └─Segmentation
├─JPEGImages
├─SegmentationClass
└─SegmentationObject
前三個已經詳細說明,下面解釋4,5兩個說明語義分割與實例分割,當然這兩個文件夾具體名字並不叫語義分割與實例分割,只是經過語義分割與實例分割的圖像存放於這兩個文件夾下。
語義分割(SegmentationClass)
通常意義上的目標分割指的就是語義分割,圖像語義分割,簡而言之就是對一張圖片上的所有像素點進行分類,即對圖像中的每個像素都划分出對應的類別,實現像素級別的分類。
舉例說明:語義分割(下圖左)就是需要區分到圖中每一點像素點,而不僅僅是矩形框框住了。但是同一物體的不同實例不需要單獨分割出來。對下圖左,標注為人,羊,狗,草地。而不需要羊1,羊2,羊3,羊4,羊5等
實例分割(SegmentationClass)
而類的具體對象,即為實例,那么實例分割不但要進行像素級別的分類,還需在具體的類別基礎上區別開不同的實例。舉例說明1:比如說圖像有多個人甲、乙、丙,那邊他們的語義分割結果都是人,而實例分割結果卻是不同的對象,具體如下圖所示:
3,標注圖像
在tensorflow環境下打開labelxml,將圖片集放在JPEGImages文件夾里面,注意圖片的格式必須是jpg格式的。打開labelImg標注工具,然后點擊左側的工具欄“Open Dir”按鈕,選擇剛才放在JPEGImages文件夾。這時,主界面將會自動加載第一張待標注照片。
點擊“Change Save Dir”選擇同一目錄下的“Annotations”文件夾作為xml數據目錄。點擊左側工具欄的“Create RectBox”按鈕,然后在主界面上點擊拉個矩形框,將貓出來。圈定后,將會彈出一個對話框,用於輸入標注物體的名稱,輸入jumao作為貓的名稱。
之后,點擊左側工具欄的“Save”按鈕,由於之前選擇剛才創建的Annotations作為保存目錄,系統將自動生成voc_2007格式的xml文件保存起來。這樣就完成了一張熊貓照片的物體標注了。
接下來點擊左側工具欄的“Next Image”進入下一張圖像,按照以上步驟,畫框、輸入名稱、保存,如此反復,直到把所有照片都標注好,保存起來。
4,划分訓練集、測試集、驗證集
完成所有熊貓照片的標注后,還要將數據集划分下訓練集、測試集和驗證集。在ImageSets文件夾下新建一個Main文件夾。
在github上下載一個自動划分的腳本:https://github.com/EddyGao/make_VOC2007/blob/master/make_main_txt.py 然后執行以下代碼:
import os
import random
trainval_percent = 0.66
train_percent = 0.5
xmlfilepath = 'C:\\Users\username\\Desktop\\ImageData\\Pascal_VOC\\Annotations'
txtsavepath = 'C:\\Users\\username\\Desktop\\ImageData\\Pascal_VOC\\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\\username\\Desktop\\ImageData\\Pascal_VOC\\ImageSets\\Main\\trainval.txt', 'w')
ftest = open('C:\\Users\\username\\Desktop\\ImageData\\Pascal_VOC\\ImageSets\\Main\\test.txt', 'w')
ftrain = open('C:\\Users\\username\\Desktop\\ImageData\\Pascal_VOC\\ImageSets\\Main\\train.txt', 'w')
fval = open('C:\\Users\\username\\Desktop\\ImageData\\Pascal_VOC\\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()
此時,將會按照腳本里面設置的比例,自動拆分訓練集、測試集和驗證集,將相應的文件名列表保存在里面。
注:訓練集、測試集和驗證集區別聯系:
訓練集:學習樣本數據集,通過匹配一些參數來建立一個分類器。建立一種分類的方式,主要是用來訓練模型的。作用是估計模型。
驗證集:對學習出來的模型,調整分類器的參數,如在神經網絡中選擇隱藏單元數。驗證集還用來確定網絡結構或者控制模型復雜程度的參數。作用是確定網絡結構或者控制模型復雜程度的參數。
測試集:測試訓練好的模型分辨能力。該數據集與訓練集、驗證集完全分離,不參與模型訓練。作用是檢驗最終選擇最優的模型性能。
划分數據集作用:為了防止過度擬合。如果我們把所有數據都用來訓練模型的話,建立的模型自然是最契合這些數據的,測試表現也好。但換了其它數據集測試這個模型效果可能就沒那么好。總而言之,訓練集和測試集相同的話,模型評估結果肯定比實際要好,但是模型的泛化性能較差。
至此,VOC數據集制作任務結束。
參考文檔:
https://my.oschina.net/u/876354/blog/1927351?tdsourcetag=s_pcqq_aiomsg