dd604 / refinedet.pytorch

A PyTorch inplementation of RefineDet
MIT License
35 stars 12 forks source link

arm filter redundant anchors in training phase? #6

Open zhao34731 opened 3 years ago

zhao34731 commented 3 years ago

Hello coder, I'm learning RefineDet architecture these days. After comparing different implements below

  1. https://github.com/luuuyi/RefineDet.PyTorch
  2. https://github.com/lzx1413/PytorchSSD
  3. yours I found there is a different when training the model. That's do we need to filter redundant anchors using ARM when training model. In the first implement. The author use below in RefineDetMultiBoxLoss function if self.use_ARM: P = F.softmax(arm_conf_data, 2) arm_conf_tmp = P[:,:,1] object_score_index = arm_conf_tmp <= self.theta pos = conf_t > 0 pos[object_score_index.data] = 0 They filter the positive anchors using arm_conf However, In the second Implement, the author lzx1413 wrote below if arm_data and filter_object: arm_conf_data = arm_conf.data[:,:,1] pos = conf_t > 0 object_score_index = arm_conf_data <= self.object_score pos[object_score_index] = 0 but in training code: refinedet_train_test.py odm_loss_l, odm_loss_c = odm_criterion((odm_loc,odm_conf),priors,targets,(arm_loc,arm_conf),False) The filter_object is disabled. However in the original paper, the author zhangshifeng write image I wonder whether It's a big difference to enable or disable this filter object ? Thanks!
dd604 commented 3 years ago

If you use an objectness threshold in inference, you would better to filter objectness samples in training to keep consistency. I would have checked the performance difference between the two operations, and the difference is not bigger than 1ap in VOC. But I'm not sure. Maybe you can have a try.