Caffe实现多标签分类
2017-09-27 11:06
381 查看
任务
我这里给出一个具体的任务咯,要求在以下图片中,识别出汽车品牌和车辆外形。汽车品牌分为:Benz/BMW/Audi 车辆外形分为:Sedan/SUV。这是一个只有72张图片的小数据库,包括了测试和训练集:
这里写图片描述
其中标注是这样的,Audi=0,BMW=1,Benz=2. Sedan =0, SUV=1。所以如果这辆车是奥迪的SUV,标注就是: xx.jpg 0 1。在数据库中,标注已经做好了。数据集的下载方式在文章的最后。
定义我们的网络结构
我们这里采用的是上述文章中薛大牛的方法,两个data层,一个data只放图片,另一个data放label,label通过slice layer切开。然后我们开始定义网络!修改AlexNet!这是我的网络:
做数据转换工具!
整个网络结构需要两类数据,一类是纯图片的lmdb,一类是包含两个标签的lmdb。首先我们需要修改caffe中的源码(相信我,很简单!)打开你编译caffe时候的工程,找到convert_imageset这个工程:
修改convert_imageset.cpp为convert_multilabel.cpp,内容如下,全部替代也可以:(见github:https://github.com/HolidayXue/CodeSnap/blob/master/convert_multilabel.cpp)然后重新编译这个convert_imageset这个project。你可能会遇到什么没有生成object的警告,在这里关掉即可:
完成后,我们会看到release文件夹下多了一个convert_multilabel的exe,这个就是我们的lmdb生成工具啦。
做图像和多标签数据!
下载我的(或者自己做也可以)数据集,用命令行命令:
然后还要做均值文件:
总之最后应该有六个东西,如图:
微调AlexNet!
网上下载一个bvlc_alexnet.caffemodel的权重文件。然后就是finetune了,参数的话得好好改改solver.prototxt里面,比如base_lr调小一点啦,迭代max_iter不要太多啦等等。此外也可以把两个fc8层的学习率适当提升一些,因为在finetune的时候训练好的权重只对原来没变的层有作用,这个新层就相当于是随机初始化的参数。
试一试我们的模型
这里还需要修改classification.cpp文件,因为Caffe自带的只支持单样本。我自己做了一个修改版本的,主要是修改了命令行和输出网络的部分,这个cpp只支持两标签,主要是用着方便,如果你需要更多的标签可以自己修改。编译步骤同convert_multilabel.cpp的编译。链接中的的代码直接就可以替换原来的cpp。
结果
写两个标注文件:
label1.txt:
Sedan
SUV
label2.txt:
Audi
BMW
Benz
1
2
3
4
5
6
7
8
我修改后的classification.exe 分类的命令行:
本项目的Github网址:https://github.com/ChenJoya/Caffe_MultiLabel_Classification
数据集:http://download.csdn.net/detail/mr_curry/9742578
我这里给出一个具体的任务咯,要求在以下图片中,识别出汽车品牌和车辆外形。汽车品牌分为:Benz/BMW/Audi 车辆外形分为:Sedan/SUV。这是一个只有72张图片的小数据库,包括了测试和训练集:
这里写图片描述
其中标注是这样的,Audi=0,BMW=1,Benz=2. Sedan =0, SUV=1。所以如果这辆车是奥迪的SUV,标注就是: xx.jpg 0 1。在数据库中,标注已经做好了。数据集的下载方式在文章的最后。
定义我们的网络结构
我们这里采用的是上述文章中薛大牛的方法,两个data层,一个data只放图片,另一个data放label,label通过slice layer切开。然后我们开始定义网络!修改AlexNet!这是我的网络:
做数据转换工具!
整个网络结构需要两类数据,一类是纯图片的lmdb,一类是包含两个标签的lmdb。首先我们需要修改caffe中的源码(相信我,很简单!)打开你编译caffe时候的工程,找到convert_imageset这个工程:
修改convert_imageset.cpp为convert_multilabel.cpp,内容如下,全部替代也可以:(见github:https://github.com/HolidayXue/CodeSnap/blob/master/convert_multilabel.cpp)然后重新编译这个convert_imageset这个project。你可能会遇到什么没有生成object的警告,在这里关掉即可:
完成后,我们会看到release文件夹下多了一个convert_multilabel的exe,这个就是我们的lmdb生成工具啦。
做图像和多标签数据!
下载我的(或者自己做也可以)数据集,用命令行命令:
convert_imageset.exe --resize_height=256 --resize_width=256 --shuffle=true D:\caffe-master\examples\ZnCar\Test\ D:\caffe-master\examples\ZnCar\Test.txt D:\caffe-master\examples\ZnCar\test_lmdb D:\caffe-master\examples\ZnCar\test_label_lmdb 2 pause
然后还要做均值文件:
compute_image_mean.exe D:\caffe-master\examples\ZnCar\test_lmdb D:\caffe-master\examples\ZnCar\TestMean.binaryproto pause
总之最后应该有六个东西,如图:
微调AlexNet!
网上下载一个bvlc_alexnet.caffemodel的权重文件。然后就是finetune了,参数的话得好好改改solver.prototxt里面,比如base_lr调小一点啦,迭代max_iter不要太多啦等等。此外也可以把两个fc8层的学习率适当提升一些,因为在finetune的时候训练好的权重只对原来没变的层有作用,这个新层就相当于是随机初始化的参数。
试一试我们的模型
这里还需要修改classification.cpp文件,因为Caffe自带的只支持单样本。我自己做了一个修改版本的,主要是修改了命令行和输出网络的部分,这个cpp只支持两标签,主要是用着方便,如果你需要更多的标签可以自己修改。编译步骤同convert_multilabel.cpp的编译。链接中的的代码直接就可以替换原来的cpp。
结果
写两个标注文件:
label1.txt:
Sedan
SUV
label2.txt:
Audi
BMW
Benz
1
2
3
4
5
6
7
8
我修改后的classification.exe 分类的命令行:
.\Build\x64\Release\classification.exe D:\caffe-master\examples\ZnCar\deploy.prototxt D:\caffe-master\examples\ZnCar\Train.caffemodel D: 9bdc \caffe-master\examples\ZnCar\ZnCarTrainMean.binaryproto D:\caffe-master\examples\ZnCar\label1.txt D:\caffe-master\examples\ZnCar\label2.txt D:\caffe-master\examples\ZnCar\Test\1.jpg .\Build\x64\Release\classification.exe D:\caffe-master\examples\ZnCar\deploy.prototxt D:\caffe-master\examples\ZnCar\Train.caffemodel D:\caffe-master\examples\ZnCar\ZnCarTrainMean.binaryproto D:\caffe-master\examples\ZnCar\label1.txt D:\caffe-master\examples\ZnCar\label2.txt D:\caffe-master\examples\ZnCar\Test\2.jpg pause
本项目的Github网址:https://github.com/ChenJoya/Caffe_MultiLabel_Classification
数据集:http://download.csdn.net/detail/mr_curry/9742578
相关文章推荐
- 多标签分类及其 caffe 实现总结
- 实战caffe多标签分类——汽车品牌与车辆外观(C++接口)[详细实现+数据集]
- 实战caffe多标签分类——汽车品牌与车辆外观(C++接口)[详细实现+数据集]
- Caffe 实现多标签分类
- WordPress中给媒体文件添加分类和标签的PHP功能实现
- 用caffe自带的训练好的模型测试图片的分类结果,实现啦啦啦
- Django学习笔记二:实现博客详情,完善文章的分类和标签
- Caffe python利用classify.py实现对单通道(灰度图)的数据进行分类
- Android 实现标签分类
- 运用训练好的模型,实现分类(caffe)
- Caffe实践 - 基于VGG16 多标签分类的训练与部署
- C++实现快速排序(源代码) 标签: c++算法systemc 2011-11-09 22:01 75011人阅读 评论(11) 收藏 举报 分类: Algorithm(1) C/C++(13
- caffe for windows 下使用caffemodel 实现cifar10的图像分类
- 使用caffe实现多标签输入
- 使用caffe训练一个多标签分类/回归模型
- Android端调用Caffe模型实现CNN分类
- Caffe实践 - 基于VGG16 多标签分类的训练与部署
- Ubutnu系统下用QT等IDE调用Caffe、SSD框架,编译Caffe实现分类检测等工程应用的方法
- cocos2d-x 通过JNI实现c/c++和Android的java层函数互调(三) 2013-07-04 10:06:20| 分类: cocos2d-x | 标签: |字号大
- Caffe实践 - 单标签图片分类流程