YOLOv3_PyTorch icon indicating copy to clipboard operation
YOLOv3_PyTorch copied to clipboard

我有一个疑问

Open xuzheyuan624 opened this issue 5 years ago • 13 comments

在代码的yolo_loss.py中的get_target函数中为什么是noobj_mask[b,anch_ious>ignore_threshold]=0,而不是noobj_mask[b,anch_ious>ignore_threshold,gi,gj]=0,不应该只在负责预测的网格上gt和anchor的overlap才可能超过阈值吗,如果你那样写岂不是所有网格的那个anchor在计算置信度损失的时候都被忽略了。

xuzheyuan624 avatar Jul 24 '18 07:07 xuzheyuan624

Same question too. In fact I've seen multiple repo doing similar things. This repo is already easier to understand by separating conf_mask to noobj_mask and mask compared to other repos. Would love some input from @BobLiu20

ydixon avatar Jul 31 '18 08:07 ydixon

试过noobj_mask[b,anch_ious>ignore_threshold,gi,gj]=0,conf_loss在训练过程中上下跳动的很大。我觉得有可能是由于confidence是shared weight,所以将cell[bs, best_n, gi, gj]的confidence weight调高的同时,其他cell的同一个confidence weight又被调低了。不知道否将shared confidence weight变成一个个独立的全连接weight可以解决这个问题。

McDo avatar Aug 08 '18 01:08 McDo

@McDo 我改过了..应该是[b, anch_ious>ignore_threshold, gj, gi],不知道你是不是gi,gj反了...我改之前会检测出很多错误的框,很多背景的confidence都很高,应该就是因为这里很多负样本都没有计算进去,改过之后结果正常了许多。

xuzheyuan624 avatar Aug 08 '18 11:08 xuzheyuan624

@xuzheyuan624 确实是反了。。。我再试一下,太感谢你了

McDo avatar Aug 08 '18 14:08 McDo

@xuzheyuan624 能请教一下为什么这里要算 ground truth 和 anchors 的 iou 吗? 为什么不直接算pred 和 gt的 iou呢?

jayden199012 avatar Oct 22 '18 03:10 jayden199012

@xuzheyuan624

我的问题和@jayden199012一样,这里计算把中心点对齐之后,算ground truth 和 anchors 的 iou 是为了得到最合适的anchor来回归,但是这个ignore_threshold又有什么用呐?不理解。

zjuxwg0401 avatar Mar 07 '19 06:03 zjuxwg0401

@zjuxwg0401这个ignore_threshold是吧iou超过这个的不设为负样本,一减少正负样本间的不平衡。 @jayden199012 说的这个 我在我的代码里写成了每一次的pred box和gt的iou。

xuzheyuan624 avatar Mar 07 '19 07:03 xuzheyuan624

@xuzheyuan624 你的yolo_loss的代码中,tconf[b,best_n,gj,gi]= best_conf, 而best_conf是预测框与真实框的iou,这里我不是很理解,我觉得tconf[b,best_n,gj,gi] = 1不是更合理吗,在对标签进行计算时,还用上了预测的信息,那刚开始训练时,还没有预测框时,那个tconf就没有意义了呀?觉得有点奇怪。

zjuxwg0401 avatar Mar 11 '19 05:03 zjuxwg0401

我看了好几个yolo的代码,比如在https://github.com/zjuxwg0401/PyTorch-YOLOv3/blob/master/utils/utils.py中的 tcls[b, best_n, gj, gi, target_label] = 1 # 对应位置填1,与您的代码中不太一样,我觉得=1 好像更合理一点。您有什么看法?

zjuxwg0401 avatar Mar 11 '19 06:03 zjuxwg0401

@zjuxwg0401 这里的代码是根据yolo9000中给的公式 P(object)*IOU(b,object)=sigma(t0) 有目标的时候P(object)=1,而且刚开始的时候预测框就是anchor 因为偏移量是以0初始化的。 这样是能够衡量不同预测框的置信程度,用预测框和gt的iou表示其需要回归的置信度。

xuzheyuan624 avatar Mar 11 '19 06:03 xuzheyuan624

@zjuxwg0401 这里的代码是根据yolo9000中给的公式 P(object)*IOU(b,object)=sigma(t0) 有目标的时候P(object)=1,而且刚开始的时候预测框就是anchor 因为偏移量是以0初始化的。 这样是能够衡量不同预测框的置信程度,用预测框和gt的iou表示其需要回归的置信度。

谢谢,刚又看一下文章,理解了。在看您的代码时,发现loss中还有一项是a_loss,文章中好像没有呀? 我微信号和QQ号都是276688034,可以加微信或QQ请教。

zjuxwg0401 avatar Mar 11 '19 07:03 zjuxwg0401

@zjuxwg0401 之前有一点说错了,偏移量初始化并不是0,所以那个a_loss就是在前12800迭代时,希望学习到的预测框先全部接近anchor(也就是偏移量为0)。这里是根据源码里面是这样写的,当然我也是听一个读过源码的人说的 我才这样改的。但实际上这样子训练的时候并不稳定,loss太大会覆盖掉别的损失,所以我给它加了个0.1的系数。

xuzheyuan624 avatar Mar 11 '19 08:03 xuzheyuan624

@xuzheyuan624 你好,我看了你的代码,https://github.com/xuzheyuan624/yolov3-pytorch/blob/master/nets/yolo_loss.py#L146 感觉上对于每张图片,在yolo中,正样本的个数等于图片的物体的个数,这是不是太少了,是不是我的理解有误呢?

shanniruo avatar May 18 '20 09:05 shanniruo