Honsia

导航

【目标检测】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,内容如下:

 


 

posted on 2019-05-10 14:21  Honsia  阅读(2181)  评论(1编辑  收藏  举报