(四)用faster r-cnn训练自己的数据集(添加一个新的层:centerLoss层用于监督训练)

一,简介

想做目标检测和大分类,在py-faster-rcnn的基础上使用ps-ROI操作,并使用了可变性卷积(deformable Convlution);原先对于分类结果cls_score的损失用的是softmax loss, 看了center loss的论文:论文

f
在分类的最后全连接那一层中,分别添加一个softmax loss层和一个center loss层,用于监督网络的学习。

(1)添加center loss 的相关文件并编译
原本caffe中没有center loss,需要手动添加关于center loss 的hpp,cpp以及cu等文件;具体操作参考:caffe添加centerloss

(2) 修改网络结构,使用center loss训练
添加好了center Loss 的相关文件并重新编译caffe后,便可以在网络中使用caffe了:修改网络结构文件(protototxt)---->在原先网络输出的最后一层(也就是输出类别得分那一层)后面再添加一层和这一层数量一样的全连接层---->分别在这两层后面添加softmax loss层和center loss 层。
注意: center loss 最后记得添加 propagate_down: true ,propagate_down: false 这两句,否则计算的center loss 无法进行法相传播而报错!这两句分别表示这一层的两个bottom是否需要back_propagate,即反向传播,第一个是需要的,labels这个输入是不需要反向传播的。

#========= RCNN ============

layer {
  name: "roi_pool5"
  type: "ROIPooling"
  bottom: "conv4_blk"
#  bottom: "conv_new_1"
#  bottom: "rfcn_cls"
  bottom: "rois"
  top: "pool5"
#  top: "cls_score"
  roi_pooling_param {
    pooled_w: 7
    pooled_h: 7
    spatial_scale: 0.0625 # 1/16
  }
}

layer {
  name: "cls_score1"
  type: "InnerProduct"
#  bottom: "conv4_blk"
  bottom: "pool5"
  top: "cls_score1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 184      #yuesongtian
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

#-----added by ard ---------
layer {
  name: "cls_score2"
  type: "InnerProduct"
#  bottom: "conv4_blk"
  bottom: "cls_score1"
  top: "cls_score2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 184      #yuesongtian
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

layer {
  name: "ps_bbox_roi_pool5"
  type: "PSROIPooling"
  bottom: "rfcn_bbox"
  bottom: "rois"
  top: "bbox_pool5"
  psroi_pooling_param {
    output_dim: 8      #4 * (bg + fg)
    group_size: 7
    spatial_scale: 0.0625 # 1/16
  }
}
layer {
  name: "global_bbox"
  type: "Pooling"
  bottom: "bbox_pool5"
  top: "bbox_pred"
  pooling_param {
    kernel_size: 7
        stride: 7
        pool: AVE
  }
}
############# online hard example mining #####################
layer {
   name: "per_roi_loss_cls"
   type: "SoftmaxWithLossOHEM"
   bottom: "cls_score2"
   bottom: "labels"
   top: "temp_loss_cls"
   top: "temp_prob_cls"
   top: "per_roi_loss_cls"
   loss_weight: 0
   loss_weight: 0
   loss_weight: 0
   propagate_down: false
   propagate_down: false
}

layer {
  name: "reshape_per_roi_loss_cls"
  bottom: "per_roi_loss_cls"
  top: "per_roi_loss_cls_reshape"
  type: "Reshape"
  reshape_param { shape { dim: 0 dim: 1 } }
}

layer {
   name: "per_roi_loss_bbox"
   type: "SmoothL1LossOHEM"
   bottom: "bbox_pred"
   bottom: "bbox_targets"
   bottom: "bbox_inside_weights"
   top: "temp_loss_bbox"
   top: "per_roi_loss_bbox"
   loss_weight: 0
   loss_weight: 0
   propagate_down: false
   propagate_down: false
   propagate_down: false
}

layer {
  name: "reshape_per_roi_loss_bbox"
  bottom: "per_roi_loss_bbox"
  top: "per_roi_loss_bbox_reshape"
  type: "Reshape"
  reshape_param { shape { dim: 0 dim: 1 } }
}

layer {
   name: "per_roi_loss"
   type: "Eltwise"
   bottom: "per_roi_loss_cls_reshape"
   bottom: "per_roi_loss_bbox_reshape"
   top: "per_roi_loss"
   propagate_down: false
   propagate_down: false
}

layer {
   bottom: "rois"
   bottom: "per_roi_loss"
   bottom: "labels"
   bottom: "bbox_inside_weights"
   top: "labels_ohem"
   top: "bbox_loss_weights_ohem"
   name: "annotator_detector"
   type: "BoxAnnotatorOHEM"
   box_annotator_ohem_param {
        roi_per_img: 128
        ignore_label: -1
   }
   propagate_down: false
   propagate_down: false
   propagate_down: false
   propagate_down: false
}
layer {
   name: "silence"
   type: "Silence"
   bottom: "bbox_outside_weights"
   bottom: "temp_loss_cls"
   bottom: "temp_prob_cls"
   bottom: "temp_loss_bbox"
}

#-----------------------output------------------------
#------center loss----------
layer {
  name: "center_loss"
  type: "CenterLoss"
  bottom: "cls_score1"
  bottom: "labels_ohem"
  top: "center_loss"
  param {
    lr_mult: 1
    decay_mult: 0
  }
  center_loss_param {
    num_output: 10
    center_filler {
      type: "xavier"
    }    
  }
  loss_weight: 0.01 
  propagate_down: true 
  propagate_down: false
} 
#------softmax loss---------
layer {
   name: "loss_fuji"
   type: "SoftmaxWithLoss"
   bottom: "cls_score2"
   bottom: "labels_ohem"
#   bottom: "labels"
   top: "loss_cls"
   loss_weight: 1
   loss_param {
        ignore_label: -1
   }
   propagate_down: true
   propagate_down: false
}
#--------------accuracy---------------------
layer {
   name: "accuarcy"
   type: "Accuracy"
   bottom: "cls_score2"
   bottom: "labels_ohem"
#   bottom: "labels"
   top: "accuarcy"
   #include: { phase: TEST }
   accuracy_param {
        ignore_label: -1
   }
   propagate_down: false
   propagate_down: false
}

#--------------loss_bbox---------------------
layer {
   name: "loss_bbox"
   type: "SmoothL1LossOHEM"
#   type: "SmoothL1Loss"
   bottom: "bbox_pred"
   bottom: "bbox_targets"
   bottom: "bbox_loss_weights_ohem"
   top: "loss_bbox"
   loss_weight: 1
   loss_param {
        normalization: PRE_FIXED
        pre_fixed_normalizer: 128
   }
   propagate_down: true
   propagate_down: false
   propagate_down: false
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,要在Windows上使用PyTorch训练自己的数据集,需要安装适用于Windows的PyTorch、CUDA和CUDNN等软件。可以通过PyTorch官方网站下载适用于Windows的PyTorch版本,并根据官方文档的指引进行安装。 接下来,准备自己的数据集数据集应该包括图像和相应的标注信息,例如边界框和类别标签。可以使用标记工具(如LabelImg)来手动标注图像,并生成XML或CSV文件以存储标注信息。确保标注信息的格式与训练模型所需的格式一致。 然后,需要编写自定义的数据集加载器。可以创建一个继承自PyTorch的Dataset类的子类,在该子类中实现__getitem__和__len__等方法。在__getitem__方法中,加载图像和相应的标注信息,并对它们进行预处理(如缩放、裁剪等)。同时,可以使用PyTorch提供的transforms模块进行数据增强(如随机翻转、旋转等)。 在训练之前,还需要定义模型结构。可以使用现有的预训练模型,如ResNet,将其与分类器部分替换为适用于目标检测的模型。在Faster R-CNN中,常用的基础模型是ResNet和VGG等。 接下来,定义损失函数和优化器。在Faster R-CNN中,常用的损失函数是RPN(Region Proposal Network)的分类和回归损失,以及分类器和回归器的损失。可以使用PyTorch提供的损失函数模块(如CrossEntropyLoss和SmoothL1Loss)来定义这些损失函数,并选择合适的优化器(如SGD或Adam)进行参数更。 最后,进行训练。使用加载器加载训练数据集,并在每个iteration中将数据传递给模型进行前向传播和反向传播,并进行参数更。可以根据需要设置训练的epoch数、学习率和批量大小等参数。 需要注意的是,在Windows上训练自己的数据集可能会遇到一些环境配置和依赖问题。在遇到问题时,可以查阅相关文档和社区论坛,寻找解决方案。此外,还可以考虑使用Colab等在线平台来训练模型,这些平台已经预先配置好了环境,并且提供了免费的GPU加速。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值