Windows10下使用Caffe训练神经网络(含数据库的生成方法)

首先,特别感谢以下参考链接的作者

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路径下应该有以下一些文件和文件夹:

二、训练模型

此处我使用的是Caffe自带的模型进行修改,其路径在models/bvlc_alexnet
1、修改模型
首先把models/bvlc_alexnet下的solver.prototxt和train_val.prototxt复制到 examples/mylife路径下,然后打开solver.prototxt文件(建议下载一个Notepad++),将其修改为如下:

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温度蹭蹭蹭就上去了
各个参数具体含义参考如下:
https://www.cnblogs.com/denny402/p/5074049.html

然后修改train_val.prototxt文件,首先就是修改Data层的4个路径(注意,自行修改成自己的相应路径):
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
  }
}
除此之外,最后一层输出神经元的个数也需要进行修改(模型里是1000类)。
至此,所有修改都已经完成。
(为什么都是绝对路径?总之如果出现找不到文件或者文件夹等错误时,就把相对路径修改成绝对路径)

2、执行训练
接下来,在cmd中输入如下指令即可:(注意,必须先cd到caffe根目录下)

Build\x64\Release\caffe.exe train --solver=examples\myfile\solver.prototxt
大功告成,等着训练结果即可。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值