0 引言
Caffe(http://caffe.berkeleyvision.org/)是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清(http://daggerfs.com/),caffe是他研究生时期写的,目前由Berkeley继续维护。
本人最近正在研究利用DeepLearning进行图像分类,正好caffe中有ImageNet的例子可以修改利用。本文主要介绍: 用到的数据集、caffe网络文件修改、数据集处理 、 model准确率验证、病斑检测
1. 数据集介绍
我的数据集来自于一组带有病斑的叶子图片。图片主要为以下三类:
第一种是整张带有病斑的图片
第二种是提取的病斑窗口图片
第三种是非病斑图片,主要是一些背景的窗口图片
2. caffe训练
为了可以很好地识别病斑与非病斑,我这次训练使用的正负样本分别为上面的第二类和第三类数据,也就是病斑窗口和非病斑窗口。
2.1 网络结构设置
在$CaffeHome/examples下有一些关于深度学习的例子,我这里选取的参考例子是cifar10,这是一个用于图片分类的深度学习网络.(http://www.cs.toronto.edu/~kriz/cifar.html)
我们需要用到的文件有几个:leaf_full.prototxt、leaf_full_solver.prototxt、leaf_full_train_test.prototxt、train_full.sh 但是我们需要对其做相应的修改。
文件:leaf_full.prototxt
name: "CIFAR10_full_deploy"
# N.B. input image must be in CIFAR-10 format
# as described at http://www.cs.toronto.edu/~kriz/cifar.html
input: "data"
input_shape {
dim: 1
dim: 3
dim: 32
dim: 32
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 32
pad: 2
kernel_size: 5
stride: 1
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "pool1"
top: "pool1"
}
layer {
name: "norm1"
type: "LRN"
bottom: "pool1"
top: "norm1"
lrn_param {
local_size: 3
alpha: 5e-05
beta: 0.75
norm_region: WITHIN_CHANNEL
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "norm1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 32
pad: 2
kernel_size: 5
stride: 1
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: AVE
kernel_size: 3
stride: 2
}
}
layer {
name: "norm2"
type: "LRN"
bottom: "pool2"
top: "norm2"
lrn_param {
local_size: 3
alpha: 5e-05
beta: 0.75
norm_region: WITHIN_CHANNEL
}
}
layer {
name: "conv3"
type: "Convolution"
bottom: "norm2"
top: "conv3"
convolution_param {
num_output: 64
pad: 2
kernel_size: 5
stride: 1
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "pool3"
type: "Pooling"
bottom: "conv3"
top: "pool3"
pooling_param {
pool: AVE
kernel_size: 3
stride: 2
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool3"
top: "ip1"
param {
lr_mult: 1
decay_mult: 250
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2
}
}
layer {
name: "prob"
type: "Softmax"
bottom: "ip1"
top: "prob"
}
leaf_full.prototxt是网络定义文件,由于只是初步的对caffe进行了解学习,所以对于网络结构的设计我依旧沿用cifar10原来的网络结构。但是在这里有几个地方需要修改一下。首先在开头的
input_shape {
dim: 1
dim: 3
dim: 32
dim: 32
}
第一个表示每次读入的照片数,第二个表示图片的通道数,我这里用的是彩色图片,所以是3,最后两个是图片的大小,我输入的32X32图片。另外对于灰度图片,我们需要提供一个binaryprototxt类型的均值文件,文件的生成可以借助caffe提供的工具文件,在我的github代码中也可以看到这个文件。
另外在结尾中,我们必须选择num_output的数目,这个变量可以理解为我们进行的是几分类,我这里是二分类,所以num_output是2。与此同时,在leaf_full_train_test.prototxt中同样需要进行修改。
inner_product_param {