abeardear / pytorch-YOLO-v1

an experiment for yolo-v1, including training and testing.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

训练的时候损失值降到1.6,predict的时候啥也检测不出来是怎么回事?

Bigwode opened this issue · comments

其实输出是14×14大小的,但是注释给的都是7×7的。
eval_voc的时候更加离奇,
---start evaluate---
---class aeroplane ap 0.0---
---class bicycle ap -1---
---map -0.5---

commented

是否用了ImageNet预训练权重?
不确定具体原因,我之后会Gitclone下来验证一下

@xiongzihua 默认是使用ImageNet预训练权重的吧。改成VGG_net作为backbone的话,有点效果了,五张图片可以检测出一个物品来吧_~_

commented

@Bigwode 原因是这样的
box的中心点归一化到0-1之间,增加了框与框之间的距离导致计算IOU时普遍偏小.那么正类和背景的pred_iou就没什么区分度,所以区分不出前景背景,所以检测不到一个目标.

我觉得如果训练久一点,应该是可以训练出来(因为我之前应该训练过).

正确的处理方式:在yoloLoss.py中,对每一个框的中心点,cxcy/14.使框与框之间距离回到原始距离,计算出的IOU为正确IOU,同时增加contain_loss的权重为2,更注重正类这部分的损失.

以上改变其实在这个项目已经做了更正,不过忘记在这做了.

我的实验,改变后,训练四轮就能看出比较有效的结果了

result

@xiongzihua 可以的老哥,确实存在这个问题,我找了两天都没找到这个bug^_^。不过这个项目里面,你是除以了15.

@xiongzihua 老哥,我又有两个问题不太明白来请教你了,因为我看代码的过程中发现一个cell中的两个box对应的target都是一样的,对应的target_confidence也是一样的,那么这分开两个box训练的意义或者说两个box之间有什么关联?
第二个问题是,预测的cxcy是对应的pred_box的中心位置还是和cell的左上角的偏差呀?在求loss 的过程中是
box1_xyxy[:,:2] = box1[:,:2]/14. -0.5box1[:,2:4]
box1_xyxy[:,2:4] = box1[:,:2]/14. +0.5
box1[:,2:4]
推测应该是中心位置,因为这里没有加上grid_cell的左上角的坐标,但是在predict.py中是加上了grid_cell的左上角的坐标的,两处感觉有点矛盾。

commented

@Bigwode

1.一个cell只预测一个目标,只有一个box是负责的,不好解决多余一个目标的情况。赋值一样训练时会根据iou决定哪一个负责,另一个当做负类。

2.cxcy是预测和cell左上角的偏差,在计算iou时,统一不加上cell坐标是因为不知道他是哪一个cell的,但是不影响中心点之间的距离,也不会影响iou计算

@xiongzihua
"正确的处理方式:在yoloLoss.py中,对每一个框的中心点,cxcy/14.使框与框之间距离回到原始距离,计算出的IOU为正确IOU,同时增加contain_loss的权重为2,更注重正类这部分的损失."

对这句话,能不能这么理解:
网络输出时,box的cxcy(中心点坐标)是相对于匹配到的grid的,box的weight和height是相对于整幅图片的,坐标含义不同.所以此时对cxcy除以14,使其坐标也相对整幅图,这样计算IOU才有意义.