侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

把vgg-face.mat权重迁移到pytorch模型示例

Python  /  管理员 发布于 5年前   383

最近使用pytorch时,需要用到一个预训练好的人脸识别模型提取人脸ID特征,想到很多人都在用用vgg-face,但是vgg-face没有pytorch的模型,于是写个vgg-face.mat转到pytorch模型的代码

#!/usr/bin/env python2# -*- coding: utf-8 -*-"""Created on Thu May 10 10:41:40 2018@author: hy"""import torchimport mathimport torch.nn as nnfrom torch.autograd import Variableimport numpy as npfrom scipy.io import loadmatimport scipy.misc as smimport matplotlib.pyplot as plt class vgg16_face(nn.Module):  def __init__(self,num_classes=2622):    super(vgg16_face,self).__init__()    inplace = True    self.conv1_1 = nn.Conv2d(3,64,kernel_size=(3,3),stride=(1,1),padding=(1,1))    self.relu1_1 = nn.ReLU(inplace)    self.conv1_2 = nn.Conv2d(64,64,kernel_size=(3,3),stride=(1,1),padding=(1,1))    self.relu1_2 = nn.ReLU(inplace)    self.pool1 = nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2), dilation=(1, 1), ceil_mode=False)          self.conv2_1 = nn.Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu2_1 = nn.ReLU(inplace)    self.conv2_2 = nn.Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu2_2 = nn.ReLU(inplace)    self.pool2 = nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2), dilation=(1, 1), ceil_mode=False)          self.conv3_1 = nn.Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu3_1 = nn.ReLU(inplace)    self.conv3_2 = nn.Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu3_2 = nn.ReLU(inplace)    self.conv3_3 = nn.Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu3_3 = nn.ReLU(inplace)    self.pool3 = nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2), dilation=(1, 1), ceil_mode=False)          self.conv4_1 = nn.Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu4_1 = nn.ReLU(inplace)    self.conv4_2 = nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu4_2 = nn.ReLU(inplace)    self.conv4_3 = nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu4_3 = nn.ReLU(inplace)    self.pool4 = nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2), dilation=(1, 1), ceil_mode=False)          self.conv5_1 = nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu5_1 = nn.ReLU(inplace)    self.conv5_2 = nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu5_2 = nn.ReLU(inplace)    self.conv5_3 = nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    self.relu5_3 = nn.ReLU(inplace)    self.pool5 = nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2), dilation=(1, 1), ceil_mode=False)           self.fc6 = nn.Linear(in_features=25088, out_features=4096, bias=True)    self.relu6 = nn.ReLU(inplace)    self.drop6 = nn.Dropout(p=0.5)        self.fc7 = nn.Linear(in_features=4096, out_features=4096, bias=True)    self.relu7 = nn.ReLU(inplace)    self.drop7 = nn.Dropout(p=0.5)    self.fc8 = nn.Linear(in_features=4096, out_features=num_classes, bias=True)          self._initialize_weights()  def forward(self,x):    out = self.conv1_1(x)    x_conv1 = out    out = self.relu1_1(out)    out = self.conv1_2(out)    out = self.relu1_2(out)    out = self.pool1(out)    x_pool1 = out        out = self.conv2_1(out)    out = self.relu2_1(out)    out = self.conv2_2(out)    out = self.relu2_2(out)    out = self.pool2(out)    x_pool2 = out        out = self.conv3_1(out)    out = self.relu3_1(out)    out = self.conv3_2(out)    out = self.relu3_2(out)    out = self.conv3_3(out)    out = self.relu3_3(out)    out = self.pool3(out)    x_pool3 = out        out = self.conv4_1(out)    out = self.relu4_1(out)    out = self.conv4_2(out)    out = self.relu4_2(out)    out = self.conv4_3(out)    out = self.relu4_3(out)    out = self.pool4(out)    x_pool4 = out        out = self.conv5_1(out)    out = self.relu5_1(out)    out = self.conv5_2(out)    out = self.relu5_2(out)    out = self.conv5_3(out)    out = self.relu5_3(out)    out = self.pool5(out)    x_pool5 = out        out = out.view(out.size(0),-1)        out = self.fc6(out)    out = self.relu6(out)    out = self.fc7(out)    out = self.relu7(out)    out = self.fc8(out)        return out, x_pool1, x_pool2, x_pool3, x_pool4, x_pool5   def _initialize_weights(self):    for m in self.modules():      if isinstance(m, nn.Conv2d):        n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels        m.weight.data.normal_(0, math.sqrt(2. / n))        if m.bias is not None:          m.bias.data.zero_()      elif isinstance(m, nn.BatchNorm2d):        m.weight.data.fill_(1)        m.bias.data.zero_()      elif isinstance(m, nn.Linear):        m.weight.data.normal_(0, 0.01)        m.bias.data.zero_()     def copy(vgglayers, dstlayer,idx):  layer = vgglayers[0][idx]  kernel, bias = layer[0]['weights'][0][0]  if idx in [33,35]: # fc7, fc8    kernel = kernel.squeeze()    dstlayer.weight.data.copy_(torch.from_numpy(kernel.transpose([1,0]))) # matrix format: axb -> bxa  elif idx == 31: # fc6    kernel = kernel.reshape(-1,4096)    dstlayer.weight.data.copy_(torch.from_numpy(kernel.transpose([1,0]))) # matrix format: axb -> bxa  else:    dstlayer.weight.data.copy_(torch.from_numpy(kernel.transpose([3,2,1,0]))) # matrix format: axbxcxd -> dxcxbxa  dstlayer.bias.data.copy_(torch.from_numpy(bias.reshape(-1))) def get_vggface(vgg_path):  """1. define pytorch model"""     model = vgg16_face()       """2. get pre-trained weights and other params"""       #vgg_path = "/home/hy/vgg-face.mat" # download from http://www.vlfeat.org/matconvnet/pretrained/  vgg_weights = loadmat(vgg_path)  data = vgg_weights  meta = data['meta']  classes = meta['classes']  class_names = classes[0][0]['description'][0][0]  normalization = meta['normalization']  average_image = np.squeeze(normalization[0][0]['averageImage'][0][0][0][0])  image_size = np.squeeze(normalization[0][0]['imageSize'][0][0])  layers = data['layers']  # =============================================================================  # for idx,layer in enumerate(layers[0]):  #   name = layer[0]['name'][0][0]  #   print idx,name  # """  # 0 conv1_1  # 1 relu1_1  # 2 conv1_2  # 3 relu1_2  # 4 pool1  # 5 conv2_1  # 6 relu2_1  # 7 conv2_2  # 8 relu2_2  # 9 pool2  # 10 conv3_1  # 11 relu3_1  # 12 conv3_2  # 13 relu3_2  # 14 conv3_3  # 15 relu3_3  # 16 pool3  # 17 conv4_1  # 18 relu4_1  # 19 conv4_2  # 20 relu4_2  # 21 conv4_3  # 22 relu4_3  # 23 pool4  # 24 conv5_1  # 25 relu5_1  # 26 conv5_2  # 27 relu5_2  # 28 conv5_3  # 29 relu5_3  # 30 pool5  # 31 fc6  # 32 relu6  # 33 fc7  # 34 relu7  # 35 fc8  # 36 prob  # """  # =============================================================================    """3. load weights to pytorch model"""    copy(layers,model.conv1_1,0)  copy(layers,model.conv1_2,2)  copy(layers,model.conv2_1,5)  copy(layers,model.conv2_2,7)  copy(layers,model.conv3_1,10)  copy(layers,model.conv3_2,12)  copy(layers,model.conv3_3,14)  copy(layers,model.conv4_1,17)  copy(layers,model.conv4_2,19)  copy(layers,model.conv4_3,21)  copy(layers,model.conv5_1,24)  copy(layers,model.conv5_2,26)  copy(layers,model.conv5_3,28)  copy(layers,model.fc6,31)  copy(layers,model.fc7,33)  copy(layers,model.fc8,35)  return model,class_names,average_image,image_size if __name__ == '__main__':  """test"""   vgg_path = "/home/hy/vgg-face.mat" # download from http://www.vlfeat.org/matconvnet/pretrained/   model,class_names,average_image,image_size = get_vggface(vgg_path)   imgpath = "/home/hy/e/avg_face.jpg"  img = sm.imread(imgpath)  img = sm.imresize(img,[image_size[0],image_size[1]])  input_arr = np.float32(img)#-average_image # h,w,c  x = torch.from_numpy(input_arr.transpose((2,0,1))) # c,h,w  avg = torch.from_numpy(average_image) #   avg = avg.view(3,1,1).expand(3,224,224)  x = x - avg  x = x.contiguous()  x = x.view(1, x.size(0), x.size(1), x.size(2))  x = Variable(x)  out, x_pool1, x_pool2, x_pool3, x_pool4, x_pool5 = model(x)#  plt.imshow(x_pool1.data.numpy()[0,45]) # plot

以上这篇把vgg-face.mat权重迁移到pytorch模型示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    Numpy之reshape()使用详解
    下一条:
    Pytorch 多维数组运算过程的索引处理方式
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客