Caffe学习笔记系列2—基于AlexNet网络的模型训练和特征提取

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
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值