tanluren / yolov3-channel-and-layer-pruning

yolov3 yolov4 channel and layer pruning, Knowledge Distillation 层剪枝,通道剪枝,知识蒸馏
Apache License 2.0
1.5k stars 446 forks source link

local variable 'labels' referenced before assignment #40

Closed wangkangchn closed 4 years ago

wangkangchn commented 4 years ago

你好, 为什么 我运行时 会报这个错误 img, labels = load_mosaic(self, index) File "O:\Deep_Learning\Dataset\YOLOv3\yolov3-channel-and-layer-pruning-master\utils\datasets.py", line 607, in load_mosaic labels4.append(labels) UnboundLocalError: local variable 'labels' referenced before assignment

ZiQiangXie commented 4 years ago

labels使用前未定义,原因是这句上面的if判断没进去,labels是if里面定义的。应该是你的样本里面有负样本,没有labels,你可以去掉这些负样本,或者给if加一个 else: labels = np.zeros((0,5), dtype=np.float32) 生成一个0标签,这个工程用的原版的yolov3是有这一句的。 不知道有负样本对稀疏训练会不会有影响。

wangkangchn commented 4 years ago

嗯嗯,谢谢,我去掉了负样本,现在跑起来了。真心膜拜大佬🧍‍♂️😸😸😸

王康 邮箱:wangkangchn@163.com

签名由 网易邮箱大师 定制

On 01/07/2020 09:58, ZiQiangXie wrote:

labels使用前未定义,原因是这句上面的if判断没进去,labels是if里面定义的。应该是你的样本里面有负样本,没有labels,你可以去掉这些负样本,或者给if加一个 else: labels = np.zeros((0,5), dtype=np.float32) 生成一个0标签,这个工程用的原版的yolov3是有这一句的。 不知道有负样本对稀疏训练会不会有影响。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

JieShare commented 4 years ago

labels使用前未定义,原因是这句上面的if判断没进去,labels是if里面定义的。应该是你的样本里面有负样本,没有labels,你可以去掉这些负样本,或者给if加一个 else: labels = np.zeros((0,5), dtype=np.float32) 生成一个0标签,这个工程用的原版的yolov3是有这一句的。 不知道有负样本对稀疏训练会不会有影响。

原版没找到这句哎

ZiQiangXie commented 3 years ago

@FishEatApple 以前的版本是有的,可能后来又删了。

JieShare commented 3 years ago

@FishEatApple 以前的版本是有的,可能后来又删了。

还有一个问题,是不是应该是

labels = np.zeros((1,5), dtype=np.float32)

而不是

labels = np.zeros((0,5), dtype=np.float32)

也就是说将未标注的负样本图片的类别与坐标全部置零,这样才能参与训练和计算损失函数嘛,我说的对吗?

ZiQiangXie commented 3 years ago

@FishEatApple 就是(0,5),这个其实就是起一个占位的作用,只定义了一个shape和labels一样的空值而已。没有标注的负样本就是没有label,如果都写成0,那就是认为负样本含有有效的目标了,只不过坐标都是零,我没试过不知道会不会报错,但是这样处理是不对的。目标检测的loss计算中的正负样本,不是指图片是正负样本,而是指目标框,这个建议看一下各个检测框架对正负样本的选取。

JieShare commented 3 years ago

@FishEatApple 就是(0,5),这个其实就是起一个占位的作用,只定义了一个shape和labels一样的空值而已。没有标注的负样本就是没有label,如果都写成0,那就是认为负样本含有有效的目标了,只不过坐标都是零,我没试过不知道会不会报错,但是这样处理是不对的。目标检测的loss计算中的正负样本,不是指图片是正负样本,而是指目标框,这个建议看一下各个检测框架对正负样本的选取。

但是如果写成(0,5)的话,是会报错的,因为这样target的class和xywh是空值,pred的值无法与之计算loss了。我改成(1,5)后就能正常训练(但是不能使用focal loss了),而且模型实测是有效果的,但是我觉得(1,5)在理论上确实有点说不通,(1,5)的意思是没有目标的样本的class是0,xywh也是0。

ZiQiangXie commented 3 years ago

@FishEatApple 我写成0是正常的。不太清楚你的报错问题,不过写成1就真的是给图片添加了一个全0的label。你可以在原版里面找,2019年12月27号左右,我下载的有这一天的版本。也可能是作者改动的比较大了,比如现在的版本没有else这一句,而loss那一块对应的处理也和当时不一样了,所以加了会报错。或者你也可以不添加了,直接把labels4.append(labels)增加一个缩进。之前的报错就是因为负样本进不了上面的 if 导致 labels 没有定义,增加缩进就保证append一定能添加。