Виявлення 3D-об’єктів (3D-обмежувальні рамки) у Python за допомогою MediaPipe Objectron PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Виявлення 3D-об’єктів (3D-обмежувальні рамки) у Python за допомогою MediaPipe Objectron

Вступ

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

Проте – все це викликає занепокоєння Виявлення 2D об'єктів, що саме по собі є складним завданням. Нещодавно ми змогли успішно виступити Виявлення 3D об'єктів, і хоча ці детектори все ще перебувають на більш нестабільній стадії, ніж детектори двовимірних об’єктів, їхня точність зростає.

У цьому посібнику ми будемо виконувати виявлення 3D-об’єктів у Python за допомогою Objectron від MediaPipe.

Примітка: MediaPipe — це платформа Google з відкритим вихідним кодом для створення конвеєрів машинного навчання для обробки зображень, відео та аудіопотоків, переважно для мобільних пристроїв. Він використовується як всередині, так і зовні, і надає попередньо підготовлені моделі для різних завдань, таких як розпізнавання облич, об’єднання облич, оцінка рук і пози, сегментація волосся, виявлення об’єктів, відстеження коробки тощо.

Усе це може й використовується для подальших завдань, таких як застосування фільтрів до облич, автоматичне фокусування камери, біометрична перевірка, ручна робототехніка тощо. Більшість проектів доступні з API для Android, iOS, C++, Python і JavaScript, а деякі доступні лише для певних мов.

У цьому посібнику ми будемо працювати з Objectron від MediaPipe, доступний для Android, C++, Python і JavaScript.

MediaPipe і виявлення 3D-об'єктів

Команда Objectron рішення було навчено на Набір даних Objectron, який містить короткі об’єктно-орієнтовані відео. Набір даних містить лише 9 об’єктів: велосипеди, книги, пляшки, фотоапарати, коробки з пластівцями, стільці, чашки, ноутбуки та взуття, тому це не дуже загальний набір даних, але обробка та закупівля цих відео є досить дорогими (пози камер, рідкісні хмари точок, характеристика плоских поверхонь тощо для кожного кадру кожного відео), що робить розмір набору даних майже 2 терабайти.

Навчена модель Objectron (відома як a рішення для проектів MediaPipe) навчається за чотирма категоріями – взуття, стільці, чашки та камери.

Виявлення двовимірних об’єктів використовує термін «обмежувальні прямокутники», хоча насправді це прямокутники. Виявлення 2D-об’єктів фактично передбачає коробки навколо об’єктів, з яких можна зробити висновок про їхню орієнтацію, розмір, приблизний об’єм тощо. Це досить складне завдання, особливо враховуючи відсутність відповідних наборів даних і вартість їх створення. Незважаючи на те, що ця проблема є складною, вона перспективна для багатьох Розширена реальність (AR) додатки!

Рішення Objectron може працювати в одноетапному або двоетапному режимі, де одноетапний режим краще виявляє кілька об’єктів, тоді як двоетапний режим краще виявляє один основний об’єкт у сцені та працює значно ефективніше. швидше. Одноступінчастий конвеєр використовує магістраль MobileNetV2, тоді як двоступеневий конвеєр використовує TensorFlow Object Detection API.

Коли у відео виявляється об’єкт, подальші прогнози для нього не робляться для кожного кадру з двох причин:

  • Безперервні прогнози викликають високу нестабільність (через притаманну стохастичність прогнозів)
  • Запускати великі моделі на кожному кадрі дорого

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

Давайте встановимо MediaPipe, імпортуємо рішення Objectron і застосуємо його до статичних зображень і відео, що надходить прямо з камери.

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

Давайте спочатку встановимо MediaPipe і підготуємо допоміжний метод для отримання зображень із заданої URL-адреси:

! pip install mediapipe

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

import mediapipe as mp

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

Давайте визначимо допоміжний метод для отримання зображень із URL-адресою, який повертає масив RGB, що представляє це зображення:

import PIL
import urllib

def url_to_array(url):
    req = urllib.request.urlopen(url)
    arr = np.array(bytearray(req.read()), dtype=np.int8)
    arr = cv2.imdecode(arr, -1)
    arr = cv2.cvtColor(arr, cv2.COLOR_BGR2RGB)
    return arr

mug = 'https://goodstock.photos/wp-content/uploads/2018/01/Laptop-Coffee-Mug-on-Table.jpg'
mug = url_to_array(mug)

Нарешті, ми хочемо імпортувати як рішення Objectron, так і утиліти малювання для візуалізації прогнозів:

mp_objectron = mp.solutions.objectron
mp_drawing = mp.solutions.drawing_utils

Виявлення 3D-об’єктів на статичних зображеннях за допомогою MediaPipe

Команда Objectron клас допускає декілька аргументів, зокрема:

  • static_image_mode: незалежно від того, подаєте ви зображення чи потік зображень (відео)
  • max_num_objects: Максимальна ідентифікована кількість об’єктів
  • min_detection_confidence: поріг достовірності виявлення (наскільки впевненою має бути мережа, щоб класифікувати об’єкт за даним класом)
  • model_name: Яку модель ви хочете завантажити між ними 'Cup', 'Shoe', 'Camera' та 'Chair'.

Маючи це на увазі, давайте створимо екземпляр Objectron і process() вхідне зображення:


objectron = mp_objectron.Objectron(
    static_image_mode=True,
    max_num_objects=5,
    min_detection_confidence=0.2,
    model_name='Cup')


results = objectron.process(mug)

Команда results містять двовимірні та тривимірні орієнтири виявлених об’єктів, а також обертання, переміщення та масштаб для кожного. Ми можемо обробити результати та досить легко намалювати обмежувальні рамки за допомогою наданих утиліт для малювання:

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

if not results.detected_objects:
    print(f'No box landmarks detected.')


annotated_image = mug.copy()
for detected_object in results.detected_objects:
    
    mp_drawing.draw_landmarks(annotated_image, 
                              detected_object.landmarks_2d, 
                              mp_objectron.BOX_CONNECTIONS)

    
    mp_drawing.draw_axis(annotated_image, 
                         detected_object.rotation, 
                         detected_object.translation)
  

fig, ax = plt.subplots(figsize=(10, 10))
ax.imshow(annotated_image)
ax.axis('off')
plt.show()

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

Виявлення 3D-об’єктів із відео чи веб-камери за допомогою MediaPipe

Більш захоплююче застосування на відео! Вам не потрібно сильно змінювати код, щоб розмістити відео, незалежно від того, надаєте ви відео з веб-камери чи наявного відеофайлу. OpenCV природно підходить для читання, обробки та подачі відеокадрів у модель objectron:


cap = cv2.VideoCapture(0)



objectron = mp_objectron.Objectron(static_image_mode=False,
                            max_num_objects=5,
                            min_detection_confidence=0.4,
                            min_tracking_confidence=0.70,
                            model_name='Cup')
                            

while cap.isOpened():
    success, image = cap.read()

    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = objectron.process(image)

    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    if results.detected_objects:
        for detected_object in results.detected_objects:
            
            mp_drawing.draw_landmarks(image, 
                                      detected_object.landmarks_2d, 
                                      mp_objectron.BOX_CONNECTIONS)
            
            mp_drawing.draw_axis(image, 
                                 detected_object.rotation,
                                 detected_object.translation)

    cv2.imshow('MediaPipe Objectron', cv2.flip(image, 1))
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Зробити зображення неможливим для запису за допомогою image.flags.writeable = False пришвидшує процес і є необов’язковою зміною. Останній cv2.flip() на отриманому зображенні також є необов’язковим – і просто робить вихід дзеркальним, щоб зробити його трохи більш інтуїтивно зрозумілим.

Якщо використовувати камеру та поширену в усьому світі кухоль Ikea, то результати:

Виявлення 3D-об’єктів (3D-обмежувальні рамки) у Python за допомогою MediaPipe Objectron PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Вихід трохи тремтить, але добре справляється з поворотним переміщенням, навіть коли камера з низькою роздільною здатністю тримається тремтячою рукою. Що відбувається, коли об’єкт виймають із рамки?

Виявлення 3D-об’єктів (3D-обмежувальні рамки) у Python за допомогою MediaPipe Objectron PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Прогнозування припиняється для об’єкта при першому виявленні, а відстеження прямокутника чітко визначає, що об’єкт покинув кадр, і виконує прогнозування та відстеження ще раз, як тільки об’єкт знову потрапляє в кадр. Схоже, що відстеження працює дещо краще, коли модель може бачити ручка кухля, оскільки результати більш тремтять, коли ручку не видно (імовірно, тому що важче точно визначити справжню орієнтацію кухля).

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

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

Висновок

Виявлення 3D-об’єктів все ще є дещо молодим, і Objectron від MediaPipe є спроможною демонстрацією! Незважаючи на те, що Objectron чутливий до умов освітлення, типів об’єктів (прозорі чи непрозорі кухлі тощо) і трохи тремтить, він є гарним уявленням про те, що незабаром стане можливим робити з більшою точністю та доступністю, ніж будь-коли.

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

Більше від Stackabuse