caffe学习笔记18-image1000test200数据集分类与检索完整过程
image1000test200数据集分类与检索完整过程:
1.准备数据:数据集图片分10个类,每个类有100个train图片(train文件夹下,一共1000),20个test图片(val文件夹下,一共200)
首先准备自己的数据集(都是全路径),我们需要准备的文件有:
1) 文件夹train:里面放训练的图片
2 )文件夹val:里面放val的图片
3 )train.txt :训练图片的文件名和对应的类别, 格式每一行文件名+ 空格 + label
4) val.txt:测试图片的文件名和对应的类别
2.创建lmdb格式数据集
在caffe安装的根目录下执行下面的脚本可以创建lmdb文件,用于caffe的数据输入;
./examples/image_test/create_imagenet.sh
对于这个脚本,我们打开,根据自己的路径做更改;
参考/home/nielsen/caffe-master/examples/image_test/create_imagenet.sh
3. 计算图像均值
输入数据需要训练图片的均值图像(需要自己修改路径 路径最前面千万不要多加空格,血的教训)只计算训练集的均值,测试的时候减去的也是训练集的均值而不是测试集的
./examples/imagenet/make_imagenet_mean.sh
4. 配置网络结构文件(检查train和test不能同时用train_lmdb,会造成死锁卡在那)
网络模型文件在models/bvlc_reference_caffenet/train_val.prototxt文件中,复制到image_test文件夹中(统一管理比较方便)
这里我们直接使用caffe提供的这个网络结构,以后我们再根据自己的想法做更改。
-----提供的数据为10类,则最后fc8层的num_output相应的改为10,即fc8为10个节点
注意:需要打开这个文件,更改里面的路径
我们对train_val.prototxt 修改后,路径:/home/nielsen/caffe-master/examples/image_test/train_val.prototxt
5. 配置训练参数文件(net路径也需要修改)
训练参数文件在:models/bvlc_reference_caffenet/solver.prototxt中,复制到image_test文件夹中(统一管理比较方便)
我们对solver.prototxt 修改后的参数如下:
net: "examples/image_test/train_val.prototxt"
test_iter: 4 # 测试的时候输入4个batch,
# 说明:查看我们train_val.prototxt文件,发现batch_size: 50;我们的test图片是200张,200/50=4,所以
test_interval: 1000 # 每迭代1000次,测试一次
base_lr: 0.01 # 初始的学习率为0.01
lr_policy: "step"
gamma: 0.1
stepsize: 3000 # 每迭代3000次,调整一次学习率
display: 20 # 每迭代20次,显示一次
max_iter: 12000 # 最大迭代12000次
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000 # 每迭代5000就存一次快照
snapshot_prefix: "examples/image_test/caffenet_train" # 快照存放路径
solver_mode: CPU # 选择模式CPU
6. 开始利用自己的数据训练网络(在caffe的根目录下执行)
./build/tools/caffe train -solver=/home/nielsen/caffe-master/examples/image_test/solver.prototxt
训练过程中,可以看到正确率在不断提升;最后的准确率是50%;
我们的样本数很少,当图片到百万数量级的时候,效果会很大提升;
7. 改变策略,使用blvc model微调
fc8层的输出节点改为10个,数据只有10类,用已经训练好的1000类进行微调(变动的层fc8需要改名字,不然还是原来的参数)
(学习率:最后一层fc的lr_mult改为10,20 且 降低base_lr为0.001)
caffenet结构的输出层的类别数一定要大于我训练集的类别数才可以收敛!
比如原来我把图像类别的label设置成1,2,3,改成0,1,2后,最后全连接层的转出改成3就OK了。
./build/tools/caffe train -solver examples/image_test/solver10.prototxt -weights examples/image_test/caffenet_train_iter_5000.caffemodel
微调参考:
1)we will change the name of the last layer form fc8 to fc8_flickr in our prototxt, it will begin training with random weights.
2)decrease base_lr(初始学习率,在train_val.protxt文件值中) and boost the lr_mult(局部学习倍率,conv和fc层才有) on the newly introduced layer(fc8_flickr).
3)set stepsize(solver.prototxt,迭代多少次就下降一次学习率) to a lower value. So the learning rate to go down faster
4)So in the solver.prototxt,we can find the base_lr is 0.001 from 0.01,and the stepsize is become to 20000 from 100000.(重要)
base_lr: 0.001~0.01 降低,基础学习率降低,不然太快的话loss会变成non
lr_mult: w:10,b:20 增大,最后一个fc层(分类层)的局部学习率
stepsize: 20000~100000 降低,迭代多少次就调整一次学习率
max_iter: 降低,没必要迭代那么多次了
那么在网络的微调中,我们的整个流程分为以下几步:
1)依然是准备好我们的训练数据和测试数据
2)计算数据集的均值文件,因为集中特定领域的图像均值文件会跟ImageNet上比较General的数据的均值不太一样(重要,使用自己数据集的均值文件)
3)修改网络最后一层的输出类别,并且需要加快最后一层的参数学习速率
4)调整Solver的配置参数,通常学习速率和步长,迭代次数都要适当减少
5)启动训练,并且需要加载pretrained模型的参数(caffemodel)
总结:
1)需要变动source,meanfile,修改层的名字,基础学习率,(fc8)分类层局部学习率,步长,最大迭代次数,test_iter(测试图像个数/batch_size)
2)如果数据集比较小,可以增大weight_decay,减少过拟合
3)test_interval也可以相应缩小,比较好观察accuracy
4)display也可以相应缩小,比较好观察loss变化,毕竟总的迭代次数减少了嘛
8.caffe写日志
在train的时候最后加 tee $folder_prefix/caffe.log,就可以重定向到文件夹了。
1)你可以从系统 /tmp 文件夹获取,名字是什么 caffe.ubuntu.username.log.INFO.....之类。(参考output.m)
2)在train的时候最后加 tee $folder_prefix/caffe.log,就可以重定向到文件夹了。
9.test测试模型
# 用 validation set 得到已训练的 image_test 模型的分数
./build/tools/caffe test -model examples/image_test/train_val.prototxt -weights
examples/image_test/caffenet_train/caffenet_train_iter_10000.caffemodel
10.用blvc model微调10类的自建数据库模型(比自己训练精度高很多,训练集的原因,太少了)
fine-turning:(采用solver.prototxt + caffemodel)
./build/tools/caffe train -solver examples/image_test/solver10.prototxt -weights examples/image_test/bvlc_reference_caffenet.caffemodel
测试结果,精度很好,自己训练集训练12000次,accuracy是0.55,用imagenet模型进行微调2400次,accuracy达到了0.895(5000次以内是最高的)
test:(采用train_val.prototxt + caffemodel)
./build/tools/caffe test -model examples/image_test/train_val10.prototxt -weights examples/image_test/caffenet_train/caffenet_train_iter_5000.caffemodel
[已解决]遇到的问题:训练accuracy 0.89,测试accurary为0?(model不对,train_val.prototxt的最后一层的(fc8)节点数要等于样本数)
test的accuracy分数top1:0.8856(平均batch_size分数),平均loss分数为0.419755
test的accuracy分数top5:0.9952(平均batch_size分数),平均loss分数为0.419755
accuracy_param{
top_k: 5 # 默认为1
}
如果loss一直居高不下(一般大于3),都认为没有收敛,预测精度都会很低。这个时候就要考虑你的数据质量问题了,或者调整初始学习率。
11.单个图像测试image_test(自己的图像数据数据库),5个输入参数(deploy.prototxt + caffemodel + mean.binaryproto + synset_words.txt + watch.jpg)
./build/examples/cpp_classification/classification.bin examples/image_test/deploy10.prototxt examples/image_test/caffenet_train/caffenet_train_iter_5000.caffemodel data/image1000test200/image_test_mean.binaryproto data/image1000test200/synset_words.txt examples/image_test/test_images/150013018467.jpg
---------- Prediction for examples/image_test/test_images/150013018467.jpg -----------
1.0000 - "0 watch,钟表"
0.0000 - "1 headwear,头饰"
0.0000 - "7 perfume,香水"
0.0000 - "8 cosmetic,化妆品"
0.0000 - "9 shoe,鞋子"
----自己网上找了10类的图片,测试网络分类性能-----test0.jpg~test9.jpg
./build/examples/cpp_classification/classification.bin examples/image_test/deploy10.prototxt examples/image_test/caffenet_train/caffenet_train_iter_5000.caffemodel data/image1000test200/image_test_mean.binaryproto data/image1000test200/synset_words.txt examples/image_test/test_images/test1.jpg
测试结果非常好!基本都达到了要求,除了头饰
test0.jpg 1.0000 - "0 watch,钟表" 正确
test1.jpg 0.9982 - "1 headwear,头饰" 正确
test2.jpg 1.0000 - "2 sweatpants,运动裤" 正确
test3.jpg 0.9924 - "3 trunk,行李箱" 正确
test4.jpg 1.0000 - "4 chair,椅子" 正确
test5.jpg 0.9998 - "5 TVwall,电视墙" 正确
test6.jpg 1.0000 - "6 yogurt,酸奶" 正确
test7.jpg 0.6424 - "7 perfume,香水" 正确
test8.jpg 0.9983 - "8 cosmetic,化妆品" 正确
test9.jpg 1.0000 - "9 shoe,鞋子" 正确
结论:基本都达到了百分之99以上,除了香水的分类低一点,主要是因为香水也属于化妆品,所以分数被化妆品占去了一些,实际 (香水+化妆品)的分数为0.97,这样看来效果也很好,分类正确率也符合200个测试样本的accuracy的0.8856分数。
自带classification.cpp文件,就是用来分类的。它带有五个参数,你把这五个参数准备好,直接调用就可以了
总结:
第一个参数:depoly配置文件
第二个参数:caffemodel文件
第三个参数:均值文件
第四个参数:类别名称列表文件(需要自己制作synset_words.txt,最后一行不要多加回车(多出一行,返回标签数大于输出层节点数的错误),血的教训)
第五个参数:要分类的图片
其中synset_words.txt里面存放的是类别名称列表。比如你有三类:dog,cat,pig.你在实际运行的时候是用数字代替的(如0,1,2),但是预测分类的时候,要把数字换回名称,这个txt文件就是做这个用的。有多少类别就有多少行,每行一个名称:如
labels.txt:
dog
cat
pig
12.数据集提取(默认是val数据集的特征)每层特征,并显示出来(测试可行)(caffemodel + train_val.prototxt + 需要提取的层名(fc7) + batchsize + 数据格式)
---使用image_test的数据集提取特征---(用第二种方法,比较方便)
第一种方法:caffe的cmd接口只能提取特征,特征的可视化需要用python接口,自己根据extract_feature_example.sh修改第二个部分
./build/tools/extract_features.bin examples/image_test/caffenet_train/caffenet_train_iter_5000.caffemodel examples/image_test/train_val10.prototxt fc7 examples/image_test/temp_features 10 lmdb
第二种方法:
1.caffe-master下执行:sh extract_feature_example.sh(已写好,更改路径和需要提取的层,以及提取特征的图片个数)默认提取的train里面的?
2.转到lmdb和生成的特征.mat的目录下,将display_feature.m和display_network.m(都已写好)拷贝到此目录下
3.打开matlab,运行display_feature.m,可修改参数,显示图片的个数。
13.若想提取自己定义文件夹的特征,可更改val集(lmdb)路径(需要先将指定文件夹内图片转为lmdb)
只要不使用test,则不影响,提取完后(生成了lmdb和.mat),再改回去原来的验证集。
1)自己写个create_my_image_database_lmdb,生成自己文件夹的lmdb
2)修改train_val.prototxt的val路径为刚才生成的自己的文件夹,再进行特征提取。
3)改回原来的val路径
14.提取单个图像的特征(这里使用自己的集合,单个就是.mat的某行):
1)制作txt:图像名 类别号(后面用不到,可随意写) 使用create_my_image_database_lmdb.sh
2)使用数据库原来的mean,不是自己图片的mean。
3)提取自己数据集的特征 使用extract_feature_example.sh 修改下.prototxt里面的TEST的source
15.再在哈希桶temp中进行与需要测试的图像集进行欧式距离的比对,按距离从小到大排序,重排,显示
topk=1:
仅用hash:map 0.8900 hamming
仅用fc7:map 0.0.8950 euclidean
仅用perceptual_fc8_sigmoid:0.8850
topk=5:
仅用hash:map 0.8900 hamming
仅用fc7:map 0.9106 euclidean
仅用perceptual_fc8_sigmoid:0.8879
topk=10:
仅用hash:map 0.8892 hamming
仅用fc7:map 0.8955 euclidean
仅用perceptual_fc8_sigmoid:0.8879
topk=20:
仅用hash:map 0.8891 hamming
仅用fc7:map 0.8842 euclidean
仅用perceptual_fc8_sigmoid:0.8877
topk=50:
仅用hash:map 0.8893 hamming
仅用fc7:map 0.8556 euclidean
仅用perceptual_fc8_sigmoid:0.8893
topk=100(同类全,再大就没有意义了)
仅用hash:map 0.8896 hamming
仅用fc7:map 0.8300 euclidean
仅用perceptual_fc8_sigmoid:0.8842
总结:1.从MAP角度分析,实质判断的平均topk分类的准确度,也MAP越高也不一定代表最优,还得看用户的反馈。
当返回的top数据越多时,hash48特征性能优于fc7
当返回的top数据比较少时,fc7特征优于hash48
2.从运行性能上分析
hash48维hamming计算速度远快于fc的4096维euclidean计算(数据量越大越明显)
3.从存储和内存性能上分析
hash48的二进制存储以及内存的占用远小于fc的float型存储(数据量越大越明显)
4.从特征描述的抽象能力(高层语义)分析
hash48的抽象能力(高层语义)比fc的特征的语义更丰富,更抽象
-----接下来的任务是两步查询,哈希分桶,实际计算map没有进行两步操作,仅用了哈希,但是单张时,在外部可以检索,缩小范围。先用hash特征.mat,再用fc7特征.mat
-----查询图片的显示(先完成单张图像的特征提取(还是得老方法),再单张检索,参照计算MAP)
16.使用bvlc_reference_caffenet.caffemodel微调hash48 (log.info)
./build/tools/caffe train -solver examples/image_test/solver10_hash48.prototxt -weights examples/image_test/bvlc_reference_caffenet.caffemodel
Accuracy:0.88
Test测试微调好的模型
./build/tools/caffe test -model examples/image_test/train_val10_hash48.prototxt -weights examples/image_test/caffenet_train/caffenet_fineturning_hash48_iter_2000.caffemodel
test的accuracy分数top1:0.8804(平均batch_size分数),平均loss分数为0.390554
test的accuracy分数top5:0.9856(平均batch_size分数),平均loss分数为0.390554
test的accuracy分数top10:1(平均batch_size分数),平均loss分数为0.390554
17.使用bvlc_reference_caffenet.caffemodel微调hash128 (log.info)
./build/tools/caffe train -solver examples/image_test/solver10_hash128.prototxt -weights examples/image_test/bvlc_reference_caffenet.caffemodel
Accuracy:0.88
Test测试微调好的模型
./build/tools/caffe test -model examples/image_test/train_val10_hash128.prototxt -weights examples/image_test/caffenet_train/caffenet_fineturning_hash128_iter_1220.caffemodel
test的accuracy分数top1:0.876(平均batch_size分数),平均loss分数为0.379799
test的accuracy分数top5:1(平均batch_size分数),平均loss分数为0.379799
test的accuracy分数top10:1(平均batch_size分数),平均loss分数为0.379799
18.单个检索流程:caffe-master下:
1.只计算hash特征:run_one_precision.m (调用one_precision.m)
2.显示hash之后的检索图片看一下效果:display_retrieval_images_hash.m
3.再计算fc7特征:compute_fc7.m (调用one_precision.m)
4.再显示经过hash之后又采用fc7的检索图片:display_retrieval_images_hash_fc7.m
19.已完成 检索结果可视化ing , 将文件夹下所有图片变成.mat格式(才能完成上一步)
第二步,提取第一步的检索结果,进行fc7计算,并重排
已完成,结果在analysis文件夹
20.整体检索
准备工作,单个图像(用文件夹装)与标签
两步检索流程:
1.该文件夹下:create_my_image_database_lmdb.sh
2.该文件夹下:extract_my_feature.sh (要修改prototxt,图像集路径)
3.该文件夹下:display_feature.m 生成哈希的特征 启动matlab (features_fc8_hash48_sigmoid.mat) fc7特征也打包一下 one_image开头的.mat
4.caffe-master下:run_precision.m 设置路径
5.生成的距离,排名,标签都在caffe-master下
6.查看哈希检索结果,display_retrieval_images_hash.m 保存图片到analysis
7.继续计算fc7特征,compute_fc7.m
8.查看fc7检索结果,display_retrieval_images_hash_fc7.m 保存图片到analysis
直接fc7检索流程:
1.前三步相同
2.caffe-master下:compute_fc7_only.m
3.查看只用fc7检索结果,display_retrieval_images_hash_fc7_only.m 保存图片到analysis
21.caffe绘制训练过程的loss和accuracy曲线:
在caffe的训练过程中,大家难免想图形化自己的训练数据,以便更好的展示结果。如果自己写代码记录训练过程的数据,那就太麻烦了,caffe中其实已经自带了这样的小工具 :caffe-master/tools/extra/parse_log.sh,caffe-master/tools/extra/extract_seconds.py,caffe-master/tools/extra/plot_training_log.py.example
使用方法如下:
1.记录训练日志
在训练过程中的命令中加入一行参数 ,实现Log日志的记录,这样训练结束之后,会在Log文件夹中生成每次训练的Log日志
TOOLS=./build/tools
GLOG_logtostderr=0 GLOG_log_dir=/home/nielsen/caffe-master/examples/cifar10/log/ \
$TOOLS/caffe train -solver=/home/nielsen/caffe-master/examples/cifar10/solver10_hash48.prototxt
2.解析训练日志
将最上面说的3个脚本文件拷贝到log文件夹下,执行:
./parse_log.sh caffe.nielsen-ubuntu.nielsen.log
后面的参数为log文件名,这样就会在当前文件夹下生成一个.train文件和一个.test文件
3.生成图片
./plot_training_log.py.example 0 save.png caffe.nielsen-ubuntu.nielsen.log
就可以生成训练过程中的Test accuracy vs. Iters 曲线,其中0代表曲线类型,save.png代表保存的图片名称
caffe中支持很多种曲线绘制,通过指定不同的类型参数即可,具体参数如下:
Notes:
1. Supporting multiple logs.
2. Log file name must end with the lower-cased ".log".
Supported chart types:
0: Test accuracy vs. Iters
1: Test accuracy vs. Seconds
2: Test loss vs. Iters
3: Test loss vs. Seconds
4: Train learning rate vs. Iters
5: Train learning rate vs. Seconds
6: Train loss vs. Iters
7: Train loss vs. Seconds
caffe学习笔记18-image1000test200数据集分类与检索完整过程相关推荐
- Caffe学习笔记3——制作并训练自己的数据集
Caffe学习笔记3 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和h ...
- Caffe学习笔记4图像特征进行可视化
Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...
- Caffe学习笔记2
Caffe学习笔记2-用一个预训练模型提取特征 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hi ...
- caffe学习笔记(1)
caffe学习笔记(1) 刚开始学习caffe,发现一个非常好的博客caffe学习.看了几遍收益匪浅,但是总是记不住,所以决定安装该博客的步骤一点一点实现,然后记录在该系列的博客中.原博客是在ubun ...
- Pytorch学习笔记7——自定义数据集
Pytorch学习笔记7--自定义数据集 1.读取数据 首先继承自torch.utils.data.Dataset 重写len与getitem train就用train数据集,test就用test数据 ...
- caffe学习笔记2:net forward与backward
caffe学习笔记2:Forward and Backward 原网页:http://caffe.berkeleyvision.org/tutorial/forward_backward.html f ...
- 【计算机网络学习笔记18】防火墙技术、入侵检测技术
[计算机网络学习笔记18]防火墙技术.入侵检测技术 一.防火墙 防火墙 (firewall) :一种访问控制技术,通过严格控制进出网络边界的分组,禁止任何不必要的通信,从而减少潜在入侵的发生,尽可能降 ...
- Hadoop学习笔记—18.Sqoop框架学习
Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...
- Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel
Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只有单元格会进入编辑模式,而行编辑模式中则对编辑行的所有可编辑字段统一进行 ...
最新文章
- python中字典的练习
- 并发-9-Callable和Future
- 【任务脚本】0616吐槽tb坑爹活动,预测看好jd活动,更新汇总战绩,DIY净水器预告...
- 单片机定时器实验两位倒计时秒表_第5章 定时器与数码管基础
- UI Automation 简介
- 浅谈CC攻击原理与防范
- 12星座的出生年月日性格_12星座男人最爱的女人性格
- java中jtextpane_Java JTextPane
- Linux 命令(61)—— ldd 命令
- 给SLAM小车添加 手柄遥控 功能 罗技F710和PS4 手柄
- DBA-数据库管理员
- 谷歌、斯坦福联合发文:我们为什么一定要用大模型?
- Prometheus 告警配置以及抑制规则inhibit_rules 说明
- 把SD卡制作为启动卡的操作步骤
- Ubuntu 20.04 X86成功编译运行wayland、wayland-protocols、weston,亲测有效,踩了很多坑,完美解决。
- 理科类专业计算机中级或省级二级水平,2017非上海生源应届高校毕业生进沪就业评分办法|政策解读...
- UML交流群2月14日讨论内容!
- 播客接棒在线音频的盈利梦
- echarts——颜色控制
- centos7 图形界面
热门文章
- boost::count_if相关的测试程序
- boost::mp11::mp_map_contains相关用法的测试程序
- boost::hana::just用法的测试程序
- boost::strong_components用法的测试程序
- GDCM:gdcm::Overlay的测试程序
- GDCM:gdcm::EnumeratedValues的测试程序
- ITK:使用Viola Wells互信息执行多模式注册
- ITK:计算图像的最小,最大,方差和均值
- DCMTK:类DVPSIPCClient的示例消息服务器
- DCMTK:DcmItem类的测试程序