赞
踩
为了不增加工作量,可以直接下载我上传的数据集:
https://download.csdn.net/download/qq_34852955/16230986?spm=1001.2014.3001.5501
…我没设置要积分和金币,系统自己设置的,等我过几天有时间传到github上面吧
中国交通标志检测数据集CCTSDB,由长沙理工大学提供,包括上万张有标注的图片,数据集下载地址为:
ps:推荐只使用前4000张照片,因为后面有很多张图片没有标注,需要一张一张的删除,太过于麻烦,所以尽量用前4000张图片,没有标注的图片比较少,而且对于一般网络来说训练4000张图片已经可以满足要求
https://github.com/csust7zhangjm/CCTSDB
VOC格式主要包含三个文件夹Annotations,ImageSets,JPEGImages,主要适用于faster-rcnn等模型的训练,ImageSets下面有一个Main的文件夹,如下图,一定按照这个名字和格式建好文件夹:
将所有的图片数据放入JPEGImages文件夹
touch rename.sh
将这个脚本粘贴进去
# 初始化变量
i=0
#将png格式转换成jpg格式
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.png}.jpg"'
# for 循环
for name in *.jpg
do
# 注意加双引号
echo "$name"
# 注意赋值方式
echo "$i$name"
# 注意name加双引号
mv "$name" "$i$name"
rm *png
done
./rename.sh
你会神奇的发现所有的png都变成的jpg,并且名字从五位变成了六位。
将CCTSDB的GroundTruth文件夹下的groundtruth0000-9999.txt文件复制到VOC2007文件夹下的Annotations文件夹下,并使用excel处理一下,让它的名字前面都加一个0,并将所有的png变成jpg(这个特别简单不细讲),变成和前面处理过图片一样的6位
之后
touch extract.py
将下面的内容复制进去
#! /usr/bin/python
# -*- coding:UTF-8 -*-
import re
f=open('groundtruth0000-9999.txt','r')
f1=f.readlines()
for i in f1:
#p='%s.txt'%(i[7:15])
p='%s.txt'%re.findall("(.*).jpg*",i)
c= p.strip()[2:8]+".txt"
print c
with open(c,'w')as a:
a.write(i)
python extract.py
神奇的发现,脚本将标注的数据提取出来并且排序,并将里面每一行分割成一个文件。
最终VOC格式要xml数据类型所以要继续将txt转换成xml:
touch txt2xml.py
将下面代码复制进去,路径改成自己的路径
#! /usr/bin/python # -*- coding:UTF-8 -*- import os, sys import glob from PIL import Image ###将txt格式文件转换为xml格式文件 # 图像存储位置 src_img_dir = "/home/lijing/py-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages" # 图像的 ground truth 的 txt 文件存放位置 #windows 系统路径用“\”,ubuntu 中用“/” src_txt_dir = "/home/lijing/py-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations" src_xml_dir = "/home/lijing/py-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations" #glob 返回的文件名只包括当前目录里的文件名,不包括子文件夹里的文件。 img_Lists = glob.glob(src_img_dir + '/*.jpg')#为图像路径列表 print(img_Lists) img_basenames = [] # e.g. 100.jpg for item in img_Lists: img_basenames.append(os.path.basename(item)) img_names = [] # e.g. 100 for item in img_basenames: temp1, temp2 = os.path.splitext(item) img_names.append(temp1) for img in img_names: im = Image.open((src_img_dir + '/' + img + '.jpg')) width, height = im.size # open the crospronding txt file gt = open(src_txt_dir + '/' + img + '.txt').read().splitlines() #gt = open(src_txt_dir + '/gt_' + img + '.txt').read().splitlines() # write in xml file #os.mknod(src_xml_dir + '/' + img + '.xml') xml_file = open((src_xml_dir + '/' + img + '.xml'), 'w') xml_file.write('<annotation>\n') xml_file.write(' <folder>VOCdevkit</folder>\n') xml_file.write(' <filename>' + str(img) + '.jpg' + '</filename>\n') xml_file.write(' <size>\n') xml_file.write(' <width>' + str(width) + '</width>\n') xml_file.write(' <height>' + str(height) + '</height>\n') xml_file.write(' <depth>3</depth>\n') xml_file.write(' </size>\n') # write the region of image on xml file for img_each_label in gt: spt = img_each_label.split(';') #这里如果txt里面是以逗号‘,’隔开的,那么就改为spt = img_each_label.split(',')。 xml_file.write(' <object>\n') xml_file.write(' <name>' + str(spt[5]) + '</name>\n') xml_file.write(' <pose>Unspecified</pose>\n') xml_file.write(' <truncated>0</truncated>\n') xml_file.write(' <difficult>0</difficult>\n') xml_file.write(' <bndbox>\n') xml_file.write(' <xmin>' + str(spt[1]) + '</xmin>\n') xml_file.write(' <ymin>' + str(spt[2]) + '</ymin>\n') xml_file.write(' <xmax>' + str(spt[3]) + '</xmax>\n') xml_file.write(' <ymax>' + str(spt[4]) + '</ymax>\n') xml_file.write(' </bndbox>\n') xml_file.write(' </object>\n') xml_file.write('</annotation>')
python txt2xml.py
又会神奇的发现每个txt都多了一个xml文件,xml的格式是这样的:
随便找一个地方,最好放在自己的数据集下,避免误导
touch train_vel.py
将下面代码复制进去,路径改成自己的路径
import os import random trainval_percent = 0.5 train_percent = 0.5 xmlfilepath = '/home/lijing/py-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations' txtsavepath = '/home/lijing/py-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Main' total_xml = os.listdir(xmlfilepath) num=len(total_xml) list=range(num) tv=int(num*trainval_percent) tr=int(tv*train_percent) trainval= random.sample(list,tv) train=random.sample(trainval,tr) ftrainval = open(txtsavepath+'/trainval.txt', 'w') ftest = open(txtsavepath+'/test.txt', 'w') ftrain = open(txtsavepath+'/train.txt', 'w') fval = open(txtsavepath+'/val.txt', 'w') for i in list: name=total_xml[i][:-4]+'\n' if i in trainval: ftrainval.write(name) if i in train: ftrain.write(name) else: fval.write(name) else: ftest.write(name) ftrainval.close() ftrain.close() fval.close() ftest .close()
神奇的发现在/ImageSets/Main文件夹下出现四个按照比例分配的四个txt文件
至此,CCTSDB已经转换成VOC格式可以进行训练了,我使用caffe进行的训练,训练步骤很简单,改几个文件就可以,可以参考其他博客:
https://blog.csdn.net/qq_34809033/article/details/84777418?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
我使用faster-rcnn训练的结果很好,有什么问题可以给我留言。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。