用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

然后就可以跑训练啦。




好的,针对你的问题,这里简单介绍一下如何使用caffe-ssd训练模型进行目标检测。 caffe-ssd是基于caffe框架实现的单阶段目标检测算法,使用预训练模型可以加快模型训练的速度,同时也可以提高模型的检测精度。下面是使用预训练模型做目标检测的步骤: 1. 下载预训练模型 caffe-ssd官方提供了一些预训练模型,可以在这里下载:https://github.com/weiliu89/caffe/tree/ssd#models。选择适合自己数据集的模型进行下载。 2. 准备数据集 准备自己的数据集,包括训练集、验证集和测试集。数据集需要满足SSD数据格式要求,即每个样本需要有对应的标注文件,标注文件格式为:类别id、xmin、ymin、xmax、ymax(例如:0 0.1 0.2 0.3 0.4,表示类别为0,左上角坐标为(0.1, 0.2),右下角坐标为(0.3, 0.4))。 3. 修改配置文件 修改caffe-ssd的配置文件,将模型路径、数据路径、类别数等参数配置正确。其中,模型路径需要指定为下载的预训练模型路径。 4. 训练模型 使用修改后的配置文件训练模型。训练过程中可以调整学习率、迭代次数等参数,以达到更好的效果。 5. 测试模型 使用测试集对训练好的模型进行测试,并计算模型在测试集上的精度和召回率等指标。 以上就是使用caffe-ssd训练模型做目标检测的基本步骤。需要注意的是,使用预训练模型虽然可以加速模型训练过程,但是如果数据集和预训练模型的差异较大,仍然需要进行微调。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值