1. 程式人生 > 其它 >Pascal VOC資料集標註

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.txttest.txttrainval.txtval.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

https://wap.sciencenet.cn/blog-3428464-1280762.html

https://www.cnblogs.com/hider/p/15781829.html