Поза YOLOv7 была представлена в репозитории YOLOv7 через несколько дней после первоначального выпуска в июле ‘22. Это одноступенчатая модель оценки позы для нескольких человек. Поза YOLOv7 уникальна, поскольку она отличается от обычных двухэтапных алгоритмов оценки позы. Благодаря снижению сложности одноступенчатых моделей мы можем ожидать, что они будут быстрее и эффективнее.

  1. Оценка позы человека на основе глубокого обучения

  2. Оценка позы человека в реальном времени

  3. Что нового в позе YOLOv7?

  4. Что такое поза MediaPipe?

  5. Особенности YOLOv7 pose vs MediaPipe

  6. Код YOLOv7 pose

  7. Сравнение YOLOv7 и MediaPipe на процессоре

  8. Вывод графического процессора YOLOv7

1. Оценка позы человека на основе глубокого обучения

Алгоритмы оценки позы, основанные на глубоком обучении, прошли долгий путь с момента первого выпуска DeepPose от Google в 2014 году. Эти алгоритмы обычно работают в два этапа.

  • Обнаружение человека.

  • Локализация ключевых точек.

В зависимости от того, какой этап наступает первым, их можно разделить на подходы "сверху вниз" и "снизу вверх".

Подход сверху вниз

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

Подход "снизу вверх"

При таком подходе он находит не связанные с личностью ориентиры (ключевые точки) всех людей на изображении сразу, а затем группирует их по отдельным лицам. Вероятностная карта, называемая тепловой картой, используется этими подходами для оценки вероятности того, что каждый пиксель содержит определенный ориентир (ключевую точку). С помощью Non-maximum suppression фильтруется наилучший ориентир. Они менее сложны по сравнению с методами сверху вниз, но за счет снижения точности.

2. Оценка позы человека в реальном времени

В зависимости от устройства [CPU / GPU / TPU и т. Д.] Производительность разных фреймворков различается. Существует множество двухэтапных моделей оценки позы, которые хорошо зарекомендовали себя в контрольных тестах. Альфа-поза, открытая поза, Глубокая поза, и это лишь некоторые из них. Однако из-за относительной сложности двухэтапных моделей получение производительности в реальном времени требует больших вычислительных затрат. Эти модели работают быстро на графических процессорах, но не так сильно на процессорах.

С точки зрения эффективности и точности MediaPipe - это хорошо сбалансированная структура для оценки позы. Он генерирует обнаружение в реальном времени на процессорах. Имея это в виду, мы протестировали позу YOLOv7, чтобы посмотреть, насколько она отличается от MediaPipe.

3. Что нового в позе YOLOv7?

В отличие от обычных алгоритмов оценки позы, YOLOv7 pose представляет собой одноступенчатый детектор ключевых точек для нескольких человек. Это похоже на подход снизу вверх, но без тепловой карты. Это расширение одноразового детектора позы – YOLO-Pose. В нем представлены лучшие подходы как сверху вниз, так и снизу вверх. Поза YOLOv7 обучается на наборе данных COCO, который имеет 17 базовых топологий. Он реализован в PyTorch, что делает код очень простым для настройки в соответствии с вашими потребностями. Предварительно обученной моделью обнаружения ключевых точек является yolov7-w6-pose.pth.

4. Что такое поза MediaPipe?

MediaPipe Pose - это система оценки позы для одного человека. Он использует топологию ориентира BlazePose 33. BlazePose - это надмножество ключевых точек COCO, топологии Blaze Palm и Blaze Face. Он работает в два этапа – обнаружение и отслеживание. Поскольку обнаружение выполняется не в каждом кадре, MediaPipe может выполнять вывод быстрее. В MediaPipe есть три модели для оценки позы.

  • BlazePose GHUM Heavy

  • BlazePose GHUM Full

  • BlazePose GHUM Lite

Эти модели помечены как сложность 0, 1 и 2 соответственно.

Решение MediaPipe pose также интегрировано с сегментацией, которую можно переключать, просто передавая флаг. Ознакомьтесь с этой статьей о позе MediaPipe для получения дополнительной информации.

5. Особенности YOLOv7 pose vs MediaPipe

Характеристики

YOLOv7 pose

MediaPipe

Топология

17 ключевых точек COCO

33 Ключевые точки COCO + Blaze Palm + Blaze Face

Рабочий процесс

Обнаружение выполняется для всех кадров

Обнаружение выполняется один раз, за которым следует отслеживание, пока не произойдет закупорка

Поддержка GPU

Поддержка как CPU, так и GPU

Только процессор

Сегментация

Сегментация, не интегрированная в позу напрямую

Интегрированная сегментация

Количество человек

Несколько человек

Один человек

YOLOv7 - это система обнаружения нескольких человек. MediaPipe не может победить YOLOv7 в этой категории, поэтому мы не будем анализировать их дальше. На следующем видео показано, как YOLOv7 оценивает позу нескольких человек на GPU против MediaPipe.

MediaPipe CPU vs YOLOv7 GPU обнаружение нескольких человек

6. Код YOLOv7 pose

YOLOv7 Pose использует служебную функцию letterbox чтобы изменить размер изображения перед выводом. Мы заметили, что нет сопоставления измененных выходных данных с исходными входными данными. Это означает, что если вы передадите видео с разрешением 1080 × 1080 для вывода, выходное видео будет иметь разрешение 960 × 960. Вы не получаете ориентиры, сопоставленные с исходным изображением. Поэтому мы внесли некоторые изменения в код ради нашего эксперимента.

  • Клонируйте репозиторий YOLOv7 и поместите yolov7-pose.py в корневом каталоге.

  • Заменить yolov7/utils/plots.py с нашей версией plots.py.

Эти файлы экспериментов доступны в Experiments каталог. Для установки вы можете ознакомиться со статьями Поза YOLOv7 и Оценка позы человека с использованием MediaPipe.

Помимо обычного импорта, нам нужны следующие служебные функции.

  • почтовый ящик: изменение размера почтового ящика масштабирует изображение, сохраняя соотношение сторон, но любые области, которые не были сняты, заливаются фоновым цветом.

  • non_max_suppression_kpt: Как следует из названия, эта функция выполняет Non-maximum suppression результатов вывода.

  • output_to_keypoint: Возвращает batch_id, class_id, x, y, w, h, conf.

  • plot_skeleton_kpts: Рендеринг ориентиров и соединительных пар.

Функция для обнаружения и построения ориентиров

Следующая функция в значительной степени понятна со встроенными комментариями. Сначала изображение преобразуется в тензор 4D [1, h, w, c] и загружается в вычислительное устройство для прямой передачи. Здесь 1 - это размер пакета. Функция pose_video возвращает аннотированное изображение вместе с частотой кадров в секунду при прямом проходе.

def pose_video(frame):
    mapped_img = frame.copy()
    # Letterbox resizing.
    img = letterbox(frame, input_size, stride=64, auto=True)[0]
    print(img.shape)
    img_ = img.copy()
    # Convert the array to 4D.
    img = transforms.ToTensor()(img)
    # Convert the array to Tensor.
    img = torch.tensor(np.array([img.numpy()]))
    # Load the image into the computation device.
    img = img.to(device)
     
    # Gradients are stored during training, not required while inference.
    with torch.no_grad():
        t1 = time.time()
        output, _ = model(img)
        t2 = time.time()
        fps = 1/(t2 - t1)
        output = non_max_suppression_kpt(output, 
                                         0.25,    # Conf. Threshold.
                                         0.65,    # IoU Threshold.
                                         nc=1,   # Number of classes.
                                         nkpt=17, # Number of keypoints.
                                         kpt_label=True)
         
        output = output_to_keypoint(output)
 
    # Change format [b, c, h, w] to [h, w, c] for displaying the image.
    nimg = img[0].permute(1, 2, 0) * 255
    nimg = nimg.cpu().numpy().astype(np.uint8)
    nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
 
    for idx in range(output.shape[0]):
        plot_skeleton_kpts(nimg, output[idx, 7:].T, 3)
         
    return nimg, fps

7. Сравнение YOLOv7 и MediaPipe на процессоре

YOLOV7

MediaPipe

Модель: yolov7-w6-pose.pth

Устройство: GPU

Размер ввода: 960p (letterbox)

Модель: BlazePose GHUM Full

Устройство: CPU

Размер ввода: 256x256p

В то время как основная цель обоих YOLOv7 и MediaPipe остается прежним, они не похожи с точки зрения реализации. Давайте рассмотрим несколько примеров, чтобы протестировать фреймворки. Мы сравним точность и частоту кадров в секунду по следующим причинам.

  1. Размер входных данных модели по умолчанию.

  2. Фиксированный размер входных данных модели для вывода в реальном времени.

  3. YOLOv7 vs MediaPipe на низком уровне свет условие.

  4. YOLOv7 vs MediaPipe Обработка окклюзии.

  5. YOLOv7 vs MediaPipe на далеком человеке.

  6. YOLOv7 vs MediaPipe при прыжках с парашютом.

  7. YOLOv7 vs MediaPipe Определение танцевальной позы.

  8. YOLOv7 vs MediaPipe при определении позы йоги.

ТЕСТОВАЯ НАСТРОЙКА: Процессор ноутбука Ryzen 5 4-го поколения, графический процессор ноутбука NVIDIA GTX 1650 4 ГБ
Примечание: Записанный FPS - это средний FPS прямого прохода без учета времени предварительной и последующей обработки.

7.1. Сравнение YOLOv7 и MediaPipe с настройками ввода по умолчанию

YOLOv7 по умолчанию содержит изображения 960p в формате почтового ящика. Он поддерживает соотношение сторон исходного изображения, сохраняя минимальную ширину или высоту 960p. С другой стороны, MediaPipe использует две модели BlazePose для обнаружения и отслеживания. Модель обнаружения принимает входные данные 128 × 128, а модель отслеживания принимает 256 × 256.

Давайте посмотрим на результаты, которые мы получаем с помощью готового кода. Очевидно, что MediaPipe является победителем в этом случае.

  • YOLOv7: 0.82 кадров в секунду.

  • MediaPipe: 29,2 кадра в секунду.

YOLOv7 pose vs MediaPipe с настройками по умолчанию для процессора

7.2. Фиксированный размер ввода для вывода в реальном времени

Чтобы уравновесить конкуренцию, мы изменили код для YOLOv7, чтобы пересылать изображения размером 256 × 256. Результаты следующие. Это также продолжается для остальных экспериментов с процессором.

  • YOLOv7: 8.1 кадров в секунду.

  • MediaPipe: 29,2 кадра в секунду.

YOLOv7 Pose vs MediaPipe исправлен ввод на процессоре

7.3. YOLOv7 против MediaPipe в условиях низкой освещенности

Пример 1. Следующие результаты показывают, что YOLOv7 и MediaPipe справляются с низким освещением, окклюзией и удаленными людьми. Наблюдается, что YOLOv7 работает немного лучше, чем MediaPipe с точки зрения точности.

  • YOLOv7: 8.3

  • MediaPipe: 29.2

YOLOv7 pose vs MediaPipe при слабом освещении с использованием процессора

Пример 2. В отличие от примера выше, MediaPipe дает несколько лучшие результаты с точки зрения точности в следующем примере.

  • YOLOv7: 8.23

  • MediaPipe: 29

YOLOv7 pose vs MediaPipe при слабом освещении с использованием процессора

7.4. Обработка окклюзии YOLOv7 vs MediaPipe

С помощью YOLOv7 прогнозирование позы работает прилично, даже когда определенные части тела закрыты. Закрытая нога человека хорошо прогнозируется YOLOv7. Однако MediaPipe считает, что это кентавр. Частота кадров в секунду не сильно отличается по сравнению с экспериментами при слабом освещении.

  • YOLOv7: 8.0

  • MediaPipe: 30.0

YOLOv7 pose vs MediaPipe обрабатывающего закупорку на процессоре

7.5. YOLOv7 vs MediaPipe на далеком человеке

Давайте сравним, как обе модели реагируют на человека в малом масштабе. Мы видим, что YOLOv7 не удалось обнаружить человека на всех кадрах. MediaPipe обнаружил человека в значительно меньшем масштабе. Это может быть связано с методами оценки позы, используемыми фреймворками. MediaPipe отслеживает человека после подтверждения обнаружения. С другой стороны, YOLOv7 выполняет обнаружение для каждого кадра.

  • YOLOv7: 8.2

  • MediaPipe: 31.1

YOLOv7 pose vs MediaPipe обнаружение человека в разных масштабах на процессоре

7.6. YOLOv7 vs MediaPipe при прыжках с парашютом

В следующем видео с прыжками с парашютом MediaPipe лучше распознает человека с различными ориентациями. Можно также видеть, что, когда человек находится дальше, MediaPipe обнаруживает лучше, чем YOLOv7. Это также может быть хорошим примером масштаба.

  • YOLOv7: 8.24

  • MediaPipe: 29.05

YOLOv7 pose vs MediaPipe, определяющая позу при различных ориентациях на процессоре

7.7. YOLOv7 vs MediaPipe, определяющего позу танца

Обе структуры способны обнаруживать человека. Тем не менее, YOLOv7 делает лучшую оценку позы. При быстрых движениях MediaPipe, похоже, не может достаточно хорошо отслеживать. Разница в FPS аналогична приведенным выше примерам.

  • YOLOv7: 7.99

  • MediaPipe: 29.46

YOLOv7 pose vs MediaPipe обнаружение танцевальной позы на процессоре

7.8. YOLOv7 vs MediaPipe при определении позы йоги

В следующем эксперименте по обнаружению позы ЙОГИ поза YOLOv7 показывает нервные обнаружения. Использование размера ввода с низким разрешением может быть не лучшей идеей для использования с YOLOv7. Мы не должны забывать, что YOLOv7 обучается на 960p изображениях почтовых ящиков.

  • YOLOv7: 8.20

  • MediaPipe: 29.06

8. Вывод YOLOv7 на графическом процессоре

Мы знаем, что это несправедливое сравнение, но это все, что у нас есть для MediaPipe сейчас. Надеемся, что поддержка GPU для Python-решений MediaPipe появится в ближайшее время. Однако мы хотим посмотреть, как лучшие из обоих фреймворков сочетаются друг с другом, используя несколько примеров. Мы сравним некоторые сложные позы с MediaPipe и самим YOLOv7 на входах с низким и высоким разрешением.

YOLOV7

MediaPipe

Размер ввода: 960 (letterbox)

Модель: yolov7-w6-pose.pth

Устройство: графический процессор

Размер входного сигнала: 256 × 256

Модель: BlazePose GHUM Full

Устройство: процессор

8.1. YOLOv7 vs MediaPipe в сложных позах

В следующем видео мы видим, что YOLOv7 работает сравнительно лучше, чем MediaPipe. Переключение на разрешение по умолчанию улучшает результаты. Более того, с точки зрения скорости вывода, YOLOv7 более чем в 2 раза быстрее.

  • YOLOv7: 83.39

  • MediaPipe: 29.0

YOLOv7 pose GPU 960p против MediaPipe по умолчанию

8.2. Анализ влияния увеличения размера входных данных

Давайте проверим предыдущие результаты вывода 256p с результатами GPU по умолчанию 960p. Это предыдущий пример прыжков с парашютом, где YOLOv7 плохо справлялся с размером ввода 256 × 256. Результат справа показан после изменения размера ввода на 960p по умолчанию.

256p

960p

YOLOv7 определяет позу человека, прыгающего с парашютом процессор 256p против графического процессора 960p

В предыдущем входном эксперименте с низким разрешением YOLOv7 не смог обнаружить человека ни разу. После увеличения входного разрешения до 960p результат значительно улучшается. Однако это не так хорошо, как MediaPipe.

Ввод модели YOLOv7 с низким разрешением и высоким разрешением на CPU и GPU

Аналогично, с экспериментом по определению позы йоги результат улучшается. Обнаружение в версии 960p определенно лучше, чем дрожащий вывод 256p.

Обнаружение позы йоги YOLOv7 с низким разрешением и высоким разрешением на процессоре и графическом процессоре

Моделям оценки позы сложно отслеживать плавание. Человек неоднократно закрывается. В следующем примере показано определение позы для плавания с помощью YOLOv7 в разных разрешениях.

YOLOv7 определяет позу плавающего человека

Наблюдения

  • Наблюдается, что MediaPipe дает хорошие результаты на входных данных с низким разрешением по сравнению с YOLOv7.

  • Это быстрее, чем YOLOv7 при выводе процессора.

  • MediaPipe также сравнительно хорошо обнаруживает удаленные объекты (в нашем случае людей). Однако, когда дело доходит до окклюзии, выигрывает YOLOv7.

  • В то время как MediaPipe ограничен одним человеком, YOLOv7 может обнаруживать несколько человек одновременно.

  • YOLOv7 также лучше оценивает быстрые движения, учитывая, что размер входных данных имеет высокое разрешение.

  • Кроме того, YOLOv7 может использовать возможности графического процессора, что делает его намного быстрее, чем MediaPipe.

Код на Github

Список литературы

  1. Введение в MediaPipe

  2. Построение системы обнаружения и оповещения о плохом положении тела с использованием MediaPipe

  3. Оценка позы нескольких человек в OpenCV с использованием OpenPose

  4. Сравнение определения позы: wrnchAI против OpenPose

  5. Видео прыжков с парашютом

Комментарии (2)


  1. IamSVP
    25.11.2022 11:16
    +1

    "Не максимального подавления" - это nms термин Non-maximum suppression. Лучше оставить в исходном виде и не переводить


    1. dimanosov007 Автор
      25.11.2022 12:46

      Спасибо! поправил