解决的目标问题:多分类问题,比如车辆的外形和颜色,苹果的大小和颜色;多任务:车牌角点的定位和车牌的颜色。定位在技术上属于回归,车牌颜色判断则属于分类。
  
  技术点
  
  caffe默认是单输入任务单标签的,也就是一个样本,其任务只有一个,标签只有一个,比如图片是什么颜色,图片是什么物体。
  
  # ${caffe_src_root}/tools/convert_imageset.cpp 第121行
  
  status = ReadImageToDatum(root_folder + lines[line_id].first,
  
  lines[line_id].second, resize_height, resize_width, is_color,
  
  enc, &datum);
  
  ## 其中 ReadImageToDatum的定义如下 ${caffe_src_root}/include/caffe/util/io.hpp
  
  bool ReadImageToDatum(const string& filename, const int label,
  
  const int height, const int width, const bool is_color,
  
  const std::string & encoding, Datum* datum);
  
  ## ${caffe_src_root}/src/caffe/util/io.cpp 中的该函数实现,涉及到Datum的定义,需要把Datum定义修改成也要支持多标签
  
  bool ReadImageToDatum(const string& filename, const int label,
  
  const int height, const int width, const bool is_color,
  
  const std::string & encoding, Datum* datum) {
  
  cv::Mat cv_img = ReadImageToCVMat(filename, height, width, is_color);
  
  if (cv_img.data) {
  
  if (encoding.size()) {
  
  if ( (cv_img.channels() == 3) == is_color && !height && !width &&
  
  matchExt(filename, encoding) )
  
  return ReadFileToDatum(filename, label, datum);
  
  std::vector<uchar> buf;
  
  cv::imencode("."+encoding, cv_img, buf);
  
  datum->set_data(std::string(reinterpret_cast<char*>(&buf[0]),
  
  buf.size()));
  
  datum->set_label(label);
  
  datum->set_encoded(true);
  
  return true;
  
  }
  
  CVMatToDatum(cv_img, datum);
  
  datum->set_label(label);
  
  return true;
  
  } else {
  
  return false;
  
  }
  
  }
  
  为了支持多任务,多标签,首先要解决输入问题。比如一个样本 定义如下:
  
  vehicle/1.jpg 0 1
  
  修改源码支持多标签
  
  其中第一个属性是车辆外形,0代表sedian,第二个属性是车身颜色,1代表白色。假如图片是60x60的RGB图像, 如果是单任务多属性输入,一个简单的更改方案是把ReadImageToDatum函数修改成如下定义,并修改相关的实现函数和convert_imageset.cpp
  
  bool ReadImageToDatum(const string& filename, const vector<int> & labels,
  
  const int height, const int width, const bool is_color,
  
  const std::string & encoding, Datum* datum);
  
  faster rcnn采用自定义的python输入层作用训练输入,输入有多个labels,检测目标的roi,其中bbox_targets, bbox_inside_weights, bbox_outside_weights是作为SmoothL1Loss损失函数的输入。自定义python输入层的源码参考 py-faster-rcnn/lib/roi_data_layer/
  
  name: "VGG_ILSVRC_16_layers"
  
  layer {
  
  name: 'data'
  
  type: 'Python'
  
  top: 'data'
  
  top: 'rois'
  
  top: 'labels'
  
  top: 'bbox_targets'
  
  top: 'bbox_inside_www.jiahuayulpt.com weights'
  
  top: 'bbox_outside_weights'
  
  python_param {
  
  module: 'roi_data_www.baohuayule.net/ layer.layer'
  
  layer: 'RoIDataLayer'
  
  param_str: "'num_classes': 21"
  
  }
  
  }
  
  从https://github.com/HolidayXue/CodeSnap/blob/master/convert_multilabel.cpp源码修改,保存到${caffe_root}/tools/convert_multi_label_www.yongshi123.cn imageset.cpp,重新编译caffe工程,在${caffe_root}目录下运行该工具,
  
  .build_release/tools/convert_multi_label_imageset.bin -resize_width=256 -resize_height=256 ~/my\ workspace/bounding-box-tool/mlds/train.list /train-data/vehicle-type-color-dataset/
  
  多数据源输入支持多标签
  
  假设对于HxW的RGB图像,转换成caffe的blob定义上1x3xHxW,对于一个任务的有n个标签,则其blob定义是1xnx1x1,每个任务对应一个blob,???那么可以在在第二维度对两个blob进行拼接???
  
  拼接之后再从第二维度对blob进行切分操作,切分出多个blob,作为每个属性训练任务的输入
  
  拼接之后进行常规的卷积操作,只是在最后的每个任务的损失函数之前的fc层再切分,如下图
  
  训练
  
  参考faster-rcnn的模型,可以看到损失函数是相互独立的,但多了一个weight参数,猜测是caffe在训练时,按下面的公式计算总的损失
  
  Lt = w1*L1 + w2 * L2
  
  faster-rcnn中经过一系列卷积层后,连接了一个ROIPooling层,再接上FC6、FC7层,从最后一个FC7层一分为2,分别接一个cls_score的FC层和名为loss_cls的SoftMaxWithLoss,接bbox_pred的FC层和名为loss_bbox的SmoothL1Loss的回归层
  
  参考:
  
  https://arxiv.org/abs/1604.02878v1
  
  https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html?from=timeline&isappinstalled=1
  
  https://kpzhang93.github.io/MTCNN_face_www.078886.cn detection_alignment/paper/spl.pdf
  
  https://github.com/happynear/MTCNN_face_detection_alignment
  
  https://github.com/naritapandhe/Gender-Age-Classification-CNN
  
  https://github.com/cunjian/multitask_CNN
  
  https://zhuanlan.zhihu.com/p/22190532
  
  https://github.com/rbgirshick/ www.tiaotiaoylzc.com py-faster-rcnn/blob/master/models/pascal_voc/VGG16/fast_rcnn/train.prototxt
  
  ${caffe_source_root}/examples/pascal-multilabel-with-datalayer.ipynb
  
  http://www.cnblogs.com/yymn/articles/7741741.html
  
  https://yq.aliyun.com/ziliao/572047
  
  https://blog.csdn.net/u013010889/article/details/53098346
  
  caffe网络在线可视化工具: http://www.yongshiyule178.com ethereon.github.io/netscope/#/editor

caffe多任务、多标签的更多相关文章

  1. Caffe实现多标签输入,添加数据层(data layer)

    因为之前遇到了sequence learning问题(CRNN),里面涉及到一张图对应多个标签.Caffe源码本身是不支持多类标签数据的输入的. 如果之前习惯调用脚本create_imagenet.s ...

  2. caffe读取多标签的lmdb数据

    问题描述: lmdb文件支持数据+标签的形式,但是却只能写入一个标签,引入多标签的解决方法有很多,这儿详细说一下我的办法:制作多个data数据,分别加入一个标签.我的方法只适用于标签数量较少的情况,标 ...

  3. caffe实现多任务学习

    Github: https://github.com/Haiyang21/Caffe_MultiLabel_Classification Blogs  1. 采用多label的lmdb+Slice L ...

  4. 多标签caffe重新编译

    说明: Caffe自带的图像转LMDB接口只支持单label,对于多label的任务,可以使用HDF5的格式,也可以通过修改caffe代码来实现.本篇文章介绍怎么通过修改DataLayer来实现带Mu ...

  5. MachineLN博客目录

    MachineLN博客目录 https://blog.csdn.net/u014365862/article/details/78422372 本文为博主原创文章,未经博主允许不得转载.有问题可以加微 ...

  6. Caffe-SSD相关源码说明和调试记录

    1      对Blob的理解及其操作: Blob是一个四维的数组.维度从高到低分别是: (num_,channels_,height_,width_) 对于图像数据来说就是:图片个数,彩色通道个数, ...

  7. 下载imagenet2012数据集,以及label说明

    updated@2018-12-07 15:22:08 官方下载地址:http://www.image-net.org/challenges/LSVRC/2012/nonpub-downloads , ...

  8. caffe 根据txt生成多标签LMDB数据

    1. 前提: 已经准备好train.txt, test.txt文件, 格式如下 此处有坑, 如果是windows下生成txt, 换行符为\r\n, 需要替换成 \n才能在linux运行. 可以使用se ...

  9. Multi label 多标签分类问题(Pytorch,TensorFlow,Caffe)

    适用场景:一个输入对应多个label,或输入类别间不互斥 调用函数: 1. Pytorch使用torch.nn.BCEloss 2. Tensorflow使用tf.losses.sigmoid_cro ...

随机推荐

  1. CAN总线学习系列之二——CAN总线与RS485的比较

    CAN总线学习系列之二——CAN总线与RS485的比较 上 一节介绍了一下CAN总线的基本知识,那么有人会问,现在的总线格式很多,CAN相对于其他的总线有什么特点啊?这个问题问的好,所以我想与其它总线 ...

  2. kettle学习笔记(一)——入门与安装

    一.概述 1.kettle是什么 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定.中文名称叫水壶,该项目的主程序 ...

  3. 20155318 《网络攻防》 Exp8 Web基础

    20155318 <网络攻防> Exp8 Web基础 基础问题 什么是表单? HTML表单用于收集用户输入,用元素定义,包含不同类型的input元素.复选框.单选按钮.提交按钮等等.一个表 ...

  4. 谈谈对Python装饰器的理解

    装饰器,又名函数修饰符.笔者觉得函数修饰符,这个名字更能直观的反应他的作用. 函数修饰符语法特征 :         @ + 修饰符 函数修饰符的装饰对象:        函数修饰符,就是说他修饰的是 ...

  5. 按键精灵对APP自动化测试(上)

    简单介绍下应用背景:测试安卓app时发现重复点击某一按钮的时候会出现报错,开发修复后提交测试.如果采用手动点击按钮,效率不高,在领导提示下使用按键精灵实现自动操作. 一.       安卓手机按键精灵 ...

  6. svn commit时报错 File already exists

    第一步: 删除当前文件所在文件夹,提交commit 第二步: 新建刚才删除的文件夹,并将先前需要commit的文件放到此文件夹下,再次commit 提交

  7. 分分钟让你理解HTTPS

    一.HTTP存在的问题 1.1 可能被窃听 HTTP 本身不具备加密的功能,HTTP 报文使用明文方式发送 由于互联网是由联通世界各个地方的网络设施组成,所有发送和接收经过某些设备的数据都可能被截获或 ...

  8. 20190215面试-C#操作外设-多线程-shocket

    百度了下,ic卡读卡器 文章;C# 读IC卡程序这个文章还不错. 从北京金木雨电子有限公司下载了,兼容IC卡 身份证阅读器的SDK资料,里面有介绍如何连接ic读卡器,对卡进行一些操作. MasterR ...

  9. NSP4——Network Simulator for P4

    NSP4--Network Simulator for P4 一.前言 NSP4旨在为P4开发者,创建一个可视化的P4流表管理及拓扑建立工具,帮助P4开发者,更好的调试自己的P4程序.此开发工具是基于 ...

  10. 小学生二元四则运算(F)

      整体功能简介: 1.题目不重复: 2.可以定制数量: 3.可以自己选择输入范围: 4.可以选择是否添加乘除法: 5.可以选择除法结果是取整或商加余数形式表示或小数方式(默认小数点后两位)表示: 6 ...