pytorch人脸识别——自己制作数据集

这是一篇面向新手的博文:因为本人也是新手,记录一下自己在做这个项目遇到的大大小小的坑。

按照下面的例子写就好了

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(‘其他人‘)

原文地址:https://www.cnblogs.com/cunyusup/p/10014131.html

时间: 2024-10-09 22:30:29

pytorch人脸识别——自己制作数据集的相关文章

[CV]人脸识别检测数据集

[CV]人脸识别检测数据集 做了一段时间的人脸识别和检测,在这里列一下用过的数据集.基本上,大家近期也都是在这几个数据集上检测自己的算法.网上这方面的总结虽然不少,但是一则有些是多年前的数据,或是规模太小或是链接已经失效,再则是数据集的测试协议定义不明,不尽适合用来和其它方法做比较. 1. Labeled Faces in the Wild:做人脸识别,准确的说是人脸验证(Face Verification),UMass的LFW估计是最近被用的最多的了,LFW采用的测试协议也已经被几个新的数据集

008_项目制作拍摄视频篇之_《人脸识别》

此项目为合作项目 需求: 采用人脸识别算法.AT89C51单片机.蓝牙模块.安卓软件设计一个门禁系统,可以实现人脸识别.面部信息添加.存储.删除:安卓与单片机连接:门禁开关.指示.报警等功能. 具体要求: 制作一个简单安卓动态人脸识别APP,APP可以添加.存储.删除面部信息,人脸识别时正确匹配到存储的面部信息之后通过手机蓝牙给装有蓝牙模块的AT89C51单片机传输一个信号,AT89C51单片机根据信号来实现简单门禁系统,开门之后手动关门,开门用LED灯表示,关门用开关代替,关门之后表示开门的灯

人脸识别常用数据集大全(12/20更新)

人脸识别常用数据集大全(12/20更新) 2018-05-18 16:53:37 meng_shangjy 阅读数 2807 1.PubFig: Public Figures Face Database(哥伦比亚大学公众人物脸部数据库) The PubFig database is a large, real-world face dataset consisting of 58,797 images of 200 people collected from the internet. Unli

人脸识别提取手机相册内人物充当数据集,身份识别学习(草稿)

未写完 采用C++,opencv+opencv contrib 4.1.0 对手机相册内人物opencv人脸识别,身份识别学习 最近事情多,介绍就先不介绍了 photocut.c #include "pch.h" #include <opencv2\opencv.hpp> #include <vector> #include "CameraFace.h" #include "PhotoFace.h" #include &l

Github开源人脸识别项目face_recognition

Github开源人脸识别项目face_recognition 原文:https://www.jianshu.com/p/0b37452be63e 译者注: 本项目face_recognition是一个强大.简单.易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统. 为了便于中国开发者研究学习人脸识别.贡献代码,我将本项目README文件翻译成中文. 向本项目的所有贡献者致敬. 英译汉:同济大学开源软件协会 子豪兄Tommy Translator's note: f

OpenCV 和 Dlib 人脸识别基础

00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测试 在键盘按 Win + R, 输入 cmd,回车,将会打开cmd窗口,输入 activate base, 如下所示,表明anaconda环境系统变量无误. IDE PyCharm的安装 自行百度搜索下载并破解. http://idea.lanyus.com/ OpenCV安装 C:\Users\A

支持向量机 人脸识别(SVM)SKLearn

#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import pylab as pl from sklearn import svm # we create 40 separable points np.random.seed(0)#每次运行结果不变 X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]] #randn2

Dlib+OpenCV深度学习人脸识别

目录(?)[+] DlibOpenCV深度学习人脸识别 前言 人脸数据库导入 人脸检测 人脸识别 异常处理 Dlib+OpenCV深度学习人脸识别 前言 人脸识别在LWF(Labeled Faces in the Wild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非常高了,但是真实的环境中的准确率有多少呢?我没有这方面的数据,但是可以确信的是真实环境中的识别率并没有那么乐观.现在虽然有一些商业应用如员工人脸识别管理系统.海关身份验证系统.甚至是银行人脸识别功能,但是我们可以仔细想

人脸识别(face recognition)

一.前述 1. 发展 以往的人脸识别主要是包括人脸图像采集.人脸识别预处理.身份确认.身份查找等技术和系统.现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测.行人跟踪.甚至到了动态物体的跟踪.由此可以看出,人脸识别系统已经由简单的图像处理发展到了视频实时处理.而且算法已经由以前的Adaboots.PCA等传统的统计学方法转变为CNN.RCNN等深度学习及其变形的方法.现在也有相当一部分人开始研究3维人脸识别识别,这种项目目前也受到了学术界.工业界和国家的支持. 之后的内容主要参考了下面的链接,