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数据集分类与检索完整过程相关推荐

  1. Caffe学习笔记3——制作并训练自己的数据集

    Caffe学习笔记3 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和h ...

  2. Caffe学习笔记4图像特征进行可视化

    Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...

  3. Caffe学习笔记2

    Caffe学习笔记2-用一个预训练模型提取特征 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hi ...

  4. caffe学习笔记(1)

    caffe学习笔记(1) 刚开始学习caffe,发现一个非常好的博客caffe学习.看了几遍收益匪浅,但是总是记不住,所以决定安装该博客的步骤一点一点实现,然后记录在该系列的博客中.原博客是在ubun ...

  5. Pytorch学习笔记7——自定义数据集

    Pytorch学习笔记7--自定义数据集 1.读取数据 首先继承自torch.utils.data.Dataset 重写len与getitem train就用train数据集,test就用test数据 ...

  6. caffe学习笔记2:net forward与backward

    caffe学习笔记2:Forward and Backward 原网页:http://caffe.berkeleyvision.org/tutorial/forward_backward.html f ...

  7. 【计算机网络学习笔记18】防火墙技术、入侵检测技术

    [计算机网络学习笔记18]防火墙技术.入侵检测技术 一.防火墙 防火墙 (firewall) :一种访问控制技术,通过严格控制进出网络边界的分组,禁止任何不必要的通信,从而减少潜在入侵的发生,尽可能降 ...

  8. Hadoop学习笔记—18.Sqoop框架学习

    Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...

  9. Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel

    Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只有单元格会进入编辑模式,而行编辑模式中则对编辑行的所有可编辑字段统一进行 ...

最新文章

  1. python中字典的练习
  2. 并发-9-Callable和Future
  3. 【任务脚本】0616吐槽tb坑爹活动,预测看好jd活动,更新汇总战绩,DIY净水器预告...
  4. 单片机定时器实验两位倒计时秒表_第5章 定时器与数码管基础
  5. UI Automation 简介
  6. 浅谈CC攻击原理与防范
  7. 12星座的出生年月日性格_12星座男人最爱的女人性格
  8. java中jtextpane_Java JTextPane
  9. Linux 命令(61)—— ldd 命令
  10. 给SLAM小车添加 手柄遥控 功能 罗技F710和PS4 手柄
  11. DBA-数据库管理员
  12. 谷歌、斯坦福联合发文:我们为什么一定要用大模型?
  13. Prometheus 告警配置以及抑制规则inhibit_rules 说明
  14. 把SD卡制作为启动卡的操作步骤
  15. Ubuntu 20.04 X86成功编译运行wayland、wayland-protocols、weston,亲测有效,踩了很多坑,完美解决。
  16. 理科类专业计算机中级或省级二级水平,2017非上海生源应届高校毕业生进沪就业评分办法|政策解读...
  17. UML交流群2月14日讨论内容!
  18. 播客接棒在线音频的盈利梦
  19. echarts——颜色控制
  20. centos7 图形界面

热门文章

  1. boost::count_if相关的测试程序
  2. boost::mp11::mp_map_contains相关用法的测试程序
  3. boost::hana::just用法的测试程序
  4. boost::strong_components用法的测试程序
  5. GDCM:gdcm::Overlay的测试程序
  6. GDCM:gdcm::EnumeratedValues的测试程序
  7. ITK:使用Viola Wells互信息执行多模式注册
  8. ITK:计算图像的最小,最大,方差和均值
  9. DCMTK:类DVPSIPCClient的示例消息服务器
  10. DCMTK:DcmItem类的测试程序