1. 程式人生 > >Dlib人臉識別 版本二(socket模式實現快速人臉搜尋)

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()