[DeepLearning] 深度学习框架Caffe初体验之病斑检测

本文介绍了使用Caffe框架进行病斑检测的步骤,包括数据集准备、网络训练、模型验证和病斑识别。作者通过调整Caffe的cifar10网络结构,实现了99%以上的二分类准确率,并讨论了滑动窗口算法在病斑检测中的应用和优化空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 {
    
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值