当前位置: 首页 > 编程日记 > 正文

实战:人脸识别的Arcface实现 | CSDN博文精选

640?wx_fmt=png


来源 | CSDN博客
本文将简单讲述arcface从训练到部署的整个过程,主要包括前期的数据筛选和准备,模型训练以及模型部署。
此文参考的arcface的代码地址:
https://github.com/ronghuaiyang/arcface-pytorch
数据集准备
1. 首先准备需要训练的人脸数据
并按照每个人一个文件夹的形式将人脸照片保存起来,为了使人脸更符合亚洲人的特征应该尽量多的采用亚洲人来你的图片训练。
每个文件夹中最少要有两张或者是两张以上的人脸照片,也就是说训练集中每个人脸最少存在两张。图片保存形式如下图所示:
640?wx_fmt=png
2. 将人脸数据中的人脸部分提取出来并对其
代码中假定的是人脸的数据已经剪裁并对齐,但是在实际的应用中一般拿到的都是普通的人脸的照片,需要将人脸照片进行剪裁并将不是正脸对着正前方的人脸照片仿射变换成正脸面对的照片。
opencv中提供了几种人脸检测的方法,并且在dlib中已经封装好,在速度和准确度上已经达到很好的效果,可以直接调用软件包。

具体几种人脸检测的方法以及对比可以参考网页:https://www.learnopencv.com/face-detection-opencv-dlib-and-deep-learning-c-python/
以dlib中的cnn为例采用下面代码可以将文件夹中的人脸全部对齐并重新保存在另外一个文件夹中。
import dlib, os, cv2
from tqdm import tqdm
import shutil
FaceDeteModel_Type = 'cnn'
FaceDeteModel_Path='mmod_human_face_detector.dat'
FaceShapeModel_Path = 'shape_predictor_68_face_landmarks.dat'
if FaceDeteModel_Type == 'cnn':
detector = dlib.cnn_face_detection_model_v1(FaceDeteModel_Path)
else:
detector = dlib.get_frontal_face_detector()
sp = dlib.shape_predictor(FaceShapeModel_Path)


def FaceDeteAlign_CNN(img):
if isinstance(img, str):
img = cv2.imread(img)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
if img.shape[0] * img.shape[1] > 2500000:
img = cv2.resize(img, (00), fx=0.5, fy=0.5)

imgsize = img.shape[0] * img.shape[1]
dets = detector(img, 0)
if len(dets) == 0:
print('未检测到人脸,请重拍')
return
else:
proposal_dets = []
for i, d in enumerate(dets):
if d.confidence > 0.6:
proposal_dets.append(d)

if len(proposal_dets) == 0:
print('人脸质量不佳,请重拍')
return
det = max(proposal_dets, key=(lambda d: d.rect.width() * d.rect.height()))
if det.rect.width() * det.rect.height() / imgsize <= 1/60:
print('未检测到人脸,请重拍')
return
faces = dlib.full_object_detections()
rec = dlib.rectangle(det.rect.left(), det.rect.top(), det.rect.right(), det.rect.bottom())
faces.append(sp(img, rec))
image = dlib.get_face_chip(img, (faces[0]), size=128)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
return image

path = '/data/tangsh/face_data/train_celebrity/lfw'
save_path = '/data/tangsh/face_data/train_celebrity/align_flw'
img_file = os.listdir(path)
i = 0
try:
for file in tqdm(img_file):
img_path = os.listdir(os.path.join(path, file))
os.system('mkdir(os.path.join(save_path, file))')
for img_name in img_path:
align_img = FaceDeteAlign_CNN(os.path.join(path, file, img_name))
if align_img is not None:
save_file = os.path.join(save_path, file)
if not os.path.exists(save_file):
os.makedirs(save_file)
print(os.path.join(save_file, img_name))
cv2.imwrite(os.path.join(save_file, img_name), align_img)
else:
i = i+1
print('thr count of none align face', i)
except Exception as error:
print(error)

# 判断当前目录下文件夹里面的图片个数 如果图片的个数少于3删除文件夹

img_file = os.listdir(save_path)
print("len"len(img_file))
for file in tqdm(img_file):
img_path = os.listdir(os.path.join(save_path, file))
print("length"len(img_path))
if len(img_path) < 3:
shutil.rmtree(os.path.join(save_path, file))

for img_name in img_path:
#     os.listdir(os.path.join(path, file))
其中用到的模型参数可以在上面提供的人脸检测网页中下载
3. 接下来是将训练集中图片路径和label保存在一个指定的文件中
代码中train.py中有一段代码如下:
opt = Config()
if opt.display:
visualizer = Visualizer()
device = torch.device("cuda")

train_dataset = Dataset(opt.train_root, opt.train_list, phase='test', input_shape=opt.input_shape)
# Dataset中输入的数据为opt.train_root 数据存放的路径, opt.train_list 每行为训练数据的图片名字 图片的label
其中Dataset函数的一个参数是数据集的路径,第二个参数是数据集中图片对应的路径以及label保存,文件内容如下:
640?wx_fmt=png
每行包括两个元素,第一个是数据集下每个图片的路径,第二个参数是图片对应的label。
具体生成该文件可以参照以下代码:
import os

f = open('img_train.txt','w')
path = '/data2/fengms/arcface-pytorch-master/data/Datasets/webface/align'
img_file = os.listdir(path)
print("len"len(img_file))
label = 0
for file in img_file:
img_path = os.listdir(os.path.join(path, file))
for img  in img_path:
new_context = os.path.join(file, img) + " " + str(label) +  '\n'
print(new_context)
f.write(new_context)
label = label + 1

f.close()
到目前为止训练集的数据已经准备好。同理如果需要验证集以及flw数据集按照同样的方法设置。
训练代码
训练代码之前需要在data目录下创建Datasets目录,分别放入训练数据集文件夹webface以及验证数据集flw。每个文件夹下分别放入数据集文件夹 以及训练和测试图片的路径 以及label保存的txt文件。特别注意flw文件夹中放入的txt文件为 lfw_test_pair.txt,该文件夹在作者提供的代码中有保存。
640?wx_fmt=png
接下来就是修改config.py文件中的配置
backbone = 'resnet50' #选用的网络结构
classify = 'softmax'
num_classes = 10001 #等于人脸中类别的个数,大于或者小于报错
metric = 'arc_margin'
easy_margin = False
use_se = False
loss = 'focal_loss'

display = False
finetune = False

train_root = '/data2/fengms/arcface-pytorch-master/data/Datasets/webface/align'
train_list = '/data2/fengms/arcface-pytorch-master/data/Datasets/webface/img_info.txt'
val_list = '/data/Datasets/webface/val_data_13938.txt'

test_root = '/data1/Datasets/anti-spoofing/test/data_align_256'
test_list = 'test.txt'

lfw_root = '/data2/fengms/arcface-pytorch-master/data/Datasets/lfw/align_flw'
lfw_test_list = '/data2/fengms/arcface-pytorch-master/data/Datasets/lfw/lfw_test_pair.txt'

checkpoints_path = 'checkpoints'
load_model_path = 'models/resnet18.pth'
test_model_path = 'checkpoints/resnet18_110.pth'
save_interval = 10
需要注意的是选用的网络结构改变的时候需要修改网络结果中self.fc5中的参数值,因为不同网络在同样输入大小的时候全卷积层输出的特征图的大小是不一致的,因此将特征图平铺之后形成的向量大小是不一致的。
例如我选用的训练网络结构为resnet50,resnet.py中代码修改如下:
self.layer1 = self._make_layer(block, 64, layers[0], stride=2)
self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
# self.avgpool = nn.AvgPool2d(8, stride=1)
# self.fc = nn.Linear(512 * block.expansion, num_classes)
self.fc5 = nn.Linear(512 * 16 * 16512# 选用不同的网络时需要修改。
当输入图片的大小为128的时候经过全卷积操作layer4输出的特征图的大小是16*16
当数据集准备好以及参数配置好后,需要创建checkpoints文件夹用于保存模型。之后安装一些必要的包torch torchvision等等 。
安装完环境后就能正常运行了python train.py
扫码查看作者更多文章
▼▼▼
640?wx_fmt=jpeg
640?wx_fmt=jpeg


(*本文为 AI科技大本营转载文章,联系作者



彩蛋~ 


1024程序员节超值特惠限时秒杀!活动时间:2019年10月24日00:00-24:00凡在此活动期间购买大会单人票,即送价值298元的CSDN VIP年卡


(VIP年卡特权:全站免广告+600个资源免积分下载+学院千门课程免费看+购课9折)


640?wx_fmt=png


推荐阅读


640?wx_fmt=png

你点的每个“在看”,我都认真当成了AI

相关文章:

Windows7/10上快速搭建Tesseract-OCR开发环境操作步骤

之前在https://blog.csdn.net/fengbingchun/article/details/51628957 中描述过如何在Windows上搭建Tesseract-OCR开发环境&#xff0c;那时除了需要clone https://github.com/fengbingchun/OCR_Test 工程外&#xff0c;还需要依赖 https://github.com/fengbingchun/Liblept_T…

C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

反射以及Attribute在ORM中的应用 一、 反射什么是反射&#xff1f;简单点吧&#xff0c;反射就是在运行时动态获取对象信息的方法&#xff0c;比如运行时知道对象有哪些属性&#xff0c;方法&#xff0c;委托等等等等。反射有什么用呢&#xff1f;反射不但让你在运行是获取对象…

Network | sk_buff

sk_buff结构可能是linux网络代码中最重要的数据结构&#xff0c;它表示接收或发送数据包的包头信息。它在中定义&#xff0c;并包含很多成员变量供网络代码中的各子系统使用。 这个结构被不同的网络层&#xff08;MAC或者其他二层链路协议&#xff0c;三层的IP&#xff0c;四…

吴恩达老师深度学习视频课笔记:深度学习的实用层面

训练、验证和测试数据集(training、development and test sets)&#xff1a;训练神经网络时&#xff0c;我们需要作出很多决策&#xff0c;如神经网络分多少层(layers)、每层含有多少个隐藏层单元(hidden units)、学习率(learning rates)、各层采用哪些激活函数(activation fun…

FtpCopy数据定时自动备份软件(FTP定时备份)

1. 软件说明 FtpCopy是一款免费的FTP数据自动备份软件&#xff0c;如果FtpCopy对您有较大的帮助&#xff0c;欢迎捐赠我们&#xff0c;我们对您表示衷心的感谢&#xff01; 如果有需求的话会一直更新下去&#xff0c;将软件做到极致&#xff01; 有问题可直接“反馈留言”。 特…

专注NLP,竹间智能完成4500万美元B+轮融资

近日&#xff0c;竹间智能在成立四周年之际宣布完成4500万美元B轮融资。本轮由某重要战略合作方、云晖资本及领沨资本联合领投&#xff0c;凯思博投资、众安资本、趋势资本、普华资本、一路资本跟投&#xff0c;光源资本担任本轮融资的独家财务顾问。竹间智能方面表示&#xff…

JDBC连接各种数据库方法

为什么80%的码农都做不了架构师&#xff1f;>>> 声明 以下内容收集自网络&#xff0c;并没有亲自测试可用性。 一、Oracle8/8i/9i数据库&#xff08;thin模式&#xff09; Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url&…

OpenCV支持中文字符输出实现

在 http://www.opencv.org.cn/forum.php?modviewthread&tid2083&extra&page1 中&#xff0c;作者给出了原始的在OpenCV中 支持中文字符的输入&#xff0c;原始的实现使用的是OpenCV的C接口&#xff0c;使用起来不怎么方便&#xff0c;这里对原作者的实现进行调整&…

CSDN”原力计划“在召唤:技术人请集结,用原创技术影响万千开发者

技术深不可测、薪资难以想象、着装招人吐槽、发量让人惊叹、笑点着实密集、情商令人堪忧......在这个你我他她它通过网络紧密互联、消息实时互通的 21 世纪&#xff0c;人们对身处技术至高点的程序员们仍然有着以上不接地气、呆板保守的误解&#xff0c;对此&#xff0c;操着一…

.asmx支持post请求或者get请求调用(WebService 因 URL 意外地以 结束,请求格式无法识别 的解决方法)...

使用Post调用以asmx形式提供的webservice时&#xff0c;在本机调试没有调用问题。一旦部署至服务器后会提示如下信息&#xff1a; <html><head><title>因 URL 意外地以“/GetCertByToken”结束&#xff0c;请求格式无法识别。</title><meta name&qu…

关于StartCoroutine的简单线程使用

StartCoroutine在unity3d的帮助中叫做协程&#xff0c;意思就是启动一个辅助的线程。 在C#中直接有Thread这个线程&#xff0c;但是在unity中有些元素是不能操作的。这个时候可以使用协程来完成。 使用线程的好处就是不会出现界面卡死的情况&#xff0c;如果有一次非常大量的运…

Robot Framework(十八) 支持工具

5支持工具 5.1库文档工具&#xff08;libdoc&#xff09; libdoc是一种用于为HTML和XML格式的测试库和资源文件生成关键字文档的工具。前一种格式适用于人类&#xff0c;后者适用于RIDE和其他工具。Libdoc也没有很少的特殊命令来显示控制台上的库或资源信息。 可以创建文档&…

基于开源TiRG的文本检测与提取实现

在 http://funkybee.narod.ru/ 中作者给出了文本检测和提取的实现&#xff0c;仅有一个.hpp文件&#xff0c;为了在windows上编译通过&#xff0c;这里简单进行了改动&#xff0c;改动后的code如下&#xff1a; #include <math.h> #include <stdio.h> #include &l…

Kaggle Days首次落地中国,日本团队拿下冠军

2019 年 10 月 20 日&#xff0c; 为期两天的 Kaggle Days 中国活动在北京圆满结束。作为全球最知名的线下数据科学活动在中国的首次落地&#xff0c;Kaggle Days 获得了谷歌、Kaggle 以及 16 位来自美国、俄罗斯、捷克、日本以及中国的 Kaggle Grandmaster 以及 Master 的大力…

《WF编程》笔记目录

《WF编程》笔记目录

activity的四种加载模式

在android里&#xff0c;有4种activity的启动模式&#xff0c;分别为&#xff1a; standard, singleTop, singleTask和singleInstance, 其中standard和singleTop类似&#xff0c; singleTask和singleInstance类似&#xff0c; 用法如下&#xff1a; (1).standard和singleTop 这…

吴恩达老师深度学习视频课笔记:优化算法

优化算法能够帮助你快速训练模型。mini-batch梯度下降法&#xff1a;把训练集分割(split)为小一点的子训练集&#xff0c;这些子集被叫做mini-batch。batch梯度下降法指的是&#xff1a;同时处理整个训练集&#xff0c;只有处理完整个训练集才更新一次权值和偏置。并且预期每次…

程序员编程时戴耳机是在听什么?

1024程序员节&#xff0c;CSDN旗下的码书商店为程序员放个“价”&#xff0c;全场所有书籍8折&#xff0c;电子产品可以拥有大额优惠券&#xff0c;购买前可加文末客服微信领取优惠券哦。兰士顿耳机&#xff0c;原价199元&#xff0c;1024专属价159元&#xff0c;购买时候请输入…

Mac中MacPorts安装和使用

文章转载至http://www.zikercn.com/node/8 星期四, 06/07/2012 - 19:02 — 张慧敏 MacPorts简单介绍 MacPorts&#xff0c;以前叫做DarwinPorts&#xff0c;是一个软件包管理系统&#xff0c;用来简化Mac OS X和Darwin操作系统上软件的安装。它是一个用来简化自由软件/开放源码…

小白入门:我是如何学好机器学习的?

作者 | Jae Duk Seo译者 | Tianyu编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;在我看来&#xff0c;机器学习是一个计算机科学和数学知识相融合的研究领域。虽然这是个很有趣的领域&#xff0c;但它其实没有想象中那么难。我相信只要你有足够的动力、…

数据库服务器 之 PostgreSQL数据库的日常维护工作

来自&#xff1a;LinuxSir.Org摘要&#xff1a;为了保持所安装的 PostgreSQL 服务器平稳运行, 我们必须做一些日常性的维护工作。我们在这里讨论的这些工作都是经常重复的事情&#xff0c; 可以很容易地使用标准的 Unix 工具&#xff0c;比如cron 脚本来实现; 目录1. 综述&…

吴恩达老师深度学习视频课笔记:超参数调试、Batch正则化和程序框架

Tuning process(调试处理)&#xff1a;神经网络的调整会涉及到许多不同超参数的设置。需要调试的重要超参数一般包括&#xff1a;学习率、momentum、mini-batch size、隐藏单元(hidden units)、层数、学习率衰减。一般对于你要解决的问题而言&#xff0c;你很难提前知道哪个参数…

AD上删除了Exchange容器,再重装时报'找不到企业组织容器

AD上删除了Exchange容器,再重装时报找不到企业组织容器。安装日志如下:[06/16/2014 04:58:15.0054] [0] **********************************************[06/16/2014 04:58:15.0054] [0] Starting Microsoft Exchange Server 2013 Service Pack 1 Setup[06/16/2014 04:58:15.0…

实战:基于OpenPose的卡通人物可视化 | CSDN博文精选

作者 | Wuzebiao2016来源 | CSDN博客前言去年打算用些现成的Pose做些展示&#xff0c;因为以前有在OpenPose做些识别等开发工作&#xff0c;所以这次我就简单在OpenPose上把骨架用动画填充上去&#xff0c;关于能够和人动作联系起来的动画&#xff0c;我找到了Unity提供的示例A…

基于Idea从零搭建一个最简单的vue项目

一、需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime)&#xff0c;发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;实质是对Chrome V8引擎进行了封装。Node.js对一些特殊用例进行优化&#xff0c;提供替代的API&#xff0c;使得V8在非浏览器环境…

OpenCV中基于LBP算法的人脸检测测试代码

下面是OpenCV 3.3中基于CascadeClassifier类的LBP算法实现的人脸检测&#xff0c;从结果上看&#xff0c;不如其它开源库效果好&#xff0c;如libfacedetection&#xff0c;可参考 https://blog.csdn.net/fengbingchun/article/details/52964163 #include "funset.hpp&qu…

解决getOutputStream() has already been called for this response[java io流]

getOutputStream() has already been called for this response以上异常出现的原因和解决方法&#xff1a;jsp中出现此错误一般都是在jsp中使用了输出流&#xff08;如输出图片验证码&#xff0c;文件下载等&#xff09;&#xff0c;没有妥善处理好的原因。具体的原因&#xff…

吴恩达老师深度学习视频课笔记:构建机器学习项目(机器学习策略)(1)

机器学习策略(machine learning strategy)&#xff1a;分析机器学习问题的方法。正交化(orthogonalization)&#xff1a;要让一个监督机器学习系统很好的工作&#xff0c;一般要确保四件事情&#xff0c;如下图&#xff1a;(1)、首先&#xff0c;你通常必须确保至少系统在训练集…

内行的AI盛会——北京智源大会带你洞见未来!(含日程及限量优惠)

报名请点击「阅读原文」北京国家会议中心2019年10月31日-11月1日www.baai.ac.cn/2019使用优惠码「BAAICSDN」专享7折优惠学生票仅69元&#xff0c;数量有限&#xff0c;先到先得世界AI看中国&#xff0c;中国AI看北京&#xff08;长按上图或点击「阅读原文」注册参会&#xff0…

微软职位内部推荐-Sr. Dev Lead

微软近期Open的职位:JD如果你想试试这个职位&#xff0c;请跟我联系&#xff0c;我是微软的员工&#xff0c;可以做内部推荐。发你的中英文简历到我的邮箱&#xff1a;Nicholas.lu.mail(at)gmail.com转载于:https://www.cnblogs.com/DotNetNuke/p/3885283.html