内容简介:Dlib由C++编写,提供了和机器学习、数值计算、图模型算法、图像处理等领域相关的一系列功能安装Dlib之前需要先安装解压之后,在终端里进入源码目录,依次运行以下命令
Dlib由C++编写,提供了和机器学习、数值计算、图模型算法、图像处理等领域相关的一系列功能
- 官方网站:dlib.net/
- Github项目: github.com/davisking/d…
安装
安装Dlib之前需要先安装 cmake ,这里以源码方式安装,去官网根据系统下载相应的源码,cmake.org/download/
- Linux、Mac OS: cmake.org/files/v3.10…
- Windows: cmake.org/files/v3.10…
解压之后,在终端里进入源码目录,依次运行以下命令
./bootstrap make sudo make install 复制代码
sudo 是以root权限运行命令,适用于 Linux 和Mac OS
如果是Windows,则以管理员身份打开cmd,并且最后一行命令改为
make install 复制代码
接下来,在终端中运行以下命令,检查cmake是否成功安装
cmake --version 复制代码
如果出现了相应的版本信息,则说明cmake安装成功
之后便可以使用pip安装Dlib
pip install dlib 复制代码
安装之后进入Python,如果能正常import,则说明Dlib安装成功
import dlib 复制代码
如果是Mac OS,还需要安装 XQuartz 用于显示图像
安装 XQuartz 之后如果碰到类似以下问题
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 复制代码
那么在命令行运行以下命令即可解决
xcode-select --install 复制代码
完成以上安装工作之后,我们来体验下Dlib提供的一些和图片处理相关的例子
人脸检测
加载库
# -*- coding: utf-8 -*- import dlib from imageio import imread import glob 复制代码
准备好人脸检测器和显示窗口,获取图片路径
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()
paths = glob.glob('faces/*.jpg')
复制代码
对每一张图片进行检测,并显示检测结果对应的矩形框
for path in paths:
img = imread(path)
# 1 表示将图片放大一倍,便于检测到更多人脸
dets = detector(img, 1)
print('检测到了 %d 个人脸' % len(dets))
for i, d in enumerate(dets):
print('- %d:Left %d Top %d Right %d Bottom %d' % (i, d.left(), d.top(), d.right(), d.bottom()))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()
复制代码
检测时也可以指定一个阈值
path = 'faces/2007_007763.jpg'
img = imread(path)
# -1 表示人脸检测的判定阈值
# scores 为每个检测结果的得分,idx 为人脸检测器的类型
dets, scores, idx = detector.run(img, 1, -1)
for i, d in enumerate(dets):
print('%d:score %f, face_type %f' % (i, scores[i], idx[i]))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()
复制代码
人脸关键点检测
使用训练好的模型 shape_predictor_68_face_landmarks.dat ,在检测出人脸的同时,检测出人脸上的68个关键点
加载库
# -*- coding: utf-8 -*- import dlib from imageio import imread import glob 复制代码
准备好人脸检测器、关键点检测模型、显示窗口、图片路径
detector = dlib.get_frontal_face_detector()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)
win = dlib.image_window()
paths = glob.glob('faces/*.jpg')
复制代码
检测每一张图片
for path in paths:
img = imread(path)
win.clear_overlay()
win.set_image(img)
# 1 表示将图片放大一倍,便于检测到更多人脸
dets = detector(img, 1)
print('检测到了 %d 个人脸' % len(dets))
for i, d in enumerate(dets):
print('- %d: Left %d Top %d Right %d Bottom %d' % (i, d.left(), d.top(), d.right(), d.bottom()))
shape = predictor(img, d)
# 第 0 个点和第 1 个点的坐标
print('Part 0: {}, Part 1: {}'.format(shape.part(0), shape.part(1)))
win.add_overlay(shape)
win.add_overlay(dets)
dlib.hit_enter_to_continue()
复制代码
人脸识别
不光是检测人脸,还要知道每张脸是谁
Dlib将每张人脸映射为一个128维的向量,当两个向量之间的Euclidean距离小于0.6时,可以认为属于同一个人
以上判定标准在LFW(Labeled Faces in the Wild,08课提到过)数据集上可以获得99.38%的识别准确率
这里需要用到两个模型, shape_predictor_68_face_landmarks.dat 和 dlib_face_recognition_resnet_model_v1.dat ,根据人脸检测结果得到关键点检测结果,根据关键点检测结果进一步得到128维向量表示
加载库
# -*- coding: utf-8 -*- import dlib from imageio import imread import glob import numpy as np 复制代码
准备好模型和图片
detector = dlib.get_frontal_face_detector()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)
face_rec_model_path = 'dlib_face_recognition_resnet_model_v1.dat'
facerec = dlib.face_recognition_model_v1(face_rec_model_path)
labeled = glob.glob('labeled/*.jpg')
labeled_data = {}
unlabeled = glob.glob('unlabeled/*.jpg')
复制代码
距离计算函数
# 定义一个计算Euclidean距离的函数 def distance(a, b): # d = 0 # for i in range(len(a)): # d += (a[i] - b[i]) * (a[i] - b[i]) # return np.sqrt(d) return np.linalg.norm(np.array(a) - np.array(b), ord=2) 复制代码
获取标注图片对应的向量表示
# 读取标注图片并保存对应的128向量
for path in labeled:
img = imread(path)
name = path.split('/')[1].rstrip('.jpg')
dets = detector(img, 1)
# 这里假设每张图只有一个人脸
shape = predictor(img, dets[0])
face_vector = facerec.compute_face_descriptor(img, shape)
labeled_data[name] = face_vector
复制代码
将未标注图片的向量表示,和标注图片逐一匹配
# 读取未标注图片,并和标注图片进行对比
for path in unlabeled:
img = imread(path)
name = path.split('/')[1].rstrip('.jpg')
dets = detector(img, 1)
# 这里假设每张图只有一个人脸
shape = predictor(img, dets[0])
face_vector = facerec.compute_face_descriptor(img, shape)
matches = []
for key, value in labeled_data.items():
d = distance(face_vector, value)
if d < 0.6:
matches.append(key + ' %.2f' % d)
print('{}:{}'.format(name, ';'.join(matches)))
复制代码
结果显示,全部标注图片都通过了匹配,说明白百合和王珞丹是真的像……
人脸聚类
对于大量图片中的大量人脸,基于以上人脸识别标准进行聚类,把距离较近的人脸聚为一类,即有可能为同一个人
加载库
# -*- coding: utf-8 -*- import dlib from imageio import imread import glob import os from collections import Counter 复制代码
准备好模型和图片
detector = dlib.get_frontal_face_detector()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)
face_rec_model_path = 'dlib_face_recognition_resnet_model_v1.dat'
facerec = dlib.face_recognition_model_v1(face_rec_model_path)
paths = glob.glob('faces/*.jpg')
复制代码
获取所有图片的关键点检测结果和向量表示
vectors = [] images = [] for path in paths: img = imread(path) dets = detector(img, 1) for i, d in enumerate(dets): shape = predictor(img, d) face_vector = facerec.compute_face_descriptor(img, shape) vectors.append(face_vector) images.append((img, shape)) 复制代码
以0.5为阈值进行聚类,并找出人脸数量最多的类
labels = dlib.chinese_whispers_clustering(vectors, 0.5)
num_classes = len(set(labels))
print('共聚为 %d 类' % num_classes)
biggest_class = Counter(labels).most_common(1)
print(biggest_class)
复制代码
将最大类中包含的人脸保存下来,类似的也可以处理其他的类
output_dir = 'most_common' if not os.path.exists(output_dir): os.mkdir(output_dir) face_id = 1 for i in range(len(images)): if labels[i] == biggest_class[0][0]: img, shape = images[i] dlib.save_face_chip(img, shape, output_dir + '/face_%d' % face_id, size=150, padding=0.25) face_id += 1 复制代码
物体追踪
物体追踪是指,对于视频文件,在第一帧指定一个矩形区域,对于后续帧自动追踪和更新区域的位置
加载库
# -*- coding: utf-8 -*- import dlib from imageio import imread import glob 复制代码
准备好追踪器和图片
tracker = dlib.correlation_tracker()
win = dlib.image_window()
paths = sorted(glob.glob('video_frames/*.jpg'))
复制代码
追踪图片中的物体
for i, path in enumerate(paths): img = imread(path) # 第一帧,指定一个区域 if i == 0: tracker.start_track(img, dlib.rectangle(74, 67, 112, 153)) # 后续帧,自动追踪 else: tracker.update(img) win.clear_overlay() win.set_image(img) win.add_overlay(tracker.get_position()) dlib.hit_enter_to_continue() 复制代码
尽管物体的位置在不断变化,Dlib始终能够比较准确地进行追踪
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 直观理解深度学习基本概念(小白入门深度学习)
- 深度学习入门和学习书籍
- redux入门到深度理解
- 你有多少时间入门深度学习?
- 【PPT下载】深度学习入门指南!六步构建深度神经网络
- 深度学习真的可以零基础入门吗?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Haskell School of Music
Paul Hudak、Donya Quick / Cambridge University Press / 2018-10-4 / GBP 42.99
This book teaches functional programming through creative applications in music and sound synthesis. Readers will learn the Haskell programming language and explore numerous ways to create music and d......一起来看看 《The Haskell School of Music》 这本书的介绍吧!