/// <summary> /// Setup the layer. /// </summary> /// <param name="colBottom">Specifies the collection of bottom (input) Blobs.</param> /// <param name="colTop">Specifies the collection of top (output) Blobs.</param> public override void LayerSetUp(BlobCollection <T> colBottom, BlobCollection <T> colTop) { base.LayerSetUp(colBottom, colTop); if (m_param.propagate_down.Count == 0) { m_param.propagate_down.Add(true); m_param.propagate_down.Add(true); m_param.propagate_down.Add(false); m_param.propagate_down.Add(false); } m_nNum = colBottom[0].num; m_nNumPriors = colBottom[2].height / 4; // Get other parameters. m_nNumClasses = (int)m_param.multiboxloss_param.num_classes; m_log.CHECK_GE(m_nNumClasses, 1, "The num_classes should not be less than 1."); m_bShareLocation = m_param.multiboxloss_param.share_location; m_nLocClasses = (m_bShareLocation) ? 1 : m_nNumClasses; m_nBackgroundLabelId = (int)m_param.multiboxloss_param.background_label_id; m_bUseDifficultGt = m_param.multiboxloss_param.use_difficult_gt; m_miningType = m_param.multiboxloss_param.mining_type; if (m_param.multiboxloss_param.do_neg_mining.HasValue) { m_log.WriteLine("WARNING: do_neg_mining is depreciated, use mining_type instead."); m_bDoNegMining = m_param.multiboxloss_param.do_neg_mining.Value; m_log.CHECK(m_bDoNegMining == (m_miningType != MultiBoxLossParameter.MiningType.NONE), "The mining type specified is inconsistent with do_neg_mining."); } else { m_bDoNegMining = (m_miningType != MultiBoxLossParameter.MiningType.NONE); } if (m_bDoNegMining) { m_log.CHECK(m_bShareLocation, "Currently only support negative mining if share_location is true."); } // Setup localization loss layer. m_fLocWeight = m_param.multiboxloss_param.loc_weight; m_locLossType = m_param.multiboxloss_param.loc_loss_type; // fake shape List <int> rgLocShape = Utility.Create <int>(1, 1); rgLocShape.Add(4); m_blobLocPred.Reshape(rgLocShape); m_blobLocGt.Reshape(rgLocShape); m_colLocBottom.Add(m_blobLocPred); m_colLocBottom.Add(m_blobLocGt); List <int> rgLossShape = Utility.Create <int>(1, 1); m_blobLocLoss.Reshape(rgLossShape); m_colLocTop.Add(m_blobLocLoss); if (m_locLossType == MultiBoxLossParameter.LocLossType.L2) { LayerParameter p = new LayerParameter(LayerParameter.LayerType.EUCLIDEAN_LOSS); p.name += "_l2_loc"; p.loss_weight.Add(m_fLocWeight); m_locLossLayer = Layer <T> .Create(m_cuda, m_log, p, null); m_locLossLayer.Setup(m_colLocBottom, m_colLocTop); } else if (m_locLossType == MultiBoxLossParameter.LocLossType.SMOOTH_L1) { LayerParameter p = new LayerParameter(LayerParameter.LayerType.SMOOTHL1_LOSS); p.name += "_smooth_l1_loc"; p.loss_weight.Add(m_fLocWeight); m_locLossLayer = Layer <T> .Create(m_cuda, m_log, p, null); m_locLossLayer.Setup(m_colLocBottom, m_colLocTop); } else { m_log.FAIL("Unknown localization loss type."); } // Setup confidence loss layer. m_confLossType = m_param.multiboxloss_param.conf_loss_type; m_colConfBottom.Add(m_blobConfPred); m_colConfBottom.Add(m_blobConfGt); m_blobConfLoss.Reshape(rgLossShape); m_colConfTop.Add(m_blobConfLoss); List <int> rgConfShape = Utility.Create <int>(1, 1); if (m_confLossType == MultiBoxLossParameter.ConfLossType.SOFTMAX) { m_log.CHECK_GE(m_nBackgroundLabelId, 0, "The background_label_id should be within [0, num_classes) for Softmax."); m_log.CHECK_LT(m_nBackgroundLabelId, m_nNumClasses, "The background_label_id should be within [0, num_classes) for Softmax."); LayerParameter p = new LayerParameter(LayerParameter.LayerType.SOFTMAXWITH_LOSS); p.name += "_softmax_conf"; p.loss_weight.Add(1); p.loss_param.normalization = LossParameter.NormalizationMode.NONE; p.softmax_param.axis = 1; // Fake shape. m_blobConfGt.Reshape(rgConfShape); rgConfShape.Add(m_nNumClasses); m_blobConfPred.Reshape(rgConfShape); m_confLossLayer = Layer <T> .Create(m_cuda, m_log, p, null); m_confLossLayer.Setup(m_colConfBottom, m_colConfTop); } else if (m_confLossType == MultiBoxLossParameter.ConfLossType.LOGISTIC) { LayerParameter p = new LayerParameter(LayerParameter.LayerType.SIGMOIDCROSSENTROPY_LOSS); p.name += "_logistic_conf"; p.loss_weight.Add(1); // Fake shape rgConfShape.Add(m_nNumClasses); m_blobConfGt.Reshape(rgConfShape); m_blobConfPred.Reshape(rgConfShape); m_confLossLayer = Layer <T> .Create(m_cuda, m_log, p, null); m_confLossLayer.Setup(m_colConfBottom, m_colConfTop); } else { m_log.FAIL("Unknown confidence loss type."); } }
/// <summary> /// Setup the layer. /// </summary> /// <param name="colBottom">Specifies the collection of bottom (input) Blobs.</param> /// <param name="colTop">Specifies the collection of top (output) Blobs.</param> public override void LayerSetUp(BlobCollection <T> colBottom, BlobCollection <T> colTop) { base.LayerSetUp(colBottom, colTop); if (m_param.propagate_down.Count == 0) { m_param.propagate_down.Add(true); m_param.propagate_down.Add(true); m_param.propagate_down.Add(false); m_param.propagate_down.Add(false); } m_nNum = colBottom[0].num; m_nNumPriors = colBottom[2].height / 4; // Get other parameters. m_nNumClasses = (int)m_param.multiboxloss_param.num_classes; m_log.CHECK_GE(m_nNumClasses, 1, "The num_classes should not be less than 1."); m_bShareLocation = m_param.multiboxloss_param.share_location; m_nLocClasses = (m_bShareLocation) ? 1 : m_nNumClasses; m_nBackgroundLabelId = (int)m_param.multiboxloss_param.background_label_id; m_bUseDifficultGt = m_param.multiboxloss_param.use_difficult_gt; m_miningType = m_param.multiboxloss_param.mining_type; if (m_param.multiboxloss_param.do_neg_mining.HasValue) { m_log.WriteLine("WARNING: do_neg_mining is depreciated, use mining_type instead."); m_bDoNegMining = m_param.multiboxloss_param.do_neg_mining.Value; m_log.CHECK(m_bDoNegMining == (m_miningType != MultiBoxLossParameter.MiningType.NONE), "The mining type specified is inconsistent with do_neg_mining."); } m_bDoNegMining = (m_miningType != MultiBoxLossParameter.MiningType.NONE); if (m_bDoNegMining) { m_log.CHECK(m_bShareLocation, "Currently only support negative mining if share_location is true."); } // Setup localization loss layer. m_fLocWeight = m_param.multiboxloss_param.loc_weight; m_locLossType = m_param.multiboxloss_param.loc_loss_type; // fake shape List <int> rgLocShape = Utility.Create <int>(1, 1); rgLocShape.Add(4); m_blobLocPred.Reshape(rgLocShape); m_blobLocGt.Reshape(rgLocShape); m_colLocBottom.Add(m_blobLocPred); m_colLocBottom.Add(m_blobLocGt); List <int> rgLossShape = Utility.Create <int>(1, 1); m_blobLocLoss.Reshape(rgLossShape); m_colLocTop.Add(m_blobLocLoss); if (m_locLossType == MultiBoxLossParameter.LocLossType.L2) { LayerParameter p = new LayerParameter(LayerParameter.LayerType.EUCLIDEAN_LOSS); p.name += "_l2_loc"; p.loss_weight.Add(m_fLocWeight); m_locLossLayer = Layer <T> .Create(m_cuda, m_log, p, null); m_locLossLayer.Setup(m_colLocBottom, m_colLocTop); } else if (m_locLossType == MultiBoxLossParameter.LocLossType.SMOOTH_L1) { LayerParameter p = new LayerParameter(LayerParameter.LayerType.SMOOTHL1_LOSS); p.name += "_smooth_l1_loc"; p.loss_weight.Add(m_fLocWeight); m_locLossLayer = Layer <T> .Create(m_cuda, m_log, p, null); m_locLossLayer.Setup(m_colLocBottom, m_colLocTop); } else { m_log.FAIL("Unknown localization loss type."); } // Setup confidence loss layer. m_confLossType = m_param.multiboxloss_param.conf_loss_type; m_colConfBottom.Add(m_blobConfPred); m_colConfBottom.Add(m_blobConfGt); m_blobConfLoss.Reshape(rgLossShape); m_colConfTop.Add(m_blobConfLoss); List <int> rgConfShape = Utility.Create <int>(1, 1); if (m_confLossType == MultiBoxLossParameter.ConfLossType.SOFTMAX) { m_log.CHECK_GE(m_nBackgroundLabelId, 0, "The background_label_id should be within [0, num_classes) for Softmax."); m_log.CHECK_LT(m_nBackgroundLabelId, m_nNumClasses, "The background_label_id should be within [0, num_classes) for Softmax."); LayerParameter p = new LayerParameter(LayerParameter.LayerType.SOFTMAXWITH_LOSS); p.name += "_softmax_conf"; p.loss_weight.Add(1); p.loss_param.normalization = LossParameter.NormalizationMode.NONE; p.softmax_param.axis = 1; // Fake shape. m_blobConfGt.Reshape(rgConfShape); rgConfShape.Add(m_nNumClasses); m_blobConfPred.Reshape(rgConfShape); m_confLossLayer = Layer <T> .Create(m_cuda, m_log, p, null); m_confLossLayer.Setup(m_colConfBottom, m_colConfTop); } else if (m_confLossType == MultiBoxLossParameter.ConfLossType.LOGISTIC) { LayerParameter p = new LayerParameter(LayerParameter.LayerType.SIGMOIDCROSSENTROPY_LOSS); p.name += "_logistic_conf"; p.loss_weight.Add(1); // Fake shape rgConfShape.Add(m_nNumClasses); m_blobConfGt.Reshape(rgConfShape); m_blobConfPred.Reshape(rgConfShape); m_confLossLayer = Layer <T> .Create(m_cuda, m_log, p, null); m_confLossLayer.Setup(m_colConfBottom, m_colConfTop); } else { m_log.FAIL("Unknown confidence loss type."); } // Create the low-level SSD support. if (m_param.multiboxloss_param.use_gpu) { float?fNmsThreshold = null; int? nNmsTopK = null; float?fNmsEta = null; bool bNmsParam = false; if (m_param.multiboxloss_param.nms_param != null && m_param.multiboxloss_param.nms_param.Active) { bNmsParam = true; fNmsThreshold = m_param.multiboxloss_param.nms_param.nms_threshold; nNmsTopK = m_param.multiboxloss_param.nms_param.top_k; fNmsEta = m_param.multiboxloss_param.nms_param.eta; } m_hSsd = m_cuda.CreateSSD(m_nNumClasses, m_bShareLocation, m_nLocClasses, m_nBackgroundLabelId, m_bUseDifficultGt, (SSD_MINING_TYPE)(int)m_miningType, (SSD_MATCH_TYPE)(int)m_param.multiboxloss_param.match_type, m_param.multiboxloss_param.overlap_threshold, m_param.multiboxloss_param.use_prior_for_matching, (SSD_CODE_TYPE)(int)m_param.multiboxloss_param.code_type, m_param.multiboxloss_param.encode_variance_in_target, m_param.multiboxloss_param.bp_inside, m_param.multiboxloss_param.ignore_cross_boundary_bbox, m_param.multiboxloss_param.use_prior_for_nms, (SSD_CONF_LOSS_TYPE)(int)m_param.multiboxloss_param.conf_loss_type, (SSD_LOC_LOSS_TYPE)(int)m_param.multiboxloss_param.loc_loss_type, m_param.multiboxloss_param.neg_pos_ratio, m_param.multiboxloss_param.neg_overlap, m_param.multiboxloss_param.sample_size, m_param.multiboxloss_param.map_object_to_agnostic, bNmsParam, fNmsThreshold, nNmsTopK, fNmsEta); if (m_hSsd == 0) { throw new Exception("Could not create the SSD!"); } } }