PASCAL VOC數據集的標註格式

背景

PASCAL的全稱是Pattern Analysis, Statistical Modelling and Computational Learning。

VOC的全稱是Visual Object Classes。

第一屆PASCAL VOC舉辦於2005年,然後每年一屆,於2012年終止。

本文以PASCAL VOC 2012為基礎。

數據標註方式

數據集簡介

PASCAL VOC競賽目標主要是目標識別,其提供的數據集里包含了20類的物體。

  • person
  • bird, cat, cow, dog, horse, sheep
  • aeroplane, bicycle, boat, bus, car, motorbike, train
  • bottle, chair, dining table, potted plant, sofa, tv/monitor

PASCAL VOC的主要2個任務是(按照其官方網站所述,實際上是5個):

  • 分類: 對於每一個分類,判斷該分類是否在測試照片上存在(共20類);
  • 檢測:檢測目標對象在待測試圖片中的位置並給出矩形框坐標(bounding box);
  • Segmentation: 對於待測照片中的任何一個像素,判斷哪一個分類包含該像素(如果20個分類沒有一個包含該像素,那麼該像素屬於背景);
  • (在給定矩形框位置的情況下)人體動作識別;
  • Large Scale Recognition(由ImageNet主辦)。

另外,PASCAL VOC利用其訓練集的一個子集對外提供2個嘗鮮性質的任務:

  • (無給定矩形框位置的情況下)人體動作識別;
  • Person Layout: 對於待測照片中的每一個人,預測出這個人的bounding box,以及這個人的頭、手、腳的bounding box。

在本文中,Gemfield只討論目標檢測。

XML標註格式

對於目標檢測來說,每一張圖片對應一個xml格式的標註文件。所以你會猜到,就像gemfield準備的訓練集有8萬張照片一樣,在存放xml文件的目錄里,這裡也將會有8萬個xml文件。下面是其中一個xml文件的示例:

<?xml version="1.0" encoding="utf-8"?><annotation> <folder>VOC2007</folder> <filename>test100.mp4_3380.jpeg</filename> <size> <width>1280</width> <height>720</height> <depth>3</depth> </size> <object> <name>gemfield</name> <bndbox> <xmin>549</xmin> <xmax>715</xmax> <ymin>257</ymin> <ymax>289</ymax> </bndbox> <truncated>0</truncated> <difficult>0</difficult> </object> <object> <name>civilnet</name> <bndbox> <xmin>842</xmin> <xmax>1009</xmax> <ymin>138</ymin> <ymax>171</ymax> </bndbox> <truncated>0</truncated> <difficult>0</difficult> </object> <segmented>0</segmented></annotation>

在這個測試圖片上,我們標註了2個object,一個是gemfield,另一個是civilnet。

在這個xml例子中:

  • bndbox是一個軸對齊的矩形,它框住的是目標在照片中的可見部分;
  • truncated表明這個目標因為各種原因沒有被框完整(被截斷了),比如說一輛車有一部分在畫面外;

    occluded是說一個目標的重要部分被遮擋了(不管是被背景的什麼東西,還是被另一個待檢測目標遮擋);
  • difficult表明這個待檢測目標很難識別,有可能是雖然視覺上很清楚,但是沒有上下文的話還是很難確認它屬於哪個分類;標為difficult的目標在測試成績的評估中一般會被忽略。

注意:在一個<object />中,<name /> 標籤要放在前面,否則的話,目標檢測的一個重要工程實現SSD會出現解析數據集錯誤(另一個重要工程實現py-faster-rcnn則不會)。

如何評判目標檢測的成績?

先來介紹幾個概念

1,IoU

這是關於一個具體預測的Bounding box的準確性評估的數據。對於目標檢測任務來說,一個具體的目標預測包括一個bounding box的坐標和它的置信度。通過測量預測的bndbox(bounding box)和ground truth的bndbox之間的重合度,我們來得出此次預測是true positive還是false positive。

一般來說,重合區域的面積(上面公式的分子)和2個bndbox的面積之和的比例(上面公式的分母)如果大於50%,那麼認為這是一個成功的預測(true positive),否則認為這是一個失敗的預測(false positive)。公式等號的左邊就是IoU。50%這個數值的選取是考慮了一些因素的,比方說人有胳膊有腿,有蜷縮有伸展的狀態,因此這個數也不能太嚴格。

如果對於一個目標演算法檢測出多個目標,比如一個目標上演算法給出了5個檢測框,那麼就算4個檢測錯誤。

2,mAP

對於一個給定的任務和分類:

precision/recall曲線是根據演算法的輸出計算得到的。

Recall(召回率)說的是所有正樣本中被演算法預測出來的樣本所佔的比率;

(Recall is defined as the proportion of all positive examples ranked above a given rank.)

Precision(準確率)說的是預測出來的樣本中是正確的比例是多少;

(Precision is the proportion of all examples above that rank which are from the positive class. )

AP的值就某種程度上反映了上述PR曲線(precision/recall)的形狀,我們把recall的值從0到1 (0%到100%)劃分為11份:0、0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9、1.0,在每個recall尺度上我們計算下準確率,然後再計算總和並平均,就是AP值。

因此,一個表現良好的演算法應該是在各個recall層面上都有足夠好的Precision。

對於給定的任務的所有的分類:

計算每個分類的AP,求和再平均,得到的就是mAP

PASCAL VOC數據集實例

當在PASCAL VOC官方網站上下載了development kit和challenge image database並將它們解壓到同一目錄下,會產生下面這樣的目錄結構:

gemfield@ai:/data/VOCdevkit2007/VOC2007$ ls -ltotal 584drwxrwxr-x 2 gemfield gemfield 270336 2月 7 19:22 Annotationsdrwxrwxr-x 5 gemfield gemfield 4096 11月 7 2007 ImageSetsdrwxrwxr-x 2 gemfield gemfield 274432 11月 7 2007 JPEGImagesdrwxrwxr-x 2 gemfield gemfield 20480 11月 7 2007 SegmentationClassdrwxrwxr-x 2 gemfield gemfield 20480 11月 7 2007 SegmentationObject

其中:

Annotations目錄下放的是標註文件,xml格式,這是用於目標檢測任務的一個總的標註集合,裡面存放有大而全的xml文件;具體是在ImageSets/Main目錄中去劃分訓練機、驗證集、測試集;

JPEGImages目錄下是所有的jpg圖片;

ImageSets目錄下有3個子目錄:Layout, Main, Segmentation。

gemfield@ai:/VOCdevkit/VOC2007$ ls -l ImageSets/total 12drwxrwxr-x 2 gemfield gemfield 4096 11月 7 2007 Layoutdrwxrwxr-x 2 gemfield gemfield 4096 2月 7 19:57 Maindrwxrwxr-x 2 gemfield gemfield 4096 2月 7 19:51 Segmentation

注意啊,這裡面全是train.txt、val.txt、trainval.txt、test.txt。這些文件里的每一行都是個文件名,其有2層含義,一方面其對應的圖片來自JPEGImages里的同名文件,另一方面其對應的標註結果來自Annotations里的同名文件。

SegmentationClass目錄下放的也是圖片,segmentations by object;

SegmentationObject目錄下放的也是圖片,segmentations by class。

建立自己的數據集

本節Gemfield僅以目標檢測為例,建立一個名為VOC2018的數據集。如下所示:

gemfield@ai:/bigdata$ mkdir VOC2018gemfield@ai:/bigdata$ cd VOC2018/gemfield@ai:/bigdata/VOC2018$ lsgemfield@ai:/bigdata/VOC2018$ mkdir Annotationsgemfield@ai:/bigdata/VOC2018$ mkdir JPEGImagesgemfield@ai:/bigdata/VOC2018$ mkdir -p ImageSets/Main

可以看到,必備的目錄只有Annotations、JPEGImages以及ImageSets/Main。

1,把所有的照片放入到JPEGImages目錄:

gemfield@ai:/bigdata/VOC2018/JPEGImages$ ls | headself1.mp4_0.jpgself1.mp4_10000.jpgself1.mp4_1000.jpgself1.mp4_10010.jpgself1.mp4_10020.jpgself1.mp4_10030.jpgself1.mp4_10040.jpgself1.mp4_10050.jpg......

2,把所有的xml標註文件放入到Annotations目錄:

gemfield@ai:/bigdata/VOC2018/Annotations$ ls |headself1.mp4_0.xmlself1.mp4_10000.xmlself1.mp4_10010.xmlself1.mp4_10020.xmlself1.mp4_10030.xmlself1.mp4_10040.xmlself1.mp4_10050.xml......

3,把劃分好的訓練集測試集放入到 ImageSets/Main目錄下:

gemfield@ai:/bigdata/VOC2018/ImageSets/Main$ ls -ltotal 4012-rw-r--r-- 1 root root 1278209 2月 11 16:53 imageset.txt-rw-r--r-- 1 root root 127874 2月 11 16:53 test.txt-rw-r--r-- 1 root root 1278209 2月 11 16:53 train.txt-rw-r--r-- 1 root root 1278209 2月 11 16:53 trainval.txt-rw-r--r-- 1 root root 127868 2月 11 16:53 val.txt

以val.txt文件為例,格式如下(這幾個文件格式一樣):

gemfield@ai:/bigdata/VOC2018/ImageSets/Main$ cat val.txt |headwzry203.mp4_3990wzry19.mp4_16340wzry232.mp4_9860wzry228.mp4_4610wzry240.mp4_120wzry49.mp4_1920wzry222.mp4_8170wzry219.mp4_10720wzry250.mp4_4410wzry249.mp4_7700

推薦閱讀:

TAG:ObjectPascal | 目標檢測 | Caffe深度學習框架 |