изображение на основе cv2 вместо HOG - PullRequest
0 голосов
/ 29 марта 2020

Привет, я работаю над распознаванием лиц.

Чтобы повысить производительность, я хочу использовать выравнивание лица.

Когда я использую идентификатор лица HOG, описанный, например, Адриан , я получаю выровненное изображение.

from imutils.face_utils import rect_to_bb
from dlib import get_frontal_face_detector

detector = dlib.get_frontal_face_detector()
shape_predictor = dlib.shape_predictor('/home/base/Documents/facial_landmarks/shape_predictor_5_face_landmarks.dat')
fa = face_utils.facealigner.FaceAligner(shape_predictor, desiredFaceWidth=112, desiredLeftEye=(0.3, 0.3))

img=cv2.imread(pathtoimage)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
        rects = detector(gray, 2)  

for rect in rects:                
            (x, y, w, h) = rect_to_bb(rect)
            faceAligned = fa.align(img, gray, rect)

Однако мне приходится работать на встроенном оборудовании, и распознавание лиц HOG недостаточно быстрое. Лучше всего работает cv2 lbpcascader.

С помощью cv2 я также получаю прямоугольник с найденной гранью, но это не помогает.

faces_detected = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=4) 

В других примерах, использующих HOG, координаты извлекаются из прямоугольника HOG с помощью :

(x, y, w, h) = rect_to_bb(rect)

, а затем используется с

aligned_face = fa.align(img, gray, dlib.rectangle(left = x, top=y, right=w, bottom=h))

Идея состоит в том, чтобы заменить x, y, w, h на значения cv2. К сожалению, это не работает, так как две строки выше приводят к полному ложному выравниванию. В первом примере кода функция rect_to_bb включена, но не используется.

Я проверил значения и они как-то отключены:

  • 224x224 изображения
  • 156 70 219 219 значений cv2 (немного отличающихся от курса)
  • 165 101 193 193 прямоугольных значений с rect_to_bb
  • [(165, 101) (358, 294)] прямоугольных значений

Я проверил функцию rect_to_bb, но это кажется прямым:

def rect_to_bb(rect):
    # take a bounding predicted by dlib and convert it
    # to the format (x, y, w, h) as we would normally do
    # with OpenCV
    x = rect.left()
    y = rect.top()
    w = rect.right() - x
    h = rect.bottom() - y

    # return a tuple of (x, y, w, h)
    return (x, y, w, h)

1 Ответ

0 голосов
/ 29 марта 2020

Во время набора я получил ответ ... classi c

функция выравнивания нуждается в немного отличающихся отметках ограничивающего прямоугольника. Это можно увидеть в функции rect_to_bb().

def rect_to_bb(rect):
    # take a bounding predicted by dlib and convert it
    # to the format (x, y, w, h) as we would normally do
    # with OpenCV
    x = rect.left()
    y = rect.top()
    w = rect.right() - x
    h = rect.bottom() - y

    # return a tuple of (x, y, w, h)
    return (x, y, w, h)

Там rect.right (w в cv2) и rect.bottom (h в cv2) вычитаются с помощью x и y. Таким образом, в функции выравнивания вы должны добавить значения, иначе изображение, подаваемое в функцию выравнивания, будет очень маленьким и не в форме. И это также могут быть значения из обнаружения cv2.

aligned_face = fa.align(img, gray, dlib.rectangle(left = x, top=y, right=w+x, bottom=h+y))

Сохраняйте здоровье

...