Pascal VOC資料集標註
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