facenet 人臉識別源碼的使用方法(一)

1. 開發環境

OS:        ubuntu16.04
tensorflow版本:1.12.0
python版本:    3.6.7

 

2. 下載源碼到本地

facenet官方github: https://github.com/davidsandberg/facenet.git 

git clone https://github.com/davidsandberg/facenet.git

在requirements.txt文件看到要安裝相關的依賴庫,自己用pip指令安裝一下就好了

 tensorflow==1.7
scipy
scikit-learn
opencv-python
h5py
matplotlib
Pillow
requests
psutil

 

3. 下載LFW數據集

LFW 是評估人臉識別算法效果的公開測試數據集,共有13233張圖片,屬於 5749 個不同人,其中圖片的大小爲250×250。

下載地址:http://vis-www.cs.umass.edu/lfw/

下載步驟:->Menu->Download->All images as gzipped tar file  

facenet/data/下新建lfw_data文件夾,把下載的壓縮包放在 facenet/data/lfw_data 目錄下,然後進行解壓。

  • 對LFW圖片預處理

lfw的圖片原圖尺寸爲 250*250,我們要修改圖片尺寸,使其大小符合預訓練模型的輸入尺寸,即160*160。在src/align/align_dataset_mtcnn.py文件裏,採用MTCNN人臉檢測算法對人臉進行檢測,進一步人臉對齊,然後再把人臉圖片尺寸修改爲160×160的尺寸,保存到facenet/data/lfw_data/lfw_160目錄下。想了解更多關於MTCNN人臉檢測算法,已經有不少寫得不錯的博客,比如:https://blog.csdn.net/qq_14845119/article/details/52680940 ,解釋的很詳細。

facenet/src/align/align_dataset_mtcnn.py文件拷貝到facenet/src路徑下,然後執行圖片轉換:

cp -i src/align/align_dataset_mtcnn.py src/
python src/align_dataset_mtcnn.py data/lfw_data/lfw data/lfw_data/lfw_160 --image_size 160 --margin 32 --random_order --gpu_memory_fraction 0.25

打印如下表示成功。

 

4. 下載Google預訓練的網絡模型

下載地址 https://github.com/davidsandberg/facenet ,這兩個模型都是基於Inception ResNet V1 網絡架構下進行識別的。同時看到有兩個基於不同的dataset預訓練好的模型,這裏我下載的是VGGFace2數據集的模型。

在facenet目錄下新建models文件夾,並把下載的模型放到models目錄下,然後解壓。

 

5. 預訓練模型準確率測試

 使用預訓練模型進行測試:

python src/validate_on_lfw.py data/lfw_data/lfw_160/ models/20180402-114759/

由於我使用的tf版本的原因,我使用的是 tf1.12版本的, 作者的預訓練模型是在tf 1.7版本訓練的,所以在導入graph時會出錯。出現如下錯誤:

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/training/input.py:734: add_queue_runner (from tensorflow.python.training.queue_runner_impl) is deprecated and will be removed in a future version.
Instructions for updating:
To construct input pipelines, use the `tf.data` module.
Model directory: models/20180402-114759/
Metagraph file: model-20180402-114759.meta
Checkpoint file: model-20180402-114759.ckpt-275
2019-02-28 19:54:02.009422: W tensorflow/core/graph/graph_constructor.cc:1265] Importing a graph with a lower producer version 24 into an existing graph with producer version 27. Shape inference will have run different parts of the graph with different producer versions.
Traceback (most recent call last):
  File "src/validate_on_lfw.py", line 164, in <module>
    main(parse_arguments(sys.argv[1:]))
  File "src/validate_on_lfw.py", line 73, in main
    facenet.load_model(args.model, input_map=input_map)
  File "/home/liguiyuan/study/deep_learning/project/facenet/src/facenet.py", line 381, in load_model
    saver = tf.train.import_meta_graph(os.path.join(model_exp, meta_file), input_map=input_map)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/training/saver.py", line 1674, in import_meta_graph
    meta_graph_or_file, clear_devices, import_scope, **kwargs)[0]
......
KeyError: "The name 'decode_image/cond_jpeg/is_png' refers to an Operation not in the graph."

解決方法:

1.把Tensorflow換爲1.7版本的;

2.在facenet.py代碼中找到create_input_pipeline 再添加一行語句 with tf.name_scope("tempscope"): 就可以完美解決(貌似Tensorflow 1.10及以上版本才修復這個bug)。

改好之後, 再重新執行python代碼。準確率達到了 0.98500+-0.00658,打印如下:

 

6. 比較兩張圖片的歐氏距離

這裏使用歐氏距離用來衡量兩張人臉的相似程度,用來判別這兩張圖片是否爲同一個人。兩張人臉圖片越相似,空間距離越小;差別越大,則空間距離越大。 

執行以下命令:

python src/compare.py models/20180402-114759/20180402-114759.pb data/images/Anthony_Hopkins_0001.jpg data/images/Anthony_Hopkins_0002.jpg --gpu_memory_fraction 0.25

 

 

下篇文章:facenet 人臉識別庫的搭建和使用方法(二) 


參考:

http://www.cnblogs.com/gmhappy/p/9472388.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章