class MyNet(nn.Module): def __init__(self, pretrained=False, **kwargs): super(MyNet, self).__init__() netname = args.arch.split('_')[0] if netname == 'resnet152': self.model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) else: self.model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) if pretrained: parameters = model_zoo.load_url(model_urls[netname]) self.model.load_state_dict(parameters) self.model.avgpool = nn.AvgPool2d(8) self.model.fc = nn.Linear(1024, 1) self.model.sig = nn.Sigmoid() def forward(self, x): x = self.model.conv1(x) x = self.model.bn1(x) x = self.model.relu(x) x = self.model.maxpool(x) x = self.model.layer1(x) x = self.model.layer2(x) x = self.model.layer3(x) # x = self.model.layer4(x) x = self.model.avgpool(x) x = x.view(x.size(0), -1) x = self.model.fc(x) return self.model.sig(x)
class OriNet(nn.Module): def __init__(self,bits_len,pretrained=False,**kwargs): super(OriNet,self).__init__() self.bits_len=bits_len self.resnetmodel=ResNet(BasicBlock,[2,2,2,2],**kwargs) if pretrained: parameters=model_zoo.load_url(model_urls['resnet18']) self.model.load_state_dict(parameters) self.resnetmodel.avgpool=None self.resnetmodel.fc1=nn.Linear(512*3*4,512) self.resnetmodel.fc2=nn.Linear(512,512) self.resnetmodel.classifier=nn.Linear(512,bits_len) self.register_buffer('centers',torch.zeros(bits_len,512)) def forward(self,input1): input1=self.resnetmodel.conv1(input1) input1=self.resnetmodel.bn1(input1) input1=self.resnetmodel.relu(input1) input1=self.resnetmodel.maxpool(input1) input1=self.resnetmodel.layer1(input1) input1=self.resnetmodel.layer2(input1) input1=self.resnetmodel.layer3(input1) input1=self.resnetmodel.layer4(input1) input1=input1.view(input1.size(),-1) input1=self.resnetmodel.fc1(input1) #feature for center loss input1=self.resnetmodel.fc2(input1) self.features=input1 input1=self.resnetmodel.classifier(input1) output1=F.log_softmax(input1) return output1
class FaceModel(nn.Module): def __init__(self, num_classes, pretrained=False, **kwargs): super(FaceModel, self).__init__() self.model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) if pretrained: parameters = model_zoo.load_url(model_urls['resnet18']) self.model.load_state_dict(parameters) self.model.avgpool = None self.model.fc1 = nn.Linear(512 * 3 * 4, 512) self.model.fc2 = nn.Linear(512, 512) self.model.classifier = nn.Linear(512, num_classes) self.register_buffer('centers', torch.zeros(num_classes, 512)) self.num_classes = num_classes def forward(self, x): x = self.model.conv1(x) x = self.model.bn1(x) x = self.model.relu(x) x = self.model.maxpool(x) x = self.model.layer1(x) x = self.model.layer2(x) x = self.model.layer3(x) x = self.model.layer4(x) x = x.view(x.size(0), -1) x = self.model.fc1(x) #feature for center loss x = self.model.fc2(x) self.features = x x = self.model.classifier(x) return F.log_softmax(x)
class ResNeXt50(BaseNetwork): def __init__(self, opt): super(ResNeXt50, self).__init__() self.model = ResNet(Bottleneck, [3, 4, 6, 3], groups=32, width_per_group=4) self.opt = opt # self.reduced_id_dim = opt.reduced_id_dim self.conv1x1 = nn.Conv2d(512 * Bottleneck.expansion, 512, kernel_size=1, padding=0) self.fc = nn.Linear(512 * Bottleneck.expansion, opt.num_classes) # self.fc_pre = nn.Sequential(nn.Linear(512 * Bottleneck.expansion, self.reduced_id_dim), nn.ReLU()) def load_pretrain(self): check_point = torch.load(model_urls['resnext50_32x4d']) util.copy_state_dict(check_point, self.model) def forward_feature(self, input): x = self.model.conv1(input) x = self.model.bn1(x) x = self.model.relu(x) x = self.model.maxpool(x) x = self.model.layer1(x) x = self.model.layer2(x) x = self.model.layer3(x) x = self.model.layer4(x) net = self.model.avgpool(x) net = torch.flatten(net, 1) x = self.conv1x1(x) # x = self.fc_pre(x) return net, x def forward(self, input): input_batch = input.view(-1, self.opt.output_nc, self.opt.crop_size, self.opt.crop_size) net, x = self.forward_feature(input_batch) net = net.view(-1, self.opt.num_inputs, 512 * Bottleneck.expansion) x = F.adaptive_avg_pool2d(x, (7, 7)) x = x.view(-1, self.opt.num_inputs, 512, 7, 7) net = torch.mean(net, 1) x = torch.mean(x, 1) cls_scores = self.fc(net) return [net, x], cls_scores