Я пытаюсь идентифицировать людей, которые покидают и повторно вводят вид камеры для видеопотока.
Используя GluonCV, я запустил обнаружение объекта на начальном кадре из видеофайла (используя OpenCV), извлек пользователей, которых я хочу отслеживать, и назначил каждому ID +, сохранил изображение человека, обрезанного до ограничительной рамки. Затем для каждого человека я выполняю отслеживание объекта, используя SiamRPN, как описано в GluonCV документах . Когда человек выходит из фрейма, трекер теряет его, и я прекращаю трекинг.
Проблема в том, что когда они повторно входят в следующий фрейм, я хочу иметь возможность повторно идентифицировать человека. Я перезапускаю обнаружение объекта каждые N кадров, чтобы обнаружить новых людей или людей, которые повторно вошли в кадр. Как Po C я хотел попытаться повторно идентифицировать, используя их одежду, потому что для моего варианта использования есть конечное число людей, носящих различную контрастную одежду.
Мой код пока:
from cv2 import cv2
def compare_hist(im1, im2):
h, w, _ = im1.shape
im2 = cv2.resize(im2, (w, h))
test_image = cv2.cvtColor(im1, cv2.COLOR_BGR2HSV)
query_image = cv2.cvtColor(im2, cv2.COLOR_BGR2HSV)
# hist
test_hist = calc_hist(test_image)
cv2.normalize(test_hist, test_hist, 0, 1, cv2.NORM_MINMAX)
query_hist = calc_hist(query_image)
cv2.normalize(query_hist, query_hist, 0, 1, cv2.NORM_MINMAX)
return cv2.compareHist(test_hist, query_hist, cv2.HISTCMP_CORREL)
def calc_hist(im):
channels = [0, 1]
bins = [50, 60]
ranges = [0, 180, 0, 256]
return cv2.calcHist([im], channels, None, bins, ranges)
if __name__ == '__main__':
score = compare_hist(cv2.imread("a.png"), cv2.imread("b.png"))
print(score)
Однако это дает противоречивые результаты и множество ложноположительных результатов, если я не установлю очень высокий порог, который приведет к ложным отрицаниям. Например, изображение 1 ниже на 73% соответствует изображению 2, но только 64% соответствует изображению 3:
1 2 3