分享

Facenet开发实战之人脸库与识别系统搭建2【人脸识别】



问题导读:

1.怎样搭建人脸库?
2.怎样结合SVM训练一个人脸识别系统?
3.怎样验证人脸识别系统?




上一篇:Facenet开发实战之环境搭建


搭建人脸库

选择的方式是从百度下载明星照片


照片下载,downloadImageByBaidu.py


[mw_shl_code=python,true]# 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'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1497491098685_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1497491098685%5E00_1519X735&word='
    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 = 1  # 图片所在页数,下载完后调整这里就行
    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)),'fbb','D:/eclipse-workspace/facenet-master/data/face_store/fbb/')#保存位置也可以修改[/mw_shl_code]


20180721114144645.png


因为是从网上下载的照片有些是不符的,需要手动删除部分


检测对齐人脸


[mw_shl_code=shell,true]python src\align\align_dataset_mtcnn.py data/face_store/old data/face_store/new --image_size 160 --margin 32 --random_order --gpu_memory_fraction 0.25[/mw_shl_code]


20180721114411177.png


20180721114448740.png


用自己的人脸库结合SVM训练一个人脸识别系统

用到的代码:calssifier.py,这个程序的基本原理是:通过用图像算出来的向量数据来训练一个SVM分类器,从而对人的身份进行一个判断,同时在.pkl格式的文件中存储每一个分类。这也是作者对于FaceNet程序应用的一个探索。


这个函数有两个模式,一个模式用来训练,另一个模式用来测试。具体功能如下:


模式= TRAIN:


使用来自数据集的计算出来的向量来训练分类器


将训练好的分类模型保存为python pickle文件


模式= CLASSIFY:


加载分类模型


使用来自数据集测试部分的嵌入来测试分类器


执行本代码需要添加的参数以及各参数的含义:


mode: 设定“TRAIN”和“CLASSIFY”两种模式。


data_dir: 图片数据所在文件夹


model: 训练好的模型


classifier_filename:类似于标签,如果mode参数是TRAIN,那么需要指定一个输出的文件位置(以.pkl结尾,例如/.pkl),如果mode参数是CLASSIFY,那么就需要指定参数的路径(.pkl文件)。


[mw_shl_code=shell,true]python src\classifier.py TRAIN D:\eclipse-workspace\facenet-master\data\face_store\new D:\eclipse-workspace\facenet-master\models\20180408-102900 D:\eclipse-workspace\facenet-master\models\classifier.pkl[/mw_shl_code]


20180721114903790.png


[mw_shl_code=shell,true]python src\classifier.py CLASSIFY D:\eclipse-workspace\facenet-master\data\face_store\new D:\eclipse-workspace\facenet-master\models\20180408-102900 D:\eclipse-workspace\facenet-master\models\classifier.pkl
[/mw_shl_code]


20180721114952941.png


验证

调用facenet-master\contributed\predict.py


网上找张女神的图片


20180721120146650.png


[mw_shl_code=shell,true]python contributed\predict.py D:\eclipse-workspace\facenet-master\data\test\test1.jpg D:\eclipse-workspace\facenet-master\models\20180408-102900 D:\eclipse-workspace\facenet-master\models\classifier.pkl
[/mw_shl_code]


20180721120112241.png


再找一张不在人脸库的照片


20180721121212383.png


20180721121137338.png


后续打算基于摄像头进行人脸检测识别


摄像头识别人脸效果


20180724152244212 (1).png


最后,附上原来的文件中各py文件的作用(持续更新):


一、主要函数


align/ :用于人脸检测与人脸对齐的神经网络


facenet :用于人脸映射的神经网络


util/plot_learning_curves.m:这是用来在训练softmax模型的时候用matlab显示训练过程的程序


二、facenet/contributed/相关函数:


1、基于mtcnn与facenet的人脸聚类


代码:facenet/contributed/cluster.py(facenet/contributed/clustering.py实现了相似的功能,只是没有mtcnn进行检测这一步)


主要功能:


① 使用mtcnn进行人脸检测并对齐与裁剪


② 对裁剪的人脸使用facenet进行embedding


③ 对embedding的特征向量使用欧式距离进行聚类


2、基于mtcnn与facenet的人脸识别(输入单张图片判断这人是谁)


代码:facenet/contributed/predict.py


主要功能:


① 使用mtcnn进行人脸检测并对齐与裁剪


② 对裁剪的人脸使用facenet进行embedding


③ 执行predict.py进行人脸识别(需要训练好的svm模型)


3、以numpy数组的形式输出人脸聚类和图像标签


代码:facenet/contributed/export_embeddings.py


主要功能:


① 需要对数据进行对齐与裁剪做为输入数据


② 输出embeddings.npy;labels.npy;label_strings.npy




上一篇:Facenet开发实战之环境搭建


来源: csdn
作者: gmHappy
原文链接:facenet 人脸识别(二)——创建人脸库搭建人脸识别系统



已有(1)人评论

跳转到指定楼层
斌哥哥 发表于 2018-8-8 09:48:31
请问博主,测试出的数是代表意思?数值越大越好还是越小越好?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条