faster rcnn代码解读(一)特征提取

faster rcnn代码解读参考

https://github.com/adityaarun1/pytorch_fast-er_rcnn

    https://github.com/jwyang/faster-rcnn.pytorch

实际上是一遍整理一遍修改吧。

这里借用的是vgg16的迁移学习(transfer learning)进行的或者说微调(fine-tuning)。

一、关于vgg16网络参数载入及冻结

我直接把vgg16打印出来

VGG16(
  (vgg): VGG(
    (features): Sequential(
      (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): ReLU(inplace=True)
      (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (3): ReLU(inplace=True)
      (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (6): ReLU(inplace=True)
      (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (8): ReLU(inplace=True)
      (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (11): ReLU(inplace=True)
      (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (13): ReLU(inplace=True)
      (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (15): ReLU(inplace=True)
      (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (18): ReLU(inplace=True)
      (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (20): ReLU(inplace=True)
      (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (22): ReLU(inplace=True)
      (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (25): ReLU(inplace=True)
      (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (27): ReLU(inplace=True)
      (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (29): ReLU(inplace=True)
    )
    (avgpool): AdaptiveAvgPool2d(output_size=(7, 7))
    (classifier): Sequential(
      (0): Linear(in_features=25088, out_features=4096, bias=True)
      (1): ReLU(inplace=True)
      (2): Dropout(p=0.5, inplace=False)
      (3): Linear(in_features=4096, out_features=4096, bias=True)
      (4): ReLU(inplace=True)
      (5): Dropout(p=0.5, inplace=False)
    )
  )
)

可以看到vgg16包含三个部分:feature特征提取、avgpool为全连接降维度、classifier分类。

class VGG16(nn.Module):
    def __init__(self,model_path ):
        super(VGG16, self).__init__()
        self.vgg = models.vgg16().to(cfg['device'])        
        if cfg['net_mode']=='train':
            print("Loading pretrained weights from %s" % (model_path))
            state_dict = torch.load(model_path)
            self.vgg.load_state_dict({k: v for k, v in state_dict.items() if k in self.vgg.state_dict()})
        self.vgg.classifier = nn.Sequential(*list(self.vgg.classifier._modules.values())[:-1])
        self.vgg.features = nn.Sequential(*list(self.vgg.features._modules.values())[:-1])
        for layer in range(10):
            for p in self.vgg.features[layer].parameters():
                p.requires_grad = False

    def forward(self, x):
        out = self.vgg.features(x)
        return out,self.vgg.classifier

常用的套路,features都特征提取直接拿过来用,载入参数后直接冻结。而classifier层这里只是因为后面做rcnn分类的时候少些几行代码,这个可以忽略,自己手写都没毛病。

二、我后面把vgg16又包了一层:

class FeatureNet(nn.Module):
    def __init__(self):
        super(FeatureNet, self).__init__()
        model_path = cfg['pretrained_model']
        if cfg['feature_net'] =='vgg16':
            self.feature_net =VGG16(model_path)
    def forward(self, inputs):
        features,classifier = self.feature_net(inputs)
        return features,classifier

没有什么其他目的,就是为了让faster rcnn看起来层次更好一点,因为features提取既可以用vgg16,也可以用点别的网络

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ControlNet 是一种基于现场总线网络通信技术的控制系统,适用于工业自动化领域。它采用高速、可靠的通信方式,用于连接各种控制设备和传感器,实现设备之间的数据传输和通信。 ControlNet 的代码解读主要涉及两个方面:物理层和应用层。 在物理层方面,ControlNet 代码解读可以包括网络拓扑结构的构建和通信线路的连接。网络拓扑结构可以是星型、树状或环状等,根据实际需求设计。通信线路的连接需要按照ControlNet的规定进行布线,连接各个设备和传感器,确保信号传输的稳定和可靠。 在应用层方面,ControlNet 代码解读可以包括配置节点和设备的通信功能。配置节点是指主站和从站,主站负责网络的控制和管理,从站负责采集数据并完成相应的控制任务。代码解读可以详细了解各个节点的功能和通信协议,例如从站在收到主站的请求后如何响应,如何保证通信的实时性和安全性等。 此外,ControlNet 代码解读还可以包括对通信报文的解析,了解报文的结构和具体的参数含义。在数据传输中,报文包括控制命令、数据和状态信息等内容,解析这些报文可以帮助理解各个节点之间的通信过程。 总之,ControlNet 代码解读是对控制系统的深入理解和掌握,通过解析代码可以了解网络的物理连接和通信功能,实现设备之间的数据传输和通信。这对于系统调试、故障排查和性能优化都具有重要意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值