目录
-->最后回归层定义,回归出两个种类数据,一个是物体分类,一个是物体坐标
pytorch编写Faster-RCNN的下载地址
目录下的Faster-Rcnn网络文件地址
这里resnet.py和vgg16.py功能类似,都是用于前端特征提取。
代码解读:
导入库部分:
#统一python3的执行代码(使用python2运行也是python3的结果)
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
#pytorch必备的数据库
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable
import math
import torchvision.models as models
#这个是唯一依赖的外部库,本文件只是一个特征提取模型,要嵌入到_fasterRCNN这个大模型中
from model.faster_rcnn.faster_rcnn import _fasterRCNN
#调试库
import pdb
这个文件程序是Faster-RCNN中前端的特征提取部分。所以只要依赖一个_fasterRCNN总的模型库就可以。
VGG16初始化:
-->下面这些是模型参数初始。
class vgg16(_fasterRCNN):
def __init__(self, classes, pretrained=False, class_agnostic=False):
self.model_path = 'data/pretrained_model/vgg16_caffe.pth'
self.dout_base_model = 512
self.pretrained = pretrained
self.class_agnostic = class_agnostic
_fasterRCNN.__init__(self, classes, class_agnostic)
-->接下来是是否有预训练,有的话导入参数。
def _init_modules(self):
vgg = models.vgg16()
if self.pretrained:
print("Loading pretrained weights from %s" %(self.model_path))
state_dict = torch.load(self.model_path)
vgg.load_state_dict({k:v for k,v in state_dict.items() if k in vgg.state_dict()})
-->这个是定义特征提取层和分类层,写法参考。
vgg.classifier = nn.Sequential(*list(vgg.classifier._modules.values())[:-1])
# not using the last maxpool layer
self.RCNN_base = nn.Sequential(*list(vgg.features._modules.values())[:-1])
-->固定前面3层的网络参数,不进行训练。
# Fix the layers before conv3:
for layer in range(10):
for p in self.RCNN_base[layer].parameters(): p.requires_grad = False
-->最后回归层定义,回归出两个种类数据,一个是物体分类,一个是物体坐标
self.RCNN_top = vgg.classifier
# not using the last maxpool layer
self.RCNN_cls_score = nn.Linear(4096, self.n_classes)
if self.class_agnostic:
self.RCNN_bbox_pred = nn.Linear(4096, 4)
else:
self.RCNN_bbox_pred = nn.Linear(4096, 4 * self.n_classes)
-->这个是定义进入全连接前,把特征图拉直的函数。
def _head_to_tail(self, pool5):
pool5_flat = pool5.view(pool5.size(0), -1)
fc7 = self.RCNN_top(pool5_flat)
return fc7