1. 程式人生 > >pytorch人臉識別——自己制作數據集

pytorch人臉識別——自己制作數據集

遇到 roo sent 模型 optimizer seq orm ini split

這是一篇面向新手的博文:因為本人也是新手,記錄一下自己在做這個項目遇到的大大小小的坑。

按照下面的例子寫就好了

import torch as t
from torch.utils import data
import os
from PIL import Image
import numpy as np
from torchvision import transforms as T
from torch import nn
from torch.autograd import Variable
from torch.optim import Adam
from torchvision.utils import
make_grid from torch.utils.data import DataLoader transform = T.Compose( #歸一化 [ T.Resize(1000), T.CenterCrop(1000), T.ToTensor(), T.Normalize(mean=[.5,.5,.5],std=[.5,.5,.5]) ] ) #在這個class裏重寫你的數據集 class twoface(data.Dataset): def __init__(self,root,transforms=None): imgs
= os.listdir(root) self.imgs = [os.path.join(root,img) for img in imgs] self.transforms = transforms def __getitem__(self, index): img_path = self.imgs[index] label = 1 if empty in img_path.split(/)[-1] else 0 #定義標簽:圖片名中有label data = Image.open(img_path)
if self.transforms: data = self.transforms(data) return data,label def __len__(self): return len(self.imgs) dataset = twoface(./data1/,transforms=transform) #transform 用在這裏 data_loader_train = t.utils.data.DataLoader(dataset=dataset, batch_size=1, #batch_size 要=1 shuffle=True, num_workers=0) data_loader_test = t.utils.data.DataLoader(dataset=dataset, batch_size=1, shuffle=True, num_workers=0) class Model(t.nn.Module): def __init__(self): super(Model, self).__init__() self.conv1 = t.nn.Sequential(t.nn.Conv2d(3, 6, kernel_size=20, stride=10, padding=0), #模型這塊如果你圖片格式不對的話要重新算 t.nn.ReLU(), t.nn.Conv2d(6, 10, kernel_size=6, stride=1, padding=0), t.nn.ReLU(), t.nn.Conv2d(10, 16, kernel_size=5, stride=1, padding=0), t.nn.ReLU(), t.nn.MaxPool2d(stride=5, kernel_size=5)) # self.dense = t.nn.Sequential(t.nn.Linear(18 * 18 * 16, 33), t.nn.ReLU(), t.nn.Linear(33, 2) ) def forward(self, x): x = self.conv1(x) x = x.view(-1,18 * 18 * 16) x = self.dense(x) return x model = Model().cuda() print(model) cost = t.nn.CrossEntropyLoss() optimizer = t.optim.Adam(model.parameters()) n_epochs = 5 for epoch in range(n_epochs): running_loss = 0.0 running_correct = 0 print("Epoch {}/{}".format(epoch, n_epochs)) print("-" * 10) for datas in data_loader_train: realone,label = datas realone, label = Variable(realone).cuda(), Variable(label).cuda() output = model(realone) _,pred = t.max(output.data,1) optimizer.zero_grad() loss = cost(output, label) loss.backward() optimizer.step() running_loss += loss.data[0] running_correct += t.sum(pred == label) testing_correct = 0 for datak in data_loader_test: X_test, y_test = datak X_test, y_test = Variable(X_test).cuda(), Variable(y_test).cuda() outputs = model(X_test) _, pred = t.max(outputs.data, 1) testing_correct += t.sum(pred == y_test.data) print( "Loss is:{:.4f}, Train Accuracy is:{:.4f}%, Test Accuracy is:{:.4f}".format(running_loss / len(dataset), 100 * running_correct / len( dataset), 100 * testing_correct / len( dataset))) t.save(model, ifempty.pkl)

運行model中的坑

from pylab import plt
import torch as t
from torch.autograd import Variable
from torchvision.utils import make_grid
from PIL import Image
import numpy as np
import os

class Model(t.nn.Module):  #如果不把這些亂七八糟的class和transform 重寫一遍會出錯

    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = t.nn.Sequential(t.nn.Conv2d(3, 6, kernel_size=20, stride=10, padding=0),
                                         t.nn.ReLU(),
                                         t.nn.Conv2d(6, 10, kernel_size=6, stride=1, padding=0),
                                         t.nn.ReLU(),
                                         t.nn.Conv2d(10, 16, kernel_size=5, stride=1, padding=0),
                                         t.nn.ReLU(),
                                         t.nn.MaxPool2d(stride=5, kernel_size=5))
        #
        self.dense = t.nn.Sequential(t.nn.Linear(18 * 18 * 16, 33),
                                     t.nn.ReLU(),
                                     t.nn.Linear(33, 2)
                                     )

    def forward(self, x):
        x = self.conv1(x)
        x = x.view(-1,18 * 18 * 16)
        x = self.dense(x)
        return x




lst = os.listdir(./recv/)
flag = 0
for i in range(len(lst)):

    img=Image.open(./recv/ + lst[i])

    from torchvision import transforms as T
    trans= T.Compose(
        [
            T.Resize(1000),
            T.CenterCrop(1000),
            T.ToTensor(),
            T.Normalize(mean=[.5,.5,.5],std=[.5,.5,.5])
        ]
    )

    a=trans(img)
    b = a.numpy()
    x = np.array([b])
    y = t.Tensor(x)
    fix_noise = Variable(y)
    fix_noise = fix_noise.cuda()
    net = t.load(ifempty.pkl)
    output = net(fix_noise)
    _,pred = t.max(output.data,1)

    if pred.data.item() == 1:
        print()
        flag = 1
    else:
        flag = 0

    if flag == 0:
        netj = t.load(ifzwh.pkl)
        output2 = netj(fix_noise)
        _, pred2 = t.max(output2.data, 1)
        if pred2.data.item() == 0:
            print(xxx)
        else:
            print(其他人)

pytorch人臉識別——自己制作數據集