【Detection】物體識別-制作PASCAL VOC數據集


代碼下載:github

PASCAL VOC數據集

PASCAL VOC為圖像識別和分類提供了一整套標准化的優秀的數據集,從2005年到2012年每年都會舉行一場圖像識別challenge
默認為20類物體

1 數據集結構

①JPEGImages

JPEGImages文件夾中包含了PASCAL VOC所提供的所有的圖片信息,包括了訓練圖片和測試圖片。

ref:PASCAL VOC數據集分析

②Annotations

Annotations文件夾中存放的是xml格式的標簽文件,每一個xml文件都對應於JPEGImages文件夾中的一張圖片。

xml文件的具體格式如下:(對於2007_000392.jpg)


<annotation>
	<folder>VOC2012</folder>                           
	<filename>2007_000392.jpg</filename>                               //文件名
	<source>                                                           //圖像來源(不重要)
		<database>The VOC2007 Database</database>
		<annotation>PASCAL VOC2007</annotation>
		<image>flickr</image>
	</source>
	<size>					                           //圖像尺寸(長寬以及通道數)						
		<width>500</width>
		<height>332</height>
		<depth>3</depth>
	</size>
	<segmented>1</segmented>		                           //是否用於分割(在圖像物體識別中01無所謂)
	<object>                                                           //檢測到的物體
		<name>horse</name>                                         //物體類別
		<pose>Right</pose>                                         //拍攝角度
		<truncated>0</truncated>                                   //是否被截斷(0表示完整)
		<difficult>0</difficult>                                   //目標是否難以識別(0表示容易識別)
		<bndbox>                                                   //bounding-box(包含左下角和右上角xy坐標)
			<xmin>100</xmin>
			<ymin>96</ymin>
			<xmax>355</xmax>
			<ymax>324</ymax>
		</bndbox>
	</object>
	<object>                                                           //檢測到多個物體
		<name>person</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>                    //檢測矩形框坐標
			<xmin>198</xmin>
			<ymin>58</ymin>
			<xmax>286</xmax>
			<ymax>197</ymax>
		</bndbox>
	</object>
</annotation>

對應的圖片為:

③ImageSets

ImageSets存放的是每一種類型的challenge對應的圖像數據。
在ImageSets下有四個文件夾:

其中Action下存放的是人的動作(例如running、jumping等等,這也是VOC challenge的一部分)
Layout下存放的是具有人體部位的數據(人的head、hand、feet等等,這也是VOC challenge的一部分)
Main下存放的是圖像物體識別的數據,總共分為20類。
Segmentation下存放的是可用於分割的數據。

在這里主要考察Main文件夾。

Main文件夾下包含了20個分類_train.txt、_val.txt和***_trainval.txt。
這些txt中的內容都差不多如下:

前面的表示圖像的name,后面的1代表正樣本,-1代表負樣本。
_train中存放的是訓練使用的數據,每一個class的train數據都有5717個。
_val中存放的是驗證結果使用的數據,每一個class的val數據都有5823個。
_trainval將上面兩個進行了合並,每一個class有11540個。
需要保證的是train和val兩者沒有交集,也就是訓練數據和驗證數據不能有重復,在選取訓練數據的時候 ,也應該是隨機產生的。

Ref: PASCAL VOC數據集分析

2 生成/創建 PASCAL VOC 數據集

2.1 利用現有數據集 - Openimages

900萬張標注圖像,谷歌發布Open Images最新V3版

該數據集包含一個訓練集(9011219張圖像)、一個驗證集(41620張圖像)和一個測試集(125436張圖像)。V1 版本里的驗證集在 V2 版本中被划分為驗證集和測試集,這樣做是為了更好地進行評估。Open Images 中的所有圖像都標注有圖像級標簽和邊界框

600余物體類別在線瀏覽
分類標簽示例:

2.1.1 下載openimages

到官網下載的時候要一次性下載所有的部分,不僅文件很大,而且下載的也不大快,更重要的是自己訓練要用到的類別並不多。

我采用的是工具箱的方法(https://github.com/EscVM/OIDv4_ToolKit),實際操作起來也挺順利的。
Open Images V4 下載自己需要的特定類別

Step1:Install the required packages
pip install -r requirements.txt

Step2:
python main.py downloader --classes ./classes.txt --type_csv all --limit 3000

用法:main.py [-h] [--Dataset/path/to/OID/csv/] [-y]
               [ - 類列表[類列表...]]
               [--type_csv'train'或'validation'或'test'或'all']
               [--sub 子人驗證圖像的子集或機器生成的h或m)]
               [--image_IsOccluded 1或0] [ -  image_IsTruncated 1或0]
               [--image_IsGroupOf 1或0] [ -  image_IsDepiction 1或0]
               [--image_IsInside 1或0] [--multiclasses 0(默認值或1)
               [--n_threads [默認20]] [--noLabels]
               [--limit integer number]
               <command>'downloader','visualizer'或'ill_downloader'。
Open Image Dataset Downloader
打開圖像數據集下載程序
位置參數:
  <command>'downloader','visualizer'或'ill_downloader'。
                        'downloader','visualizer'或'ill_downloader'。
可選參數:
  -h, --help      顯示此幫助消息並退出
  --Dataset /path/to/OID/csv/
                        OID數據集文件夾的目錄
  -y, --yes 是和是可以下載丟失的文件
   - 類列表[類列表...]
                        所需類的“字符串”序列
  --type_csv'train'或'validation'或'test'或'all'
                        從什么csv搜索圖像
  --sub  人工驗證圖像或機器生成的子集(h或m)
                        從人類驗證的數據集或從
                        機器生成一個。
  --image_IsOccluded 1或0
                        圖像的可選特征。表示
                        對象被圖像中的另一個對象遮擋。
  --image_IsTruncated 1或0
                        圖像的可選特征。表示
                        對象超出圖像的邊界。
  --image_IsGroupOf 1或0
                        圖像的可選特征。表示
                        盒子跨越一組物體(分鍾5)。
  --image_IsDepiction 1或0
                        圖像的可選特征。表示
                        對象是一個描述。
  --image_IsInside 1或0
                        圖像的可選特征。表示a
                        從對象內部拍攝的照片。
  --multiclasses 0(默認值)或1
                        分別(0)或一起下載不同的類
                        (1)
  --n_threads [默認20]
                        要使用的線程數
  --noLabels            沒有標簽創作
  --limit integer number
                        要下載的圖像數量的可選限制

下載完成后得到 OID Folder

2.1.2 csv生成.xml(以Google openimage為例)

代碼下載:github

Step1:Get VOC.xml - csv2voc.py

Openimage.csv to Anotation/XXX.xml

  • Input : OPEN_IMAGES_DIR = folder of csv file

eg. where the validation-annotations-bbox.csv is.

  • Output = Anotation/XXX.xml +
    test.txt、train.txt、val.txt、trainval.txt

生成后得到VOCify Folder

Note: 此時無需直接操作圖片

test.txt、train.txt、val.txt、trainval.txt 后期訓練時可再次生成,代碼如下

# -*- coding:utf-8 -*- 
# -*- python3.5 
import os 
import random 
 
trainval_percent = 0.7 #可以自己設置
train_percent = 0.8    #可以自己設置
 
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(txtsavepath+'/trainval.txt', 'w') 
ftest = open(txtsavepath+'/test.txt', 'w') 
ftrain = open(txtsavepath+'/train.txt', 'w') 
fval = open(txtsavepath+'/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() 
print('Well finshed')

Step2:Save images to JPEGImages folder - By hand
cp -r Dataset/images_file* VOCify/JPEGImages
Source : Dataset/images_file
Destination : VOCify/JPEGImages

Step3:Set same name - my_same_name.py

Set Anotation/XXX.xml as JPEGImages/XXX.jpg
Make XXX the same

ref: 制作VOC數據集

2.2 手工標注

推薦:使用labelImg工具給圖片上標簽,並生成.xml文件


免責聲明!

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



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