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('其他人')
pytorch人脸识别——自己制作数据集的更多相关文章
- pytorch 读数据接口 制作数据集 data.dataset
[吐槽] 啊,代码,你这个大猪蹄子 自己写了cifar10的数据接口,跟官方接口load的数据一样, 沾沾自喜,以为自己会写数据接口了 几天之后,突然想,自己的代码为啥有点慢呢,这数据集不大啊 用了官 ...
- pgm revert转换 成jpg 人脸识别图片
最近在搞人脸识别,下载数据集走得比较心累.很多数据集太大了.没有啥标签.先搞一个小的玩玩.还找到的是pgm灰度图.索性写了个小脚本,用来转换.同时写脚本打标签. 数据集地址:http://downlo ...
- olivettifaces数据集实现人脸识别代码
数据集: # -*- coding: utf-8 -*- """ Created on Wed Apr 24 18:21:21 2019 @author: 92958 & ...
- opencv人脸识别提取手机相册内人物充当数据集,身份识别学习(草稿)
未写完 采用C++,opencv+opencv contrib 4.1.0 对手机相册内人物opencv人脸识别,身份识别学习 最近事情多,介绍就先不介绍了 photocut.c #include & ...
- Yale数据库上的人脸识别
一.问题分析 1. 问题描述 在Yale数据集上完成以下工作:在给定的人脸库中,通过算法完成人脸识别,算法需要做到能判断出测试的人脸是否属于给定的数据集.如果属于,需要判断出测试的人脸属于数据集中的哪 ...
- 使用OpenCV和Python进行人脸识别
介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...
- Github开源人脸识别项目face_recognition
Github开源人脸识别项目face_recognition 原文:https://www.jianshu.com/p/0b37452be63e 译者注: 本项目face_recognition是一个 ...
- OpenCV 和 Dlib 人脸识别基础
00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测 ...
- Opencv摄像头实时人脸识别
Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...
随机推荐
- 关于hibernate中的session与数据库连接关系以及getCurrentSession 与 openSession() 的区别
1.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用. 2.多个sessi ...
- Python入门之python可变对象与不可变对象
本文分为如下几个部分 概念 地址问题 作为函数参数 可变参数在类中使用 函数默认参数 类的实现上的差异 概念 可变对象与不可变对象的区别在于对象本身是否可变. python内置的一些类型中 可变对象: ...
- Python3 Selenium定位不到元素常见原因及解决办法
Python3 Selenium定位不到元素常见原因及解决办法 一.问题描述 在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况: 报错信息: no such e ...
- Charles手机端抓包--证书
应用测试: Charles通过无线对手机进行抓包 测试系统: ubuntu 16.04 LTS 测试手机: IOS 10.3(14E277) Charles版本: Charles 4.1.4 手机证书 ...
- Tensorflow游乐场
昨天,Google发布了Tensorflow游乐场.Tensorflow是Google今年推出的机器学习开源平台.而有了Tensorflow游乐场,我们在浏览器中就可以训练自己的神经网络,还有酷酷的图 ...
- Git 基础 —— 常见使用场景
Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 突然插入 Bugifx 工作, ...
- Slf4j+LogBack使用参考
博文参考: 最简例子:https://blog.csdn.net/johnson_moon/article/details/77532583 Web中配置:https://blog.csdn.net/ ...
- Java 多线程 破解密码 demo
功能要求: 具体类: Decrypt 测试类,用来启动破解和日志线程 DecryptThread 破解线程类,用来生成测试的字符串,并暴力破解 LogThread 日志类,将输出每次生成的字符串结果 ...
- 并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别和使用场景总结
三者区别与联系: 联系,三者 都是线程安全的.区别,就是 并发 和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理:后2者采用锁机制,所以是阻塞的.注意点就是前者由于采用cas算 ...
- MVC ---- 如何扩展方法
先定义一个扩展类: public static class StringExtend { //扩展一个string的方法 public static bool IsNullOrEmpty(this s ...