本帖最后由 一路向北lm 于 2018-7-16 08:29 编辑
转载博客 https://blog.csdn.net/cesc_treze ... 61935?from=timeline 仅供大家参考学习
识别目标包括: 1.车牌号 2.车辆颜色 3.车辆品牌,具体到如奥迪A6之类 4.驾驶人是否系安全带 5.是否贴有年检标志 实验平台 开发平台使用Caffe,参考了博客小咸鱼_的实现(pretrained CaffeNet+finetune),本文主要在其基础上补充一些实现的细节。训练好的模型已经分享到百度云。 链接: https://pan.baidu.com/s/1eRSDFlo 密码: ahyx 1. 训练数据准备 在caffe/examples下建立目录car_color,并在其下面建立几个子目录: car_color/data:存放训练和验证数据 car_color/models:存放prototxt和训练得到的模型 car_color/pre_train_models:存放预训练的CaffeNet data目录 首先新建文件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
这里有必要把初始学习率设低一些,否则很难收敛。我用的是0.001。
最终实验时每个类别的训练和评估分别用了50/10张图片。
训练速度比我想象的要更快,50个Iter后Valid accuracy就到了72.5%,150个Iter后基本稳定在95%。
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.
|