Meet YOLO26: next-gen vision AI.

Link to this sectionКак изолировать сегментированные объекты с помощью Ultralytics YOLO#

Семантическая сегментация создает попиксельно точную маску для каждого обнаруженного объекта, что позволяет извлечь каждый объект из изображения отдельно. Это руководство показывает, как превратить результаты сегментации Ultralytics YOLO в изолированные объекты с помощью режима предсказания (Predict Mode) и OpenCV, используя либо сплошной черный фон, либо прозрачный для сохранения в формате PNG.



Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀

Link to this sectionЗачем изолировать сегментированные объекты?#

Извлечение отдельных объектов из изображения открывает ряд возможностей для дальнейшей обработки:

  • Удаление фона для фотографий товаров, каталогов или творческого редактирования.
  • Вырезание отдельных объектов для создания наборов данных классификации на основе твоих обнаружений.
  • Целенаправленная обработка, чтобы последующие шаги, такие как OCR, цветовой анализ или измерения, видели только сам объект, а не окружающую сцену.
  • Экспорт в прозрачный PNG для наложения объектов на новые фоны.

Этот метод работает с любой моделью сегментации Ultralytics YOLO и состоит из четырех этапов: запуск выводаизвлечение контура каждого объектаизоляция объектасохранение результата.

Link to this sectionЗапуск вывода сегментации#

Установи необходимые библиотеки, затем загрузи модель сегментации (суффикс -seg, необходимый для создания масок) и запусти предсказание на исходном изображении:

from ultralytics import YOLO

# Load a segmentation model
model = YOLO("yolo26n-seg.pt")

# Run inference on a source
results = model.predict(source="path/to/image.jpg")
Нет своего изображения? YOLO использует встроенные примеры

Если ты вызовешь model.predict() без параметра source, Ultralytics использует примеры изображений, поставляемые с пакетом (bus.jpg и zidane.jpg), что удобно для быстрой проверки рабочего процесса.

Link to this sectionИзвлечение контуров объектов#

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

Фрагменты кода в этом разделе и следующем выполняются внутри цикла обнаружения ниже; полный скрипт для копирования находится в Полном примере.

Изображение бинарной маски{ width="240", align="right" }

from pathlib import Path

import cv2
import numpy as np

for r in results:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem  # source image base-name

    # Iterate each detected object in the image
    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]  # class name

        # Build a binary mask and draw the object contour onto it
        b_mask = np.zeros(img.shape[:2], np.uint8)
        contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
        cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
Что делает `c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)`?
  • c.masks.xy[0] возвращает контур маски в виде координат точек (x, y) для объекта в этом конкретном результате обнаружения.
  • .astype(np.int32) преобразует точки из формата float32, который не принимает функция OpenCV drawContours().
  • .reshape(-1, 1, 2) меняет форму точек в макет [N, 1, 2], который ожидает drawContours(), где N — количество точек контура.

Передача [contour] с индексом -1 рисует все точки предоставленного контура, а cv2.FILLED заполняет белым цветом каждый заключенный внутрь пиксель.

Link to this sectionИзоляция объекта#

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

Выбери стиль изоляции

Преобразуй маску в три канала и оставь только те пиксели, которые перекрывают объект. Все, что находится вне контура, станет черным:

# Isolate object with a black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
![Example Full size Isolated Object Image Black Background](https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/full-size-isolated-object-black-background.avif){ width=240 }
Full-size object on a black background
Кадрирование по ограничивающей рамке (bbox)

Чтобы оставить только область объекта, а не полноразмерное изображение, обрежь его по ограничивающей рамке обнаружения:

# Bounding box coordinates
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
# Crop the isolated image to the object region
iso_crop = isolated[y1:y2, x1:x2]
![Example Crop Isolated Object Image Black Background](https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/example-crop-isolated-object-image-black-background.avif){ width=240 }
Object cropped to its bounding box
Нужен вырез с оригинальным фоном?

Это уже встроено. Передай save_crop=True в predict(), и Ultralytics автоматически сохранит обрезанные по рамке изображения, маскирование не требуется.

Link to this sectionСохранение результата (опционально)#

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

# Save the isolated object to file
cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)

Здесь img_name — это имя исходного файла, label — имя класса, а ci — индекс обнаружения, поэтому несколько экземпляров одного класса получают уникальные имена файлов. Замени isolated на iso_crop, если ты применил опциональное кадрирование выше.

Link to this sectionПолный пример#

Скрипт ниже объединяет каждый шаг в один запускаемый блок. По умолчанию используется черный фон; замени отмеченную строку на np.dstack([img, b_mask]) для получения прозрачного PNG:

from pathlib import Path

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo26n-seg.pt")
results = model.predict(source="path/to/image.jpg")

for r in results:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem

    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]

        # Build a binary mask from the object contour
        b_mask = np.zeros(img.shape[:2], np.uint8)
        contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
        cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)

        # Isolate the object (black background)
        mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
        isolated = cv2.bitwise_and(mask3ch, img)  # transparent PNG: isolated = np.dstack([img, b_mask])

        # Save or add your custom post-processing here
        cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)

        # Optional: crop to the bounding box before saving
        # x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
        # cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated[y1:y2, x1:x2])

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

Link to this sectionЗаключение#

Теперь у тебя есть полный рецепт для изоляции сегментированных объектов с помощью Ultralytics YOLO: запуск вывода, построение бинарной маски из каждого контура, затем извлечение объекта на черном или прозрачном фоне и опциональное кадрирование по ограничивающей рамке. Изучи полную документацию по задаче сегментации (Segment Task) и режиму предсказания (Predict Mode), чтобы адаптировать рабочий процесс под свои собственные классы.

Link to this sectionFAQ#

Link to this sectionКак мне изолировать объекты с помощью Ultralytics YOLO для задач сегментации?#

Загрузи модель сегментации, запусти вывод, построй бинарную маску из контура каждого обнаруженного объекта и объедини ее с исходным изображением:

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo26n-seg.pt")
results = model.predict(source="path/to/your/image.jpg")

img = np.copy(results[0].orig_img)
b_mask = np.zeros(img.shape[:2], np.uint8)
contour = results[0].masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)

mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)

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

Link to this sectionКакие варианты сохранения изолированных объектов доступны после сегментации?#

Есть два основных стиля. Для черного фона преобразуй маску в три канала и используй cv2.bitwise_and(). Для прозрачного фона (при сохранении в PNG) наложи маску как четвертый альфа-канал с помощью np.dstack([img, b_mask]). Оба способа показаны в разделе Изоляция объекта.

Link to this sectionКак я могу обрезать изолированные объекты по их ограничивающим рамкам?#

Считай координаты ограничивающей рамки из обнаружения и обрежь изолированное изображение:

x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
iso_crop = isolated[y1:y2, x1:x2]

Узнай больше о результатах ограничивающих рамок в документации Predict Mode.

Link to this sectionПочему мне стоит использовать Ultralytics YOLO для изоляции объектов в задачах сегментации?#

Ultralytics YOLO обеспечивает быструю сегментацию экземпляров в реальном времени с точной генерацией масок и ограничивающих рамок, а также простой API на Python, который превращает результаты вывода в изолированные объекты с помощью нескольких строк кода OpenCV.

Link to this sectionМогу ли я сохранить изолированные объекты вместе с фоном с помощью Ultralytics YOLO?#

Да. Используй аргумент save_crop в predict(), чтобы сохранить вырез по ограничивающей рамке вместе с исходным фоном:

results = model.predict(source="path/to/your/image.jpg", save_crop=True)

Читай больше в разделе Аргументы вывода режима предсказания (Predict Mode Inference Arguments).

Комментарии