caffe 训练自己的分类模型

学习caffe的最终目的,是可以利用自己的数据集,训练模型,并解决实际问题。

所以在前面跑通了mnist和cifar-10例程的基础上,尝试训练自己的模型,从头到尾走一遍所有的流程。准备数据、训练并得到模型,利用模型进行分类预测。


一、准备数据

1、在网上找了一些图片,分为五类,编号为0,1,2,3,4,每类训练数据50张,测试数据20张。博主将所有的train图片都放在了train文件夹下,编号为0-49,100-149,200-249,300-349,400-449,把所有的test图片都放在了test文件夹下,编号为0-19,100-119,200-219,300-319,400-419。

2、得到train.txt和test.txt清单文件。网上有很多方法,也可以自己用C++写代码实现。部分清单如下所示:

3、将train.txt和test.txt放在 与 train和test文件夹同一目录下。我的为:caffe-master\examples\myExample。

0.jpg 0
1.jpg 0
2.jpg 0
3.jpg 0
4.jpg 0
5.jpg 0
6.jpg 0
7.jpg 0
8.jpg 0
9.jpg 0
10.jpg 0
11.jpg 0
12.jpg 0
13.jpg 0
14.jpg 0
15.jpg 0
16.jpg 0
17.jpg 0
18.jpg 0
19.jpg 0
100.jpg 1
101.jpg 1
102.jpg 1


二、转换为lmdb格式

1、安装git客户端,方便后面运行.sh文件。  安装教程 

2、找到caffe-master\examples\imagenet目录下的create_imagenet.sh文件,并对其进行修改。

#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e

#EXAMPLE=examples/imagenet
DATA=E:/NotFineshed/caffeWin10/caffe-master/examples/myExample
TOOLS=E:/NotFineshed/caffeWin10/caffe-master/Build/x64/Release

TRAIN_DATA_ROOT=E:/NotFineshed/caffeWin10/caffe-master/examples/myExample/train/
VAL_DATA_ROOT=E:/NotFineshed/caffeWin10/caffe-master/examples/myExample/test/

# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true
if $RESIZE; then
  RESIZE_HEIGHT=256
  RESIZE_WIDTH=256
else
  RESIZE_HEIGHT=0
  RESIZE_WIDTH=0
fi

if [ ! -d "$TRAIN_DATA_ROOT" ]; then
  echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
  echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet training data is stored."
  exit 1
fi

if [ ! -d "$VAL_DATA_ROOT" ]; then
  echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
  echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet validation data is stored."
  exit 1
fi

echo "Creating train lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --backend=lmdb \
    --shuffle \
    $TRAIN_DATA_ROOT \
    $DATA/train.txt \
    $EXAMPLE/mydata_train_lmdb

echo "Creating val lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --backend=lmdb \
    --shuffle \
    $VAL_DATA_ROOT \
    $DATA/test.txt \
    $EXAMPLE/mydata_test_lmdb

echo "Done."

3、运行完成后,在git的文件位置目录下,得到两个文件夹 madata_train_lmdb 和 mydata_test_lmdb


三、生成图像均值

1、修改make_imagenet_mean.sh文件,如下所示

#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12

#EXAMPLE=examples/imagenet
DATA=E:/NotFineshed/caffeWin10/caffe-master/examples/myExample
TOOLS=E:/NotFineshed/caffeWin10/caffe-master/Build/x64/Release

$TOOLS/compute_image_mean.exe $DATA/mydata_train_lmdb $DATA/mydata_mean.binaryproto --backend=lmdb

echo "Done."
2、运行完成后,在caffe-master\examples\myExample目录下,生成mydata_mean.binaryproto文件。

四、创建模型并编写配置文件

1、模型就用caffe自带的caffenet模型,位置在 caffe-master\models\bvlc_reference_caffenet/文件夹下, 我们需要的三个文件是solver.prototxt 和train_val.prototxt、deploy.prototxt。博主将train_val.prototxt改名为train_test.prototxt。

2、修改其中的solver.prototxt,如下所示

net: "E:/NotFineshed/caffeWin10/caffe-master/examples/myExample/train_test.prototxt"
test_iter: 5
test_interval: 10
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 1000
momentum: 0.9
weight_decay: 0.005
solver_mode: GPU
snapshot: 500
snapshot_prefix: "E:/NotFineshed/caffeWin10/caffe-master/examples/myExample/minemodel"
3、修改train_test.protxt,需要修改两个阶段的data层。

    实际上就是修改两个data layer的mean_file和source这两个地方,其它都没有变化 。

    然后修改全连接层fc8的输出num,即分类数,我的为五类,所以改为5.

name: "CaffeNet"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 227
    mean_file: "E:/NotFineshed/caffeWin10/caffe-master/examples/myExample/mydata_mean.binaryproto"
  }
# mean pixel / channel-wise mean instead of mean image
#  transform_param {
#    crop_size: 227
#    mean_value: 104
#    mean_value: 117
#    mean_value: 123
#    mirror: true
#  }
  data_param {
    source: "E:/NotFineshed/caffeWin10/caffe-master/examples/myExample/mydata_train_lmdb"
    batch_size: 25
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 227
    mean_file: "E:/NotFineshed/caffeWin10/caffe-master/examples/myExample/mydata_mean.binaryproto"
  }
# mean pixel / channel-wise mean instead of mean image
#  transform_param {
#    crop_size: 227
#    mean_value: 104
#    mean_value: 117
#    mean_value: 123
#    mirror: false
#  }
  data_param {
    source: "E:/NotFineshed/caffeWin10/caffe-master/examples/myExample/mydata_test_lmdb"
    batch_size: 20
    backend: LMDB
  }
}

4、修改deploy.prototxt文件

 同样的修改num_output为5(5个类别)。


五、开始训练

1、在caffe-master目录下,新建train-my-caffe-model.txt,并输添加以下代码,添加完成后,再将后缀名改为.bat

Build\x64\Release\caffe.exe train --solver=examples/myExample/solver.prototxt
pause

另一种方式:新建一个train-my-caffe-model.sh文件,添加一下代码,用git运行也可以的。

DATA=E:/NotFineshed/caffeWin10/caffe-master/examples/myExample
TOOLS=E:/NotFineshed/caffeWin10/caffe-master/Build/x64/Release
$TOOLS/caffe.exe train --solver=$DATA/solver.prototxt
read -p "press Enter to continue"

2、双击.bat文件,即可开始训练。


六、各种报错及解决办法

1、F0108 11:44:23.991556  8376 db_lmdb.hpp:15] Check failed: mdb_status == 0 (3 vs. 0) 系统找不到指定的路径。

 解决办法: http://blog.csdn.net/u012308979/article/details/72793108

2、F0108 13:05:50.865810  9376 syncedmem.cpp:56] Check failed: error == cudaSuccess (2 vs. 0)  out of memory

解决办法:GPU显存不够,修改batch_size的值,改为25


七、结果

如下图所示。


感觉训练的结果不够满意啊,接下来,需要了解模型网络参数,修改参数以得到更好的训练结果。


八、输入单张图片,进行分类预测

1、新建.sh文件,输入以下代码即可,然后用git运行

#EXAMPLE=examples/imagenet
DATA=E:/NotFineshed/caffeWin10/caffe-master/examples/myExample
TOOLS=E:/NotFineshed/caffeWin10/caffe-master/Build/x64/Release

$TOOLS/classification.exe $DATA/deploy.prototxt $DATA/minemodel_iter_1000.caffemodel $DATA/mydata_mean.binaryproto $DATA/synset_words.txt $DATA/1.jpg
read -p "press Enter to continue"






评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值