【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。
前面的表示影象的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文