一.环境的准备
Visual studio2013(编译环境)
64位Win7/10系统(操作系统)
Notepad+++中文编码器(用于写或修改代码)
二.caffe的CPU版本安装(Debug版本和Release版本)
1.从github下载Caffe的windows分支。
https://github.com/BVLC/caffe/

caffe压缩包https://github.com/BVLC/caffe/archive/master.zip
2.解压压缩包,然后把把caffe-windows\windows目录下的CommonSettings.props.example文件改名为CommonSettings.props。

解压后的目录
然后Notepad+++打开CommonSettings.props文件,修改如下:

修改的地方
***把CpuOnlyBuild改为true
***把UseCuDNN改为false
3.用VS2013打开caffe-windows\windows\Caffe.sln。打开libcaffe的属性,设置配置属性->C/C++->常规,把"将警告视为错误"改为"否"。然后编译Debug版本。

Debug版本设置
编译成功后在caffe-windows根目录下出现一个Build文件夹,该文件夹目录下有:E:\caffe-window\Build\x64\Debug

编译成功图
若出现如上程序包,表示Debug编译成功,若没有,则编译不成功,需重新编译。
4. Release版本的编译:用VS2013打开caffe-windows\windows\Caffe.sln。选择Release版本,然后打开libcaffe的属性,设置配置属性->C/C++->常规,把"将警告视为错误"改为"否"。然后编译Release版本。

Release版本设置
编译成功后在caffe-windows根目录下出现一个Build文件夹,该文件夹目录下有:E:\caffe-window\Build\x64\Release

编译成功图
若出现如上程序包,表示Release编译成功,若没有,则编译不成功,需重新编译。第3、4步骤完成后表示CPU的caffe安装就完成了。
三、Caffe的python接口的配置
1.安装Anaconda2
a) 下载Anaconda2:https://www.anaconda.com/download/#windows

Anaconda2版本
b)安装流程参考如下网址:
http://www.cnblogs.com/IT-LearnHall/p/9486029.html
注意:需要把添加系统环境变量打√,要记得安装路径。
2.windows下编译pycaffe:
a) 进入window命令处理程序(cmd) 输入:pip install protobuf==2.6.1回车就行。安装的一定要是3.0以下版本的protobuf,Caffe只支持2.的版本。

安装protobuf
3. 然后用Notepad+++打开CommonSettings.props文件,修改如下:
<PythonSupport>true</PythonSupport>
表示支持python
<PythonDir>E:\Anaconda2\</PythonDir>
Anaconda2的根目录(根据自己安装路径修改)
4.编译pycaffe
a) 用VS2013打开caffe-windows\windows\Caffe.sln,修改属性如下,只留下pycaffe。

相关属性修改
b) 开始编译,编译成功后在E:\caffe-window\Build\x64\Release的目录下出现一个新的文件夹pycaffe(之前编译完Release是没有的)

pycaffe
c) .把caffe-windows\Build\x64\Release\pycaffe\caffe复制到Anaconda2的Lib\site-packages目录下。
d) .把Build\x64\Release\pycaffe\caffe目录下的所有文件复制到caffe-windows\python\caffe目录下。
5.测试python是否成功
打开window命令处理程序(cmd),输入python,回车后输入import caffe

测试
如图表示没有报错表示成功。
四、利用Caffe训练自己模型并测试(苹果成熟度为例)
1.数据采集及分类
从网上批量下载苹果的图片(1000张左右),然后利用Matlab测试的R、G、B的值,

提取R、G、B
根据R(0-255)的值判断苹果的成熟度,
RGB 模型中,成熟苹果的 R 在180 以上,苹果成熟度分类如下:
0<R<100 表示不成熟(immature)
100<R<180 表示半熟(medium)
180<R<255表示成熟(mature)
在E:\caffe-window\models建立一个名为models_recognition

models_recognition文件夹
然后在models_recognition的目录下建立数据集文件data

data文件夹
在data的文件夹下面建立测试集(test)和训练集(train)并把三类分类建立好文件夹

test and train

三种分类
训练集和测试集分别要有三种分类
2.图片标签的制作
格式:文件路径+标签
在制作标签之前在models_recognition文件目录下建立名为labels的文件夹
使用python的接口Jupyter Notebook,标签代码如下图:

标签代码
文本代码:
import os #调用程序包
caffe_root = 'E:/caffe-master/'
#训练集标签制作
i = 0
withopen(caffe_root + 'models/models_recognition/labels/train.txt','w') as train_txt:
for root,dirs,files in os.walk(caffe_root+'models/models_recognition/data/train/'):
for dir in dirs:
for root,dirs,files in os.walk(caffe_root+'models/models_recognition/data/train/'+str(dir)):
for file in files:
image_file = str(dir) + '\\' + str(file)
label = image_file + ' ' + str(i) + '\n'
train_txt.writelines(label)
i+=1
#测试集标签制作
i=0
with open(caffe_root + 'models/models_recognition/labels/test.txt','w') as test_txt:
for root,dirs,files in os.walk(caffe_root+'models/models_recognition/data/test/'):
for dir in dirs:
for root,dirs,files in os.walk(caffe_root+'models/models_recognition/data/test/'+str(dir)):
for file in files:
image_file = str(dir) + '\\' + str(file)
label = image_file + ' ' + str(i) + '\n'
test_txt.writelines(label)
i+=1
运行代码后在下面路径
E:\caffe-master\models\models_recognition\labels
生成两个文本文档

标签文本
3. .数据转换,将图片转为LMDB格式
在models_recognition的目录下建立名为bat和lmdb的的文件夹,并写两个批处理文件:convert_imagest_test.bat和convert_imagest_train.bat

批处理文件
convert_imagest_train.bat的程序:

convert_imagest_train.bat的程序
文本代码:
E:\caffe-master\caffe-master\Build\x64\Release\convert_imageset.exe ^
--resize_height=256 --resize_width=256 ^
--shuffle ^
--backend="lmdb" ^
E:\caffe-master\caffe-master\models\models_recognition\data\train\ ^
E:\caffe-master\caffe-master\models\models_recognition\labels\train.txt ^
E:\caffe-master\caffe-master\models\models_recognition\lmdb\train\
pause
保存并双击运行
convert_imagest_test.bat的程序:

convert_imagest_test.bat的程序
文本代码:
E:\caffe-master\caffe-master\Build\x64\Release\convert_imageset.exe ^
--resize_height=256 --resize_width=256 ^
--shuffle ^
--backend="lmdb" ^
E:\caffe-master\caffe-master\models\models_recognition\data\test\ ^
E:\caffe-master\caffe-master\models\models_recognition\labels\test.txt ^
E:\caffe-master\caffe-master\models\models_recognition\lmdb\test\
pause
保存并双击运行
两个批处理文件运行完成后会在lmdb文件夹生成test和train的文件并在两个文件下有lmdb的数据

lmdb数据
4.修改网络模型文件
利用E:\caffe-master\models下的bvlc_reference_caffenet文件的train_val.prototxt文件训练模型,利用Notepad+++打开train_val.prototxt修改如下:

相关修改

相关修改
5.修改超参数文件
修改E:\caffe-master\models下的bvlc_reference_caffenet文件的solver.prototxt文件,

solver.prototxt文件
6.优化器的选择及效果比较
https://blog.csdn.net/qq_40314507/article/details/79933289

各类优化前期比较
本模型我们用AdaDelta优化器
7.训练模型(GPU训练)
在bat文件夹下写一个批处理文件train.bat
代码如下:

train.bat
文本代码:
E:\caffe-master\caffe-master\Build\x64\Release\caffe.exe train ^
-solver=E:\caffe-master\caffe-master\models\models_recognition/solver.prototxt
pause
双击运行train.bat
训练模型过程中

训练过程
使用AdaDelta准确率越来越高了

使用优化器AdaDelta后

完成
电脑显卡好的话两三个小时就可以训练好了,GPU比CPU训练速度快10-20倍左右,所以建议使用GPU训练。训练完成后在models_recognition目录下训练前新建的model生成如下文件:

model
8.测试模型
把需要测试的图片放进在models_recognition目录下新建的image文件夹下(网上随机下载图片)

测试图
使用python的接口Jupyter Notebook测试:

Jupyter Notebook

Jupyter Notebook
文本代码:
import caffe
import numpy as np
import matplotlib.pyplot as plt
import os
import PIL
from PIL import Image
import sys
caffe_root = 'E:/caffe-master/'
deploy_file = caffe_root+'models/models_recognition/deploy.prototxt'
model_file = caffe_root+'models/models_recognition/model/_iter_5000.caffemodel'
net = caffe.Classifier(deploy_file,
model_file,
channel_swap=(2,1,0),
raw_scale=255,
image_dims=(227, 227))
imagenet_labels_filename = caffe_root +'models/models_recognition/labels/label.txt'
labels = np.loadtxt(imagenet_labels_filename, str, )
for root,dirs,files in os.walk(caffe_root+'models/models_recognition/image'):
for file in files:
#加载要分类的图片\n",
image_file = os.path.join(root,file)
input_image = caffe.io.load_image(image_file)
image_path = os.path.join(root,file)
print(image_path)
img=Image.open(image_path)
plt.imshow(img)
plt.show()
#预测图片类别\n",
prediction = net.predict([input_image])
print 'predicted class:',prediction[0].argmax()
top_k = prediction[0].argsort()[::-1]
for node_id in top_k:
#获取分类名称\n",
human_string = labels[node_id]
#获取该分类的置信度\n",
score = prediction[0][node_id]
print('%s (score = %.5f)' % (human_string, score))
运行后结果如下:

效果图a

效果图b

效果图c
结果准确率达到99.99%,这说明数据集和训练的模型非常不错。