【目標檢測】Fast R-CNN (keras) 構造自己的數據集


網上一直沒有找到Kitti數據集,於是決定使用之前的安全帽數據集。

1.獲取安全帽圖片並且按順序標號(之前的博客中已經說明詳細步驟)

2.給圖片中的安全帽打框,生成xml文件,其中的坐標對應每個安全帽的位置。

  使用工具:labelImg

  需安裝的第三方庫:
  python,PyQt5 , lxml
  1.Python的安裝 (略)
  2.pip安裝PyQt5
  進入cmd(win鍵+R鍵,輸入cmd),輸入:
  pip install PyQt5
  3.安裝lxml
  進入cmd(win鍵+R鍵,輸入cmd),輸入:
  pip install lxml
  4.安裝labelImg
  labelImg下載地址:
  https://github.com/tzutalin/labelImg.git
  進入cmd(win鍵+R鍵,輸入cmd),進入labelImg文件夾,輸入:
  pyrcc5 -o resources.py resources.qrc
  輸入:python labelImg.py
  即可打開labelImg。

  1)打開界面如下:

  

 

   (2)給圖片打框,界面如下:

 

  (3)生成xml文件,內容如下:

 

  (4)將需要訓練的所有圖片進行該操作。

 

但是查看Fast R-CNN算法中,使用到的數據集格式並不是xml,而是txt格式,最前面為圖片地址,中間為坐標,最后為檢測物體的標簽。Kitti數據集部分截圖如下:

 

 3.按照Kitti的格式,將已經生成的xml文件轉化為txt

代碼如下:

import xml.dom.minidom
import os
import os.path

i=0
for ii in range(1,500):
print('這是第',ii,'張圖片')
s = '%05d' % ii # 補0
src = 'F:/ProPycharm/PyProject/XmlToTxt-master/data/train_val_00001-00499xlm/'+str(s)+''+'.xml'
# print(src)

# 保存生成的txt地址
save_dir = 'F:/ProPycharm/PyProject/XmlToTxt-master/data/train_val_00001-00499txt'
if not os.path.exists(save_dir):
os.mkdir(save_dir)
f = open(os.path.join(save_dir, 'name.txt'), 'a')

DOMTree = xml.dom.minidom.parse(src)
annotation = DOMTree.documentElement
filename = annotation.getElementsByTagName("filename")[0]
imgname = 'F:/ProPycharm/PyProject/XmlToTxt-master/data/train_val_00001-00499txt/'+filename.childNodes[0].data
# print(imgname)

objects = annotation.getElementsByTagName("object")
loc = [] # 文檔保存格式:文件名 坐標
imaname00 =[]
for object in objects:
bbox = object.getElementsByTagName("bndbox")[0]
leftTopx = bbox.getElementsByTagName("xmin")[0]
lefttopx = leftTopx.childNodes[0].data
leftTopy = bbox.getElementsByTagName("ymin")[0]
lefttopy = leftTopy.childNodes[0].data
rightTopx = bbox.getElementsByTagName("xmax")[0]
righttopx = rightTopx.childNodes[0].data
rightTopy = bbox.getElementsByTagName("ymax")[0]
righttopy = rightTopy.childNodes[0].data
name = object.getElementsByTagName('name')[0]
# print(lefttopx, lefttopy, righttopx, righttopy, name.childNodes[0].data)
loc = loc + [imgname, lefttopx, lefttopy, righttopx, righttopy, name.childNodes[0].data]
# print(loc)

for num in range(len(loc)):
print(str(loc[num]))
if num % 6 == 5:
f.write(str(loc[num]))
f.write('\n')
else:
f.write(str(loc[num]) + ',')
# f.write('\n')
f.close()

注意:
1.最開始生成的txt中,全部以“,”為分隔符,導致標簽后面依然有一個多余的“,”
解決方法:對每一行的數據長度進行取余操作,如果長度為6,就換行。因為每行保存的數據中,只有6個:一個地址,四個坐標。一個標簽。如果不是這樣,就以“,”為分隔符寫進去。
2.在進行for循環時,雖然讀取了500張圖片的xml,但是保存的txt文件中只有最后一張圖片的信息,前面499張圖片的信息都沒有保存。因為沒for一次,保存的信息會自動刷新一次,所以前面499張圖片的txt內容被覆蓋了!
解決方法:將f = open(os.path.join(save_dir, 'name.txt'), 'w') 換為 f = open(os.path.join(save_dir, 'name.txt'), 'a')

最終生成了正確的txt,內容如下:

 

 
        

 


免責聲明!

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



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