facenet 人脸识别库的搭建和使用方法(二)

上一篇文章介绍了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=&copyright=&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 人脸识别源码的使用方法(一)

下篇文章:facenet 人脸识别原理理解(三) 

注:转载请注明原出处:https://blog.csdn.net/u012505617/article/details/88086447


参考资料:

https://www.cnblogs.com/gmhappy/p/9472387.html

 

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liguiyuan112

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值