Xuangeng Chu
Xuangeng Chu
Does this error exist in fpn_baseline or emd_simple?
修改一下打入数据部分的代码,把输入整理成image,label,iminfo几项就可以了。具体的操作可以参考lib/data/CrowdHuman.py
> > 论文中写道在coco和CityPersons上进行了实验。是否是需要将这两个数据集转换成与CrowdHuman相同的格式?是否可以提供实现格式转换的文件? > > 您好,请问能提供读取CityPersons数据集的代码吗? CityPerson的代码已经遗失了。。如果要读取CityPersons数据集,请修改lib/data/CrowdHuman.py,将CityPersons读入后整理为相同的输出即可。每个sample整理为image, gtboxes, im_info, record['ID'],batch merge方法根据需要整理为images, ground_truth, im_info。
gt为数据集所提供的。json为模型生成的预测文件,具体的组织方法可以参照test.py中的逻辑。
You could modify the lib/data/CrowdHuman.py to replace the full body input with head region input. Changing the "anchor_aspect_ratios" in config.py to [0.5, 1, 2] may also be beneficial for head...
如果只有一个gt,预测了两个bbox,记作bbox0和bbox1。计算bbox0对应gt、bbox1对应0的loss和bbox0对应0、bbox1对应gt的loss,取其中的小值作为最终loss进行计算。 如果是两个gt,也这样计算即可。
> > 嗯我明白您的意思。那请问您在训练过程中有没有遇到这种问题: > > 由于可能训练集中绝大部分的点都只有一个gt,那么就会导致预测的两个Bbox,其中一个对应gt的置信度一直很高(>0.9),比如是Bbox0,而另一个Bbox1对应的置信度一直很低( > 或者说大部分的数据都是只有一个gt,而另一个需要对应0的,这就导致两个预测的head网络产生记忆,多轮训练之后固定其中一个Bbox0预测的置信度很高,另一个Bbox1预测置信度很低。也就是我认为由于两个gt重叠一个anchor的情况极少,没有得到充分训练,导致网络训练的结果倾向于只预测一个高置信度的边界框,比如Bbox0(或Bbox1)即可达到损失收敛。 > > 我表达的不是很好,不知道您是否能清楚。总之这是我现在运用您的方法预测两个box遇到的困境,谢谢您啦! > > 你好,我也有同样的困惑,如果我预测物体只有一个类(包裹,label=1),大多数图片只有一个gt,这个时候我用0来填充gt,但是这个填充的gt,他的label是什么呢,我认为应该是-1,相当于ignore掉,但是我的模型结果很差,map很低 应该填充0。如果填充-1,则相当于只有一个头被训练,最终可能会都输出高分预测导致大量false positive。
> 嗯我明白您的意思。那请问您在训练过程中有没有遇到这种问题: > 由于可能训练集中绝大部分的点都只有一个gt,那么就会导致预测的两个Bbox,其中一个对应gt的置信度一直很高(>0.9),比如是Bbox0,而另一个Bbox1对应的置信度一直很低( 或者说大部分的数据都是只有一个gt,而另一个需要对应0的,这就导致两个预测的head网络产生记忆,多轮训练之后固定其中一个Bbox0预测的置信度很高,另一个Bbox1预测置信度很低。也就是我认为由于两个gt重叠一个anchor的情况极少,没有得到充分训练,导致网络训练的结果倾向于只预测一个高置信度的边界框,比如Bbox0(或Bbox1)即可达到损失收敛。 > 我表达的不是很好,不知道您是否能清楚。总之这是我现在运用您的方法预测两个box遇到的困境,谢谢您啦! 如果说大部分数据都是只有一个gt,确实会在训练早期就陷入到你所说的情况,一个非常倾向预测低置信度而另一个表现正常。这也是我们的方法在稀疏数据集中表现不会下降的原因。只有在有比较多高重叠样本的时候,我们的方法才会有显著的提升。
> > 如果只有一个gt,预测了两个bbox,记作bbox0和bbox1。计算bbox0对应gt、bbox1对应0的loss和bbox0对应0、bbox1对应gt的loss,取其中的小值作为最终loss进行计算。 > > 如果是两个gt,也这样计算即可。 > > localization_loss = smooth_l1_loss( > pred_delta[fg_masks], > targets[fg_masks], > config.smooth_l1_beta) > 感觉计算loss的时候并没有体现这个思想啊,不太明白bbox怎么对应0计算的loss,这里取的都是正样本进行计算,只对应一个gt的话,另一个在计算iou时其值小于阈值,就直接置为负样本,label=0,就不参与回归损失的计算,最后 > loss = objectness_loss * valid_mask > loss[fg_masks] = loss[fg_masks] +...
此处系论文有误。