Beispiel #1
0
        /// <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.");
            }
        }
Beispiel #2
0
        /// <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!");
                }
            }
        }