人脸识别简介

简单来讲,人脸识别这个问题,就是给定两个人脸,然后判定他们是不是同一个人,这是它最原始的定义。它有很多应用场景,比如银行柜台、海关、手机解锁、酒店入住、网吧认证,会查身份证跟你是不是同一个人。

关于人脸识别的内容,网上资料很多,这里推荐一篇综述,详细介绍了一些人脸识别的背景和目前的相关研究,以及常用的人脸识别模型:

http://www.elecfans.com/d/709424.html

好了,直接进入主题,今天的重点:

insightface论文:https://arxiv.org/abs/1801.07698

insightface github项目:https://github.com/deepinsight/insightface

制作数据集

一、环境配置

官方提供的项目是基于mxnet框架的

因此首先需要配置好这些环境,这里假设已经安装好cuda等

mxnet的安装相对来说比较简单(相对于caffe)

(1)查询自己cuda的版本

# 输入
nvcc -V
# 输出结果
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176

(2)用pip安装mxnet(GPU版本)

pip install mxnet-cu90
# 根据自身情况查询对应的安装命令,例如我服务器的cuda版本是10.0的,安装命令为 pip install mxnet-cu100

二、克隆项目和数据集下载

将insight项目克隆到本地

git clone --recursive https://github.com/deepinsight/insightface.git

下载lfw数据集

链接:http://vis-www.cs.umass.edu/lfw/index.html#download

这里为了方便,提供了lfw的部分用于练手

练手数据集https://www.lanzous.com/i7gdxva,仅用于制作数据集练手

观察数据集:

这里提供了20个用于练手,完整数据集可以去上面的链接或自行查找下载。

说明:每个文件夹名为人的姓名,文件夹内包含多张人脸(>=1)。

三、开始制作所需要格式的数据集

(1)数据对齐并生成lst文件

将lfw数据集下载好并放置在datasets下(这里以lfwdata命名的文件夹),然后新建一个文件夹并命名为output保存对齐后的人脸图片,新建一个文件夹命名为train用于保存输出结果

运行insightface项目下 src/align下的align_lfw.py文件

python align_lfw.py --input-dir ../../datasets/lfwdata --output-dir ../../datasets/output

对齐后的图片

遇到问题1:

ValueError: Object arrays cannot be loaded when allow_pickle=False

解决方案:

pip3 install numpy==1.16.1

如果已安装了多个numpy版本,需要先将其卸载后在运行

遇到问题2:

AttributeError: module ‘scipy.misc’ has no attribute ‘imread’

解决方案:

pip install scipy==1.1.0

如果成功运行,output文件夹下会产生对齐后的人脸以及一个lst文件(将lst文件改名为 train.lst,并移动到train文件下)

终端下,移动和重命名的操作

# 重命名 mv [原始文件名] [改变后的文件名]
mv lst train.lst
# 移动 mv [起始文件路径] [目标文件路径]
mv train.lst ../train/

观察生成的 lst 文件内容:

1       ../../datasets/train/Abbas_Kiarostami/Abbas_Kiarostami_0001.jpg 0
1       ../../datasets/train/Abdel_Aziz_Al-Hakim/Abdel_Aziz_Al-Hakim_0001.jpg   1
# 其中1代表对齐,最后的数字0,1代表class label 中间是地址;需要用\t表示tab键,不能用空格间隔。

(2)创建property配置文件

在datasets/train下创建property,没有后缀

写入下面内容,含义1000,112,112代表ID数量,尺寸,尺寸

1000,112,112

(3)生成rec&idx文件(依托于lst文件)

运行src/data face2rec2.py

python face2rec2.py ../../datasets/train/

运行可能会报错,需要修改,可能原因是源代码是基于python2的

在python3下运行,修改第105行成如下所示:

s = mx.recordio.pack(header, b'')

运行成功后会出现两个文件

train.idx和train.rec

(4)创建pair文件

为了做测试我们需要生成验证集用的bin文件,bin文件生成前需要做pair文件,就是一对一对的数据,每一行分别是


图A的目录 空格 图B的目录 空格 标志0/1(代表两张图类别一致否)
在src/data下新建一个代码generate_image_pairs.py用于生成pairs

代码来源:
https://blog.csdn.net/CLOUD_J/article/details/100672392

# coding:utf-8
import sys
import os
import random
import time
import itertools
import pdb
import argparse
#src = '../../datasets/lfw2'
#dst = open('../../datasets/lfw/train.txt', 'a')
parser = argparse.ArgumentParser(description='generate image pairs')
# general
parser.add_argument('--data-dir', default='', help='')
parser.add_argument('--outputtxt', default='', help='path to save.')
parser.add_argument('--num-samepairs',default=100)
args = parser.parse_args()
cnt = 0
same_list = []
diff_list = []
list1 = []
list2 = []
folders_1 = os.listdir(args.data_dir)
dst = open(args.outputtxt, 'a')
count = 0
dst.writelines('\n')
# 产生相同的图像对
for folder in folders_1:sublist = []same_list = []imgs = os.listdir(os.path.join(args.data_dir, folder))for img in imgs:img_root_path = os.path.join(args.data_dir, folder, img)sublist.append(img_root_path)list1.append(img_root_path)for item in itertools.combinations(sublist, 2):for name in item:same_list.append(name)if len(same_list) > 10 and len(same_list) < 13:for j in range(0, len(same_list), 2):if count < int(args.num_samepairs):#数量可以修改dst.writelines(same_list[j]   ' '   same_list[j 1]  ' '   '1'   '\n')count  = 1if count >= int(args.num_samepairs):break
list2 = list1.copy()
# 产生不同的图像对
diff = 0
print(count)
# 如果不同的图像对远远小于相同的图像对,则继续重复产生,直到两者相差很小
while True:random.seed(time.time() * 100000 % 10000)random.shuffle(list2)for p in range(0, len(list2) - 1, 2):if list2[p] != list2[p   1]:dst.writelines(list2[p]  + ' '  + list2[p   1] +  ' ' +  '0' +  '\n')diff  = 1if diff >= count:break#print(diff)if diff < count:#print('--')continueelse:break

运行generate_image_pairs.py

python3 generate_image_pairs.py --data-dir ../../datasets/output --outputtxt ../../datasets/train/train.txt --num-samepairs 5

–data-dir 后接对齐后的人脸

–outputtxt 用于保存train.txt文件

–num-samepairs 生成多少对(具体如何设置,还需要好好研究一下)

运行成功后在datasets/train下会生成一个train.txt文件

内容:
../../datasets/output/Abdullah/Abdullah_0002.jpg ../../datasets/output/Abdullah/Abdullah_0004.jpg 1
# 前面两个分布是生成的pairs的路径,后面的0/1代表是否同一个人或类

(5)生成验证集bin文件

成功后利用/src/data/下的 lfw2pack.py生成bin文件

但是存在点问题,对lfw2pack.py进行稍微的修改,修改lfw2pack.py中19行,打#的为更改的,改为两个参数,一个是txt读出来的列表,另一个是总数量。

import mxnet as mx
from mxnet import ndarray as nd
import argparse
import pickle
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'eval'))
import lfw
parser = argparse.ArgumentParser(description='Package LFW images')
# general
parser.add_argument('--data-dir', default='', help='')
# 修改1:图像大小修改为112,112
parser.add_argument('--image-size', type=str, default='112,112', help='')
parser.add_argument('--output', default='', help='path to save.')
# 修改2:添加解析参数 
parser.add_argument('--num-samepairs',default=100)
args = parser.parse_args()
lfw_dir = args.data_dir
image_size = [int(x) for x in args.image_size.split(',')]
# 修改3:将文件名pairs.txt修改成train.txt
lfw_pairs = lfw.read_pairs(os.path.join(lfw_dir, 'train.txt'))
print(lfw_pairs)
# 修改4:下一行进行修改成需要的格式
# lfw_paths, issame_list = lfw.get_paths(lfw_dir, lfw_pairs, 'jpg')
lfw_paths, issame_list = lfw.get_paths(lfw_pairs,int(args.num_samepairs) 1)#, 'jpg')
lfw_bins = []
#lfw_data = nd.empty((len(lfw_paths), 3, image_size[0], image_size[1]))
print(len(issame_list))
i = 0
for path in lfw_paths:with open(path, 'rb') as fin:_bin = fin.read()lfw_bins.append(_bin)#img = mx.image.imdecode(_bin)#img = nd.transpose(img, axes=(2, 0, 1))#lfw_data[i][:] = imgi =1if i00==0:print('loading lfw', i)
with open(args.output, 'wb') as f:pickle.dump((lfw_bins, issame_list), f, protocol=pickle.HIGHEST_PROTOCOL)

对应的get_paths这个文件存在src/eval/lfw.py下,把它也改了

def get_paths(pairs, same_pairs):nrof_skipped_pairs = 0path_list = []issame_list = []cnt = 1for pair in pairs:path0 = pair[0]path1 = pair[1]if cnt < same_pairs:issame = Trueelse:issame = False if os.path.exists(path0) and os.path.exists(path1):    # Only add the pair if both paths existpath_list  = (path0,path1)issame_list.append(issame)else:print('not exists', path0, path1)nrof_skipped_pairs  = 1cnt  = 1if nrof_skipped_pairs>0:print('Skipped %d image pairs' % nrof_skipped_pairs)return path_list, issame_list

vim中多行注释方法:

多行注释:
1. 进入命令行模式,按ctrl   v进入 visual block模式,然后按j, 或者k选中多行,把需要注释的行标记起来
2. 按大写字母I,再插入注释符,例如 #
3. 按esc键就会全部注释了
取消多行注释:
1. 进入命令行模式,按ctrl   v进入 visual block模式,按字母l横向选中列的个数,例如 # 需要选中2列
2. 按字母j,或者k选中注释符号
3. 按d键就可全部取消注释

之后再运行

python3 lfw2pack.py --data-dir ../../datasets/train --output ../../datasets/train/lfw.bin --num-samepairs 2

注意:我这里报错了(没有报错的小伙伴可以忽略)

path0 = pair[0]
IndexError: list index out of range```仔细分析之后,是因为在train.txt中存在空白行导致,直接删除即可,如果没有报错可以直接忽略至此,我们已经完成了数据集的制作,后续会更新如何训练,以及使用。这部分内容,是本人摸索了很久才搞定的,本文尽可能的写的详细,希望能帮到大家,写这篇的时候又重新操作了一遍,如果可以恳请小伙伴们能点个“在看”或分享到朋友圈。谢谢啦!
> 欢迎关注我,wx公主号:AI算法与图像处理

人脸识别之insightface开源代码使用——自定义数据集制作相关推荐

  1. 人脸识别之insightface开源代码使用:训练、验证、测试(1)

    码字不易,转载请注明出处! 代码放于github:https://github.com/vincentwei0919/insightface_for_face_recognition 训练权重: 链接 ...

  2. 人脸识别之insightface开源代码使用:训练、验证、测试(4)

    通过前面的几个小节,我们已经实现了模型的训练以及阈值的选取.此时利用我们已经训练好的模型和手上的阈值,我们已经能够做到1:1这样的验证了.所要做的就是拿两张图片,相同人或者不同人,然后送入网络中,网络 ...

  3. 人脸识别之insightface开源代码使用:训练、验证、测试(2)

    码字不易,转载请注明出处! 有了前面的准备工作之后,我们就开始动手了. Let The Hunt Begin! 数据集规模 数据当然是越多越好,然而实际我们可能没有那么多数据,那么多大的量就可以了呢? ...

  4. 人脸识别之insightface开源代码使用:训练、验证、测试(3)

    码字不易,转载请注明出处! 前面我们制作好了训练所需要的文件:train.rec,property,以及验证时所需要的val.bin,那么接下来就是该探索如何进行数据的训练. 这部分内容相对来说比较简 ...

  5. 人脸识别SeetaFace2原理与代码详解

    人脸识别SeetaFace2原理与代码详解 前言 一.人脸识别步骤 二.SeetaFace2基本介绍 三.seetaFace2人脸注册.识别代码详解 3.1 人脸注册 3.1.1 人脸检测 3.1.2 ...

  6. 离线识别率高达99%的Python人脸识别系统,开源~

    来源:https://zhuanlan.zhihu.com/p/46931078 大家好,我是辰哥 以往的人脸识别主要是包括人脸图像采集.人脸识别预处理.身份确认.身份查找等技术和系统.现在人脸识别已 ...

  7. python人脸识别系统早已开源,离线识别率高达99%以上!

    以往的人脸识别主要是包括人脸图像采集.人脸识别预处理.身份确认.身份查找等技术和系统.现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测.行人跟踪.甚至到了动态物体的跟踪. 由此可以看出,人脸识别系统 ...

  8. 使用python和pyqt5轻松上手人脸识别系统(含代码)

    使用python和pyqt5轻松上手人脸识别系统(含代码) 一. 环境配置 1.1 python环境配置 1.1.1 安装 anaconda 1.1.2 安装pycharm 1.1.3 配置pip源 ...

  9. DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)

    DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现) @author:wepon @blog:http://blog.csdn.net/u012162 ...

最新文章

  1. 我的家庭私有云计划-13
  2. seaborn箱图(box plot)可视化、并且在箱图中使用三角形标注均值的位置(showmeans=True)
  3. QEMU — 编译安装指定的版本
  4. HD 2602 Bone Collector (0-1背包)
  5. 在kali Linux中搭建DVWA
  6. Python数据分析库pandas高级接口dt和str的使用
  7. Push or pull?
  8. 51CTO专访:谈谈SOC安全管理平台
  9. js实现下载 .txt文件
  10. 1个鼠标和1个键盘控制2台电脑(windows和linux系统)
  11. 利用VS2005进行dump文件调试
  12. zzulioj题库题解(持续更新中.......)
  13. coursera和udacity_三大 mooc 网站:coursera 与 udacity 和 edx 比较,哪个更适合中国人你有何经验分享...
  14. java 像素点 生成图片_黑白图片的两种生成方法
  15. Hyper-v集群高可用性配置
  16. 教育培训机构经营技巧
  17. 关于mysql的timestamp时间范围
  18. 天猫精灵 python_GitHub - zhjc1124/tmallgenius: 天猫精灵打卡
  19. anaconda安装软件包
  20. S3C6410 中的 cascaded irqdomain 之 gpio

热门文章

  1. 人工智能相关书籍介绍
  2. Windows 7下vc2010编译使用redis 3.0
  3. EBS提交取消请求、请求集程序fnd_request
  4. 爬虫之旅(二):爬取b站搜索数据
  5. android 泰文ttf字体,如何在Android上正确显示泰语diactirics?
  6. 使用Python对GIF读取、生成、压缩和加水印
  7. decoct() 函数
  8. spark.jars.packages使用镜像源加速
  9. 反编译exe软件_Winnti组织:利用ShadowPad和Winnti恶意软件针对高校发动攻击
  10. 山石岩读丨一文读懂区块链安全:区块链会带来哪些冲击?