Skip to content
Tutorials4 min read

Разметка полигонами для задач сегментации

Настройка инструментов рисования полигонов в Potato для сегментации изображений: советы по сложным формам, перекрывающимся областям, многоклассовым полигонам и экспорту в COCO.

Potato Team

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

Полигоны против ограничивающих рамок

Полигоны, когдаРамки, когда
Нужны точные границыДостаточно грубой локализации
Формы объектов неправильныеОбъекты примерно прямоугольные
Обучаете модели сегментацииОбучаете модели детекции
Объекты перекрываютсяОбъекты не перекрываются
Нужна высокая точностьВажнее скорость

Базовая настройка полигонов

yaml
annotation_task_name: "Image Segmentation"
 
data_files:
  - "data/images.json"
 
annotation_schemes:
  - annotation_type: image_annotation
    tools: [polygon]
    name: segments
    description: "Draw polygons around each object"
    labels:
      - name: road
        color: "#808080"
      - name: sidewalk
        color: "#F5F5DC"
      - name: building
        color: "#8B4513"
      - name: vegetation
        color: "#228B22"
      - name: sky
        color: "#87CEEB"
      - name: vehicle
        color: "#FF6B6B"
      - name: person
        color: "#4ECDC4"

Как рисовать полигоны

Основной порядок

  1. Выберите метку на панели инструментов
  2. Кликами расставьте вершины вокруг объекта
  3. Двойным кликом или клавишей Enter замкните полигон
  4. Перетаскивайте вершины, чтобы их поправить
  5. Кликните по ребру, чтобы добавить точку

Горячие клавиши

В Potato есть сочетания для редактирования полигонов:

  • Enter — замкнуть текущий полигон
  • Escape — отменить рисование или снять выделение
  • Delete — удалить выделенную вершину или полигон
  • +/− — приблизить и отдалить
  • Пробел с перетаскиванием — двигать изображение

Когда всё усложняется

Перекрывающиеся объекты

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

Неудобные границы

Для объектов с изломанными, изогнутыми границами:

  1. Ставьте больше вершин на изгибах, чтобы форма вышла точной
  2. Приблизьте изображение, прежде чем обводить мелкие детали
  3. Идите по периметру по порядку, а не скачками
  4. Потом переключитесь в режим правки и подвиньте вершины на место

Настройка семантической сегментации

Для сегментации изображения целиком:

yaml
annotation_task_name: "Semantic Segmentation"
 
data_files:
  - "data/images.json"
 
annotation_schemes:
  - annotation_type: image_annotation
    tools: [polygon]
    name: semantic_segments
    description: "Segment the entire image"
    labels:
      - name: background
        color: "#000000"
      - name: road
        color: "#808080"
      - name: sidewalk
        color: "#F5F5DC"
      - name: building
        color: "#8B4513"
      - name: vegetation
        color: "#228B22"
      - name: sky
        color: "#87CEEB"
      - name: person
        color: "#4ECDC4"
      - name: vehicle
        color: "#FF6B6B"

Настройка сегментации экземпляров

Для отдельных экземпляров объектов:

yaml
annotation_task_name: "Instance Segmentation"
 
data_files:
  - "data/images.json"
 
annotation_schemes:
  - annotation_type: image_annotation
    tools: [polygon]
    name: instances
    description: "Draw polygons around each object instance"
    labels:
      - name: person
        color: "#4ECDC4"
      - name: car
        color: "#FF6B6B"
      - name: dog
        color: "#FFEAA7"

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

Полный пример конфигурации

yaml
annotation_task_name: "Cityscapes-style Segmentation"
 
data_files:
  - "data/urban_scenes.json"
 
annotation_schemes:
  - annotation_type: image_annotation
    tools: [polygon]
    name: segments
    description: "Segment all objects following Cityscapes protocol"
    labels:
      # Flat
      - name: road
        color: "#804080"
      - name: sidewalk
        color: "#F423E8"
      # Construction
      - name: building
        color: "#464646"
      - name: wall
        color: "#666666"
      - name: fence
        color: "#BE9999"
      # Nature
      - name: vegetation
        color: "#6B8E23"
      - name: terrain
        color: "#98FB98"
      # Sky
      - name: sky
        color: "#4682B4"
      # Human
      - name: person
        color: "#DC143C"
      - name: rider
        color: "#FF0000"
      # Vehicle
      - name: car
        color: "#00008B"
      - name: truck
        color: "#000046"
      - name: bus
        color: "#003C64"
      - name: motorcycle
        color: "#0000E6"
      - name: bicycle
        color: "#770B20"

Формат вывода

Разметка полигонами попадает в вывод с координатами каждой вершины:

json
{
  "id": "img001",
  "annotations": {
    "segments": [
      {
        "label": "road",
        "points": [[0, 600], [100, 580], [200, 590], [0, 600]]
      },
      {
        "label": "car",
        "points": [[450, 400], [520, 400], [520, 480], [450, 480]]
      }
    ]
  }
}

Советы по аккуратным полигонам

  1. Приближайте изображение вдвое и больше, когда обводите детальные границы.
  2. Выучите горячие клавиши. Это гораздо быстрее, чем тянуться к панели инструментов.
  3. Сначала набросайте грубый контур, потом вернитесь и уточните его.
  4. Обходитесь наименьшим числом вершин, которое всё ещё передаёт форму. Больше не значит лучше.
  5. Делайте перерывы. Детальная работа с полигонами выматывает быстро.

Что дальше

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


Полная документация по полигонам — в разметке изображений.