Сегментация с помощью одноточечных аннотаций по графам?

У меня есть набор данных, которые я пытаюсь сегментировать. Для каждого изображения в наборе данных эксперты случайно выбрали отдельные пиксели/точки и добавили аннотации классов к тому классу, к которому принадлежит этот пиксель. Другими словами, каждое изображение будет иметь около 60 точек, помеченных таким образом:

x, y, class

Как я могу лучше всего использовать знания этих одиночных аннотаций пикселей для выполнения хорошей семантической сегментации?

Ранее задавался аналогичный вопрос, и ответ заключался в использовании сокращений графа:

"hard" контроль сегментации изображений с помощью python

Графические сокращения в теории кажутся хорошим кандидатом, но будут ли сокращения графов работать с аннотациями с одним пикселем? Кроме того, существуют ли методы работы с многоклассовым набором данных? Если да, есть ли хорошая реализация библиотеки или какие-то хорошие ресурсы для этого?

Если нет, какой метод лучше всего подходит для этого сценария? Я немного играл со случайными блужданиями, но в результате сегментации была плохая локализация края (чрезвычайно закругленные края).

Любая помощь, ресурсы или примеры, которые вы можете дать, будут очень оценены (желательно с библиотеками python, но я действительно могу работать с чем-либо).

EDIT: В моем наборе данных имеется около 10 различных классов, каждое изображение, вероятно, имеет около 5 в среднем. Аннотаторам не гарантируется аннотация каждой религии, но редко можно пропустить один (несколько недостающих регионов или неправильно обозначенные регионы являются допустимыми). Каждый из классов соответствует текстурно однородным областям, а текстуры довольно постоянны (думайте небо, грязь, вода, гора). Вы не можете получить текстуру из одной точки, но почти во всех регионах должны быть аннотированы несколько точек.

Ответ 1

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


Подход №1: используйте плотные дескрипторы

  • Вычислить плотные дескрипторы изображений (например, SIFT/HOG/Gabor или даже лучше использовать предварительно подготовленную глубокую сетку, например VGG).
  • Возьмите дескрипторы из всех изображений только из аннотированных мест: у вас должны быть дескрипторы ~ 10K с метками класса. Настройте простой классификатор (например, SVM) на этом наборе.
  • Вернитесь к изображениям: примените классификатор и выведите лог-вероятность для каждого пикселя, принадлежащего каждому из классов. Это должен быть унарный термин (иначе называемый "термин данных" ) для вырезания графа.
  • Локально изменить унарный термин, чтобы заставить аннотированные точки принадлежать правому классу.
  • Используйте простой парный термин (градиенты изображения или некоторый термин, основанный на краю).
  • Примените Graph-Cut, чтобы получить семантическую сегментацию.

Подход №2: тренируйте собственную модель семантической сегментации

Для обучения полностью сверточной модели для сегментации вам необязательно иметь метки для всех пикселей. У вас может быть "ignore_label": пиксель, помеченный этой меткой, игнорируется и не вносит вклад в потерю.
Ваш случай - крайний случай "ignore_label" - у вас есть только ~ 60 пикселей, помеченных на изображение. Тем не менее, может быть интересно посмотреть, что вы можете узнать с такой разреженной информацией.

Подумав об этом, вы получите больше информации на изображение, чем только отмеченные точки:

В моем наборе данных имеется около 10 различных классов, каждое изображение, вероятно, имеет около 5 в среднем

Смысл в том, что если у изображения есть метки для классов 1..5, вы знаете, что он не содержит классов 6..10 (!) У вас может быть "положительный термин" в убытке, приписывая очень немногие помеченные пиксели вправо классов и отрицательный термин "для всех остальных пикселей, которые наказывают, если они назначены классам, которые вообще не присутствуют на изображении.