Подробное развлечение | 14 Dlib Quick Start

искусственный интеллект GitHub Mac .NET
Подробное развлечение | 14 Dlib Quick Start

Введение

Dlib написан на C++ и предоставляет ряд функций, связанных с машинным обучением, численными вычислениями, алгоритмами графовых моделей, обработкой изображений и другими областями.

Установить

Его необходимо установить перед установкой Dlib.cmake, здесь установлен исходный код, перейдите на официальный сайт, чтобы загрузить соответствующий исходный код в соответствии с системой,cmake.org/download/

После распаковки войдите в каталог исходного кода в терминале и последовательно выполните следующие команды.

./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 всегда может достаточно точно отслеживать объекты, несмотря на изменение положения объекта.

物体追踪结果

Ссылаться на

видеоурок

Глубоко и интересно (1)