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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM