微调CaffeNet用于车颜色识别
2016-01-10 21:18
295 查看
说明:主要思想是微调使用ImageNet预训练的CaffeNet模型参数,用来对车颜色进行识别。为了不和其他文件混乱,我们在examples下新建文件夹finetune_myself。
1.计算图像均值
caffenet需要图像均值文件,所以先计算均值文件。在finetune_myself下新建文件夹Image_mean,从imagenet中拷贝make_imagenet_mean.sh到finetune_myself下,更名为make_image_mean.sh(为了和imagenet区分),然后修改脚本如下:
这样,生成的均值文件保存在finetune_myself下的Image_mean文件夹里,名字为image_mean.binaryproto。
(实验中发现直接用ImageNet的均值文件也没有什么问题,感觉均值文件影响并不大啊!!!)
训练和测试阶段的data层均要修改。
(2)假设训练集和测试集的lmdb文件在finetune_myself下,所以训练阶段的的data层:
同理,TEST阶段的data层也作同样的修改。即:
(3)修改fc8层和相关层
将层名改为fc8_myself(当然其他也行),并修改权重的lr_mult=10,bias的lr_mult=20,目的是让非微调层学习更快。num_output修改为类别数。具体如下:
该路径改为train_val.Prototxt的路径。
还有
此路径是训练过程得到的caffemodel和solverstate保存路径,按自己想保存的路径更改。
这样,模型就改好了。
:
精度还是挺高的。
训练完成后,得到caffemodel文件:
测试:
这些路径按自己的设置,labels是标签,比如你的train.txt中白色标签是0,红色标签是1,那么labels中第一行是white,第二行是red,其他的也是这样按顺序排。
结果:
1.计算图像均值
caffenet需要图像均值文件,所以先计算均值文件。在finetune_myself下新建文件夹Image_mean,从imagenet中拷贝make_imagenet_mean.sh到finetune_myself下,更名为make_image_mean.sh(为了和imagenet区分),然后修改脚本如下:EXAMPLE=examples/finetune_myself #该路径下为训练图像的lmdb文件 DATA=examples/finetune_myself/Image_mean #该路径为生成的均值文件保存的地方 TOOLS=build/tools $TOOLS/compute_image_mean $EXAMPLE/car_train_lmdb \ #这里的lmdb和自己的对应 $DATA/image_mean.binaryproto #生成的均值文件名字,这里为了区分改一下名字
这样,生成的均值文件保存在finetune_myself下的Image_mean文件夹里,名字为image_mean.binaryproto。
(实验中发现直接用ImageNet的均值文件也没有什么问题,感觉均值文件影响并不大啊!!!)
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层:
data_param { source:"examples/finetune_myself/car_train_lmdb" batch_size: 50 #这里自己可以修改合适的batch大小 backend:LMDB }
同理,TEST阶段的data层也作同样的修改。即:
data_param{ source: "examples/finetune_myself/car_test_lmdb" batch_size:50 backend:LMDB }
(3)修改fc8层和相关层
将层名改为fc8_myself(当然其他也行),并修改权重的lr_mult=10,bias的lr_mult=20,目的是让非微调层学习更快。num_output修改为类别数。具体如下:
layer { name: "fc8_myself" type: "InnerProduct" bottom: "fc7" top: "fc8_myself" param { lr_mult: 10 decay_mult: 1 } param { lr_mult: 20 decay_mult: 0 } inner_product_param { num_output: 8 #根据类别修改,我做的实验为8类 weight_filler { type: "gaussian" std: 0.01 } bias_filler { type: "constant" value: 0 } } }与fc8相关的层也要修改:
layer { name:"accuracy" type:"Accuracy" bottom: "fc8_myself" bottom:"label" top:"accuracy" include { phase: TEST } }
layer { name: "loss" type: "SoftmaxWithLoss" bottom: "fc8_myself" bottom: "label" top: "loss" }
对solver.prototxt的修改:
主要是net:"examples/finetune_myself/models/train_val.prototxt",
该路径改为train_val.Prototxt的路径。
还有
snapshot_prefix:"examples/finetune_myself/models"
此路径是训练过程得到的caffemodel和solverstate保存路径,按自己想保存的路径更改。
对deploy.prototxt的修改:
网络的名字name要与train_val.prototxt相同。然后修改fc8层和相关层:layer { name: "fc8_myself" type: "InnerProduct" bottom: "fc7" top: "fc8_myself" inner_product_param { num_output: 8 #根据类别数改 } }
layer { name:"prob" type:"Softmax" bottom: "fc8_myself" top:"prob" }
这样,模型就改好了。
3.准备预训练好的caffenet模型参数
finetune_myself下新建文件夹pre_train_models,运行./scripts/download_model_binary.py examples/finetune_myself/pre_train_models即将文件下载在pre_train_models中。
4.开始训练
./build/tools/caffe train –solver examples/finetune_myself/models/solver.ptototxt –weights examples/finetune_myself/pre_train_models/bvlc_reference_caffenet
5.结果
训练结果:
精度还是挺高的。
训练完成后,得到caffemodel文件:
测试:
./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,其他的也是这样按顺序排。
结果:
white - "0.9963" gray - "0.0036" green - "0.0001"输出前三个预测结果
相关文章推荐
- jquery在ie7下选择器的问题导致append失效的解决方法
- Caffe 用于解决预测(回归)问题
- 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史)
- JavaScript系列(二:基础知识)
- JQuery直接调用asp.net后台WebMethod方法
- jQuery中的事件
- 浅析JavaScript原型链与原型链式继承
- jQuery学习笔记
- 浅析JavaScript作用域链
- Web--CSS控制页面(link与import方式差别)
- AngularJs 动态加载模块和依赖
- JS选取DOM元素的方法
- node.js的nvm与npm
- CSS3学习笔记(4)-CSS3函数
- 【html】What is href=“#” and why is it used?
- can't find referenced pointcut原因及解决方案
- ace treeview 的动态请求json数据返回格式
- html5本地存储
- JSON.toJSONString会把key的首字母转成小写
- jQuery 2.2 和 1.12 新版本发布