CV_Task3 利用ResNet实现人脸识别
作业数据集描述:共15个人的头像,每个人11张图。
作业描述:使用给定的数据集完成人脸识别。
实现方法
对人脸图像进行分类处理,可以使用目前流行的深度学习算法进行处理。ResNet作为经典的分类CNN模型,在分类问题上有着出色的表现,因此针对人脸分类问题可以使用ResNet模型作为分类网络来解决。在Pytorch中已经包含了预设的resnet模型可以直接使用。
导入包
from torchvision.models import resnet18
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from sklearn.metrics import accuracy_score
import numpy as np
import os
import random
import argparse
import cv2
from random import shuffle
import matplotlib.pyplot as plt
数据集预处理
对人脸数据集进行预处理,通过对文件操作将所有的图片标签和图片地址放入总列表中,打乱顺序按照一定比例分为训练集和测试集,获取训练数据列表和测试数据列表。
# 获取数据序列
def gen_data_list(data_dir):train_list = []test_list = []tmp_list = []for data_name in os.listdir(data_dir):index = os.path.splitext(data_name)[0].split("s")[-1]filepath = os.path.join(data_dir, data_name)tmp_list.append('{}\t{}'.format(int(index) // 12 + 1, filepath))shuffle(tmp_list) # 打乱顺序train_num = int(len(tmp_list) * 0.9)train_list = tmp_list[:train_num]test_list = tmp_list[train_num:]return train_list, test_list# train_list,test_list = gen_data_list('./data')
# print(train_list)
创建数据集类
数据集类的作用是提取训练数据列表或测试数据列表中的标签和数据地址,通过数据地址获得图片,然后对图片进行处理保留图片信息的精度,来为模型训练或测试读取训练集或测试集数据。
from torch.utils.data import Dataset# 获取数据集
class Face_Data(Dataset):def __init__(self, data_list, image_size=(100, 100)):self.label_list = []self.image_list = []for data in data_list:data = data.strip().split('\t')if len(data) != 2:continuelabel, filepath = dataself.label_list.append(int(label))img = cv2.imread(filepath, cv2.IMREAD_COLOR) / 255. * 2. - 1.img = cv2.resize(img, dsize=image_size) # (W, H, C)self.image_list.append(img)def __len__(self):return len(self.label_list)def __getitem__(self, item):label = torch.LongTensor([self.label_list[item]]).squeeze()image = torch.FloatTensor(self.image_list[item]).permute(2, 1, 0) # size: (C, H, W)return label, image
定义参数
# 设置参数
def parse():parser = argparse.ArgumentParser()parser.add_argument("--mode", type=str, default="test")parser.add_argument("--pre_train", type=str, default="")parser.add_argument("--batch_size", type=int, default=16)parser.add_argument("--lr", type=float, default=1e-4)parser.add_argument("--num_epoch", type=int, default=50)parser.add_argument("--loss_every", type=int, default=5)parser.add_argument("--num_classes", type=int, default=15)parser.add_argument("--data_dir", type=str, default="./data")parser.add_argument("--rand_seed", type=int, default=999)args = parser.parse_known_args()[0]return args
模型训练和测试
从torch中加载预设的resnet18模型,并对模型进行训练,每当数据训练完了5个epoch后就对模型进行1次测试,获取测试结果。本次实验设置的训练循环次数为50轮。
class Model():def __init__(self, cfg):self.cfg = cfgseed = self.cfg.rand_seedtorch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.backends.cudnn.deterministic = Truerandom.seed(seed)np.random.seed(seed)self.model = resnet18(pretrained=False,progress=True,num_classes=self.cfg.num_classes)if os.path.isfile(self.cfg.pre_train):self.model.load_state_dict(torch.load('./save.pth'))self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")self.model = self.model.to(self.device)self.loss_fn = nn.CrossEntropyLoss()def test(self):_, test_list = gen_data_list(self.cfg.data_dir)test_data = Face_Data(test_list)test_loader = DataLoader(test_data,batch_size=self.cfg.batch_size,shuffle=False,num_workers=4)self.model.eval()test_loss = 0.gt_labels = []pred_labels = []cnt = 0with torch.no_grad():for labels, images in test_loader:labels = labels.to(self.device)images = images.to(self.device)pred = self.model(images)loss = self.loss_fn(pred, labels)test_loss += loss.item()cnt += 1# agrmaxpred = torch.max(pred, dim=1)[1]pred = pred.detach().cpu().numpy().tolist()pred_labels += predlabels = labels.detach().cpu().numpy().tolist()gt_labels += labelstest_loss /= cnttest_acc = accuracy_score(gt_labels, pred_labels) * 100.print("Test loss: %.3f, acc: %.2f%%" %(test_loss, test_acc))return test_lossdef train(self):train_losses = []test_losses = []train_list, _ = gen_data_list(self.cfg.data_dir)train_data = Face_Data(train_list)train_loader = DataLoader(train_data,batch_size=self.cfg.batch_size,shuffle=True,num_workers=4)optimizer = optim.Adam(self.model.parameters(), lr=self.cfg.lr)for epoch in range(1, self.cfg.num_epoch + 1):self.model.train()for labels, images in train_loader:labels = labels.to(self.device)images = images.to(self.device)pred = self.model(images)loss = self.loss_fn(pred, labels)optimizer.zero_grad()loss.backward()optimizer.step()pred = torch.max(pred, dim=1)[1]pred = pred.detach().cpu().numpy().tolist()labels = labels.detach().cpu().numpy().tolist()acc = accuracy_score(labels, pred) * 100. if epoch % self.cfg.loss_every == 0:print("epoch: %d loss: %.4f acc: %d%%" % (epoch, loss.item(), acc))train_losses.append(loss.item())test_loss = self.test()test_losses.append(test_loss)torch.save(self.model.state_dict(), './save.pth')plt.figure()plt.plot(train_losses)plt.plot(test_losses)
结果展示
cfg = parse()
model = Model(cfg)
model.train()
CV_Task3 利用ResNet实现人脸识别相关推荐
- java调起本地摄像头,利用openCV进行人脸识别(一)
嗨咯,又好久没有更新了.今天写个前阵子做的人脸识别程序.该程序客户端基于Jave JFrame 客户端的主要作用是,调用电脑的摄像头(我的直接调用笔记本摄像头),然后回显摄像头录取的信息,再利用ope ...
- python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片)
首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import ...
- 利用MATLAB进行人脸识别
最近要给同学在一个自动瞄准装置的基础上做一个人脸识别模块.也是上网查阅了一些资料,经过一周的整理整合,也算是有一些收获. 首先,通过阅读网上的一些现有的程序,可以发现,人脸识别大致可以分为两种方 ...
- 利用OpenCV进行人脸识别
OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库.OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研 ...
- 利用ArcSoftFace做人脸识别-屏幕卫士 保护你的屏幕不被别人偷窥
最近突发奇想,有没一款电脑屏幕保护程序. 通过人脸识别,达到人在电脑面前,打开屏幕,人不在时自动锁屏.在网上搜索了一翻,并没有找到相关的软件. 网上发现了虹软这个人脸识别这个插件,于是下载下来,加功成 ...
- 利用百度进行人脸识别
感谢优秀的你打开了小白的文章 "希望在看文章的你今天又进步了一点点,离美好生活更近一步!" 目录 前提工作: aip安装 graphics安装 程序代码 运行结果 前提工作: 需要 ...
- python利用百度AI 人脸识别(不用access_token)
最近几天做项目要用人脸识别,因为以前用的都是c++,所以用python很不习惯弄了好久,现在差不多弄好了,就记录一下吧,希望可以帮到有需要的人. 我看到网上很多代码都有用access_token,刚开 ...
- 利用face_recognition进行人脸识别,从全班证件照中找出自己
https://blog.csdn.net/hongbin_xu/article/details/76284134 参考hongbin_xu的教程:应用一个基于Python的开源人脸识别库,face_ ...
- Python网络爬虫实战:利用 Python ADB 人脸识别实现自动给抖音漂亮小姐姐视频点赞
这只爬虫做了些什么事儿呢? 通过 ADB 控制你的手机,帮你自动刷抖音 调用百度人脸识别的接口,给视频画面中出现的小姐姐打分 自动给颜值 70 以上的小姐姐的视频点赞 有趣的是,根据抖音的推荐算法,连 ...
最新文章
- dot--向量或矩阵的点乘
- 前端websocket获取数据后需要存本地吗_是什么让我放弃了Restful API?了解清楚后我全面拥抱GraphQL!...
- python-OpenCV图像的基本运算
- linux ulimit
- 滴滴披露女司机数据:80后女性过半 24%全年零违章
- centos7 host修改
- 基于python的在线考试系统-基于 Python 的电子教室和在线考试系统源代码
- 本地源制作docker镜像
- hane nfs win 配置_win7下搭建nfs-server的方法
- solaris 系统信息查看
- aliez歌词_aLIEz FULL歌词【假名 罗马音】
- Unity SRP从零搭建一套图形渲染管线
- 学习笔记(04):21天通关Python(视频课)-字符串高级用法
- webpack打包vue项目之后dist文件夹在本地跑起来
- 过年抢红包,还怕手速慢,我用Python自动抢红包!
- 深圳区块链企业在江岸区设区域总部
- 在职研究生计算机专业学什么区别,计算机专业在职研究生考试科目有哪些?
- Oracle 19c VLDB and Partitioning Guide 第8章:Using Parallel Execution 读书笔记
- 无线射频专题《射频单位,功率单位与相对单位,瓦特,毫瓦,分贝,dBi,dBd,dBm》
- 关于Vue在面试中常常被提到的几点(持续更新……)