Найти в Дзене
LabelMe

Семантическая сегментация 150 классов объектов с помощью 5 строк кода

Оглавление

Для тех, кто впервые попал на наш канал, - давайте знакомиться. Мы - компания LabelMe. Мы занимаемся подготовкой датасетов и разметкой данных для машинного обучения и создания нейросетей. Дело это непростое и очень интересное и именно это мы доказываем в нашем блоге. Здесь вы можете почитать о разных библиотеках, алгоритмах, моделях, методах и так далее.

Сегодня мы решили уделить внимание оптимизации процесса разметки. Это наша основная специализация, а на канале слишком мало информации и лайфхаков по этой теме. Поэтому сегодня LabelMe расскажет про способ семантической сегментации по 150 классам с помощью всего 5 строк кода.

Это будет небольшая, но очень полезная на практике статья. Она сэкономит много сил и времени при подготовке ваших датасетов. Погнали.

Что нам потребуется

Нам потребуется ADE20K с PixelLib. ADE20K — набор изображений с размеченными сущностями, который хорошо подходит для задачи семантической сегментации данных в компьютерном зрении.

В нее встроена архитектура DeepLabv3+, которая служит своего рода фильтром, повышающим точность разметки и обучена на базе данных ADE20K. TensorFlow DeepLab Model Zoo позволяет извлечь сам ADE20K из его контрольной точки в модели TensorFlow. Поэтому первый шаг - установка нужных компонентов.

Установите последнюю версию TensorFlow (TensorFlow 2.0) с помощью:

  • pip3 install tensorflow

Установите Pixellib:

  • pip3 install pixellib — upgrade

Семантическая сегментация с помощью PixelLib

Код для семантической сегментации с помощью модели DeepLabv3 на базе ADE20K:

Давайте быстро пробежимся по каждой строчке кода:

import pixellib
from pixellib.semantic import semantic_segmentation segment_image = semantic_segmentation()

Класс для выполнения семантической сегментации импортируется из PixelLib, и мы создали экземпляр этого класса.

segment_image.load_ade20k_model («deeplabv3_xception65_ade20k.h5»)

В приведенном выше коде мы загрузили модель xception, обученную на ade20k для сегментирования объектов. Скачать ее можно отсюда.

segment_image.segmentAsAde20k(“path_to_image”, output_image_name = “path_to_output_image)

Мы загрузили функцию для сегментации изображения. Функция принимает два параметра:

  • path_to_image: - это путь к сегментированному изображению.
  • output_image_name: - это путь для сохранения сегментированного изображения. Оно будет сохранено в вашем текущем рабочем каталоге.

С помощью PixelLib можно выполнить семантическую сегментацию как внутренних, так и наружных сцен на базе модели Ade20k. Что однозначный плюс.

Примеры сегментирования

Чтобы лучше понимать, как всё устроено, предлагаем обратиться к конкретным примерам.

Пример 1

-2

Это наш источник, который мы будем сегментировать. После описанных описанных выше действий, мы получаем размеченное изображение.

-3

Если вам нужно сохранить читаемость объектов и деталей, то можно выполнить дополнительное наложение:

segment_image.segmentAsAde20k ("sample.jpg", output_image_name = "image_new.jpg", overlay = True)
-4

Мы добавили дополнительный параметр overlay и установили для него значение true. По итогу получаем изображение с наложением сегментации на объекты.

Пример 2

-5

Повторяем процедуру уже с другой картинкой и получаем семантическую сегментацию внутренней сцены.

segment_image.segmentAsAde20k («sample2.jpg», output_image_name = «image_new2.jpg»)
-6

Здесь возникает небольшой нюанс. PixelLib может потребовать от вас возврата массива результатов сегментации. Получить его можно с помощью этой функции:

segmap, output = segment_image.segmentAsAde20k ()

Вы можете протестировать код для получения массивов в ваших данных, скопировав форму вывода и изменив приведенный ниже код.

Или можно получить сразу и segmap, и массивы наложения сегментации с помощью этого кода:

segmap, seg_overlay = segment_image.segmentAsAde20k (overlay = True)

Сегментация видео на базе ADE20K

Несмотря на то, что сегментировать динамичные сцены в разы сложнее, описываемый метод отлично справляется с этой задачей. Как и всегда, начнем с кода:

Давайте также разберем каждую строку.

import pixellib
from pixellib.semantic import semantic_segmentation
segment_video = semantic_segmentation()

Здесь мы импортировали в класс для выполнения семантической сегментации и создали экземпляр класса.

segment_video.load_ade20k_model ("deeplabv3_xception65_ade20k.h5")

Здесь загрузили модель xception, обученную на наборе данных ADE20K для выполнения семантической сегментации (ее можно скачать здесь).

segment_video.process_video_ade20k("video_path", overlay = True, frames_per_second= 15, output_video_name="path_to_output_video")

Этим вызываем функцию для выполнения сегментации видеофайла. Она принимает следующие параметры:

  • video_path: это путь к видеофайлу, который мы хотим сегментировать.
  • frames_per_second: это параметр, используемый для установки количества кадров в секунду для сохраняемого видеофайла. В этом случае он установлен на 15 (то есть 15 fps).
  • output_video_name: это имя сохраненного сегментированного видео. Выходное видео будет сохранено в вашем текущем рабочем каталоге.

Это сохраненное сегментированное видео с уличных камер на основе модели ADE20K.

Мы можем использовать ту же модель для семантической сегментации на камере. Это можно сделать, добавив несколько модификаций в код, используемый для обработки видеофайла.

import cv2
capture = cv2.VideoCapture(0)

Мы импортировали cv2 и включили код для захвата кадров камеры.

segment_video.process_camera_ade20k(capture, overlay = True, frames_per_second= 15, output_video_name="output_video.mp4", show_frames= True,frame_name= "frame")

В коде для выполнения сегментации мы заменили путь к файлу видео: алгоритм обрабатывает видеопоток, захваченных камерой, а не видеофайл. Мы также добавили дополнительные параметры для потокового видео:

  • show_frames: этот параметр обрабатывает отображение сегментированных кадров камеры. Для этого нужно нажать q.
  • frame_name: это имя, данное отображаемому кадру камеры.

Пример того, как работает потоковое сегментирование можно посмотреть на видео ниже.

Заключение

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

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

Если же погрешности алгоритма для вас критические - вы можете обратиться к нам. LabelMe специализируется на размете данных и подготовке датасетов под ваших задачи. Штат обученных разметчиков легко справляется со всеми видами разметки:

  • анализом тональности,
  • определением сущностей в тексте,
  • транскрипцией речи,
  • категоризацией изображений,
  • транскрипцией рукописного текста,
  • выделением 2D и 2D объектов,
  • семантической сегментацией.

Сомневаетесь в качестве? Убедитесь в нем, не потратив ни рубля: LabelMe готовит тестовый датасет абсолютно бесплатно. Просто опишите задачу и мы покажем, на что способны.

Другие наши статьи:

Что-то пошло не так, и нам не удалось загрузить комментарии. Попробуйте ещё раз
Рекомендуем почитать
Тайная функция Word, которая сэкономит вам часы работы ⏳📄
Казалось бы, Microsoft Word изучен вдоль и поперек, но даже опытные пользователи часто не догадываются о скрытых возможностях, которые могут в разы ускорить работу с текстом. Сегодня я расскажу вам об одной такой функции, которая буквально перевернет ваше представление о редактировании документов! 🔗 Больше лайфхаков — в нашем телеграм-канале "Не баг, а фича"! Все знают про Ctrl + F, но мало кто использует «Расширенный поиск и замена» (Ctrl + H). А ведь это настоящая магия редактирования! ✅ Менять не просто слова, а целые форматы (например, все полужирные слова на курсив)...
🐍🏗️ Основы архитектуры для джунов: построение масштабируемых и чистых приложений на Python
Когда речь идет о создании масштабируемых и поддерживаемых приложений, понимание таких важных понятий, как принципы чистого кода, архитектурные паттерны и SOLID практики проектирования, имеет решающее значение. Изучив эти принципы, новички получат представление о построении надежных, гибких и легко тестируемых приложений, что позволит им сохранить ясность кодовой базы и возможность ее сопровождения по мере роста их проектов. Немного теории Прежде чем погрузиться в архитектуру, я хотел бы ответить...
Что такое HTTP, HTTPS, структура HTTP?
Очень частый вопрос на собеседованиях тестировщика. Давайте разберем его подробно. Описание: HTTP — это протокол прикладного уровня для передачи гипертекстовых документов, таких как HTML, по сети. Он является основой обмена данными в Интернете и работает по принципу запрос-ответ. Особенности: Статус-коды: HTTP использует статус-коды для обозначения результатов запросов (например, 200 OK, 404 Not Found). Методы: HTTP поддерживает различные методы запросов, такие как GET, POST, PUT, DELETE, HEAD и другие, каждый из которых имеет свое назначение...
Следующая статья
Документы, вакансии и контакты