Найти тему
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 готовит тестовый датасет абсолютно бесплатно. Просто опишите задачу и мы покажем, на что способны.

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