Caffe学习笔记系列2—基于AlexNet网络的模型训练和特征提取
本节主要讲解AlexNet网络的模型训练和特征提取,主要是利用AlexNet对自己的数据进行训练。
在“Caffe学习笔记系列”文件夹中建立“CaffeTest2”文件夹,本节的所有操作在该文件夹进行。
一、模型的训练
1、 源数据(图片)准备。首先建立Data文件夹,文件夹里面再建立子文件夹,子文件夹命名从0开始,用数据类别命名,即用图片的类别命名;
2、 将图片名称转化成.txt格式,形如“1\41_20170503074032\1_23.jpg(图片路径) 1(图片类别)”。注意我的类别文件夹里面还建立了文件夹,这是因为我项目需要,可以不按照这种写法。提供一段转化为该txt格式的代码,本部分代码工程在“Caffe学习笔记系列”文件夹—>“CaffeTest2”文件夹—>“getTrainTxt”文件夹中。如下:
#include<vector>
#include<opencv2\opencv.hpp>
#include<iostream>
#include<string>
#include<fstream>
#include<direct.h>
using namespace std;
using namespace cv;
//生成AlexNet训练的数据格式
//图片存放的目录如下:Data\类别\相机号\xx.jpg
//得到的训练集的txt格式:类别\相机号\xx.jpg 类别
//得到的验证集的txt格式:类别\相机号\xx.jpg 类别
//注:训练集和验证集交错生成
void main()
{
stringtrainData = "../../trainData.txt";
stringvalData = "../../valData.txt";
ofstreamtrainOut(trainData);
ofstreamvalOut(valData);
intnumstart = 0, numend = 73;//类别;
for(int i = numstart; i < numend; i++)
{
stringmainFolder = "../../Data/";
mainFolder= mainFolder + to_string(i);
Directorydir;
stringexten = "*";
booladdPath = true;
vector<string>filenames = dir.GetListFolders(mainFolder, exten, addPath);
for(int j = 0; j < filenames.size(); j++)
{
vector<string>tmp = dir.GetListFiles(filenames[j], "*.jpg", true);
for(int k = 0; k < tmp.size(); k++)
{
if(k % 4 != 0)//训练集:验证集=4:1
trainOut<< tmp[k] << " " << i << endl;//训练
else
valOut<< tmp[k] << " " << i << endl;
}
}
}
}
3、步骤2中生成的txt格式形如“../../Data/1/41_20170503074032/1_23.jpg 1”,需要将其替换生成如“1\41_20170503074032\1_23.jpg 1”格式;
4、 转换生成lmdb数据文件。建立convert文本文件,里面编写如下代码:
..\CaffeDev\caffe-master\Build\x64\Release\convert_imageset.exe--resize_width=227 --resize_height=227 Data/ trainData.txt train_lmdb -backend=lmdb
pause
然后,将其后缀名改为.bat,运行之即可。生成验证文件的数据格式时,将上面中的“trainData.txt”改为“valData.txt”,“train_lmdb”改为“val_lmdb”。
5、 生成均值文件,编写如下代码的mean.bat文件即可,并运行之。
..\CaffeDev\caffe-master\Build\x64\Release\compute_image_mean.exetrain_lmdb mean.binaryproto --backend=lmdb
pause
6、 编写如下代码的train.bat文件即可,并运行之。
..\CaffeDev\caffe-master\Build\x64\Release\caffe.exe train--solver=solver.prototxt
pause
7、其余的.prototxt格式的网络文件,自己修改一下类别即可。
提示,如果想继承已有的网络参数,可以编写如下的train.bat:
..\CaffeDev\caffe-master\Build\x64\Release\caffe.exetrain --solver=solver.prototxt --weights= bvlc_reference_caffenet.caffemodel
pause
如果想接着上次中断的地方继续训练,可以编写如下的train.bat:
..\CaffeDev\caffe-master\Build\x64\Release\caffe.exetrain --solver=solver.prototxt --snapshot=caffenet_train_iter_9000.solverstate
pause
二、卷积权重和特征可视化+提取图片的FC7层特征
该部分的具体代码如下,读者可以先clone下来跑一遍有个感性认识,然后再深究细节。本部分的代码工程在“Caffe学习笔记系列”文件夹—>“CaffeTest2”文件夹—>“WeightandFeature”文件夹中。
头文件featAndweightVisualize.h如下:
#pragmaonce
#include<caffe/caffe.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<algorithm>
#include<iosfwd>
#include<memory>
#include<string>
#include<utility>
#include<vector>
usingnamespace caffe;
usingnamespace cv;
usingnamespace std;
//===可视化卷积权重及卷积响应,
//===网络是官方的AlexNet