изображение с cv2 вместо HOG
Привет, я работаю над распознаванием лиц.
Для повышения производительности я хочу использовать выравнивание лица.
Когда я использую идентификатор лица 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-rect с помощью:
(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 с rect_to_bb
- [(165, 101) (358, 294)] значения rect
Я проверил функцию 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 ответ
В процессе набора я получил ответ... классический
функция выравнивания требует, чтобы метки ограничивающей рамки немного отличались. Это можно увидеть в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))
Будь здоров