SSD detector源码问题

在层类型PriorBox对应的prior_box_layer.cpp中,已经得到各种比例的Box坐标后,为什么还要进行下面这一步:
// set the variance.
  top_data += top[0]->offset(0, 1);
  if (variance_.size() == 1) {
    caffe_set<Dtype>(dim, Dtype(variance_[0]), top_data);
  } else {
    int count = 0;
    for (int h = 0; h < layer_height; ++h) {
      for (int w = 0; w < layer_width; ++w) {
        for (int i = 0; i < num_priors_; ++i) {
          for (int j = 0; j < 4; ++j) {
            top_data[count] = variance_[j];
            ++count;
          }
        }
      }
    }
  }
已邀请:

小小Z - 机器学习小白

赞同来自:

  top_data += top[0]->offset(0, 1);这一句得到的是特征图的height*width
variance_.size() 就是在prototxt里面的    
    variance: 0.1
    variance: 0.1
    variance: 0.2
    variance: 0.2
这几个参数的个数,
至于下面的这个top_data[count] = variance_[j]; 我也不太清楚是什么意思,希望对你有帮助
 

宇Never

赞同来自:

@automan:您好,关于这个问题我已经困惑很久了。有时间的话能否解答一下!谢谢!
我觉得上面的代码好不容易算出来每一个特征图上的点对应的默认框的大小和位置。
这里不知道为什么非要加上一个 宽度乘上高度 而且做了那么多运算之后,又被那4个给方差覆盖掉了。。无法理解啊 

可能的话能否加个QQ一起讨论SSD的代码。
QQ:604701943
E-mail:lishangyu1993@hotmail.com

grubby - student of NEU

赞同来自:

您好,我现在需要拿SSD检测更小的物体,所以就想改变一下它的检测框的大小,但是我发现在prior_box_layer.cpp中,box_width和box_height的计算方式为:box_width = min_size_ * sqrt(ar); box_height = min_size_ / sqrt(ar); 而这个min_size_是在ssd_pascal.py处定义的,定义的内容为:
mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'pool6']
# in percent %
min_ratio = 20
max_ratio = 95
step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2)))
min_sizes = []
max_sizes = []
for ratio in xrange(min_ratio, max_ratio + 1, step):
   min_sizes.append(min_dim * ratio / 100.)
   max_sizes.append(min_dim * (ratio + step) / 100.)
min_sizes = [min_dim * 10 / 100.] + min_sizes
max_sizes = [[]] + max_sizes
我想知道,min_size是根据什么原理定义的啊,如果我想改变检测框的大小,是不是只要改变这个min_ratio的初始值就可以了?

Zack6514

赞同来自:

个人感觉ssd中相比于普通的bbox regression 多了一个variance的东东,其实这个东西可以在配置文件中设置variance_encoded_in_target禁掉的,应该是跟anchor有关系或者作者测试保留效果好点,实际作用应该不大,没试验过,个人理解。

要回复问题请先登录注册