sfzhang15 / RefineDet

Single-Shot Refinement Neural Network for Object Detection, CVPR, 2018
Other
1.43k stars 393 forks source link

关于如何训练更小更快的网络,保留ARM和ODM模块? #143

Closed urbaneman closed 5 years ago

urbaneman commented 5 years ago

您好,感谢你做的研究与贡献,拜读了你的论文和部分开源代码,受益良多。有两个问题想请教您。(由于英文水平不是很高,怕描述不清,所以使用中文,希望您不要介意)。 1.考虑到使用VGG16和ResNet-101作为特征提取模块参数量较大,不能很好的满足实时性的要求,拟使用MobileNet或MobileNetV2或其他的模块来作为特征提取模块,来减少参数量以提高效率,模型中保留ARM和ODM模块。关于在特征提取阶段使用什么模块,不知道你有没有什么建议? 2.数据集制作过程中,如果只检测voc的20类目标,或者更少,关于coco数据集的lmdb数据集制作需要包含不含这些目标的图片吗?如果包含,占比大概多少能较好地训练出结果? 3.不采用fine-tuning的情况下,训练过程如何进行?超参数和梯度下降策略使用什么较好?有没有一些技巧可以传授一下。 接触目标检测不久,希望您能不吝赐教,感谢之至。

sfzhang15 commented 5 years ago

@urbaneman 你好

  1. RefineDet就有ARM和ODM模块,我不知道你说的“关于在特征提取阶段使用什么模块”是指什么,如果你想把backbone换成MobileNet的话,可以参看MobileNet-SSD的实现,把RefineDet对SSD的改变加进去应该就行。
  2. 我们利用coco进行finetune是这么进行的,先把模型在coco训一遍,然后对coco训好的模型进行修改,就是把最后的那个卷积层,从输出80类,变成输出指定类别数目,其实就是挑选出指定类别的权重就行了,然后用这个改动的模型作为初始化,继续在新的数据集上训练。
  3. 你说的不采用fine-tuning,我理解的是指不用imagenet,如果不用imagenet初始化的话,并且你使用的backbone还有BN层,那么按照kaiming最新的文章,你得利用sysc-BN或GN,然后训练时间久一些。
urbaneman commented 5 years ago

@sfzhang15 感谢您的回答!

  1. 我说的“特征提取模块”就是backbone,这是我自己理解的(描述的的确不清楚,尴尬)。我参照了MoileNetV2-SSD的模型,又加入了CFE模块,都是采用Conv-BN-Relu的结构。模型目前正在训练,收敛速度很慢。。。好在已经有收敛的迹象了。
  2. get。因为没有现有的预模型,考虑到80类较难收敛的情况,我去除了coco中不含voc20类目标的图像,只训练了voc的20类。后续有实验结果了,我会反馈给您。
  3. 我说的fine-tuning,就是您上面说的在ImageNet的pre-training。何恺明的《Rethinking ImageNet Pre-training》已经听说很久了,但是一直没有时间读,正好利用假期好好读一下。 再次感谢您耐心的回复,受益匪浅。
wait1988 commented 5 years ago

@urbaneman 你加入CFE之后在MoileNetV2-SSD上提升大吗

urbaneman commented 5 years ago

我试着加入了,因为没有在imagenet上预训练,最后的结果voc07test只有60多,后来因为忙其他的事情,没有继续做实验,所以最终的结果怎么样,我也不确定。

china56321 commented 5 years ago

请问refinedet只支持ResNet-101吗?可以将ResNet-101改为ResNet-50吗?我查了下资料,ResNet-101和ResNet-50不同之处在于conv4_x,ResNet50有6个block,而ResNet101有23个block,相差了17个block,也就是17 x 3 = 51层。在Refinedet/python/caffe文件夹里有个model_libs.py,是不是只需要将for i in range(1, 23)更改为for i in range(1, 6)就可以训练ResNet-50了吗?(加载ResNet-50.caffemodel)

sfzhang15 commented 5 years ago

@china56321 其他网络也可以训练的,只要你定义好,找到对的预训练模型就行。ResNet101到ResNet50应该就是按照你说的那么改。