首先,特别感谢以下参考链接的作者:
http://www.cnblogs.com/denny402/p/5082341.html
http://www.cnblogs.com/denny402/p/5083300.html
https://www.cnblogs.com/qw12/p/6160572.html
https://www.cnblogs.com/QingHuan/p/7306720.html
一、生成Caffe数据库
1、准备数据
参考链接中的作者提供了一些图片,共有500张图片,分为大巴车、恐龙、大象、鲜花和马五个类,每个类100张。可到网盘下载:https://pan.baidu.com/s/1dpHnqu
编号分别以3,4,5,6,7开头,各为一类。其中每类选出20张用作测试,其余80张用作训练。因此最终训练图片400张,测试图片100张,共5类。我在caffe根目录下的examples文件夹里新建了myflie文件夹,并将图片集放入其中。即,训练图片目录:examples/myfile/train,测试图片目录: examples/myfile/test
2、生成图片文件列表清单
在生成数据库之前,需要生成图片文件列表清单,一般为.txt文件。我创建.py脚本文件来执行这一步,具体代码create_txt.py如下(代码只是随便写的,可以优化):
import os
import os.path
import re
train_dir = "examples/myfile/train" #不修改路径则请将本代码放到caffe根目录
test_dir = "examples/myfile/test"
for parent,dirnames,filenames in os.walk(train_dir):
tr1 = re.compile(r'3.+')
tr2 = re.compile(r'4.+')
tr3 = re.compile(r'5.+')
tr4 = re.compile(r'6.+')
tr5 = re.compile(r'7.+')
for filename in filenames:
match1 = tr1.match(filename)
if match1:
file = open('examples/myfile/train.txt','a')
file.write('train/')
file.write(filename)
file.write(' 3\n') #不加换行\n可以会出问题
file.close()
for filename in filenames:
match2 = tr2.match(filename)
if match2:
file = open('examples/myfile/train.txt','a')
file.write('train/')
file.write(filename)
file.write(' 4\n')
file.close()
for filename in filenames:
match3 = tr3.match(filename)
if match3:
file = open('examples/myfile/train.txt','a')
file.write('train/')
file.write(filename)
file.write(' 5\n')
file.close()
for filename in filenames:
match4 = tr4.match(filename)
if match4:
file = open('examples/myfile/train.txt','a')
file.write('train/')
file.write(filename)
file.write(' 6\n')
file.close()
for filename in filenames:
match5 = tr5.match(filename)
if match5:
file = open('examples/myfile/train.txt','a')
file.write('train/')
file.write(filename)
file.write(' 7\n')
file.close()
for parent,dirnames,filenames in os.walk(test_dir):
tr1 = re.compile(r'3.+')
tr2 = re.compile(r'4.+')
tr3 = re.compile(r'5.+')
tr4 = re.compile(r'6.+')
tr5 = re.compile(r'7.+')
for filename in filenames:
match1 = tr1.match(filename)
if match1:
file = open('examples/myfile/test.txt','a')
file.write('test/')
file.write(filename)
file.write(' 3\n')
file.close()
for filename in filenames:
match2 = tr2.match(filename)
if match2:
file = open('examples/myfile/test.txt','a')
file.write('test/')
file.write(filename)
file.write(' 4\n')
file.close()
for filename in filenames:
match3 = tr3.match(filename)
if match3:
file = open('examples/myfile/test.txt','a')
file.write('test/')
file.write(filename)
file.write(' 5\n')
file.close()
for filename in filenames:
match4 = tr4.match(filename)
if match4:
file = open('examples/myfile/test.txt','a')
file.write('test/')
file.write(filename)
file.write(' 6\n')
file.close()
for filename in filenames:
match5 = tr5.match(filename)
if match5:
file = open('examples/myfile/test.txt','a')
file.write('test/')
file.write(filename)
file.write(' 7\n')
file.close()
关于正则表达式的用法可以参考:
https://www.cnblogs.com/dyfblog/p/5880728.html
关于文件读写操作可以参考:
https://www.cnblogs.com/bearkchan/p/8046494.html
将该文件放到caffe根目录下,打开cmd,并且cd指令进入到caffe根目录,然后执行python create_txt.py
执行后生成的txt文件如下:
3、生成lmdb数据库
在cmd中进入caffe根目录,分别执行以下 指令:
Build\x64\Release\convert_imageset.exe --shuffle --resize_height=256 --resize_width=256 examples\myfile\ examples\myfile\test.txt examples\myfile\test_lmdb
Build\x64\Release\convert_imageset.exe --shuffle --resize_height=256 --resize_width=256 examples\myfile\ examples\myfile\train.txt examples\myfile\train_lmdb
convert_imageset使用格式如下:
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
FLAGS: 图片参数组,后面详细介绍
ROOTFOLDER/: 图片存放的绝对路径,从linux系统根目录开始(注意,这里我是从别的博客复制下来的,现在是windows10系统,亲测可以不需要使用绝对路径)
LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片(上一步已经生成)
DB_NAME: 最终生成的db文件存放目录
FLAGS参数组详情如下:
-gray: 是否以灰度图的方式打开图片。程序调用opencv库中的imread()函数来打开图片,默认为false
-shuffle: 是否随机打乱图片顺序。默认为false
-backend:需要转换成的db文件格式,可选为leveldb或lmdb,默认为lmdb
-resize_width/resize_height: 改变图片的大小。在运行中,要求所有图片的尺寸一致,因此需要改变图片大小。 程序调用opencv库的resize()函数来对图片放大缩小,默认为0,不改变
-check_size: 检查所有的数据是否有相同的尺寸。默认为false,不检查
-encoded: 是否将原图片编码放入最终的数据中,默认为false
-encode_type: 与前一个参数对应,将图片编码为哪一个格式:'png','jpg' 等
4、生成均值文件
图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。caffe程序提供了一个计算均值的文件compute_image_mean.cpp,我们直接使用就可以。
Build\x64\Release\compute_image_mean.exe examples\myfile\train_lmdb examples\myfile\mean.binaryproto
至此,生成数据库的工作已经完成了,此时examples/mylife路径下应该有以下一些文件和文件夹:
二、训练模型
1、修改模型
net: "D:/Micro_Caffe/caffe-master/examples/myfile/train_val.prototxt" #路径自行修改
test_iter: 2
test_interval: 50
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 500
momentum: 0.9
weight_decay: 0.005
snapshot: 500 #注意:这一句和下一句可以不要,主要是用于保存模型
snapshot_prefix: "D:/Micro_Caffe/caffe-master/examples/myfile/model_test" #路径自行修改
solver_mode: GPU #没有GPU改用CPU,但是需要比较长的时间,并且CPU温度蹭蹭蹭就上去了
name: "AlexNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "D:/Micro_Caffe/caffe-master/examples/myfile/mean.binaryproto"
}
data_param {
source: "D:/Micro_Caffe/caffe-master/examples/myfile/train_lmdb"
batch_size: 256
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
mean_file: "D:/Micro_Caffe/caffe-master/examples/myfile/mean.binaryproto"
}
data_param {
source: "D:/Micro_Caffe/caffe-master/examples/myfile/test_lmdb"
batch_size: 50
backend: LMDB
}
}
2、执行训练
Build\x64\Release\caffe.exe train --solver=examples\myfile\solver.prototxt
大功告成,等着训练结果即可。