facenet 人臉識別(二)——創建人臉庫搭建人臉識別系統


搭建人臉庫

選擇的方式是從百度下載明星照片

照片下載,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'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/')#保存位置也可以修改

 

因為是從網上下載的照片有些是不符的,需要手動刪除部分

檢測對齊人臉

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

用自己的人臉庫結合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文件)。

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

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

驗證

調用facenet-master\contributed\predict.py

網上找張女神的圖片

 

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

再找一張不在人臉庫的照片

 

python contributed\predict.py D:\eclipse-workspace\facenet-master\data\test\test2.png D:\eclipse-workspace\facenet-master\models\20180408-102900 D:\eclipse-workspace\facenet-master\models\classifier.pkl

后續打算基於攝像頭進行人臉檢測識別


攝像頭識別人臉效果

修改contributed目錄下的face.py

執行

python contributed\real_time_face_recognition.py

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

一、主要函數

facenet/src/align/ :用於人臉檢測與人臉對齊的神經網絡

facenet/src/facenet.py :用於人臉映射的神經網絡

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM