網上一直沒有找到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,內容如下: