上一篇文章介绍了facenet人脸识别的源码使用,这篇文章就来搭建自己的人脸识别库。
1. 制作自己的人脸识别库
1.1 准备数据集
通过百度图片爬取一些明星图片为例,这里准备了一个DownloadImageByBaidu.py文件用来下载图片。
# coding=utf-8
"""
爬取百度图片的高清原图
"""
import re
import sys
import urllib
import os
import requests
def get_onepage_urls(onepageurl):
if not onepageurl:
print('执行结束')
return [], ''
try:
html = requests.get(onepageurl).text
except Exception as e:
print(e)
pic_urls = []
fanye_url = ''
return pic_urls, fanye_url
pic_urls = re.findall('"objURL":"(.*?)",', html, re.S)
fanye_urls = re.findall(re.compile(r'<a href="(.*)" class="n">下一页</a>'), html, flags=0)
fanye_url = 'http://image.baidu.com' + fanye_urls[0] if fanye_urls else ''
return pic_urls, fanye_url
def down_pic(pic_urls,pic_name,localPath):
if not os.path.exists(localPath): # 新建文件夹
os.mkdir(localPath)
"""给出图片链接列表, 下载图片"""
for i, pic_url in enumerate(pic_urls):
try:
pic = requests.get(pic_url, timeout=15)
string = pic_name + "_" + str(i + 1) + '.jpg'
with open(localPath + '%s' % string, 'wb')as f:
f.write(pic.content)
print('成功下载第%s张图片: %s' % (str(i + 1), str(pic_url)))
except Exception as e:
print('下载第%s张图片时失败: %s' % (str(i + 1), str(pic_url)))
print(e)
continue
if __name__ == '__main__':
keyword = '胡歌1920*1080' # 关键词, 改为你想输入的词即可
url_init_first = r'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1551588579127_R&pv=&ic=&nc=1&z=&hd=&latest=©right=&se=1&showtab=0&fb=0&width=1920&height=1080&face=0&istype=2&ie=utf-8&word=%E8%83%A1%E6%AD%8C'
url_init = url_init_first + urllib.parse.quote(keyword, safe='/')
all_pic_urls = []
onepage_urls, fanye_url = get_onepage_urls(url_init)
all_pic_urls.extend(onepage_urls)
fanye_count = 0 # 图片所在页数,下载完后调整这里就行
while 1:
onepage_urls, fanye_url = get_onepage_urls(fanye_url)
fanye_count += 1
print('第%s页' % fanye_count)
if fanye_url == '' and onepage_urls == []:
break
all_pic_urls.extend(onepage_urls)
down_pic(list(set(all_pic_urls)),'huge','/home/liguiyuan/study/deep_learning/project/facenet/data/my_data/star_images/huge')#保存位置也可以修改
新建自己的数据库文件夹,然后执行DownloadImageByBaidu.py 下载网络图片到 my_data/star_images 目录下
mkdir -p my_data/star_images
python DownloadImageByBaidu.py
再通过align_dataset_mtcnn.py进行人脸检测,并把人脸图片尺寸设定为 160*160:
python src/align_dataset_mtcnn.py data/my_data/star_images/ data/my_data/star_images_160 --image_size 160 --margin 32 --random_order --gpu_memory_fraction 0.25
此时我们在star_images_160文件夹里面看到制作好的数据集,有一点值得注意的是,里面的人脸图片数据集并不是可靠的,我们从网上下载的图片可能有些图片质量较差,或者有多张人脸的,然后导致人脸检测失败,所以我们还需要检测star_images_160里面的人脸图片,把不合格的图片给删掉。到这里图片数据集准备完毕。下面来 做一个人脸识别库。
1.2 制作人脸识别库
训练一个人脸识别库,在facenet/models/ 目录下my_classifier.pkl 文件。
python src/classifier.py TRAIN data/my_data/star_images_160/ models/20180402-114759/ models/my_classifier.pkl
我们使用 .pkl 文件来验证图片,看看效果:
python src/classifier.py CLASSIFY data/my_data/star_images_160/ models/20180402-114759/ models/my_classifier.pkl
可以看到准确率为 97.2%,有两张图片识别错了。
2. 验证图片
网上下载一张图片,然后用 predict.py 代码来测试:
cp -i contributed/predict.py src/
python src/predict.py data/my_data/unknown_name.jpeg models/20180402-114759/ models/my_classifier.pkl --gpu_memory_fraction 0.25
结果显示能够正确识别。
3. 使用摄像头实时识别
拷贝contributed目录下的 face.py和real_time_face_recognition.py文件放到src目录下
把 face.py代码里的
facenet_model_checkpoint = os.path.dirname(__file__) + "/../model_checkpoints/20170512-110547"
classifier_model = os.path.dirname(__file__) + "/../model_checkpoints/my_classifier_1.pkl"
改为:facenet_model_checkpoint = os.path.dirname(__file__) + "/../models/20180402-114759"
classifier_model = os.path.dirname(__file__) + "/../models/my_classifier.pkl"
运行实时人脸识别代码:
python src/real_time_face_recognition.py
思考:每次加入新的人脸去识别时,是怎么把新的人脸图片加入到人脸识别数据库(.pkl)的,难道要加入新的图片重新生成一个.pkl文件吗。答案当然不是,我们在实际的产品中看到,只需要加入几张新的图片就可以了。接下来会继续探索~
下篇文章:facenet 人脸识别原理理解(三)
注:转载请注明原出处:https://blog.csdn.net/u012505617/article/details/88086447
参考资料:
https://www.cnblogs.com/gmhappy/p/9472387.html