1. 程式人生 > >Tensorflow框架下Faster-RCNN實踐(一)——Faster-RCNN所需資料集製作(附程式碼)

Tensorflow框架下Faster-RCNN實踐(一)——Faster-RCNN所需資料集製作(附程式碼)

最近剛實現了在Ubuntu16.04、Tensorfllow1.0下 Faster R-CNN 從資料製作到訓練再到利用生成的模型檢測的測試圖片的全過程,現在將具體的過程記錄在部落格,方便遇到困惑或者需要的朋友檢視。

製作資料集

利用Faster R-CNN訓練自己的資料的時候,一般有兩種方法:

1、按照VOC2007的格式修改自己的資料格式
2、根據自己的資料格式修改原始碼

這裡我們一般推薦第一種方法,因為第一種方法比較簡單而且不容易出錯,下面我們就按照第一種方法的形式來製作資料集。

一、 淺析PASCAL VOC資料集

PASCAL VOC資料集主要是為影象識別和分割而製作的資料集,我們以VOC2007為例,可以看到VOC2007中一共有五個資料夾:

Annotations  ImageSets  JPEGImages  SegmentationClass  SegmentationObject

SegmentationClass SegmentationObject 是做影象分割的,我們做檢測只需要考慮前三個資料夾。

1.1、 JPEGImages

  • JPEGImages 內部存放了PASCAL VOC所提供的所有的圖片資訊,包括了訓練圖片和測試圖片

  • 這些影象的畫素尺寸大小不一,但是橫向圖的尺寸大約在500*375左右,縱向圖的尺寸大約在375*500左右,基本不會偏差超過100。(在之後的訓練中,第一步就是將這些圖片都resize到300*300或是500*500,所有原始圖片不能離這個標準過遠。

1.2、Annotations

Annotations資料夾中存放的是xml格式的標籤檔案,每一個xml檔案都對應於JPEGImages資料夾中的一張圖片。xml檔案的解析如下:

<annotation>  
    <folder>VOC2007</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>

1.3、 ImageSets

ImageSets存放的是每一種型別的challenge對應的影象資料。
在ImageSets下有四個資料夾:

Layout Main Segmentation

  • Layout下存放的是具有人體部位的資料(人的head、hand、feet等等,這也是VOC challenge的一部分)
  • Main下存放的是影象物體識別的資料,總共分為20類。
  • Segmentation下存放的是可用於分割的資料。

在這裡主要考察Main資料夾。
Main資料夾下包含了20個分類的***_train.txt、***_val.txt和***_trainval.txt。
這些txt中的內容都差不多如下:

000005 -1
000007 -1
000009  1
000016 -1
000019 -1
000020 -1
000021 -1
000024 -1
000030 -1
000039 -1

前面的表示影象的name,後面的1代表正樣本,-1代表負樣本。
_train中存放的是訓練使用的資料
_val中存放的是驗證結果使用的資料
_trainval將上面兩個進行了合併
需要保證的是train和val兩者沒有交集,也就是訓練資料和驗證資料不能有重複,在選取訓練資料的時候 ,也應該是隨機產生的。

二、根據PASCAL VOC資料集製作自己的資料集

我們製作資料集的時候,其實是把我們自己的資料格式轉換為PASCAL VOC資料集的格式。以我以前儲存的資料格式為例,我們的資料格式為:

DG00001L003.jpg iris 202 72 337 170
DG00001L004.jpg iris 227 99 354 197
DG00001L005.jpg iris 320 47 473 141
DG00001R002.jpg iris 312 114 488 190
DG00001R003.jpg iris 252 65 425 148
DG00002L001.jpg iris 328 184 495 264
DG00002L003.jpg iris 139 77 291 180
DG00002L004.jpg iris 116 194 247 294
DG00002L005.jpg iris 203 138 350 231
DG00002R001.jpg iris 327 135 456 231
DG00002R002.jpg iris 225 199 390 281
DG00002R003.jpg iris 295 42 479 164
DG00003L001.jpg iris 268 169 427 262
DG00003L002.jpg iris 277 73 440 165
DG00003L005.jpg iris 187 168 350 253
DG00003L005.jpg iris 232 86 412 168

即每行由圖片名、目標型別、包圍框座標組成,空格隔開
如果一張圖片有多個目標,則格式如下:(比如兩個目標)
DG00003L005.jpg iris 187 168 350 253
DG00003L005.jpg iris 232 86 412 168
四個座標點為包圍框座標的左上角和右下角。
當然我們只有一個檢測模板iris,如果有多個檢測目標,也是類似的格式,比如:

DG00003L001.jpg contact 268 169 427 262
DG00003L002.jpg iris 277 73 440 16

三、 利用程式碼生成資料集XML檔案以及訓練、測試、驗證集

具體的轉換程式碼和例程可以從下面的github地址下載。

Github

  • VOC2007xml.m 用來生成Annotations目錄下的xml檔案 VOC2007txt.m

  • VOC2007txt.m 根據已生成的xml,製作VOC2007資料集中的trainval.txt;train.txt;test.txt和val.txt。trainval佔總資料集的50%,test佔總資料集的50%;train佔trainval的50%,val佔trainval的50%;上面所佔百分比可根據自己的資料集修改,如果資料集比較少,test和val可少一些

生成步驟

1、程式碼下載後,開啟VOC2007xml.m,根據在img中提供好的*.jpg 檔案與output.txt就可以生成Annotations的xml 檔案,如果要生成自己的xml檔案,則只需要將img中的圖片替換為自己的圖片,output.txt根據格式修改就可以了。
2、xml生成後,只需要執行VOC2007txt.m,就可以生成對應的測試集驗證集和訓練集。

文章程式碼地址: