基于深度学习的车辆信息识别(一):车辆颜色识别
背景
导师布置了一个项目任务要求摄像头对路过的车辆进行实时监控拍摄的照片进行自动分析识别
- 车牌号
- 车体颜色
- 车辆品牌名称(例如奥迪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.
