前言

前面的博客介绍过使用dlib进行人脸检测、比对、检测特征点等等操作。
python dlib学习(一):人脸检测
python dlib学习(二):人脸特征点标定
python dlib学习(五):比对人脸
这次再将那些操作综合一下,进行人脸聚类。识别图片中的人脸,并分类。这里使用的是聚类,属于无监督学习。这里对每个人脸的区分与比对人脸中原理相同,将人脸映射到128D的空间中,计算彼此之间的距离。距离近的视作一个人,距离远的视作不是一个人,而判定的标准阈值由自己选定,通常是0.6。

目录结构

  • faces文件夹保存测试图片;
  • model文件夹保存模型文件,也可以自己训练,我偷懒使用了官方提供的;
  • output文件夹中存放输出结果;
  • 源码直接放在根目录。

程序

# coding: utf-8
"""
@author: xhb
"""import sys
import os
import dlib
import glob
import cv2# 指定路径
current_path = os.getcwd()
model_path = current_path + '/model/'
shape_predictor_model = model_path + '/shape_predictor_5_face_landmarks.dat'
face_rec_model = model_path + '/dlib_face_recognition_resnet_model_v1.dat'
face_folder = current_path + '/faces/'
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")):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)# 投影到128Dface_descriptor = face_recognizer.compute_face_descriptor(img2, shape)# 保存相关信息descriptors.append(face_descriptor)images.append((img2, shape))# 聚类
labels = dlib.chinese_whispers_clustering(descriptors, 0.5)
print("labels: {}".format(labels))
num_classes = len(set(labels))
print("Number of clusters: {}".format(num_classes))# 为了方便操作,用字典类型保存
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_pathdlib.save_face_chip(image, shape, file_path, size=150, padding=0.25)

程序很简单,不做赘述。

结果




后记

dlib作为开源库,为我们提供了很方便的api工具,可以实现许多很酷的功能。当然那些功能也可以自己实现。不管怎样,都很有趣吧!

python dlib学习(九):人脸聚类相关推荐

  1. python dlib学习(八):训练人脸特征点检测器

    前言 前面的博客(python dlib学习(二):人脸特征点标定)介绍了使用dlib识别68个人脸特征点,但是当时使用的是dlib官方给出的训练好的模型,这次要自己训练一个特征点检测器出来.当然,想 ...

  2. python dlib学习(七):人脸特征点对齐

    前言 前面的博客介绍过人脸特征点标定:python dlib学习(二):人脸特征点标定.这次试着使用这些人脸特征点来对人脸进行对齐. 完整工程链接附在文章最后. 程序 上代码,程序中使用了python ...

  3. python dlib学习(五):比对人脸

    前言 在前面的博客中介绍了,如何使用dlib标定人脸(python dlib学习(一):人脸检测),提取68个特征点(python dlib学习(二):人脸特征点标定).这次要在这两个工作的基础之上, ...

  4. python dlib学习(三):调用cnn人脸检测

    前言 调用训练好的卷积神经网络(CNN)模型进行人脸检测. 模型下载链接:http://dlib.net/files/mmod_human_face_detector.dat.bz2 程序 注:使用了 ...

  5. python dlib学习(二):人脸特征点标定

    前言 上次介绍了人脸检测的程序(python dlib学习(一):人脸检测),这次介绍人脸特征点标定.dlib提供了训练好的模型,可以识别人脸的68个特征点. 下载链接:http://pan.baid ...

  6. python dlib学习(十一):眨眼检测

    前言 我们要使用opencv和dlib实现在视频流中实时检测和计数眨眼次数. 参考论文:Real-Time Eye Blink Detection using Facial Landmarks 作者在 ...

  7. python dlib学习(十):换脸

    前言 这次再用dlib来做一个很酷的应用:换脸.在百度可以搜出一大堆转载的,里面虽然讲的不是很详细(数学部分),个人感觉大多数人对于奇异值分解.仿射变换矩阵 怎么实现根本不敢兴趣,只想上代码实现功能, ...

  8. python dlib学习(六):训练模型

    前言 前面的博客都是使用dlib官方提供的训练好的模型,进行目标识别. - python dlib学习(一):人脸检测 - python dlib学习(二):人脸特征点标定 - python dlib ...

  9. python dlib学习(一):人脸检测

    前言 dlib毕竟是一个很有名的库了,有c++.Python的接口.使用dlib可以大大简化开发,比如人脸识别,特征点检测之类的工作都可以很轻松实现.同时也有很多基于dlib开发的应用和开源库,比如f ...

最新文章

  1. 【Android】adb命令总结
  2. python openstack究竟能干嘛_openstack是什么,能干什么
  3. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)...
  4. js中字符串转为对象或者json
  5. [LeetCode] Reverse Linked List II
  6. 云炬Android开发笔记 9主界面-通用底部导航设计与一键式封装
  7. LOJ116 有源汇有上下界最大流(上下界网络流)
  8. 华为机试——进制转换
  9. Thinkphp5之ajax分页实现_paginate()参数详细
  10. 深度神经进化大有可为?Uber详解如何用它优化强化学习 | 5篇论文
  11. verilog之按键消抖的理解
  12. Python爬虫之模拟CSDN网站登录
  13. PHP跨域获取session
  14. 基于TI Sitara系列AM3352/AM3354/AM3359的Linux常用开发案例分享
  15. Android开发之移动互联网周刊第二期
  16. permutohedral lattice理解
  17. SuperView和View的区别
  18. 核心大小1M的VIN码OCR识别核心
  19. 在Centos/Linux系统下使用Phalcon开发PHP项目
  20. 解决this._data.$$state...“Error: [vuex] do not mutate vuex store state outside mutation handlers.“ 报错

热门文章

  1. 本地仓库管理权限问题
  2. oracle12 官网文档,Oracle 21c 官方文档 发布了
  3. 【c++】8.map和vector容器查找、删除指定元素、emplace、insert
  4. Python-OpenCV 处理图像(三):图像像素点操作
  5. 攻破JAVA NIO技术壁垒
  6. 如何理解RESTful的幂等性
  7. Java集合容器全面分析
  8. 《疯狂动物城》电脑壁纸
  9. 玩转CSDN博客之自定义博客栏目,根据需要定制栏目
  10. Coursera课程Python for everyone:chapter 2