首先确保已经用VS2013打开Caffe.sln并编译好了libcaffe、caffe和convert_imageset这三个项目。
一、数据准备
1.先准备一个文件夹存放所有训练用的图片文件,再准备一个trainlist.txt文件,包含图片名及其对应的标签,格式如下:
imagename1.jpg 0
imagename2.jpg 1
imagename3.jpg 1
...
这里提供一个简陋的Python脚本用于划分数据集和生成相应的list.txt文件,不保证样本数目均衡:
import os
import shutil
import random
def CreateFileList(images_path, txt_save_path):
#创建list.txt文件
with open(txt_save_path,"w") as fw:
#查看图片目录下的文件
image_names = os.listdir(images_path)
#遍历所有文件名
for image_name in image_names:
label=image_name[:image_name.find('_')]
fw.write(image_name + ' '+label+'\n')
#打印成功信息
print ("生成list.txt文件成功!")
def DivideDatasets(root_path):
"""
通过指定图片集所在路径root_path,按比例(6:2:2)划分训练、验证和测试数据集,以及对应的trainlist.txt文件.
要求:root_path路径下【只有图片】,且图片名以"label_"开头,例如1_猫咪.jpg,0_狗子.jpg
"""
#获得数据集信息并初始化参数
image_names = os.listdir(root_path)
all_num=len(image_names)
train_num=int(3*all_num/5) #6/10
verify_num=int(all_num/5) #2/10
end_of_verify=train_num+verify_num
num=1
# 随机打乱文件名顺序
random.shuffle(image_names)
#创建所需目录
train_path=root_path+'train\\'
verify_path=root_path+'verify\\'
test_path=root_path+'test\\'
if not os.path.exists(train_path):
os.makedirs(train_path)
if not os.path.exists(verify_path):
os.makedirs(verify_path)
if not os.path.exists(test_path):
os.makedirs(test_path)
# 移动文件到目标文件夹
for image_name in image_names:
if num<=train_num:
shutil.move(root_path+image_name,train_path+image_name)
elif num<=end_of_verify:
shutil.move(root_path+image_name,verify_path+image_name)
else:
shutil.move(root_path+image_name,test_path+image_name)
num+=1
# 生成各数据集的list.txt文件
CreateFileList(train_path,root_path+'trainlist.txt')
CreateFileList(verify_path,root_path+'verifylist.txt')
CreateFileList(test_path,root_path+'testlist.txt')
print("数据划分成功!")
#定义图片集根目录
root_path='D:\\caffe-window\\caffe-master\\my_caffe_project\\data\\imageset\\'
#调用划分函数
DivideDatasets(root_path)
2.然后调用编译好的convert_imageset.exe将图片数据集转换为适合Caffe快速读取的lmdb格式,具体做法是在caffe-master文件夹里新建批处理文件my_data_convert.bat,以灰度图为例,内容如下:
Build\x64\Release\convert_imageset --gray=true --shuffle --backend=lmdb my_caffe_project\data\imageset\train\ my_caffe_project\data\imageset\trainlist.txt my_caffe_project\data\LMDB\trainset
Build\x64\Release\convert_imageset --gray=true --shuffle --backend=lmdb my_caffe_project\data\imageset\verify\ my_caffe_project\data\imageset\verifylist.txt my_caffe_project\data\LMDB\verifyset
Build\x64\Release\convert_imageset --gray=true --shuffle --backend=lmdb my_caffe_project\data\imageset\test\ my_caffe_project\data\imageset\testlist.txt my_caffe_project\data\LMDB\testset
Pause
#注意上述Build和my_caffe_project都是caffe-master的子目录。
编辑好保存,双击.bat文件运行即可。
二、修改定义好网络配置文件train_test.prototxt和训练参数配置文件solver.prototxt
假设两个配置文件都在目录caffe-master\my_caffe_project\mynet\下,网络结构和训练参数都设置好之后,只需修改train_test.prototxt中数据层的训练集和测试集lmdb文件所在路径,修改为我们在上一步生成的lmdb文件所在路径:
...
data_param {
source: "my_caffe_project/data/LMDB/imageset_train_lmdb"
batch_size: 64
backend: LMDB
...
data_param {
source: "my_caffe_project/data/LMDB/imageset_test_lmdb"
batch_size: 100
backend: LMDB
#注意:路径中要用'/'分隔。
然后修改solver.prototxt中的net参数和snapshot_prefix参数,指定网络配置文件的路径和网络快照保存位置:
net: "my_caffe_project/mynet/train_test.prototxt"
...
snapshot_prefix: "my_caffe_project/mynet/mynet"
#最后一个'mynet'表示网络快照文件的前缀
#注意:路径中要用'/'分隔。
三、调用caffe.exe训练网络
在caffe-master文件夹下新建批处理文件mynet_train_run.bat文件,编辑如下命令:
Build\x64\Release\caffe.exe train --solver=my_caffe_project\mynet\solver.prototxt --gpu=0
pause
编辑好保存,双击.bat文件运行即可。