本文是学习Caffe官方文档"ImageNet Tutorial"时做的,同样由于是Windows版本的原因,很多shell脚本不能直接使用,走了不少弯路,但是收获也不少。比如:如何让shell脚本在Windows系统上直接运行、如何去用Caffe给图像resize来统一大小,如何去构建train.txt和val.txt等等。具体流程均记录如下。

正文:

1.准备数据

我从网上下载了两类图片,一类为猫,一类为鸟,分别存在名为bird和cat的文件夹里,每类60张(50张做为训练集,10张做为测试集)。【分开存放,在做train.txt时,方便打标签。等做完标签再将100张训练图片一起放在新建的train文件下里,下面会详述。】

猫:(已经过批量重命名。ps:我选图还是比较讲究的,不好看的、不清楚的、不奇怪的我不选,哈哈)

鸟:(已经过批量重命名)

2.构建train.txt和val.txt

首先是重命名图片,从搜索引擎下载下来的图片的名称都是则乱无章,我们需要用批量重命名的方法去先给它们命名。

批量重命名可以通过一个bat文件实现,代码如下:

修改其中的“bird”位置,运行。比如,我将“bird”改为“Cat”,运行bat文件,效果如下:

可以看到图片名字被统一的修改了,并且生成了一个list文件夹,通过txt文件的查找-替换,给每个文件打上标签(比如Cat为0,Bird为1),截图如下:

下面的工作自己做就行了,将cat和bird的txt文档,合在一起,组成train.txt。同理,完成val.txt。我的train.txt和val.txt的截图如下(我标签用了1和2):

3.数据处理

数据处理要进行三项:1.将图片统一转化成256X256大小。2.将数据转化为LEVELDB格式。3.求数据均值。

看了一些博客,在将图片统一转化成256大小这儿曲线救国,想了很多方法。其实第1步和第2步可以一起完成,只要调用examples\imagenet\create_imagenet.sh就可以一起完成。但是shell脚本在Windows下如何运行呢?是可以的,只需要安装Git即可在Windows环境下运行shell脚本!Git下载链接:https://git-scm.com/downloads/

根据具体情况,对create_imagenet.sh,做一些修改(需要修改处均用红色方框标出,五角星处即是caffe自带的resize图片的地方,一定要设为true):

打开git,运行create_imagenet.sh即可,查看文件夹,出现imagenet_train_leveldb和imagene_val_leveldb:

接下来是进行第三步,求图像均值了。在进行这一步时,我使用\examples\imagenet\make_imagenet_mean.sh时,是成功求得了均值文件imagenet_mean.binaryproto,但在之后训练时,一直报错,提示均值文件无法读取。故还是换用了compute_image_mean.exe,来求得均值文件,具体步骤,之前的文章已经记录了,不再赘述。

再从\models\bvlc_reference_caffenet中,将train_val.prototxt和solver.prototxt复制过来,这样所有文件都准备齐全了:

4.配置训练所需文件

首先,根据具体情况修改,train_val.prototxt:

修改solver.prototxt:

关于solver里面的参数,我认为应该根据具体情况就修改就好了,这一部分我还不是很熟悉,慢慢积累吧。

5.进行训练

写一个bat文件,进行训练即可!bat文件代码如下:

6.训练结果

因为我的电脑配置很低很低。。所以训练起来很慢,我调小了很多参数,训练了两天还是没训完。。。贴一张训练中的截图吧:

7.总结

这次主要是为了自己感受一下用Windows Caffe训练自己数据的整个过程,也没有去追求准确率,也没有考虑去跟踪训练过程去调参等等。这些经验方面的知识,接下来慢慢继续积累吧。经过这次学习,起码能把整个过程跑下来了,收获很多。

caffe调用的一个例子相关推荐

  1. python中self_一个例子带你入门Python装饰器

    ============ 欢迎关注我的公众号:早起python ============ 前言 在还未正式发布的python3.9中,有一个新功能值得关注,那就是任意表达式可以作为装饰器,如果你还不知 ...

  2. shell实例第19讲:一个脚本中调用另一个脚本的3种方法

    在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...

  3. C++中const——由一个例子想到的

    前天同学实现了<C++ Primer>中关于虚函数的一个例子,拿过来问我,代码如下: #include<iostream> #include<string> usi ...

  4. 安卓一个方法多处调用_一个隐藏在方法集和方法调用中且易被忽略的小细节

    来自公众号:新世界杂货铺 作为一个长期从事Go语言开发的程序猿,笔者不敢说自己是老油条但也勉强算一个小油条.然而就在今天,笔者研究TLS/SSL握手源码的时候,突然灵光一闪,想到了一个和自己认知不符的 ...

  5. 将一个简单远程调用的方式例子改为异步调用 -- 2

    将一个简单远程调用的方式例子改为异步调用 第一版:https://www.cnblogs.com/nxzblogs/p/12766025.html 第二版:使用RxJava :(RxJava:http ...

  6. 将一个简单远程调用的方式例子改为异步调用

    将一个简单远程调用的方式例子改为异步调用 package com.xsxy.asynctest.test03;import java.util.ArrayList; import java.util. ...

  7. js 调用另一个类的方法_一个隐藏在方法集和方法调用中且易被忽略的小细节

    来自公众号:新世界杂货铺 作为一个长期从事Go语言开发的程序猿,笔者不敢说自己是老油条但也勉强算一个小油条.然而就在今天,笔者研究TLS/SSL握手源码的时候,突然灵光一闪,想到了一个和自己认知不符的 ...

  8. oracle创建包 和调用,oracle创建函数和调用存储过程和调用函数的例子(区别)...

    创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; ...

  9. 基于 abapGit 和 abaplint 的 ABAP 持续集成的一个例子

    这是 Jerry 2021 年的第 61 篇文章,也是汪子熙公众号总共第 338 篇原创文章. 短歌行 曹操 对酒当歌,人生几何! 譬如朝露,去日苦多. 慨当以慷,忧思难忘. 何以解忧?唯有杜康. 青 ...

最新文章

  1. python openpyxl读取excel_Python使用openpyxl读写excel文件
  2. mongodb 对内存的占用监控 ——mongostat,linux系统可用的内存是free + buffers + cached...
  3. 无边框对话框改变大小
  4. H2O —— 宣称性能是 Nginx 2 倍的 HTTP 服务器
  5. 摩斯密码(加密/解密)脚本
  6. Pandas 处理 dummy variable
  7. selenium使用浏览器隐私模式加载网站
  8. 三维里面点击播放视频
  9. LeetCode--057--插入区间(java)
  10. 手机编程环境初尝试-用AIDE开发Android应用
  11. 环绕声混响效果器-Acon Digital Verberate Immersive 2.2.1 WiN-MAC
  12. idea git push 码云: Remote: [31mYou do not have permission to push to the repository via HTTPS
  13. NB IoT技术简介
  14. 电子计算机审计,计算机审计存在的风险
  15. MapReduce实现kmeans算法
  16. 一个简单的form表单登录界面
  17. apk部分手机安装失败_安装APK文件时提示“解析包出现错误”,看完就知道怎么做了!...
  18. 这样的生产计划与排产,我看行
  19. Java java.sql.SQLSyntaxErrorException:Duplicate column name ‘xxx‘问题解决
  20. 图像处理--医疗图片的处理

热门文章

  1. 用 W32DASM看IF高级语法
  2. 对qps、tps、pv、uv的理解
  3. call和ret(f)指令
  4. uva 10479——The Hendrie Sequence
  5. go语言在windows编译在linux上运行的可执行程序
  6. cp -r 和 cp -R 的区别
  7. gcc -l参数和-L参数
  8. C语言实现单链表操作
  9. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
  10. pthread_cleanup_push与pthread_cleanup_pop的目的 作用