yjh0410 / PyTorch_YOLO-Family

Apache License 2.0
158 stars 47 forks source link

加入DilatedEncoder的YOLOV3会比YOLOV3-SPP效果更好吗? #2

Open linklist2 opened 2 years ago

linklist2 commented 2 years ago

很抱歉再次麻烦您,我根据您的YOLOV3尝试将YOLOv3-SPP的红色区域的结构替换为DilatedEncoder,但是在PASCAL VOC2012上效果比yolov3-spp差了5个点。 image 我加载预训练权重的方式如下:

  1. 加载yolov3-spp-ultralytics-512.pt中的backbone部分
  2. 加载yolov3-spp-ultralytics-512.pt中剩余部分到新模型的对应部分

训练的超参数则与SPP之前设置的一样: image

我想请教的是,效果比不上原来的是正常的现象吗?还是我哪里的步骤出了问题?

yjh0410 commented 2 years ago

@linklist2 从您在voc数据集上训练的方法大概能看出是采用了COCO预训练方法,也就是把在COCO上训练过的参数作为VOC数据集上的初始化权重是吧?如果是这样的话,那根据您的描述来看,这种性能下降方式是可能合理的。

yolov3-spp在训练voc的时候,除了最后的预测层的类别部分,其余全部是加载COCO上训练好的,因此收敛会非常快。而您把图中红框部分替换成了DilatedEncoder,但是这一部分的权重想必都是随机初始化的吧,而没有在COCO上训练过(根据您的描述得出来的猜测),所以,即使backbone和其他部分都加载yolov3-spp提供的权重,但这一部分完全是随机初始化的,需要从头训,而yolov3-spp在voc上也就最后的预测层需要重新训,其他所有部分都有预训练权重。因此,两者的收敛速度肯定会不一样,相同epoch下,性能也自然会差一些。

解决办法之一就是延长在voc上的训练epoch。但最好的办法就是把改好的模型现在coco上从头训一遍,直接在coco上和yolov3-spp对比性能是最有说服力的。

多说一句,我也不能百分百保证把SPP替换成DilatedEncoder一定就会有明显提升, 但或许大目标的AP有较为明显的提升。因为您使用的yolov3-spp项目的很多超参都是在COCO上精心调过的(担心某些超参可能过拟合COCO数据集了),一旦改了一些结构,有可能会使得做的改动和超参不匹配,使得性能未必会有预想中的提升,这个是有可能的,但也不完全一定,可能要有这样的心理准备

linklist2 commented 2 years ago

@yjh0410 您好,很感谢您的耐心解答,您的猜测是正确的,新加的DilatedEncoder是随机初始化的并没有在COCO数据上训练过。 我还想再请教您,在1080Ti的机器上用COCO数据集训练这样的模型是可能实现的吗(指显存)?还有您能否分享一些调参的技巧呢?我是个在目标检测上的挣扎了好多个月的小白,换过很多结构,但大多是以掉点失败收尾,我想是不是可能会有超参的影响?

yjh0410 commented 2 years ago

@linklist2 一张1080ti的话,从显存角度来说,也可以训练COCO,比如把batchsize设置成8,然后accumulate设置为8,这样可以约等于用64batch size来训练,但精度可能难以和直接用64batch size训练对齐。一张1080ti多少有点捉襟见肘了。而且COCO数据集很大,训练时间可能会很长,如果是训啦yolo,这个可能得用上半个月。

如果你是想替换模型中的某个结构来看能不你涨点的话,其实不建议使用ultralytics的yolo项目,包括yolov5,因为这位大佬的yolo项目的超参都是精心调试的,很有可能掉点不是你用的结构不好,而是和某个超参数产生了排斥作用,这个是很常见的。这种工作最好找一些没有精心调参过的baseline,比如RetinaNet、FCOS,因为他们的超参都没有精心调过,所以更好去验证你的模块的有效性。

一般不太建议调超参,这是个很吃资源的做法。调参这一块我也没有多少经验,基本都是论文里说啥我就用啥,主要也是我的算力也有限,像YOLOF我尽力调到31.4后,和baseline还差6个点,我就不做了,因为资源不够,有些参数不太敢调。

如果情况允许的话,尽可能添加两块2080ti或者一块3090,这样一些基础工作也就稍微施展开拳脚了。

linklist2 commented 2 years ago

@yjh0410 再次感谢您的解答。确实有这种感受,尤其在yolov5的项目中,我前几个月的工作扑在了研究对yolov5的剪枝中,将各种剪枝算法嵌入到里面去后,总是很失望地发现mAP变为了0或者一个很低的数值,而且很久也微调不上去,和这些剪枝算法用在yolov3的中的表现差距特别明显。到了年底了,目标检测有点搞不动了。

yjh0410 commented 2 years ago

@linklist2 有的时候一些不容易注意到的细节会带来很大的影响,加油哇~

linklist2 commented 2 years ago

@yjh0410 好的,非常感谢