其实比较R-CNN、fast R-CNN、faster R-CNN、YOLO、SSD等模型的准确度,直接给出准确率的意义不大,因为这些网络的基网络可能不同,故在给出detector准确率的同时,最好也同时给出基网络的模型:如VGG、resnet。
为什么region-based method的方法train from scratch会不收敛,而SSD的train from scratch mAP降低不大?
region based method是两个阶段的,基于RPN+classification/regression detector,input image先送到base network,如VGG16/resnet的前基层(conv4_3),经过卷积网络提取到特征图后,网络分为两个支路:①将特征图送入RPN网络:将特征图进行再一次的卷积,如果对于特征图上的每个像素点生成6个region proposal(different aspect ratios),而特征图的尺寸是38*38,则经过RPN后会生成38*38*6的输出,其中对于每个aspect ratio的输出图,38*38中的每个点,其像素值都是0或者1,表示当前的region proposal中是前景还是背景,这时,实际上,单独训练RPN也需要标签(关于包围框是前景还是背景的标签);②将RPN产生的anchor对应的包围狂映射到VGG16 base network的输出特征图上,得到一个特征块,对anchor进行classification和regression。进行pretrain主要是对于特征提取网络,由于imagenet的数据集的图片数据量特别大,如果不进行pretrain,直接进行train from sracth,由于COCO有10万张图片,VOC训练的数据集数据量更少,VOC2012与COCO数据集中有部分的重叠,并不是完全独立。直接进行权值随机初始化,则这么少的训练数据图片对于VGG特征提取网络的训练都比较困难了,更别说训练region proposal network;而如果是用pretrain model作为特征提取网络,再用VOC/COCO数据集训练RPN,则将会使得RPN精度提高。所以,对于two-stage method,可能增大训练数据量,直接train from scratch可能效果也会很好。
使用多块GPU训练网络模型:
服务器端有8块GPU,当然也有CPU,一块GPU的显存是11G,一般batch size设置为11~16在一块GPU上运行没有问题,(最大显存在10G左右),当使用多个(如4个)GPU并行时,先由CPU从硬盘中读取训练数据,CPU有多个核,每个核又有很多个进程,每个进程中又有很多线程,num_worker参数用来指定一次使用多少个线程从硬盘中读取训练数据到内存,由CPU读取一个batch size的数据到内存后,将内存中的这一个batch size的图片数据全都送给第一个GPU,由第一个GPU对于训练图片做均分,如batch size=16,有4块GPU,则CPU的多个线程会读取64个batch size的图片,分别分配到4个GPU中,在每个GPU中,对一个batch size的数据进行前向传播forward一次,计算出每一层神经网络的输出特征图,并保存中间结果,得到输出损失函数之后,再backward反向传播计算损失函数相对于每一层权值参数的梯度,反向传播的过程中同样需要计算每一层的输出中间结果(用以计算前一层的梯度值),当每个GPU进行完完整的一次前向传播和反向传播后,每个GPU会有一个 权值的梯度矩阵 delta W,每个GPU把这个梯度矩阵都传递给第一个GPU,由第一个GPU更新完模型参数后(对于4个GPU传回的 delta W 计算平均值),再将更新后的模型参数传给4个GPU ,进行下一次的训练。
在GPU训练时需要对一个网络模型的训练时间有很好的估计,需要知道一次epoch花费多少时间,从而训练一个网络模型需要多少时间。如果出现某个GPU的显存占用率跳变,从0% 到80%,再变成0%,80%,则很有可能是CPU读取数据的速度和GPU的计算速度不匹配所导致,CPU从机械硬盘中读取速度很慢,多个线程读取一个batch size的训练数据要花很久时间,故此时GPU占用率为0%,而一旦当前的GPU读取到一个batch size的图像数据后,就开始进行计算,这时候GPU的占用率会跳变到80%,解决这种现象的方法是:用固态硬盘存储数据或者把数据存储到内存中。
阅读torchcv代码,并在GPU上跑ssd+fpn
1.将训练数据集改成voc2007+2012
2.backbone 由resnet50 改成resnet101
3.如果迭代的epoch>50,就将学习率lr变成之前的0.1倍
4.weight decay参数,对于backbone网络,设置成5*10e-4,对于classification+localization网络,设置成5*10e-3
5.对于batch normalization 将affine参数由默认的True设置成false,将momentum参数由默认的0.1设置成0.9,可能需要看框架的源代码
6.kaggle竞赛中的ship detection,将ssd+fpn模型在比赛所使用的数据集上调试成功,测试跑出几张有包围框的图片
10天之内完成,找老师讨论结果
期间多看看github上的优秀源码,有好的代码要点赞保存 star 学习pytorch教程中的examples imagenet mnist数据集上进行网络的分类和训练
我的github账号和密码
账号:
wyxhahaha123
密码:
wyxhahaha123
https://github.com/wyxhahaha?tab=stars
https://github.com/pytorch
https://github.com/pytorch/tutorials
https://github.com/pytorch/examples
https://github.com/pytorch/examples/blob/master/imagenet/main.py
https://github.com/pytorch/examples/tree/master/mnist
https://github.com/pytorch/examples/tree/master/mnist_hogwild
https://github.com/pytorch/examples/blob/master/dcgan/main.py
torch.nn.BatchNorm2d(num_features,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)
函数功能:对一个输入的4D tensor 进行batch normalization,这个4D tensor:(batch_size,H,W,channels),