dlib CW KMeans DBSCAN Birch MeanShift人类聚类

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值