Dlib人臉識別 版本二(socket模式實現快速人臉搜尋)
server端
import socket import sys,os,dlib,glob,numpy from skimage import io import pickle as cpk
descriptors = [] current_path = os.getcwd() # 獲取當前路徑
# 1.人臉關鍵點檢測器 #predictor_path = sys.argv[1] predictor_path = current_path + "\\1.dat"
# 2.人臉識別模型 #face_rec_model_path = sys.argv[2] face_rec_model_path = current_path + "\\2.dat" # 3.候選人臉資料夾 faces_folder_path = current_path + "\\candidates\\"
# 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 sorted(glob.glob(os.path.join(faces_folder_path, "*.jpg"))): print("Processing file: {}".format(f)) print(os.path.basename(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) v = numpy.array(face_descriptor) descriptors.append(v)
# 建立 socket 物件 serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 獲取本地主機名 host = socket.gethostname()
port = 9999
# 繫結埠號 serversocket.bind((host, port))
# 設定最大連線數,超過後排隊 serversocket.listen(5)
print("====================init finished=================================")
while True: # 建立客戶端連線 clientsocket,addr = serversocket.accept()
# print("連線地址: %s" % str(addr)) d_test1=clientsocket.recv(4096) print("server received:") print(d_test1) d_test=cpk.loads(d_test1) print(d_test) dist = []
for i in descriptors: dist_ = numpy.linalg.norm(i-d_test) dist.append(dist_)
# 候選人名單 candidate = ['張****','張***','f***','d**','***g','張***,'曾***'] # 候選人和距離組成一個dict c_d = dict(zip(candidate,dist))
cd_sorted = sorted(c_d.items(), key=lambda d:d[1]) print ("\n The person is: ",cd_sorted[0][0]) clientsocket.send(cpk.dumps(cd_sorted[0][0])) clientsocket.close() client端
import socket import pickle as cpk import sys,os,dlib,glob,numpy from skimage import io #import datetime
current_path = os.getcwd() # 獲取當前路徑 # 1.人臉關鍵點檢測器 #predictor_path = sys.argv[1] predictor_path = current_path + "\\1.dat" # 2.人臉識別模型 #face_rec_model_path = sys.argv[2] face_rec_model_path = current_path + "\\2.dat" # 4.需識別的人臉 #img_path = sys.argv[3] img_path = current_path + "\\4.jpg"
# 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)
# 候選人臉描述子list #descriptors = []
# 對需識別人臉進行同樣處理
# 提取描述子,不再註釋 img = io.imread(img_path) dets = detector(img, 1)
#win = dlib.image_window() #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) # 建立 socket 物件 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 獲取本地主機名 host = socket.gethostname()
# 設定埠號 port = 9999
# 連線服務,指定主機和埠 s.connect((host, port))
s.send(cpk.dumps(d_test))
str=s.recv(4096) print(cpk.loads(str))
#s.close()