用caffe-SSD训练交通信号灯LISA数据的流程

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

然后就可以跑训练啦。




猜你喜欢

转载自blog.csdn.net/baobei0112/article/details/80190555