1,下载caffe-ssd 并编译安装
按照https://github.com/bei91/caffe/tree/ssd上的步骤安装即可
2,下载交通灯项目
https://github.com/hailuo0112/TrafficLightsDetection
3,下载LISA数据
http://cvrr.ucsd.edu/vivachallenge/index.php/traffic-light/traffic-light-detection/
4,制作数据
1)写脚本从LISA的csv的label数据进行格式转换成ssd要求的格式,一张图片对应一个txt,必须数目名称严格对应,不然生成lmdb时候出错。txt格式如下
类别序号 x_min y_min x_max y_max
如果一幅图片多个目标,直接多行就行。
脚本程序参考:
读取read_csv:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import sys
import os
#import cv2
dict = {'go': '1', 'goForward': '2', 'goLeft': '3', 'stop': '4', 'stopLeft': '5', 'warning': '6',
'WarningLeft': '7', 'non_of_above': '8'}
def read_csv(imput_file, out__path):
csv = open(os.path.abspath(imput_file), 'r')
csv.readline() # Discard the header-line.
lines = csv.readlines()
file_output = open(out__path+'/output.txt', 'w')
image_name2 = ''
for line in lines:
Comp = line.split(';')
Comp2 = Comp[0].split('/')
image_name = Comp2[1]
print(image_name)
if image_name == image_name2: //csv的label同一图片的不同目标分开列了,这里要合并回去
file_output.write(' ' + ','.join(Comp[2:6]) + ',' + dict[Comp[1]])
else:
file_output.write('\n' + image_name + ' ' + ','.join(Comp[2:6]) + ',' + dict[Comp[1]])
image_name2 = image_name
file_output.close()
csv.close()
if __name__ == '__main__':
if len(sys.argv) < 2:
print(__doc__)
sys.exit(-1)
label_file = sys.argv[1]
output_folder = None if len(sys.argv) < 3 else sys.argv[2]
read_csv(label_file, output_folder)
转换成
名称 真值坐标 类别 真值坐标 类别
再用下面脚本转一下
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 27 13:46:53 2017
@author: zhouwl
"""
def labeled_sample(image_txt_full_path, save_txt_path):
fr = open(image_txt_full_path,'r')
min_est = 30
images = fr.readlines()
cnt = 0
for tmp, image in enumerate(images):
#print('{:.2f}%'.format(float(tmp+1)*100/len(images)))
inx = image.find('.png')
if inx != -1 :
# image_name = image[:inx].split('/')[-1]
image_name = image[:inx]
#print(image_name)
image_num = image_name[10:15]
#print(image_num)
if cnt != int(image_num): //有的图片没有目标,这样在图片和txt数量上会不一致,输出没有目标的图像序号
diff = int(image_num)-cnt
cnt = int(image_num)
print(image_num + ' ' + str(diff))
cnt += 1
else:
cnt += 1
inx = inx+4
corrids = image[inx:].strip('\n')
corrids = corrids.strip()
corrids = corrids.split(' ')
target_num = len(corrids)
write_full_path = save_txt_path + image_name + '.txt'
wr_context = ''
for i, corrid in enumerate(corrids):
corrid = corrid.replace(',', ' ')
#print(corrid)
test_cor = corrid.split(' ')
#print(test_cor)
zz = test_cor[0] + ' ' + test_cor[1] + ' ' + test_cor[2] + ' ' + test_cor[3]
#print(zz)
zz_c = test_cor[4]
#print(zz_c)
#area = int(test_cor[2])*int(test_cor[3])
#if area > min_est:
#wr_context = wr_context + zz_c +'-sign ' + zz + '\n'
wr_context = wr_context + zz_c + ' ' + zz + '\n'
#else:
#target_num -= 1
if target_num > 0:
fw = open(write_full_path,'w')
#fw.write(str(target_num) + '\n')
fw.write(wr_context)
fw.close()
fr.close()
if __name__ == '__main__':
root = '/home/wanghl/VOC-jiaoben/'
image_txt_full_path = root + 'output.txt'
save_txt_path = root + 'labels/'
labeled_sample(image_txt_full_path, save_txt_path)
--------------------
其实可以直接写一个脚本就完事了,为毛要弄成两个。。。服了
会生成一个 label文件夹,里面有ssd需要的label格式
2)用trafficlightsdetection-master/data下的脚本来生成lmdb数据格式
运行 ./create_list.sh 要修改里面的路径
运行 ./create_data.sh 要修改里面的路径
会生成一个lmdb的文件夹,里面有LISA_test_lmdb 和 LISA_trainval_lmdb的数据文件。
3)修改/home/wanghl/TrafficLightsDetection-master/models/VGGNet/LISA/SSD_414x125下面的网络文件的数据路径,
不然执行python train_ssd_lisa.py 的时候会出现下面的错误
check failed:mdb_status==0(2vs.0)No such file or directiry
如果还有错,命令前面加上sudo
然后就可以跑训练啦。