Dlib人臉識別 版本一(最初cascade)
# -*- coding: UTF-8 -*-
import sys,os,dlib,glob,numpy from skimage import io
if len(sys.argv) != 5: print ("請檢查引數是否正確") exit()
# 1.人臉關鍵點檢測器 predictor_path = sys.argv[1]
# 2.人臉識別模型 face_rec_model_path = sys.argv[2]
# 3.候選人臉資料夾 faces_folder_path = sys.argv[3]
# 4.需識別的人臉 img_path = sys.argv[4]
# 1.載入正臉檢測器 detector = dlib.get_frontal_face_detector()
# 2.載入人臉關鍵點檢測器 sp = dlib.shape_predictor(predictor_path)
# 3. 載入人臉識別模型 facerec = dlib.face_recognition_model_v1(face_rec_model_path)
win = dlib.image_window()
# 候選人臉描述子list descriptors = []
# 對資料夾下的每一個人臉進行: # 1.人臉檢測 # 2.關鍵點檢測 # 3.描述子提取
for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")): print("Processing file: {}".format(f)) img = io.imread(f) win.clear_overlay() win.set_image(img)
# 1.人臉檢測 dets = detector(img, 1) print("Number of faces detected: {}".format(len(dets)))
for k, d in enumerate(dets): # 2.關鍵點檢測 shape = sp(img, d) # 畫出人臉區域和和關鍵點 win.clear_overlay() win.add_overlay(d) win.add_overlay(shape)
# 3.描述子提取,128D向量 face_descriptor = facerec.compute_face_descriptor(img, shape)
# 轉換為numpy array v = numpy.array(face_descriptor) print(v) descriptors.append(v)
# 對需識別人臉進行同樣處理
# 提取描述子,不再註釋 img = io.imread(img_path) dets = detector(img, 1)
win.clear_overlay() win.set_image(img)
dist = [] for k, d in enumerate(dets): shape = sp(img, d) win.clear_overlay() win.add_overlay(d) win.add_overlay(shape) face_descriptor = facerec.compute_face_descriptor(img, shape) # 轉換為numpy array d_test = numpy.array(face_descriptor) print(d_test) # 計算歐式距離 for i in descriptors: dist_ = numpy.linalg.norm(i-d_test) dist.append(dist_)
# 候選人名單 candidate = ['郭德綱','李克強','劉德華','孫悅','于謙','劉鶴','周小川','樑振英','90金正日','金正日']
# 候選人和距離組成一個dict c_d = dict(zip(candidate,dist))
cd_sorted = sorted(c_d.items(), key=lambda d:d[1]) print(cd_sorted) print ("\n The person is: ",cd_sorted[0][0]) print("\n Or he person is: ",cd_sorted[1][0]) dlib.hit_enter_to_continue()