Амит Пармар, специалист по данным в Rapidops Inc., Ахмедабад

Эта статья является расширением статьи Сиддхарт Манджи (https://medium.com/mlearning-ai/glasses-detection-opencv-dlib-bf4cd50856da) в Сиддхарт Манджи в статье он дал возможность обнаруживать очки на изображении любого человека. В статье он использует детектор = dlib.get_frontal_face_detector() для обнаружения лица, вместо этого детектора dlib.cnn_face_detection_model_v1('mmod_human_face_detector .dat') является предпочтительным детектором, когда у вас есть изображения низкого качества или черно-белые изображения. Найден с помощью множества экспериментов.

я. Подход:

Обнаружение очков на лице не является сложной задачей, потому что после обнаружения ориентиров лица на очках трудно отметить ориентиры. Но способ обнаружения «соединителя»,который находитсямежду очками между двумя глазами, иногда этот «соединитель»трудно заметить в наши дни. спецификации нового века, особенно когда есть изображение с низкими размерами или когда у нас есть черно-белые изображения, где трудно увидеть границу очков. В этом подходе мы сначала обнаруживаем ориентиры лица, используя "shape_predictor_68_face_landmarks.dat", а затем обнаруживаем "соединитель", который присутствует между двумя очками, с помощью метода обнаружения краев. Если обнаружен край, это означает, что «соединитель» есть, и, следовательно, очки находятся на лице человека.

ii. Давайте программировать на Python

Импортируйте необходимые библиотеки:

import numpy as np
import dlib
import cv2
import matplotlib.pyplot as plt
from PIL import Image
import statistics

Загрузите детектор лиц и детектор ориентиров, сначала загрузите эти детекторы (обычно они в файле .dat)

detector =  dlib.cnn_face_detection_model_v1('mmod_human_face_detector.dat')
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

Загрузите изображение через Dlib и примените к нему детекторы.

image_path=__________  #Provide the image path
img = dlib.load_rgb_image(image_path)
plt.imshow(img)
    
rect = detector(img)[0].rect  #in mmod_cnn detector we have to give face index with .rect which is gives rectangle coordinates
sp = predictor(img, rect)
landmarks = np.array([[i.x, i.y] for i in sp.parts()])

Пример изображения и его ориентиры:

Нас интересуют ориентиры нет. 28,30,31,32,33, потому что там мы получим строку connector.

connector_x = []
connector_y = []
for i in [28,29,30,31,32,33]:
        connector_x.append(landmarks[i][0])
        connector_y.append(landmarks[i][1])
        
x_min = min(connector_x)
x_max = max(connector_x)
y_min = landmarks[20][1]
y_max = landmarks[31][1]

img2 = Image.open(image_path)
img2 = img2.crop((x_min,y_min,x_max,y_max))
plt.imshow(img2)  

Получаем изображение вида:

После того, как мы получим изображение, как указано выше, мы размоем изображение и применим обнаружение хитрых краев, чтобы определить край «соединителя».

img_blur = cv2.GaussianBlur(np.array(img2),(3,3), sigmaX=0, sigmaY=0)
edges = cv2.Canny(image =img_blur, threshold1=100, threshold2=200)
plt.imshow(edges, cmap =plt.get_cmap('gray'))

После обнаружения края через хитрость мы проверим край на «коннекторе» или нет с помощью приведенного ниже кода.

connector = edges.T[(int(len(edges.T)/2))]

if 255 in connector:
    print("Face is with Glasses!")
else:
    print("Face is without Glasses!")  
Face is with Glasses!  #Output of the above code

Из вывода мы можем подтвердить, что код способен обнаружить очки на лице человека.

Первоначальная заслуга принадлежит Сиддхарту Манджи. Спасибо за статью!