Точность обнаружения верхнего и нижнего века DLIB неверна для закрытых глаз

Мы используем DLIB для распознавания лиц, который расширен для определения того, открыт или закрыт глаз.

Это работает очень хорошо, но для некоторых изображений глаз полностью закрыт, что не дает правильных очков.

например Правильное изображение

введите здесь описание изображения

Как видите, КРАСНЫЕ точки расположены правильно.

Неправильное обнаружение, как показано на изображении ниже.

введите здесь описание изображения

Как видите, точки, отмеченные синим цветом, находятся не в правильном положении. В идеале расстояние между верхним и нижним веком должно быть равно нулю.

Но это не так. Мы искали, можно ли сделать какой-либо тюнинг, но безуспешно.

Альтернативным решением может быть применение некоторого фильтра после обработки dlib для обнаружения Iris и т. д., но поиск лучшего решения для этого.


person Banng    schedule 12.09.2019    source источник


Ответы (1)


Есть несколько улучшений, которые вы могли бы сделать. Сначала вам нужно использовать серую рамку для лучшего отслеживания:

# Load frames from the camera
while True:
    _, frame = cap.read()
    # Use gray frame for better tracking
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Второе улучшение, которое вы могли бы сделать, это создать новый ориентир лица (центр вверху глаза и центр внизу глаза), вы делаете это, используя простую математику:

# Create new facial landmarks
def midpoint(p1, p2):
    return int((p1.x + p2.x)/2), int((p1.y + p2.y)/2)

Тогда у вас должны получиться точки, расположенные сверху и снизу по центру каждого глаза. Вы спросите: а чем это может помочь? Ну, вы можете использовать эти точки и провести линию между ними следующим образом:

# Draw line between different facial landmarks
ver_line = cv2.line(frame, center_top, center_bottom, (0, 255, 0), 2)

Затем проделайте то же самое с горизонтальной линией:

# Draw line between different facial landmarks
hor_line = cv2.line(frame, left_point, right_point, (0, 255, 0), 2)

Затем вычислите длину горизонтальной и вертикальной линии и возьмите их отношение:

# Calculating length of the lines
hor_line_lenght = hypot(
    (left_point[0] - right_point[0]), (left_point[1] - right_point[1]))
ver_line_lenght = hypot(
    (center_top[0] - center_bottom[0]), (center_top[1] - center_bottom[1]))
ratio = hor_line_lenght/ver_line_lenght
return ratio
person squidward    schedule 12.09.2019
comment
Спасибо за ответ и предложения. Мы пробовали с серой шкалой, но тот же вывод из Dlib. Что касается отношения, это будет полезно, когда dlib обнаружит правильные точки, в случае, если глаз закрыт. - person Banng; 13.09.2019