caffe上手:微调CaffeNet用于车颜色识别

说明:主要思想是微调使用ImageNet预训练的CaffeNet模型参数,用来对车颜色进行识别。为了不和其他文件混乱,我们在examples下新建文件夹finetune_myself。


1.计算图像均值

caffenet需要图像均值文件,所以先计算均值文件。在finetune_myself下新建文件夹Image_mean,从imagenet中拷贝make_imagenet_mean.sh到finetune_myself下,更名为make_image_mean.sh(为了和imagenet区分),然后修改脚本如下:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. EXAMPLE=examples/finetune_myself #该路径下为训练图像的lmdb文件  
  2. DATA=examples/finetune_myself/Image_mean #该路径为生成的均值文件保存的地方  
  3. TOOLS=build/tools  
  4.   
  5. $TOOLS/compute_image_mean $EXAMPLE/car_train_lmdb \ #这里的lmdb和自己的对应  
  6.   $DATA/image_mean.binaryproto #生成的均值文件名字,这里为了区分改一下名字  

这样,生成的均值文件保存在finetune_myself下的Image_mean文件夹里,名字为image_mean.binaryproto。


2.准备caffenet模型

在finetune_myself下新建文件夹,命名为models,将caffenet的train_val.prototxt、solver.prototxt和deploy.prototxt复制到此models文件夹里,然后,对模型进行修改。假设我们的训练集类别是m,那么fc8层的num_output需要修改成m,又由于finetune时用到的权重是根据层名匹配的,而fc8的num_output已经修改,该层的参数必须重新学习,所以我们把该层的名字也进行修改,如改为fc8_myself。具体修改如下。

对train_val.prototxt的修改:

(1) mean_file路径:"examples/finetune_myself/Image_mean/image_mean.binaryproto"


训练和测试阶段的data层均要修改。

(2)假设训练集和测试集的lmdb文件在finetune_myself下,所以训练阶段的的data层:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. data_param {  
  2.  source:"examples/finetune_myself/car_train_lmdb"  
  3.  batch_size: 50 #这里自己可以修改合适的batch大小  
  4.  backend:LMDB  
  5. }  

同理,TEST阶段的data层也作同样的修改。即:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. data_param{  
  2.     source: "examples/finetune_myself/car_test_lmdb"  
  3.     batch_size:50  
  4.     backend:LMDB  
  5.   }  

(3)修改fc8层和相关层

将层名改为fc8_myself(当然其他也行),并修改权重的lr_mult=10,bias的lr_mult=20,目的是让非微调层学习更快。num_output修改为类别数。具体如下:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. layer {  
  2.   name: "fc8_myself"  
  3.   type: "InnerProduct"  
  4.   bottom: "fc7"  
  5.   top: "fc8_myself"  
  6.   param {  
  7.     lr_mult: 10  
  8.     decay_mult: 1  
  9.   }  
  10.   param {  
  11.     lr_mult: 20  
  12.     decay_mult: 0  
  13.   }  
  14.   inner_product_param {  
  15.     num_output: 8  #根据类别修改,我做的实验为8类  
  16.     weight_filler {  
  17.       type: "gaussian"  
  18.       std: 0.01  
  19.     }  
  20.     bias_filler {  
  21.       type: "constant"  
  22.       value: 0  
  23.     }  
  24.   }  
  25. }  
与fc8相关的层也要修改:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. layer {  
  2.   name:"accuracy"  
  3.   type:"Accuracy"  
  4.   bottom: "fc8_myself"  
  5.   bottom:"label"  
  6.   top:"accuracy"  
  7.   include {  
  8.   phase: TEST  
  9.   }  
  10. }  


[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. layer {  
  2.   name: "loss"  
  3.   type: "SoftmaxWithLoss"  
  4.   bottom: "fc8_myself"  
  5.   bottom: "label"  
  6.   top: "loss"  
  7. }  

对solver.prototxt的修改:

主要是
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. net:"examples/finetune_myself/models/train_val.prototxt",  

该路径改为train_val.Prototxt的路径。

还有

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. snapshot_prefix:"examples/finetune_myself/models/caffenet"  

此路径是训练过程得到的caffemodel和solverstate保存路径,按自己想保存的路径更改。

对deploy.prototxt的修改:

网络的名字name要与train_val.prototxt相同。然后修改fc8层和相关层:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. layer {  
  2.   name: "fc8_myself"  
  3.   type: "InnerProduct"  
  4.   bottom: "fc7"  
  5.   top: "fc8_myself"  
  6.   inner_product_param {  
  7.   num_output: 8 #根据类别数改  
  8.   }  
  9. }  

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. layer {  
  2.   name:"prob"  
  3.   type:"Softmax"  
  4.   bottom: "fc8_myself"  
  5.   top:"prob"  
  6. }  

这样,模型就改好了。

3.准备预训练好的caffenet模型参数

finetune_myself下新建文件夹pre_train_models,运行

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ./scripts/download_model_binary.py examples/finetune_myself/pre_train_models  
即将文件下载在pre_train_models中。

4.开始训练

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ./build/tools/caffe train –solver examples/finetune_myself/models/solver.ptototxt –weights examples/finetune_myself/pre_train_models/bvlc_reference_caffenet  

5.结果

训练结果

精度还是挺高的。

训练完成后,得到caffemodel文件:

测试:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ./build/examples/cpp_classification/classification.bin **/**/deploy.prototxt **/***/models_iter_100000.caffemodel **/**/image_mean.binaryproto **/**/labels.txt **/**/car.jpg  

这些路径按自己的设置,labels是标签,比如你的train.txt中白色标签是0,红色标签是1,那么labels中第一行是white,第二行是red,其他的也是这样按顺序排。


结果:
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. white - "0.9963"  
  2. gray - "0.0036"  
  3. green - "0.0001"  
输出前三个预测结果







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值