初步接触多标签多任务训练的时候,网上能找到的资料文献几乎全看了,不禁感叹一下,百家争鸣百花齐放五花八门,对我来说真的是费了好大劲来缕清思路,没有一篇是可以完全照着能复现出来的,要么缺少数据集,要么缺少代码,要么步骤没有讲清楚,总之是参阅了很多的网友的智慧,终于跑通了自己的。
参考过的资料我尽量都贴在文章后面,以表敬意。
网上好几种思路来修改caffe,使之能够处理多标签数据集,我这里只跑通了修改caffe DataLayer 相关源码,修改的地方貌似较多,对之前的兼容性也还没测试,所之前的caffe项目建议备份一个。
一、数据集
- 车辆属性:品牌(奥迪、宝马、奔驰)、车型(suv、小轿车)
参考这篇文章的汽车属性识别,https://blog.csdn.net/u014696921/article/details/70245141,不过它是windows vs工程,所以只是借用了它这里提供的数据集:http://download.csdn.net/detail/mr_curry/9742578 ,下载要好多积分啊,不过还是非常感谢博主提供的数据集。
我将该数据稍微改了一下结构目录,方便后续训练,修改后放在这里了:
链接:https://pan.baidu.com/s/1naw84G5RI8OkEj_sCl5NQw
提取码:j5kx
数据集下载后放在这个路径下,car_multilabes文件夹是我自己新建的:
train.txt的内容:文件名相对路径+label1+label2,这个标注文件的制作我没找到好的工具,难道要自己写个小程序用来标注多标签样本吗,谁知道的话,麻烦后面留言告知,不胜感激。
2.lmdb数据集制作
[email protected]:~/caffe-multilabels-datalayer$ sudo ./build/tools/convert_imageset -shuffle=true -resize_height=224 -resize_width=224 /home/exbot/caffe-multilabels-datalayer/data/car_multilabels/ /home/exbot/caffe-multilabels-datalayer/data/car_multilabels/train.txt ./examples/car_multilabels/multilabels-alexnet/car_train_lmdb_224x224
[email protected]:~/caffe-multilabels-datalayer$ sudo ./build/tools/convert_imageset -shuffle=true -resize_height=224 -resize_width=224 /home/exbot/caffe-multilabels-datalayer/data/car_multilabels/ /home/exbot/caffe-multilabels-datalayer/data/car_multilabels/test.txt ./examples/car_multilabels/multilabels-alexnet/car_test_lmdb_224x224
在这个目录下生成car_train_lmdb_224x224和car_test_lmdb_224x224:
2.修改caffe源码。
主要参考文章https://www.jianshu.com/p/fdf7c599ab9d,它是实现了4位验证码的识别,是基于Alexnet网络,加入了slice层之后能够处理多标签数据集。
主要参考他这里的修改caffe源码部分,他写的很清晰,只不过他是根据自己识别4位验证码的需要,修改源码时将标签个数也写死了4个label,无法广泛使用,所以我又修改了一些代码,后面网盘里一起上传,大家可以下下载来看下,这里也参考了很多资料,记不清楚了。
网盘里下载好之后,替换如下对应的文件:
/caffe/tools/convert_imageset.cpp
/caffe/include/caffe/util/io.hpp
/caffe/src/caffe/util/io.cpp
/caffe/src/caffe/proto/caffe.proto
/caffe/src/caffe/layers/data_layer.cpp
3. 修改Alexnet网络,实现多标签。
也参考了上面这篇文章,不过我自己的数据集是车辆属性,品牌和车型,2个label,所以还是有所不同,相关代码放在网盘了,下载后可以看到。
- 训练
先截图几个重要文件的目录,便于理解:
这个目录下有制作好的lmdb格式的数据集,有训练网络prototxt文件,训练生成的caffemodel文件,测试网络prototxt文件、测试脚本py和图片:
执行以下代码,开始训练:
[email protected]:~/caffe-multilabels-datalayer$ sudo ./build/tools/caffe train --solver=examples/car-multilabels/multilabels-alexnet/solver.prototxt
5.查看训练好的模型和log
[email protected]:~/caffe-multilabels-datalayer$ sudo ./build/tools/caffe test -model=examples/car-multilabels/multilabels-alexnet/train_val.prototxt -weights examples/car-multilabels/multilabels-alexnet/multilabels-alexnet_iter_20000.caffemodel -iterations 100
6.测试一张图片
[email protected]:~/caffe-multilabels-datalayer$ python examples/car-multilabels/multilabels-alexnet/pycaffe_test.py
品牌标签:0—奥迪,1—宝马,2—奔驰
车型标签:0—小轿车,1—越野车
本文提到的要修改的caffe源码、网络prototxt文件、训练好的caffemodel、测试脚本和图片,都上传了,请自行下载:
链接:https://pan.baidu.com/s/1IrOtdRfd_Zjo95Bd-WpAgQ
提取码:j1t7
#参考
https://www.jianshu.com/p/fdf7c599ab9d
https://blog.csdn.net/u014696921/article/details/70245141
https://blog.csdn.net/twinkle_star1314/article/details/77256091