最近想熟悉一下深度学习,体验了一下Caffe,简单写写训练和分类的过程:

1.下载Caffe VS2013工程:https://github.com/Microsoft/caffe

2. 解压并用VS2013打开解决方案caffe-master\windows\Caffe.sln,默认配置是x64 Debug

2.  重命名caffe-master\windows\CommonSettings.props.example为caffe-master\windows\CommonSettings.props,然后修改如下配置:

<CpuOnlyBuild>true</CpuOnlyBuild>  -----  是否使用GPU,我的电脑没有GPU,所以为true

<UseCuDNN>false</UseCuDNN>   -----   是否使用CuDNN库

<PythonSupport>false</PythonSupport>  ----- 是否支持Python

<MatlabSupport>false</MatlabSupport>   -----  是否支持Matlab

4. 编译解决方案

全编译整个解决方案,刚开始会弹出一个窗口下载第三方库,需要下载一段时间,下载完毕后开始编译。第一次编译或许会出现错误说找不到libcaffe.lib,把工程libcaffe单独编译一下然后再编译整个解决方案即可。

5.编译通过后,在caffe-master\Build\x64\Debug中会出现一堆exe和dll:

convert_imageset.exe    用来生成训练图片和测试图片的数据库

compute_image_mean.exe  计算训练图片的均值

classification.exe   对目标图片分类

6. 准备训练图片和测试图片,我们这里训练圆形,三角形,六边形和云朵图片,比如:

caffe-master\data\train\circle中放圆形练图片10张

caffe-master\data\train\cloud中放云朵形状练图片5张

caffe-master\data\train\hexagon中放六边形练图片5张

caffe-master\data\train\triangle中放三角形练图片10张

训练图片共30张

caffe-master\data\train\val中放测试图片

这里放两张圆形图片(标准圆形和手绘圆形),两张三角形(标准+手绘),一张标准六边形,一张云朵图片,共6张

7. 新建文本文件caffe-master\data\train\train.txt,填写将30张训练图片和类别编号对应关系,内容如下,jpg后面的数字表示图片类别编号,从0开始。

\circle\1.jpg 0

\circle\2.jpg 0

\circle\3.jpg 0

\circle\4.jpg 0

\circle\5.jpg 0

\circle\6.jpg 0

\circle\7.jpg 0

\circle\8.jpg 0

\circle\9.jpg 0

\circle\10.jpg 0

\triangle\1.jpg 1

\triangle\2.jpg 1

\triangle\3.jpg 1

\triangle\4.jpg 1

\triangle\5.jpg 1

\triangle\6.jpg 1

\triangle\7.jpg 1

\triangle\8.jpg 1

\triangle\9.jpg 1

\triangle\10.jpg 1

\hexagon\1.jpg 2

\hexagon\2.jpg 2

\hexagon\3.jpg 2

\hexagon\4.jpg 2

\hexagon\5.jpg 2

\cloud\a.jpg 3

\cloud\b.jpg 3

\cloud\c.jpg 3

\cloud\d.jpg 3

\cloud\e.jpg 3

注意:这里每行的文件名称会和第9节convert_imageset_train.bat的行“set a=C:\xxx\caffe-master\data\train”指定的路径拼接成一个完整图片文件路径

8. 新建文本文件caffe-master\data\val\val.txt,填写测试图片和类别编号的对应关系,内容如下,格式与上面train.txt一样:

\1.jpg 0

\a.jpg 0

\2.jpg 1

\b.jpg 1

\3.jpg 2

\5.jpg 3

注意:这里每行的图片文件名称会和第10节convert_imageset_val.bat的行“set a=C:\xxx\caffe-master\data\val”指定的路径拼接成一个完整图片文件路径

9. 在caffe-master根目录下新建并运行批处理文件convert_imageset_train.bat,用于生成训练图片数据库:

文件内容如下:

SET GLOG_logtostderr=1

cd /d C:\xxx\caffe-master

set a=C:\xxx\caffe-master\data\train

set b=C:\xxx\caffe-master\data\train\train.txt

set c=C:\xxx\caffe-master\data\trainlmdb

Build\x64\Debug\convert_imageset.exe -resize_height=200 -resize_width=200 %a% %b% %c% 0

pause

注意:运行此批处理文件前要确保文件夹caffe-master\data\trainlmdb不存在,否则会报错。

批处理运行后生成两个文件:caffe-master\data\trainlmdb\data.mdb和caffe-master\data\trainlmdb\lock.mdb

10. 在caffe-master根目录下新建并运行批处理文件convert_imageset_val.bat,用于生成测试图片数据库,文件内容如下:

SET GLOG_logtostderr=1

cd /d C:\xxx\caffe-master

set a=C:\xxx\caffe-master\data\val

set b=C:\ xxx\caffe-master\data\val\val.txt

set c=C:\xxx\caffe-master\data\vallmdb

Build\x64\Debug\convert_imageset.exe -resize_height=200 -resize_width=200 %a% %b% %c% 0

pause

注意:运行此批处理文件前要确保文件夹caffe-master\data\vallmdb不存在,否则会报错。

resize_height和resize_width分别为调整后的输入图片的宽度和高度

批处理运行后生成两个文件:caffe-master\data\vallmdb\data.mdb和caffe-master\data\vallmdb\lock.mdb

11. 生成均值文件,在caffe-master根目录下新建并运行批处理文件compute_image_mean.bat

SET GLOG_logtostderr=1

cd /d C:\xxx\caffe-master

set a=C:\xxx\caffe-master\data\trainlmdb

set b=C:\xxx\caffe-master\data\image_mean.binaryproto

Build\x64\Debug\compute_image_mean.exe %a% %b%

pause

批处理运行后生成caffe-master\data\image_mean.binaryproto

12. 复制文件caffe-master\models\bvlc_alexnet\solver.prototxt和caffe-master\models\bvlc_alexnet\train_val.prototxt到caffe-master\data,并修改如下:

solver.prototxt:

net: "C:/xxx/caffe-master/data/train_val.prototxt"

test_iter: 1

test_interval: 500

base_lr: 0.001

lr_policy: "step"

gamma: 0.1

stepsize: 100000

display: 20

max_iter: 10000

momentum: 0.9

weight_decay: 0.0005

snapshot: 1000

snapshot_prefix: "models/bvlc_alexnet/caffe_alexnet_train"

solver_mode: CPU

solver.prototxt和train_val.prototxt的详细介绍请参考如下两篇博客:

http://blog.csdn.net/u012746763/article/details/51549184

http://blog.csdn.net/u012746763/article/details/51549267

13. 在caffe-master根目录下新建并运行批处理文件train.bat开始训练:

SET GLOG_logtostderr=1

cd /d C:\xxx\caffe-master

Build\x64\Debug\caffe.exe train --solver=C:\xxx\caffe-master\data\solver.prototxt

pause

训练结果和快照保存在caffe-master\models\bvlc_alexnet中。

14. 由于使用CPU计算,训练速度非常慢,不知道采用GPU能加速多少,减少训练图片数量和图片尺寸(step9和10中的resize_height和resize_width)能加快训练速度和降低内存使用。经过数个小时的等待训练结束,生成最终的训练结果,也可使用训练中间生成的快照来做分类。

15.  在caffe-master根目录下新建并运行批处理文件classification.bat开始分类。

SET GLOG_logtostderr=1

cd /d C:\xxx\caffe-master

set a=C:\xxx\caffe-master\models\bvlc_alexnet\deploy.prototxt

set b=C:\xxx\caffe-master\models\bvlc_alexnet\caffe_alexnet_train_iter_4000.caffemodel

set c=C:\xxx\caffe-master\data\image_mean.binaryproto

set d=C:\xxx\caffe-master\labels.txt

set e=C:\xxx\caffe-master\data\val\f.jpg

Build\x64\Debug\classification.exe %a% %b% %c% %d% %e%

pause

参数说明:

deploy.prototxt:

修改name为data的layer中的input_param为{ shape: { dim: 10 dim: 3 dim: 200 dim: 200 } }  其中的200分别对应step9和10中的resize_height和resize_width

在name为fc8的layer中,修改num_output的值为4(训练图片类型的个数)

caffe_alexnet_train_iter_4000.caffemodel: 训练结果

image_mean.binaryproto: 均值文件

labels.txt: 图片类型编号对应的类型名称文件,一行一个名称

f.jpg: 待分类的图片

14. 手绘一个云朵形状的图片然后分类,结果:

0.9997 - "cloud"

0.0002 - "triangle

0.0001 - "hexagon"

0.0000 - "circle"

【神经网络与深度学习】在Windows8.1上用VS2013编译Caffe并训练和分类自己的图片的更多相关文章

  1. 【神经网络与深度学习】如何将别人训练好的model用到自己的数据上

    caffe团队用imagenet图片进行训练,迭代30多万次,训练出来一个model.这个model将图片分为1000类,应该是目前为止最好的图片分类model了. 假设我现在有一些自己的图片想进行分 ...

  2. (转)神经网络和深度学习简史(第一部分):从感知机到BP算法

    深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...

  3. [DeeplearningAI笔记]神经网络与深度学习人工智能行业大师访谈

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 吴恩达采访Geoffrey Hinton NG:前几十年,你就已经发明了这么多神经网络和深度学习相关的概念,我其实很好奇,在这么多你发明的东西中 ...

  4. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验【中英】

    [中英][吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第二周测验 第2周测验 - 神经网络基础 神经元节点计算什么? [ ]神经元节点先计算激活函数,再计算线性函数(z = Wx + ...

  5. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验【中英】

    [吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第一周测验[中英] 第一周测验 - 深度学习简介 和“AI是新电力”相类似的说法是什么? [  ]AI为我们的家庭和办公室的个人设备供电 ...

  6. 如何理解归一化(Normalization)对于神经网络(深度学习)的帮助?

    如何理解归一化(Normalization)对于神经网络(深度学习)的帮助? 作者:知乎用户链接:https://www.zhihu.com/question/326034346/answer/730 ...

  7. 【神经网络与深度学习】卷积神经网络(CNN)

    [神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...

  8. 【神经网络与深度学习】【python开发】caffe-windows使能python接口使用draw_net.py绘制网络结构图过程

    [神经网络与深度学习][python开发]caffe-windows使能python接口使用draw_net.py绘制网络结构图过程 标签:[神经网络与深度学习] [python开发] 主要是想用py ...

  9. 【神经网络与深度学习】【Qt开发】【VS开发】从caffe-windows-visual studio2013到Qt5.7使用caffemodel进行分类的移植过程

    [神经网络与深度学习][CUDA开发][VS开发]Caffe+VS2013+CUDA7.5+cuDNN配置成功后的第一次训练过程记录<二> 标签:[神经网络与深度学习] [CUDA开发] ...

随机推荐

  1. Redis的部署使用文档

    Redis的部署使用文档   简述: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符 串).list(链表).set( ...

  2. Python 异常处理Ⅲ

    使用except而不带任何异常类型 你可以不带任何异常类型使用except,如下实例: 以上方式try-except语句捕获所有发生的异常.但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信 ...

  3. js callback回调的一种写法

    getLocation.cityname(latitude, longitude, function (data1) { SetCityCallBack(data1); }); 定义方法: var g ...

  4. react 的className动态修改

    https://blog.csdn.net/suwyer/article/details/81481507(copy) <div style={{display: (index===this.s ...

  5. 冒泡排序和选择排序(bubble sort and selection sort)

    Bubble sort Basic Method: import random nums = [random.randint(1,20) for _ in range(10)] #制作一个无序数字列表 ...

  6. Spark译文(二)

    PySpark Usage Guide for Pandas with Apache Arrow(使用Apache Arrow的Pandas PySpark使用指南) Apache Arrow in ...

  7. Luogu P4708 画画 (Burnside引理、组合计数)

    题目链接 https://www.luogu.org/problem/P4708 题解 看上去Luogu P4706-4709是Sdchr神仙出的一场比赛,一道水题和三道很有趣的题终于全过了纪念QAQ ...

  8. JavaWeb_(SSH论坛)_四、页面显示

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 帖子表与回复表 ...

  9. python学习之路(2)(渗透信息收集)

    scapy的用法 通过目标ip的回复判断目标ip主机的情况 先写上三层的IP 四层的TCP 然后r.display看一下我们的包 src是源ip dst是目标ip 我们添加目标ip 这里是网关的ip ...

  10. Java Optional orElse() 和 orElseGet() Optional.flatMap()和Optional.map()区别

    Java Optional 的 orElse() 和 orElseGet() 的区别 1. 接收的参数不同 orElse()方法以一个自定义类型的数据作为参数 public T orElse(T t) ...