pytorch利用resnet50提取图像特征

import os
import torch
import torch.nn as nn
from torchvision import models,transforms
from torch.autograd import Variable
import numpy as np
from PIL import Image
import time

device=torch.device("cuda:3" if torch.cuda.is_available() else "cpu")

class net(nn.Module):
    def __init__(self):
        super(net, self).__init__()
        self.net = models.resnet50(pretrained=True)

    def forward(self, input):
        output = self.net.conv1(input)
        output = self.net.bn1(output)
        output = self.net.relu(output)
        output = self.net.maxpool(output)
        output = self.net.layer1(output)
        output = self.net.layer2(output)
        output = self.net.layer3(output)
        output = self.net.layer4(output)
        output = self.net.avgpool(output)
        return output

features_dir="./index/"
imgPath="./test/2cf80bb7a9fb5c63c20401e8722408f0.jpg"
fileName=imgPath.split('/')[-1]
feature_path=os.path.join(features_dir,fileName+".txt")

transform = transforms.Compose([
    # transforms.Resize(256),
    # transforms.CenterCrop(224),
    transforms.ToTensor()]
)

img = Image.open(imgPath)
img = transform(img)
print(img.shape)
startTime=time.perf_counter()
x = Variable(torch.unsqueeze(img, dim=0).float(), requires_grad=False)
print(x.shape)
with torch.no_grad():
    model=net()
    # if use_gpu:
    #     x = x.cuda()
    #     net = net.cuda()
    y = model(x).cpu()
    y = torch.squeeze(y)
    y = y.data.numpy()
    print(y.shape)
endTime=time.perf_counter()
print("cpu time:"+str(endTime-startTime))
model2=model.cuda()
endTime=time.perf_counter()
with torch.no_grad():
    x = Variable(torch.unsqueeze(img, dim=0).float(), requires_grad=False)
    x=x.cuda()
    y = model2(x).cpu()
    y = torch.squeeze(y)
    y = y.data.numpy()
    print(y.shape)
endTime2=time.perf_counter()
print("GPU time:"+str(endTime2-endTime))
np.savetxt(feature_path, y, delimiter=',')

需要注意:如果没有使用 with torch.no_grad()语句,会导致显存溢出从而报错退出。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值