Обнаружение 3D-объектов (3D-ограничивающие рамки) в Python с помощью MediaPipe Objectron PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Обнаружение 3D-объектов (3D-ограничивающие рамки) в Python с помощью MediaPipe Objectron

Введение

Обнаружение объектов набирает обороты, и в несколько подходов к его решению вносятся улучшения. За последние пару лет методы на основе YOLO превосходили другие с точки зрения точности и скорости благодаря недавним достижениям, таким как YOLOv7 и YOLOv6 (которые были выпущены независимо после YOLOv7).

Однако – все это касается Обнаружение 2D-объектов, что само по себе является сложной задачей. Недавно нам удалось успешно выступить Обнаружение 3D-объектов, и хотя эти детекторы все еще находятся на более нестабильной стадии, чем детекторы 2D-объектов, их точность растет.

В этом руководстве мы будем выполнять обнаружение 3D-объектов в Python с помощью Objectron MediaPipe.

Примечание: MediaPipe — это платформа Google с открытым исходным кодом для создания конвейеров машинного обучения для обработки изображений, видео и аудиопотоков, в первую очередь для мобильных устройств. Он используется как внутри, так и снаружи и предоставляет предварительно обученные модели для различных задач, таких как распознавание лиц, создание сетки лиц, оценка рук и позы, сегментация волос, обнаружение объектов, отслеживание ящиков и т. д.

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

В этом руководстве мы будем работать с Объектрон MediaPipe, доступен для Android, C++, Python и JavaScript.

MediaPipe и обнаружение 3D-объектов

Ассоциация Объектрон решение было обучено на Набор данных Объектрона, который содержит короткие объектно-ориентированные видеоролики. Набор данных содержит всего 9 объектов: велосипеды, книги, бутылки, фотоаппараты, коробки из-под хлопьев, стулья, чашки, ноутбуки и обувь, поэтому это не очень общий набор данных, но обработка и приобретение этих видео довольно дорогие (позы для камеры, редкие облака точек, характеристики плоских поверхностей и т. д. для каждого кадра каждого видео), в результате чего размер набора данных составляет почти 2 терабайта.

Обученная модель Объектрона (известная как Решение для проектов MediaPipe) обучается по четырем категориям – обувь, стулья, кружки и фотоаппараты.

При обнаружении 2D-объектов используется термин «ограничивающие рамки», хотя на самом деле они представляют собой прямоугольники. Обнаружение 3D-объектов фактически предсказывает коробки вокруг объектов, по которым вы можете сделать вывод об их ориентации, размере, примерном объеме и т. д. Это довольно сложная задача, особенно с учетом отсутствия соответствующих наборов данных и стоимости их создания. Несмотря на сложность, эта проблема имеет многообещающие перспективы для различных Augmented Reality (AR) Приложения!

Решение Objectron может работать в одноэтапном или двухэтапном режиме: одноэтапный режим лучше обнаруживает несколько объектов, а двухэтапный режим лучше обнаруживает один основной объект на сцене и значительно ускоряется. Быстрее. В одноэтапном конвейере используется магистральная сеть MobileNetV2, а в двухэтапном конвейере используется API обнаружения объектов TensorFlow.

Когда на видео обнаруживается объект, дальнейшие прогнозы для него не выполняются в каждом кадре по двум причинам:

  • Непрерывные прогнозы приводят к высокой нервозности (из-за присущей прогнозам стохастичности)
  • Запускать большие модели на каждом кадре дорого.

Команда распределяет сложные прогнозы только по первым встречам, а затем отслеживает этот ящик, пока рассматриваемый объект все еще находится на сцене. Как только линия зрения прерывается и объект снова вводится, прогноз делается снова. Это позволяет использовать более крупные модели с более высокой точностью, сохраняя при этом низкие вычислительные требования, а также снижает требования к аппаратному обеспечению для вывода в реальном времени!

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

Установка МедиаПайпа

Давайте сначала установим 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 содержат 2D и 3D ориентиры обнаруженного объекта(ов), а также вращение, перемещение и масштаб для каждого из них. Мы можем довольно легко обработать результаты и нарисовать ограничивающие рамки, используя предоставленные утилиты для рисования:

Ознакомьтесь с нашим практическим руководством по изучению 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 идеально подходит для чтения, манипулирования и подачи видеокадров в модель объектрона:


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. Вертикальный поиск. Ай.

Выходной сигнал немного дергается, но хорошо справляется с вращательным перемещением, даже если трясущейся рукой держать камеру с низким разрешением. Что происходит, когда объект вынимается из кадра?

Обнаружение 3D-объектов (3D-ограничивающие рамки) в Python с помощью MediaPipe Objectron PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

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

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

Заключение

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

Отметка времени:

Больше от Стекабьюс