/py-faster-rcnn/data/VOCdevkit2007/VOC2007/下有
- JPEGImages
- Annotations
- ImageSets/Main
JPEGImages —> 存放你用來訓練的原始圖像
Annotations —> 存放原始圖像中的Object的坐標信息,XML格式
ImageSets/Main —> 指定用來train,trainval,val和test的圖片的編號
JPEGImages
這個沒什么,直接把你的圖片放入就可以了,但是有三點注意:
- 編號要以6為數字命名,例如000034.jpg
- 圖片要是JPEG/JPG格式的,PNG之類的需要自己轉換下
- 圖片的長寬比(width/height)要在0.462-6.828之間,就是太過瘦長的圖片不要
如果你的圖片都是0.jpg這種命名的,如何用python代碼改成000000.jpg呢?
import os
file_names = os.listdir('./JPEGImages')
for filename in file_names:
var = filename.split('.')[0]
var = var.zfill(6)
os.rename('./JPEGImages'+filename,'./JPEGImages/%s.jpg'%(var))
Annotations
faster rcnn訓練需要圖像的bounding box信息作為監督(ground truth),所以你需要將你的所有可能的object使用框標注,並寫上坐標,最終是一個XML格式的文件,一個訓練圖片對應Annotations下的一個同名的XML文件
參考官方VOC的Annotations的格式:
<annotation>
<folder>VOC2007</folder> #數據集文件夾
<filename>000105.jpg</filename> #圖片的name
<source> #注釋信息,無所謂有無
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid>321862192</flickrid>
</source>
<owner> #注釋信息,無所謂有無
<flickrid>Eric T. Johnson</flickrid>
<name>?</name>
</owner>
<size> #圖片大小
<width>500</width>
<height>333</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object> #多少個框就有多少個object標簽
<name>boat</name> #bounding box中的object的class name
<pose>Frontal</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>22</xmin> #框的坐標
<ymin>1</ymin>
<xmax>320</xmax>
<ymax>314</ymax>
</bndbox>
</object>
<object>
<name>person</name>
<pose>Frontal</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>202</xmin>
<ymin>71</ymin>
<xmax>295</xmax>
<ymax>215</ymax>
</bndbox>
</object>
<object>
<name>person</name>
<pose>Frontal</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>170</xmin>
<ymin>107</ymin>
<xmax>239</xmax>
<ymax>206</ymax>
</bndbox>
</object>
</annotation>
這里有一個非常好用的工具VOC框圖工具,可以自動幫你生成需要的XML格式,實際中發現格式基本無誤,只有小的地方需要改動下,大家對比下就知道怎么改了,我是在Linux下借助sed修改的,這個不難
但是,如果你已經有一個txt文件,存放目標以及框:filename objectname xmin ymin xmax ymax,那么該怎么用python生成xml文件呢?參考(2)提供代碼
訓練
參考(3)修改文件。
訓練時可能遇到問題:
TypeError numpy.float64 object cannot be interpreted as an index
解決方法:
把numpy的版本由1.12.0降為.1.11.0既能解決
sudo pip install -U numpy=1.11.0
File "/home/meng/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 111, in append_flipped_images
assert (boxes[:, 2] >= boxes[:, 0]).all()
AssertionError
解決辦法:
參考(3)
測試
參考(3)修改文件
執行
./tools/demo.py --net zf
出現問題:
File "./tools/demo.py", line 89, in demo
cls_scores = scores[:, cls_ind]
IndexError: index 6 is out of bounds for axis 1 with size 6
查看了一下demo.py的文件,原來是代碼中subadult_males多寫了
'''python
CLASSES = ('background',
'adult_males','subadult_males','subadult_males','adult_females','juveniles','pups')
'''
參考:(1)使用Faster-Rcnn進行目標檢測(實踐篇)
(2)提供把自己的圖像處理成voc數據格式的代碼
(3)指導在訓練自己的數據時應該修改哪些文件
(4)指導如何把自己的數據變為VOC格式