Обнаружение объектов RetinaNet с помощью PyTorch и Torchvision PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Обнаружение объектов RetinaNet с помощью PyTorch и torchvision

Введение

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

Обнаружение объектов не так стандартизировано, как классификация изображений, в основном потому, что большинство новых разработок обычно выполняются отдельными исследователями, сопровождающими и разработчиками, а не большими библиотеками и фреймворками. Трудно упаковать необходимые служебные сценарии в такую ​​​​инфраструктуру, как TensorFlow или PyTorch, и поддерживать рекомендации API, которые до сих пор руководили разработкой.

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

Обнаружение объектов с помощью PyTorch/TorchVision RetinaNet

torchvision является проектом PyTorch Computer Vision и направлен на упрощение разработки моделей CV на основе PyTorch за счет предоставления сценариев преобразования и дополнения, зоопарка моделей с предварительно обученными весами, наборами данных и утилитами, которые могут быть полезны для практикующего специалиста.

Пока все еще в бета-версии и очень экспериментально - torchvision предлагает относительно простой API обнаружения объектов с несколькими моделями на выбор:

  • Быстрее R-CNN
  • РетинаНет
  • FCOS (полностью сверточная RetinaNet)
  • SSD (магистраль VGG16… угу)
  • SSDLite (магистраль MobileNetV3)

Хотя API не такой отточенный или простой, как некоторые другие сторонние API, это очень достойная отправная точка для тех, кто по-прежнему предпочитает безопасность в знакомой им экосистеме. Прежде чем двигаться дальше, убедитесь, что вы установили PyTorch и Torchvision:

$ pip install torch torchvision

Давайте загрузим некоторые служебные функции, такие как read_image(), draw_bounding_boxes() и to_pil_image() чтобы упростить чтение, рисование и вывод изображений с последующим импортом RetinaNet и его предварительно обученных весов (MS COCO):

from torchvision.io.image import read_image
from torchvision.utils import draw_bounding_boxes
from torchvision.transforms.functional import to_pil_image
from torchvision.models.detection import retinanet_resnet50_fpn_v2, RetinaNet_ResNet50_FPN_V2_Weights

import matplotlib.pyplot as plt

RetinaNet использует магистраль ResNet50 и сеть функциональных пирамид (FPN) поверх нее. Хотя имя класса многословно, оно указывает на архитектуру. Давайте получим изображение, используя requests библиотеку и сохраните ее как файл на нашем локальном диске:

import requests
response = requests.get('https://i.ytimg.com/vi/q71MCWAEfL8/maxresdefault.jpg')
open("obj_det.jpeg", "wb").write(response.content)

img = read_image("obj_det.jpeg")

Имея изображение на месте, мы можем создать экземпляр нашей модели и весов:

weights = RetinaNet_ResNet50_FPN_V2_Weights.DEFAULT
model = retinanet_resnet50_fpn_v2(weights=weights, score_thresh=0.35)

model.eval()

preprocess = weights.transforms()

Ассоциация score_thresh Аргумент определяет порог, при котором объект определяется как объект класса. Интуитивно это порог достоверности, и мы не будем классифицировать объект как принадлежащий к классу, если модель менее чем на 35% уверена в том, что он принадлежит к классу.

Давайте предварительно обработаем изображение, используя преобразования из наших весов, создадим пакет и запустим вывод:

batch = [preprocess(img)]
prediction = model(batch)[0]

Вот оно, наше prediction словарь содержит предполагаемые классы объектов и местоположения! Теперь результаты не очень полезны для нас в этой форме — мы хотим извлечь метки относительно метаданных из весов и нарисовать ограничивающие рамки, что можно сделать с помощью draw_bounding_boxes():

labels = [weights.meta["categories"][i] for i in prediction["labels"]]

box = draw_bounding_boxes(img, boxes=prediction["boxes"],
                          labels=labels,
                          colors="cyan",
                          width=2, 
                          font_size=30,
                          font='Arial')

im = to_pil_image(box.detach())

fig, ax = plt.subplots(figsize=(16, 12))
ax.imshow(im)
plt.show()

Это приводит к:

RetinaNet действительно классифицировал человека, подглядывающего за машиной! Это довольно сложная классификация.

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

Вы можете переключить RetinaNet на FCOS (полностью сверточный RetinaNet), заменив retinanet_resnet50_fpn_v2 fcos_resnet50_fpn, и использовать FCOS_ResNet50_FPN_Weights вес:

from torchvision.io.image import read_image
from torchvision.utils import draw_bounding_boxes
from torchvision.transforms.functional import to_pil_image
from torchvision.models.detection import fcos_resnet50_fpn, FCOS_ResNet50_FPN_Weights

import matplotlib.pyplot as plt
import requests
response = requests.get('https://i.ytimg.com/vi/q71MCWAEfL8/maxresdefault.jpg')
open("obj_det.jpeg", "wb").write(response.content)

img = read_image("obj_det.jpeg")
weights = FCOS_ResNet50_FPN_Weights.DEFAULT
model = fcos_resnet50_fpn(weights=weights, score_thresh=0.35)
model.eval()

preprocess = weights.transforms()
batch = [preprocess(img)]
prediction = model(batch)[0]

labels = [weights.meta["categories"][i] for i in prediction["labels"]]

box = draw_bounding_boxes(img, boxes=prediction["boxes"],
                          labels=labels,
                          colors="cyan",
                          width=2, 
                          font_size=30,
                          font='Arial')

im = to_pil_image(box.detach())

fig, ax = plt.subplots(figsize=(16, 12))
ax.imshow(im)
plt.show()

Двигаясь дальше — практическое глубокое обучение компьютерному зрению

Ваша любознательная натура заставляет вас идти дальше? Рекомендуем ознакомиться с нашим "Курс": «Практическое глубокое обучение компьютерному зрению с помощью Python».

Обнаружение объектов RetinaNet с помощью PyTorch и Torchvision PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Еще один курс по компьютерному зрению?

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

Мы хотим сосредоточиться на демистификация, практичность, понимание, интуиция и реальные проекты. Хочу учиться КАК Вы можете внести разнообразие? Мы проведем вас от того, как наш мозг обрабатывает изображения, до написания классификатора глубокого обучения исследовательского уровня для рака молочной железы, до сетей глубокого обучения, которые «галлюцинируют», обучая вас принципам и теории посредством практической работы, вооружая вас ноу-хау и инструменты, чтобы стать экспертом в применении глубокого обучения для решения задач компьютерного зрения.

Что внутри?

  • Первые принципы зрения и как научить компьютеры «видеть»
  • Различные задачи и приложения компьютерного зрения
  • Ремесленные инструменты, которые облегчат вашу работу
  • Поиск, создание и использование наборов данных для компьютерного зрения
  • Теория и применение сверточных нейронных сетей
  • Обработка смещения домена, совпадения и других смещений в наборах данных
  • Передача обучения и использование времени обучения и вычислительных ресурсов других в ваших интересах
  • Создание и обучение современного классификатора рака молочной железы
  • Как применить здоровую дозу скептицизма к господствующим идеям и понять последствия широко распространенных методов
  • Визуализация «концептуального пространства» ConvNet с использованием t-SNE и PCA
  • Тематические исследования того, как компании используют методы компьютерного зрения для достижения лучших результатов
  • Правильная оценка модели, визуализация скрытого пространства и выявление внимания модели
  • Выполнение исследования предметной области, обработка ваших собственных наборов данных и создание модельных тестов
  • Передовые архитектуры, развитие идей, что делает их уникальными и как их реализовать
  • KerasCV — WIP-библиотека для создания современных пайплайнов и моделей.
  • Как разбирать и читать статьи и реализовывать их самостоятельно
  • Выбор моделей в зависимости от вашего применения
  • Создание сквозного конвейера машинного обучения
  • Ландшафт и интуиция при обнаружении объектов с помощью Faster R-CNN, RetinaNets, SSD и YOLO
  • Экземпляр и семантическая сегментация
  • Распознавание объектов в реальном времени с помощью YOLOv5
  • Обучение детекторам объектов YOLOv5
  • Работа с трансформерами с использованием KerasNLP (надежная библиотека WIP)
  • Интеграция Transformers с ConvNets для создания подписей к изображениям
  • DeepDream

Заключение

Обнаружение объектов — важная область компьютерного зрения, и, к сожалению, менее доступная, чем должна быть.

В этом кратком руководстве мы рассмотрели, как torchvision, пакет PyTorch Computer Vision, упрощает обнаружение объектов на изображениях с помощью RetinaNet.

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

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