Thinklab-SJTU / R3Det_Tensorflow

Code for AAAI 2021 paper: R3Det: Refined Single-Stage Detector with Feature Refinement for Rotating Object
Apache License 2.0
546 stars 122 forks source link

训练时正常,测试时没有预测框,无法计算mAP #120

Closed windyjunfeng closed 3 years ago

windyjunfeng commented 3 years ago

学长,您好,我训练的是SSDD+数据集,数据格式都转成了dota格式,在训练时loss值正常,在测试时运行test_hrsc2016_r3det.py(也运行过test_ssdd_ms.py)生成的det_ship.txt是空的,进而导致无法计算mAP,运行inference.py时生成的图片也没有预测框。已经检查了权重文件的位置和cfgs.py文件,参考了之前的issue仍然没能解决。 最终定位到libs/networks/build_whole_network_r3det.py中333行到351行出现了问题,但仍不知具体问题所在,想请教一下学长。谢谢学长。

for i in range(cfgs.NUM_REFINE_STAGE):
            box_pred_list, cls_prob_list, proposal_list = self.refine_stage(input_img_batch,
                                                                            gtboxes_batch_r,
                                                                            box_pred_list,
                                                                            cls_prob_list,
                                                                            proposal_list,
                                                                            feature_pyramid,
                                                                            gpu_id,
                                                                            pos_threshold=cfgs.REFINE_IOU_POSITIVE_THRESHOLD[i],
                                                                            neg_threshold=cfgs.REFINE_IOU_NEGATIVE_THRESHOLD[i],
                                                                            stage='' if i == 0 else '_stage{}'.format(i + 2),
                                                                            proposal_filter=True if i == 0 else False)
            if not self.is_training:
                all_box_pred_list.extend(box_pred_list)
                all_cls_prob_list.extend(cls_prob_list)
                all_proposal_list.extend(proposal_list)
            else:
                all_box_pred_list, all_cls_prob_list, all_proposal_list = box_pred_list, cls_prob_list, proposal_list
windyjunfeng commented 3 years ago

在训练过程中我还发现与回归相关的损失都为0,请问这可能是什么原因导致的呢? 2021-01-22 22:59:22: global_step:220 current_step:220 per_cost_time:0.633s total_losses:0.213 cls_loss:0.204 refine_cls_loss_stage3:0.000 refine_reg_loss_stage3:0.000 refine_cls_loss:0.010 refine_reg_loss:0.000 reg_loss:0.000

yangxue0827 commented 3 years ago

查看tensorboard情况,很有可能你没有训练好

windyjunfeng commented 3 years ago

学长,我之前查看过tensorboard中total loss随迭代次数的变化情况,大约16个epoch之后total loss就变为0了,而reg_loss一直是0,感觉像是回归上出了问题,我把cfg配置文件中的USE_IOU_FACTOR设为True,REG_LOSS_MODE设为0后还是不行。还请学长指点一下。

yangxue0827 commented 3 years ago

那你用loss正常的时候保存下来的权重测试一下呢

windyjunfeng commented 3 years ago

学长还是不行,运行test_ssdd_ms.py文件一直报错,应该是与预测框有关参数的列表为空导致的。 image

yangxue0827 commented 3 years ago

你只print mAP吧,recall[-1]什么的屏蔽了,另外看一下可视化

windyjunfeng commented 3 years ago

感谢学长,我发现问题所在了,我用的SSDD+数据集的xml文件中旋转框的坐标位于'polygon'的tag下,不是'bndbox',因此之前数据集中的真实标注框没有加载进去。