Advertisement

基于深度学习的车辆信息识别(一):车辆颜色识别

阅读量:

背景

导师布置了一个项目任务要求摄像头对路过的车辆进行实时监控拍摄的照片进行自动分析识别

  • 车牌号
  • 车体颜色
  • 车辆品牌名称(例如奥迪A6等)
  • 驾驶员是否佩戴了安全带
  • 车辆是否贴有年度检验标志
    等等……

一项任务具有相当的难度。
计划首先完成较为简单的子任务。
就具体实现而言,
可以考虑以下方向:
颜色识别和安全带检测。
就品牌识别而言,
则显得力不从心。
尽管如此,
在现有条件下尽力做到最好。


实验平台

本开发平台基于Caffe框架,并参考了小咸鱼博客中关于(pretrained CaffeNet+finetune)的具体实现方案作为参考依据。在此基础上进一步补充了一些具体的实施细节。经过训练得到的模型文件已发布至百度网盘

1. 训练数据准备

在caffe/examples目录下创建car_color folder,并在其内创建以下几个folder:
car_color/data: 存储training和validation data
car_color/models: 存储prototxt文件以及经过training后所得的model
car_color/pre_train_models: 存储pre-trained CaffeNet model

创建新文件color_map.txt,并用于存储待分类的颜色信息;这里我们详细分类为8个不同的颜色类别

复制代码
    black
    white
    red
    blue
    green
    gray
    yellow
    brown

对每种颜色划分train和valid数据:

复制代码
    # ratio for train and valid data
    train_ratio = 0.8
    val_ratio = 0.2
    
    if not os.path.exists('train/' + color):
    os.makedirs('train/' + color)
    if not os.path.exists('val/' + color):
    os.makedirs('val/' + color)
    
    num = len(os.listdir('raw_data/' + color))
    print("Folder {} has {} images.".format(color, num))
    
    for file in os.listdir('raw_data/' + color):
    oldfile = 'raw_data/{}/{}'.format(color, file)
    if train_num > 0:
        newfile = 'train/{}'.format(file)
        shutil.copyfile(oldfile, newfile)
        train_num -= 1
    elif val_num > 0:
        newfile = 'val/{}'.format(file)
        shutil.copyfile(oldfile, newfile)
        val_num -= 1
    else:
        pass

创建train.txt和val.txt,用于lmdb数据库的生成:

复制代码
    prefix = '/your/path/caffe/examples/car_color/data/'
    def make_dict(syn_file):
    i = 0
    with open(syn_file, 'r') as df:
        for kv in [d.strip().split(' ') for d in df]:
            dict[kv[0]] = i; i = i + 1
    dict = {}
    make_dict('color_map.txt')
    
    # list file directories
    command = 'cd %s%s; find -name *.jpg | cut -d ''/'' -f2-3 >train.txt' % (prefix, train)
    system(command)
    command = 'cd %s%s; find -name *.jpg | cut -d ''/'' -f2-3 >val.txt' % (prefix, val)
    system(command)
    
    # add label
    train_in = open(prefix + train + 'train.txt')
    val_in = open(prefix + val + 'val.txt')
    train_out = open(prefix + 'train.txt', 'w')
    val_out = open(prefix + 'val.txt', 'w')
    for d in train_in:
    train_out.write(d[0:len(d)-1] + ' ' + str(dict[d.strip().split('/')[0]]) + '\n')
    for d in val_in:
    val_out.write(d[0:len(d)-1] + ' ' + str(dict[d.strip().split('/')[0]]) + '\n')

生成的train.txt形如:

复制代码
    blue/016_011_00011.jpg 3
    brown/001_001_00005.jpg 7
    brown/002_002_00001.jpg 7
    brown/002_002_00003.jpg 7
    brown/003_001_00002.jpg 7
    brown/006_001_00003.jpg 7
    ...

models目录和pre_train_models目录
1. 从models/bvlc_reference_caffenet下拷贝train_val.prototxt、deploy.prototxt和solver.prototxt这三个文件到examples/ car_color/models,并修改对应的路径。
2. 修改train_val.prototxt中fc8的名称和输出层节点数。
3. 下载预训练的CaffeModel至目录examples/car_color/pre_train_models。
篇幅问题不做赘述,具体可以参考小咸鱼_的博客。

生成lmdb数据库和图像均值

复制代码
    ./examples/car_color/create_imagenet.sh
    ./examples/car_color/make_imagenet_mean.sh

2. 开始训练

复制代码
    ./build/tools/caffe train -solver examples/car_color/models/solver.prototxt -weights examples/car_color/pre_train_models/bvlc_reference_caffenet.caffemodel

这里有必要把初始学习率设置得更低一些,在难以收敛的情况下非常必要。我已经将其设置为1\times 10^{-3}

3. 实验结果

复制代码
    I0518 11:12:40.746090 12784 solver.cpp:341] Iteration 1000, Testing net (#0)
    I0518 11:12:40.938202 12784 solver.cpp:409]     Test net output #0: accuracy = 0.975
    I0518 11:12:40.938266 12784 solver.cpp:409]     Test net output #1: loss = 0.0606646 (* 1 = 0.0606646 loss)
    I0518 11:12:40.938277 12784 solver.cpp:326] Optimization Done.
    I0518 11:12:40.938285 12784 caffe.cpp:215] Optimization Done.

全部评论 (0)

还没有任何评论哟~