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

Оцінка пози/виявлення ключової точки за допомогою YOLOv7 у Python

Вступ

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

Виявлення об’єктів не є настільки стандартизованим, як класифікація зображень, головним чином тому, що більшість нових розробок зазвичай виконуються окремими дослідниками, супроводжувачами та розробниками, а не великими бібліотеками та фреймворками. Важко упакувати необхідні службові сценарії в такий фреймворк, як TensorFlow або PyTorch, і підтримувати інструкції щодо API, якими досі керувалася розробка.

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

На щастя для мас, компанія Ultralytics розробила простий, дуже потужний і красивий API виявлення об’єктів на основі свого YOLOv5, який був розширений іншими дослідницькими групами та розробниками до нових версій, таких як YOLOv7.

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

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

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

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

Ultralytics' YOLOv5 це перша широкомасштабна реалізація YOLO в PyTorch, яка зробила її доступнішою, ніж будь-коли раніше, але основною причиною, чому YOLOv5 завоював таку точку опори, є чудово простий і потужний API, створений навколо нього. Проект абстрагує непотрібні деталі, водночас дозволяє налаштовувати практично всі придатні для використання формати експорту та використовує дивовижні методи, які роблять увесь проект ефективним і оптимальним, наскільки це можливо.

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

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

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

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

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

Давайте встановимо проект з GitHub:

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

Це створює yolov7 у вашому поточному робочому каталозі, де ви зможете знайти основні файли проекту:

%cd yolov7
!ls

/Users/macbookpro/jup/yolov7
LICENSE.md       detect.py        models           tools
README.md        export.py        paper            train.py
cfg              figure           requirements.txt train_aux.py
data             hubconf.py       scripts          utils
deploy           inference        test.py

Примітка: Записники Google Colab повертаються до основного робочого каталогу в наступній комірці, навіть після виклику %cd dirname, тож вам доведеться продовжувати викликати його в кожній клітинці, у якій потрібно виконати операцію. Локальні блокноти Jupyter запам’ятовують зміни, тому немає потреби продовжувати викликати команду.

Кожного разу, коли ви запускаєте код із заданим набором ваг, вони будуть завантажені та збережені в цьому каталозі. Щоб виконати оцінку пози, ми захочемо завантажити ваги для попередньо підготовленої моделі YOLOv7 для цього завдання, яку можна знайти під /releases/download/ вкладка на GitHub:

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

  % 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  3742k      0  0:00:42  0:00:42 --:--:-- 4573k

/Users/macbookpro/jup

Чудово, ми завантажили yolov7-w6-pose.pt файл ваг, який можна використовувати для завантаження та реконструкції навченої моделі для оцінки пози.

Завантаження моделі оцінки пози YOLOv7

Давайте імпортуємо бібліотеки, які нам знадобляться для оцінки пози:

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

torch та torchvision досить прості – YOLOv7 реалізовано за допомогою PyTorch. The utils.datasets, utils.general та utils.plots Модулі походять із проекту YOLOv7 і надають нам методи, які допомагають у попередній обробці та підготовці вхідних даних для моделі для виконання висновків. Серед них є letterbox() доповнити зображення, non_max_supression_keypoint() щоб запустити алгоритм Non-Max Suppression на початковому виході моделі та створити чистий результат для нашої інтерпретації, а також output_to_keypoint() та plot_skeleton_kpts() методи фактичного додавання ключових точок до даного зображення, коли вони передбачені.

Ми можемо завантажити модель із файлу ваги за допомогою torch.load(). Давайте створимо функцію, щоб перевірити, чи доступний графічний процесор, завантажити модель, перевести її в режим висновку та перемістити на графічний процесор, якщо він доступний:

def load_model():
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model = torch.load('yolov7/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()

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

Завантаживши модель, давайте створимо a run_inference() метод, який приймає рядок, що вказує на файл у нашій системі. Метод читатиме зображення за допомогою OpenCV (cv2), прокладіть його letterbox(), застосуйте до нього трансформації та перетворите його на пакет (модель навчена і очікує пакетів, як зазвичай):

def run_inference(url):
    image = cv2.imread(url) 
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    
    image = image.unsqueeze(0) 
    output, _ = model(image) 
    return output, image

Тут ми повернули трансформоване зображення (оскільки ми хочемо витягнути оригінал і побудувати на ньому графік) і результати моделі. Ці результати містять 45900 прогнозів ключових точок, більшість із яких збігаються. Ми захочемо застосувати немаксимальне придушення до цих необроблених прогнозів, так само як і з прогнозами виявлення об’єктів (де передбачається багато обмежувальних прямокутників, а потім вони «згортаються» за певної впевненості та порогового значення IoU). Після придушення ми можемо нанести кожну ключову точку на вихідне зображення та відобразити її:

def visualize_output(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)
    plt.figure(figsize=(12, 12))
    plt.axis('off')
    plt.imshow(nimg)
    plt.show()

Тепер для деякого вхідного зображення, наприклад karate.jpg у головному робочому каталозі ми можемо запустити висновок, виконати немаксимальне придушення та побудувати результати за допомогою:

output, image = run_inference('./karate.jpg')
visualize_output(output, image)

Це призводить до:

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

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

Висновок

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

Потім ми розглянули, як ми можемо завантажити опубліковані файли ваги, завантажити їх, щоб побудувати модель і виконати оцінку пози для людей, що дало вражаючі результати.

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

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

Оцінка пози/виявлення ключової точки за допомогою YOLOv7 у Python 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