caffe finetune操作流程详述(Windows)

【概述】

caffe finetune用于数据集较少的情形。当数据集较少时,用搭建的新网络来训练,要么容易过拟合,要么容易导致效果差(识别准确率低),因而采用对已有的类似分类网络进行调整(finetune),再此基础之上训练自己的数据,就能得到自己需要的分类网络来进行模式识别应用。

本文是在已知网络模型Caffenet的基础之上,进行微调,来训练所需的分类模型的,同时,以四分类为例来讲解(手边在做的是四分类,方便讲),分类数目可以在1000以内均可。

在处理过程中,本文主要介绍以下几点:

1.数据集的制作,从图片到规范化的数据集过程

2.用Windows下的批处理脚本(.bat文件)来进行相关的指令操作;

3.相关文件的修改调整,包括网络的调整以及后续函数调用

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【数据集制作】

1.图片分类整理--建立两个文件夹(训练集-train 测试集-val)

将各个类别的数据图片放入两个文件夹中:

在本例中训练集与测试集每个类别的图片数量约为300:100(例:train>airline:300 ,val>airline:100)

此外,每张图片的分辨率应为256*256,并按照格式命名。(如下)

2.制作标签文件--train.txt--val.txt--lables.txt

其中,lables.txt可以直接编辑,如下:

此外,对于train.txt与val.txt可以有两种方式来处理:

>一次性处理:

建立create_imageset.txt并编辑如下,然后修改文件后缀名,将.txt改为.bat,双击运行即可:

# /usr/bin/env sh
DATA=myfile/datatest/train/  
DATASAVE=myfile/datatest/
echo "Create train.txt..."

find $DATA -name airline*.jpg | cut -d '/' -f3-5 | sed "s/$/ 0/">>$DATASAVE/train.txt
find $DATA -name bird*.jpg | cut -d '/' -f3-5 | sed "s/$/ 1/">>$DATASAVE/tmp.txt
find $DATA -name UAV*.jpg | cut -d '/' -f3-5 | sed "s/$/ 2/">>$DATASAVE/tmp1.txt
find $DATA -name other*.jpg | cut -d '/' -f3-5 | sed "s/$/ 3/">>$DATASAVE/tmp2.txt

cat $DATASAVE/tmp.txt>>$DATASAVE/train.txt
cat $DATASAVE/tmp1.txt>>$DATASAVE/train.txt
cat $DATASAVE/tmp2.txt>>$DATASAVE/train.txt

rm -rf $DATASAVE/tmp.txt
rm -rf $DATASAVE/tmp1.txt
rm -rf $DATASAVE/tmp2.txt

echo "Done.."

>分别处理再合并:

在每一个类别的图片文件夹内,运行一个简单的批处理指令即可,最后将每个文件中生成的列表合在一起即可(复制粘贴)

DIR *.*/B>airline.txt

方法二是方法一的分解,后者较为麻烦。

生成的train.txt如下:四类全部都包含,文件路径要注意观察;val.txt与此类似。

 

3.转化成lmdb格式或者leveldb格式

运行批处理程序即可:

E:\caffe_leexin_windows\Build\x64\Release\convert_imageset.exe --resize_height=256 --resize_width=256 --shuffle --backend="leveldb" E:\caffe_lx_windows\tupian\ E:\caffe_lx_windows\tupian\train.txt E:\caffe_lx_windows\tupian\train_leveldb  
pause  
E:\caffe_leexin_windows\Build\x64\Release\convert_imageset.exe --resize_height=256 --resize_width=256 --shuffle --backend="leveldb" E:\caffe_lx_windows\tupian\ E:\caffe_lx_windows\tupian\val.txt E:\caffe_lx_windows\tupian\val_leveldb  
pause  

如果要转为lmdb格式,只需将leveldb换成lmdb即可,生成文件如下:

到此,完成了数据集的制作。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【训练模型】

1.生成均值文件--myself_mean.binaryproto

代码如下:

E:\caffe_leexin_windows\Build\x64\Release\compute_image_mean.exe --backend="leveldb"  E:\caffe_lx_windows\tupian\train_leveldb E:\caffe_lx_windows\tupian\myself_mean.binaryproto
pause  

运行结果:

2.修改网络文件--train_val.prototxt

>数据输入层:训练集路径

>数据输入层:测试集路径

>fc8层:修改分类数

3.修改训练参数--solver.prototxt

修改路径,迭代次数,以及其他参数指标(每个量的含义,百度即可)

4.运行train.bat进行训练

E:\caffe_leexin_windows\Build\x64\Release\caffe.exe train --solver=E:/caffe_lx_windows/solver.prototxt  -weights=E:/caffe_lx_windows/bvlc_reference_caffenet.caffemodel
pause  

训练时长取决于迭代次数等参数,生成模型文件的时间与snapshot设定相关,参数如上时,第500次迭代后,保存一份网络模型,如图所示:(约3h+)

备注:以下三个文件是需要下载caffenet网络模型的,百度一下就有了。

训练后得到如下文件:

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【函数调用模型】

1.将所需文件放在项目工程根目录下

其中,deploy.prototxt是在train_val.prototxt的基础之上修改所得:

2.在VS工程项目中配置好caffe

可以百度如何配置,有问题可以交流,有机会的话会再补一篇配置caffe+VS的文章

3.编写调用测试程序即可


#include <iostream>    
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <fstream> 
#include <string> 
#include <iostream>
#include "classification.h"
#include "LayerHead.h"

using namespace cv;
using namespace std;
int main()
{
	caffe::Caffe::set_mode(caffe::Caffe::CPU);
	CvFont font;
	double hscale = 1.0;
	double vscale = 1.0;
	cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX | CV_FONT_ITALIC, hscale, vscale, 0, 2);
	CvScalar textColor = cvScalar(0, 0, 255);
	CvPoint textPos1 = cvPoint(10, 30);
	CvPoint textPos2 = cvPoint(10, 60);
	char str1[20],str2[20];
	
	IplImage * img, *imgresize; 
	img = cvLoadImage("test\\UAV_Y (8).jpg",1);
	imgresize = cvCreateImage(cvSize(256, 256), IPL_DEPTH_8U, img->nChannels);
	cvResize(img, imgresize, CV_INTER_LINEAR);
	
	
	Classifier cl("caffe_model\\deploy.prototxt", "caffe_model\\leexin_caffenet_train_iter_500.caffemodel", "caffe_model\\myself_mean.binaryproto", "caffe_model\\lables.txt");
	
	std::vector<Prediction>pre = cl.Classify(imgresize);
	sprintf(str1, "%s", pre[0].first);
	cvPutText(imgresize, str1, textPos1, &font, textColor);
	sprintf(str2,"CFV=%f", pre[0].second);
	cvPutText(imgresize, str2, textPos2, &font, textColor);
	
	cvSaveImage("test\\UAV_Y (8)_1.jpg", imgresize);
	cvShowImage("1", img);
	cvShowImage("2", imgresize);
	std::cout << pre[0].first << std::endl;
	std::cout << pre[0].second << std::endl;
	waitKey(0);
	cvReleaseImage(&img);
	cvReleaseImage(&imgresize);
	return 0;
}

4.运行结果展示,其余结果类似

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【总结】

1.只是以对caffenet调整为例,可以选取其他网络模型;

2.分类数可以按需调整;

3.可以通过调整训练参数,来改善识别分类效果;

欢迎指正&交流,一起学习,共同进步。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值