Введение
Dlib написан на C++ и предоставляет ряд функций, связанных с машинным обучением, численными вычислениями, алгоритмами графовых моделей, обработкой изображений и другими областями.
- Официальный сайт:dlib.net/
- Проект на гитхабе:GitHub.com/Дэвис Кинг/…
Установить
Его необходимо установить перед установкой Dlib.cmake
, здесь установлен исходный код, перейдите на официальный сайт, чтобы загрузить соответствующий исходный код в соответствии с системой,cmake.org/download/
- Линукс, Мак ОС:checkmark.org/files/v3.10…
- Окна:checkmark.org/files/v3.10…
После распаковки войдите в каталог исходного кода в терминале и последовательно выполните следующие команды.
./bootstrap
make
sudo make install
sudo
Выполнение команд с привилегиями root для Linux и Mac OS
Если это Windows, откройте cmd от имени администратора, и последняя строка команды изменится на
make install
Затем выполните следующую команду в терминале, чтобы проверить, успешно ли установлен cmake.
cmake --version
Если появится соответствующая информация о версии, установка cmake прошла успешно.
После этого вы можете установить Dlib с помощью pip
pip install dlib
После установки введите Python.Если его можно нормально импортировать, значит, установка 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. Когда евклидово расстояние между двумя векторами меньше 0,6, можно считать, что оно принадлежит одному и тому же человеку.
Вышеупомянутые критерии могут обеспечить точность распознавания 99,38% в наборе данных LFW (Labeled Faces in the Wild, упомянутый в уроке 08).
Здесь нужны две модели,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 всегда может достаточно точно отслеживать объекты, несмотря на изменение положения объекта.
Ссылаться на
- Официальный сайт Dlib:dlib.net/
- Длиб Гитхаб:GitHub.com/Дэвис Кинг/…