# coding: utf-8 """ @author: xhb """ import sys import os import dlib import glob import cv2 import time from sklearn import cluster # 指定路径 current_path = os.getcwd() print(current_path) model_path = current_path + '/recog_dlib/weights' shape_predictor_model = model_path + '/shape_predictor_68_face_landmarks.dat' face_rec_model = model_path + '/dlib_face_recognition_resnet_model_v1.dat' face_folder = current_path + '/faces/' print(face_folder) output_folder = current_path + '/output/' # 导入模型 detector = dlib.get_frontal_face_detector() shape_detector = dlib.shape_predictor(shape_predictor_model) face_recognizer = dlib.face_recognition_model_v1(face_rec_model) # 为后面操作方便,建了几个列表 descriptors = [] images = [] # 遍历faces文件夹中所有的图片 # for f in glob.glob(os.path.join(face_folder, "*.jpg")): for f in glob.glob(os.path.join(face_folder, "*.*")): # glob.glob返回所有匹配的文件路径列表 print('Processing file:{}'.format(f)) # 读取图片 img = cv2.imread(f) # 转换到rgb颜色空间 img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 检测人脸 dets = detector(img2, 1) print("Number of faces detected: {}".format(len(dets))) # 遍历所有的人脸 for index, face in enumerate(dets): # 检测人脸特征点 shape = shape_detector(img2, face) # 投影到128D face_descriptor = face_recognizer.compute_face_descriptor(img2, shape) # 保存相关信息 descriptors.append(face_descriptor) images.append((img2, shape)) # dlib CW聚类 clu_time=time.time() labels = dlib.chinese_whispers_clustering(descriptors, 0.4) print("clusterign time:",time.time()-clu_time) print("labels: {}".format(labels)) num_classes = len(set(labels)) print("Number of clusters: {}".format(num_classes)) # # KMeans聚类 # labels = cluster.KMeans(n_clusters=15).fit_predict(descriptors) #n_clusters:簇的个数,即你想聚成几类 # num_classes = len(set(labels)) # # DBSCAN聚类 # db = cluster.DBSCAN(eps=0.4, min_samples=1).fit(descriptors) # labels = db.labels_ # num_classes = len(set(labels)) # # Birch聚类 # labels = cluster.Birch(n_clusters = None).fit_predict(descriptors) # num_classes = len(set(labels)) # # MeanShift聚类 # bandwidth = cluster.estimate_bandwidth(descriptors, quantile=0.2, n_samples=5) #stimate_bandwidth()用于生成mean-shift窗口的尺寸,其参数的意义为:从X中随机选取500个样本,计算每一对样本的距离,然后选取这些距离的0.2分位数作为返回值,显然当n_samples很大时,这个函数的计算量是很大的。 # ms = cluster.MeanShift(bandwidth=4, bin_seeding=True) # ms.fit(descriptors) # labels = ms.labels_ # num_classes = len(set(labels)) # 为了方便操作,用字典类型保存 face_dict = {} for i in range(num_classes): face_dict[i] = [] # print face_dict for i in range(len(labels)): face_dict[labels[i]].append(images[i]) # print face_dict.keys() # 遍历字典,保存结果 for key in face_dict.keys(): file_dir = os.path.join(output_folder, str(key)) if not os.path.isdir(file_dir): os.makedirs(file_dir) for index, (image, shape) in enumerate(face_dict[key]): file_path = os.path.join(file_dir, 'face_' + str(index)) print(file_path) dlib.save_face_chip(image, shape, file_path, size=150, padding=0.25)
dlib CW KMeans DBSCAN Birch MeanShift人类聚类
最新推荐文章于 2022-01-17 22:25:30 发布