PascalVOC 數據集介紹! |
文章目錄
Pascal VOC challenge 是一個非常流行的數據集,用於構建和評估圖像分類、對象檢測和分割的算法。官網數據集鏡像:數據集下載鏈接
一、Challenge
Pascal VOC challenge 的目標就是從存在於現實場景中的許多可視對象類別中識別出對象(即不預先分割的對象)。全部有二十個類:
person, bird, cat, cow, dog, horse, sheep, aeroplane, bicycle, boat, bus, car,
motorbike, train, bottle, chair, dining table, potted plant, sofa, tv / monitor
由於我們是將數據用於檢測,因此,我們只關注Annotation、ImageSets、JPEGImages這三個文件夾。下面我們逐個分析每一個文件夾下面的內容:
- ImageSets/Main/ 保存了具體數據集的索引;
- Annotations 保存了標籤數據;
- JPEGImages 保存了圖片內容。
1.1、數據集的主要任務
有五個主要任務:
- 1、分類: 對於每一個類,在一張測試圖片中預測該類至少一個對象是否存在。
- 2、檢測: 對於每一個類,在一張測試圖片中預測該類的每一個對象的邊界框(bounding box)。
- 3、分割: 對於測試圖片每一個像素,如果像素不屬於20個指定類中的一個,則預測包含該像素或“背景”的對象的類。
- 4、動作分類: 對於每個動作類別,預測測試圖片中的指定的人(由其邊界框指示)是否正在執行相應的動作。其中有 10 個動作類別:
jumping; phoning; playing a musical instrument; reading; riding a bicycle or motorcycle; riding a horse; running; taking a photograph;using a computer; walking
- 5、大尺度識別: 這個任務又 ImageNet 組織者執行。更多可查看其官網。
1.2、VOC2012文件夾
裏面有一個 VOC2007 ,另一個是 VOC2012 。進去裏面有 5 個文件夾;
- VOC2012
- Annotations:存放 xml 文件,每個文件對應 JPEGImage 裏面的一張圖片;
- JPEGImage:存放圖片,每張圖片都有對應的編號;
- SegmentationClass:存放分割圖片,按類分,相同的類用同一個顏色表示;
- SegmentationObject:存放分割圖片,按物體分, 不同的物體用不同的顏色表示;
1.3、Annotations
- xml 是可擴展標記語言,文件裏面內容大概如下:
<annotation>
<folder>VOC2012</folder>
<filename>2007_000027.jpg</filename>
<source>
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
</source>
<size>
<width>486</width>
<height>500</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>person</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>174</xmin>
<ymin>101</ymin>
<xmax>349</xmax>
<ymax>351</ymax>
</bndbox>
<part>
<name>head</name>
<bndbox>
<xmin>169</xmin>
<ymin>104</ymin>
<xmax>209</xmax>
<ymax>146</ymax>
</bndbox>
</part>
<part>
<name>hand</name>
<bndbox>
<xmin>278</xmin>
<ymin>210</ymin>
<xmax>297</xmax>
<ymax>233</ymax>
</bndbox>
</part>
<part>
<name>foot</name>
<bndbox>
<xmin>273</xmin>
<ymin>333</ymin>
<xmax>297</xmax>
<ymax>354</ymax>
</bndbox>
</part>
<part>
<name>foot</name>
<bndbox>
<xmin>319</xmin>
<ymin>307</ymin>
<xmax>340</xmax>
<ymax>326</ymax>
</bndbox>
</part>
</object>
</annotation>
- 其中裏面指定了文件夾,文件名字,圖片的長寬和深度,還有邊界框(bounding box)及物體類別。;
1.4、ImageSets
- ImageSets/Main/ 文件夾裏面文件以 class_trainval.txt、class_val.txt 的格式命名。 train.txt val.txt 例外。
aeroplane_train.txt
aeroplane_trainval.txt
aeroplane_val.txt
bicycle_train.txt
bicycle_trainval.txt
bicycle_val.txt
bird_train.txt
bird_trainval.txt
bird_val.txt
boat_train.txt
boat_trainval.txt
boat_val.txt
bottle_train.txt
bottle_trainval.txt
bottle_val.txt
bus_train.txt
bus_trainval.txt
bus_val.txt
car_train.txt
car_trainval.txt
car_val.txt
cat_train.txt
cat_trainval.txt
cat_val.txt
chair_train.txt
chair_trainval.txt
chair_val.txt
cow_train.txt
cow_trainval.txt
cow_val.txt
diningtable_train.txt
diningtable_trainval.txt
diningtable_val.txt
dog_train.txt
dog_trainval.txt
dog_val.txt
horse_train.txt
horse_trainval.txt
horse_val.txt
motorbike_train.txt
motorbike_trainval.txt
motorbike_val.txt
person_train.txt
person_trainval.txt
person_val.txt
pottedplant_train.txt
pottedplant_trainval.txt
pottedplant_val.txt
sheep_train.txt
sheep_trainval.txt
sheep_val.txt
sofa_train.txt
sofa_trainval.txt
sofa_val.txt
train.txt
train_train.txt
train_trainval.txt
train_val.txt
trainval.txt
tvmonitor_train.txt
tvmonitor_trainval.txt
tvmonitor_val.txt
val.txt
其中如下:
- {class}_train.txt 保存類別爲 class 的訓練集的所有索引,每一個 class 的 train 數據都有 5717 個。
- {class}_val.txt 保存類別爲 class 的驗證集的所有索引,每一個 class 的val數據都有 5823 個
- {class}_trainval.txt 保存類別爲 class 的訓練驗證集的所有索引,每一個 class 的val數據都有11540 個
每個文件包含內容爲:
2011_003194 -1
2011_003216 -1
2011_003223 -1
2011_003230 1
2011_003236 1
2011_003238 1
2011_003246 1
2011_003247 0
2011_003253 -1
2011_003255 1
2011_003259 1
2011_003274 -1
2011_003276 -1
注:1代表正樣本,-1代表負樣本。
-
VOC2012 / ImageSets / Main / train.txt保存了所有訓練集的文件名 ,從 VOC2012/JPEGImages/ 找到文件名對應的圖片文件。VOC2012/Annotations/ 找到文件名對應的標籤文件;
-
VOC2012/ImageSets/Main/val.txt 保存了所有驗證集的文件名,從 VOC2012/JPEGImages/ 找到文件名對應的圖片文件。VOC2012/Annotations/ 找到文件名對應的標籤文件
-
讀取 JPEGImages 和 Annotation 文件轉換爲 tf 的 Example 對象,寫入 {train|test}{index}_of{num_shard} 文件。每個文件寫的 Example 的數量爲 total_size/num_shard。(不同數據集可以適當調節 num_shard 來控制每個輸出文件的大小)
1.5、JPEGImages
- 這個文件夾主要放置數據的原始圖片,圖片的文件名用00001.jpg進行命名。
二、標註軟件對數據手動標註
- 解決Annotation文件;使用標註軟件對數據手動標註,軟件會自動生成圖片信息的xml文件。
軟件下載鏈接,提取碼:l53r
2.1、軟件簡單介紹
- 導入圖片
- 點擊左側的create Rect 創建標註框
- 可以創建新的Label
- 最後點擊verifyImage進行確認,導出XML文件
- 生成的XML文件內容如下:
<annotation verified="yes">
<folder>Desktop</folder>
<filename>000005.jpg</filename>
<path>C:/Users/Devinzhang/Desktop/000005.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>500</width>
<height>375</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>dog</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>85</xmin>
<ymin>270</ymin>
<xmax>186</xmax>
<ymax>375</ymax>
</bndbox>
</object>
</annotation>
2.2、解決Imagesets裏的文件
- 先抄別人一份代碼,然後自己修改
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()
參考了以下作者: