初步接触多标签多任务训练的时候,网上能找到的资料文献几乎全看了,不禁感叹一下,百家争鸣百花齐放五花八门,对我来说真的是费了好大劲来缕清思路,没有一篇是可以完全照着能复现出来的,要么缺少数据集,要么缺少代码,要么步骤没有讲清楚,总之是参阅了很多的网友的智慧,终于跑通了自己的。

参考过的资料我尽量都贴在文章后面,以表敬意。

网上好几种思路来修改caffe,使之能够处理多标签数据集,我这里只跑通了修改caffe DataLayer 相关源码,修改的地方貌似较多,对之前的兼容性也还没测试,所之前的caffe项目建议备份一个。

一、数据集

  1. 车辆属性:品牌(奥迪、宝马、奔驰)、车型(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文件夹是我自己新建的:
caffe修改DataLayer来实现多标签多任务——车辆属性识别
train.txt的内容:文件名相对路径+label1+label2,这个标注文件的制作我没找到好的工具,难道要自己写个小程序用来标注多标签样本吗,谁知道的话,麻烦后面留言告知,不胜感激。
caffe修改DataLayer来实现多标签多任务——车辆属性识别
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:
caffe修改DataLayer来实现多标签多任务——车辆属性识别
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,所以还是有所不同,相关代码放在网盘了,下载后可以看到。

  1. 训练

先截图几个重要文件的目录,便于理解:

这个目录下有制作好的lmdb格式的数据集,有训练网络prototxt文件,训练生成的caffemodel文件,测试网络prototxt文件、测试脚本py和图片:
caffe修改DataLayer来实现多标签多任务——车辆属性识别
执行以下代码,开始训练:

[email protected]:~/caffe-multilabels-datalayer$ sudo ./build/tools/caffe train --solver=examples/car-multilabels/multilabels-alexnet/solver.prototxt
caffe修改DataLayer来实现多标签多任务——车辆属性识别
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
caffe修改DataLayer来实现多标签多任务——车辆属性识别
6.测试一张图片

[email protected]:~/caffe-multilabels-datalayer$ python examples/car-multilabels/multilabels-alexnet/pycaffe_test.py

品牌标签:0—奥迪,1—宝马,2—奔驰

车型标签:0—小轿车,1—越野车
caffe修改DataLayer来实现多标签多任务——车辆属性识别

caffe修改DataLayer来实现多标签多任务——车辆属性识别

caffe修改DataLayer来实现多标签多任务——车辆属性识别
caffe修改DataLayer来实现多标签多任务——车辆属性识别
caffe修改DataLayer来实现多标签多任务——车辆属性识别
caffe修改DataLayer来实现多标签多任务——车辆属性识别
本文提到的要修改的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

相关文章:

  • 2021-05-02
  • 2022-02-09
  • 2022-02-08
  • 2021-10-26
  • 2022-12-23
  • 2021-12-25
  • 2021-06-09
  • 2021-09-27
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-10
  • 2021-09-13
  • 2021-09-03
  • 2021-09-09
  • 2021-04-21
相关资源
相似解决方案