Оцінка пози в реальному часі з відео на Python за допомогою YOLOv7 PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Оцінка пози в реальному часі з відео на Python за допомогою YOLOv7

Вступ

Виявлення об’єктів — це велика область комп’ютерного зору та одне з найважливіших застосувань комп’ютерного зору «в дикій природі». З нього було отримано визначення ключових точок (які часто використовуються для оцінки пози).

Ключовими точками можуть бути різні точки – частини обличчя, кінцівки тіла тощо. Оцінка пози – це окремий випадок виявлення ключових точок, у якому точки є частинами тіла людини.

Оцінка пози — це дивовижний, надзвичайно веселий і практичний спосіб використання комп’ютерного зору. З його допомогою ми можемо відмовитися від апаратного забезпечення, яке використовується для оцінки поз (костюми захоплення руху), яке є дорогим і громіздким. Крім того, ми можемо зіставити рух людей з рухом роботів у евклідовому просторі, забезпечуючи точний рух двигуна без використання контролерів, які зазвичай не забезпечують більш високий рівень точності. Оцінку ключових точок можна використовувати для перетворення наших рухів у 3D-моделі в AR і VR, і все частіше використовується для цього лише за допомогою веб-камери. Нарешті, оцінка пози може допомогти нам у спорті та безпеці.

У цьому посібнику ми будемо виконувати оцінку пози в реальному часі з відео на Python, використовуючи найсучаснішу модель YOLOv7.

Зокрема, ми будемо працювати з відео з зимових Олімпійських ігор 2018 року, які проходили в південнокорейському Пхенчхані:

Альона Савченко та Бруно Массо показали дивовижний перфоманс, включно з перекриттям тіл на камеру, швидким плавним рухом та обертанням у повітрі. Це буде чудова нагода побачити, як модель справляється зі складними для визначення ситуаціями!

YOLO та оцінка пози

YOLO (You Look Only Once) це методологія, а також сімейство моделей, побудованих для виявлення об'єктів. З моменту створення в 2015 році YOLOv1, YOLOv2 (YOLO9000) і YOLOv3 були запропоновані тим самим автором (авторами), і спільнота глибокого навчання продовжувала вдосконалювати відкритий вихідний код протягом наступних років.

Ultralytics' YOLOv5 це репозиторій галузевого рівня виявлення об’єктів, побудований на основі методу YOLO. Він реалізований у PyTorch, на відміну від C++ для попередніх моделей YOLO, є повністю відкритим вихідним кодом і має чудово простий і потужний API, який дозволяє робити висновки, навчати та гнучко налаштовувати проект. Це такий основний елемент, що більшість нових спроб удосконалити метод YOLO спираються на нього.

Це, як YOLOR (ви вивчаєте лише одне представлення) і YOLOv7, які створені на основі YOLOR (той самий автор), також були створені!

YOLOv7 – це не просто архітектура виявлення об’єктів – вона надає нові головки моделі, які можуть виводити ключові точки (скелети) і виконувати сегментацію екземплярів, окрім лише регресії обмежувальної рамки, яка не була стандартною для попередніх моделей YOLO. Це не дивно, оскільки багато архітектур виявлення об’єктів також були перепрофільовані, наприклад, для завдань сегментації та виявлення ключових точок через спільну загальну архітектуру з різними результатами залежно від завдання.

Хоча це й не дивно – підтримка сегментації екземплярів і визначення ключових точок, швидше за все, стане новим стандартом для моделей на базі YOLO, які кілька років тому почали перевершувати практично всі інші двоступінчасті детектори як з точки зору точності, так і швидкості.

Це робить сегментацію екземплярів і визначення ключових точок швидше, ніж будь-коли раніше, завдяки простішій архітектурі, ніж двоступеневі детектори.

Сама модель була створена шляхом архітектурних змін, а також оптимізації аспектів навчання, які отримали назву «мішок безкоштовних подарунків», що підвищило точність без збільшення вартості висновків.

Встановлення YOLOv7

Давайте почнемо з клонування репозиторію, щоб отримати вихідний код:

! git clone https://github.com/WongKinYiu/yolov7.git

Тепер перейдемо до yolov7 каталог, який містить проект, і подивіться на вміст:

%cd yolov7
!ls
/content/yolov7
cfg	   figure      output.mp4	 test.py       
data	   hubconf.py  paper		 tools
deploy	   inference   README.md	 train_aux.py
detect.py  LICENSE.md  requirements.txt  train.py
export.py  models      scripts		 utils

Примітка: покликання !cd dirname переміщує вас до каталогу в цій клітинці. Дзвінок %cd dirname також переміщує вас у каталог наступних комірок і залишає вас там.

Тепер YOLO призначений як детектор об’єктів і не поставляється з ваговими оцінками пози за замовчуванням. Ми хочемо завантажити ваги та завантажити з них конкретний екземпляр моделі. Вагові коефіцієнти доступні в тому самому сховищі GitHub, і їх також можна легко завантажити через CLI:

! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  153M  100  153M    0     0  23.4M      0  0:00:06  0:00:06 --:--:-- 32.3M

Після завантаження ми можемо імпортувати бібліотеки та допоміжні методи, які будемо використовувати:

import torch
from torchvision import transforms

from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts

import matplotlib.pyplot as plt
import cv2
import numpy as np

Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!

Чудово! Давайте приступимо до завантаження моделі та створення сценарію, який дозволяє вибирати пози з відео за допомогою YOLOv7 і OpenCV.

Оцінка пози в реальному часі за допомогою YOLOv7

Давайте спочатку створимо метод для завантаження моделі із завантажених ваг. Ми перевіримо, який пристрій у нас доступний (CPU або GPU):

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

def load_model():
    model = torch.load('yolov7-w6-pose.pt', map_location=device)['model']
    
    model.float().eval()

    if torch.cuda.is_available():
        
        
        model.half().to(device)
    return model

model = load_model()

Залежно від того, чи є у нас GPU чи ні, ми ввімкнемо половинну точність (за допомогою float16 замість float32 в операціях), що робить висновок значно швидшим. Зауважте, що настійно рекомендується виконувати це на графічному процесорі для швидкості в реальному часі, оскільки ЦП, ймовірно, не вистачить для цього, якщо вони не працюють на невеликих відео.

Давайте напишемо зручний метод для запуску логічного висновку. Ми будемо приймати зображення як масиви NumPy (оскільки це те, що ми передамо їм пізніше під час читання відео). По-перше, використовуючи letterbox() функція – ми змінимо розмір і додамо відео до форми, з якою зможе працювати модель. Це не обов’язково і не буде формою (роздільністю) отриманого відео!

Потім ми застосуємо перетворення, перетворимо зображення на половинну точність (якщо доступний графічний процесор), об’єднаємо його в пакет і пропустимо через модель:

def run_inference(image):
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    if torch.cuda.is_available():
      image = image.half().to(device)
    
    image = image.unsqueeze(0) 
    with torch.no_grad():
      output, _ = model(image)
    return output, image

Ми повернемо прогнози моделі, а також зображення як тензор. Це «приблизні» прогнози – вони містять багато активацій, які перекриваються, і ми захочемо «очистити» їх за допомогою Non-Max Supression і нанести передбачені скелети на само зображення:

def draw_keypoints(output, image):
  output = non_max_suppression_kpt(output, 
                                     0.25, 
                                     0.65, 
                                     nc=model.yaml['nc'], 
                                     nkpt=model.yaml['nkpt'], 
                                     kpt_label=True)
  with torch.no_grad():
        output = output_to_keypoint(output)
  nimg = image[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

З їх допомогою наша загальна схема виглядатиме так:

img = read_img()
outputs, img = run_inference(img)
keypoint_img = draw_keypoints(output, img)

Щоб перевести це в налаштування відео в реальному часі, ми використаємо OpenCV для читання відео та запустимо цей процес для кожного кадру. На кожному кадрі ми також запишемо кадр у новий файл, закодований як відео. Це обов’язково сповільнить процес, оскільки ми виконуємо висновок, відображаємо його та записуємо – тож ви можете пришвидшити висновок та відображення, уникаючи створення нового файлу та запису в нього в циклі:

def pose_estimation_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('ice_skating_output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))))
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            output, frame = run_inference(frame)
            frame = draw_keypoints(output, frame)
            frame = cv2.resize(frame, (int(cap.get(3)), int(cap.get(4))))
            out.write(frame)
            cv2.imshow('Pose estimation', frame)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

Команда VideoWriter приймає кілька параметрів – назву вихідного файлу, FourCC (чотири кодека, що позначають кодек, що використовується для кодування відео), частоту кадрів і роздільну здатність як кортеж. Щоб не вгадувати чи змінювати розмір відео – ми використали ширину та висоту оригінального відео, отримані за допомогою VideoCapture екземпляр, який містить дані про саме відео, наприклад ширину, висоту, загальну кількість кадрів тощо.

Тепер ми можемо викликати метод для будь-якого вхідного відео:

pose_estimation_video('../ice_skating.mp4')

Це відкриє вікно OpenCV, що відображає висновок у реальному часі. А також запише відеофайл у yolov7 каталог (оскільки ми cdвпав в це):

Оцінка пози в реальному часі з відео на Python за допомогою YOLOv7 PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Примітка: Якщо ваш графічний процесор має проблеми або якщо ви хочете вбудувати результати подібної моделі в програму, яка має затримку як важливий аспект робочого процесу, зробіть відео меншим і працюйте з меншими кадрами. Це відео з роздільною здатністю Full HD 1920 × 1080, яке повинно працювати швидко на більшості домашніх систем, але якщо воно не працює у вашій системі, зменшіть зображення.

Висновок

У цьому посібнику ми розглянули метод YOLO, YOLOv7 і зв’язок між YOLO та виявленням об’єктів, оцінкою пози та сегментацією екземплярів. Потім ми розглянули, як ви можете легко встановити й працювати з YOLOv7 за допомогою програмного API, і створили кілька зручних методів, щоб спростити висновок і відобразити результати.

Нарешті, ми відкрили відео за допомогою OpenCV, запустили висновок за допомогою YOLOv7 і створили функцію для виконання оцінки пози в реальному часі, зберігаючи отримане відео в повній роздільній здатності та 30 кадрів/с на вашому локальному диску.

Йти далі – практичне глибоке навчання для комп’ютерного зору

Ваша допитлива природа змушує вас йти далі? Ми рекомендуємо перевірити наш Курс: «Практичне глибоке навчання комп’ютерного бачення за допомогою Python».

Оцінка пози в реальному часі з відео на Python за допомогою YOLOv7 PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Ще один курс комп’ютерного зору?

Ми не будемо класифікувати цифри MNIST або моди MNIST. Вони свою роль давно відслужили. Занадто багато навчальних ресурсів зосереджені на базових наборах даних і базових архітектурах, перш ніж дозволити просунутим архітектурам чорної скриньки взяти на себе тягар продуктивності.

Ми хочемо зосередитися на демістифікація, практичність, розуміння, інтуїція та реальні проекти. Хочеться навчитися як ти можеш змінити ситуацію? Ми проведемо вас у подорожі від того, як наш мозок обробляє зображення, до написання дослідницького класифікатора глибокого навчання для раку молочної залози до мереж глибокого навчання, які «галюцинують», навчаючи вас принципам і теорії через практичну роботу, озброюючи вас ноу-хау та інструменти, щоб стати експертом у застосуванні глибокого навчання для вирішення проблем комп’ютерного зору.

Що всередині?

  • Перші принципи бачення та те, як комп’ютери можна навчити «бачити»
  • Різні задачі та застосування комп'ютерного зору
  • Інструменти, які полегшать вашу роботу
  • Пошук, створення та використання наборів даних для комп’ютерного зору
  • Теорія та застосування згорткових нейронних мереж
  • Обробка зсуву домену, спільного входження та інших упереджень у наборах даних
  • Передача навчання та використання часу навчання та обчислювальних ресурсів інших для вашої вигоди
  • Створення та навчання сучасного класифікатора раку молочної залози
  • Як застосувати здорову дозу скептицизму до основних ідей і зрозуміти наслідки широко поширених методів
  • Візуалізація «концептуального простору» ConvNet за допомогою t-SNE та PCA
  • Тематичні дослідження того, як компанії використовують методи комп’ютерного зору для досягнення кращих результатів
  • Правильна оцінка моделі, візуалізація прихованого простору та ідентифікація уваги моделі
  • Виконання досліджень предметної області, обробка власних наборів даних і створення тестів моделей
  • Передові архітектури, розвиток ідей, що робить їх унікальними та як їх реалізувати
  • KerasCV – бібліотека WIP для створення найсучасніших конвеєрів і моделей
  • Як аналізувати та читати документи та реалізувати їх самостійно
  • Вибір моделей в залежності від вашого застосування
  • Створення наскрізного конвеєра машинного навчання
  • Пейзаж та інтуїція під час виявлення об’єктів за допомогою Faster R-CNN, RetinaNets, SSD та YOLO
  • Екземплярна та семантична сегментація
  • Розпізнавання об'єктів у реальному часі за допомогою YOLOv5
  • Навчання детекторам об’єктів YOLOv5
  • Робота з Transformers за допомогою KerasNLP (потужна бібліотека WIP)
  • Інтеграція Transformers із ConvNets для створення підписів до зображень
  • DeepDream
  • Оптимізація моделі Deep Learning для комп’ютерного зору

Часова мітка:

Більше від Stackabuse