분할 객체 분리
분할 작업을 수행한 후 추론 결과에서 분리된 객체를 추출하는 것이 바람직할 때가 있습니다. 이 가이드는 Ultralytics 예측 모드를 사용하여 이를 수행하는 방법에 대한 일반적인 레시피를 제공합니다.
레시피 둘러보기
-
필수 라이브러리 설치에 대한 빠른 안내는 Ultralytics 퀵스타트 설치 섹션을 참조하십시오.
-
모델을 로드하고 실행합니다.
predict()
소스에 대한 메서드from ultralytics import YOLO # Load a model model = YOLO("yolo11n-seg.pt") # Run inference results = model.predict()
예측 인수가 없습니까?
소스를 지정하지 않으면 라이브러리의 예제 이미지가 사용됩니다.
'ultralytics/assets/bus.jpg' 'ultralytics/assets/zidane.jpg'
이는 다음을 사용하여 빠른 테스트를 수행하는 데 유용합니다.
predict()
메서드.세분화 모델에 대한 추가 정보는 다음을 방문하십시오. 세분화 작업 페이지. 에 대해 자세히 알아보려면
predict()
메서드에 대한 자세한 내용은 예측 모드 설명서 섹션.
-
이제 결과와 윤곽선을 반복합니다. 이미지를 파일에 저장하려는 워크플로우의 경우, 소스 이미지,
base-name
및 감지class-label
은 나중에 사용하기 위해 검색됩니다(선택 사항).from pathlib import Path import numpy as np # (2) Iterate detection results (helpful for multiple images) for r in res: img = np.copy(r.orig_img) img_name = Path(r.path).stem # source image base-name # Iterate each object contour (multiple detections) for ci, c in enumerate(r): # (1) Get detection class name label = c.names[c.boxes.cls.tolist().pop()]
- 감지 결과 작업에 대한 자세한 내용은 예측 모드의 Boxes 섹션을 참조하십시오.
- 자세한 내용은
predict()
결과를 보려면 예측 모드 결과 작업
For-Loop
단일 이미지는 첫 번째 루프를 한 번만 반복합니다. 단일 감지만 있는 단일 이미지는 각 루프를 한 번만 반복합니다.
-
소스 이미지에서 바이너리 마스크를 생성한 다음 마스크에 채워진 윤곽선을 그리는 것으로 시작합니다. 이렇게 하면 객체를 이미지의 다른 부분과 분리할 수 있습니다. 다음의 예:
bus.jpg
에서 감지된 항목 중 하나에 대해person
클래스 객체가 오른쪽에 표시됩니다.import cv2 # Create binary mask b_mask = np.zeros(img.shape[:2], np.uint8) # (1) Extract contour result contour = c.masks.xy.pop() # (2) Changing the type contour = contour.astype(np.int32) # (3) Reshaping contour = contour.reshape(-1, 1, 2) # Draw contour onto mask _ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
-
자세한 내용은
c.masks.xy
다음을 참조하십시오. 예측 모드의 마스크 섹션. -
여기서 값은 다음과 같이 캐스팅됩니다.
np.int32
과의 호환성을 위해drawContours()
함수: OpenCV. -
OpenCV
drawContours()
함수는 윤곽선이 다음과 같은 모양을 가질 것으로 예상합니다.[N, 1, 2]
자세한 내용은 아래 섹션을 확장하십시오.
다음을 정의할 때 발생하는 상황을 이해하려면 확장하십시오.
contour
변수.-
c.masks.xy
:: 마스크 윤곽선 점의 좌표를 다음 형식으로 제공합니다.(x, y)
. 자세한 내용은 다음을 참조하십시오. 예측 모드의 마스크 섹션. -.pop()
:: 다음과 같이masks.xy
는 단일 요소를 포함하는 목록이며, 이 요소는 다음을 사용하여 추출됩니다.pop()
메서드입니다. -.astype(np.int32)
:: 사용masks.xy
는 데이터 유형으로 반환됩니다.float32
, 하지만 OpenCV와 호환되지 않습니다.drawContours()
함수를 사용하므로 데이터 유형이 다음과 같이 변경됩니다.int32
호환성을 위해 -.reshape(-1, 1, 2)
:: 데이터를 필요한 모양으로 재구성합니다.[N, 1, 2]
여기서N
는 윤곽선 점의 수이며, 각 점은 단일 항목으로 표시됩니다.1
, 항목은 다음으로 구성됩니다.2
값입니다.-1
는 이 차원을 따라 있는 값의 수가 유동적임을 나타냅니다.다음에 대한 설명을 보려면 확장하십시오.
drawContours()
구성.- 다음을 캡슐화합니다.
contour
대괄호 안의 변수[contour]
, 테스트 중 원하는 윤곽 마스크를 효과적으로 생성하는 것으로 확인되었습니다. - 값-1
다음에 대해 지정됨drawContours()
파라미터는 이미지에 있는 모든 윤곽선을 그리도록 함수에 지시합니다. -tuple
(255, 255, 255)
는 흰색을 나타내며, 이는 이진 마스크에서 윤곽선을 그리는 데 원하는 색상입니다. - 다음의 추가cv2.FILLED
윤곽선 경계로 둘러싸인 모든 픽셀을 동일한 색상으로 칠합니다. 이 경우 둘러싸인 모든 픽셀이 흰색이 됩니다. - 다음 참조 OpenCV 문서에서drawContours()
자세한 내용을 확인하세요.
-
-
다음으로 이 시점부터 이미지를 처리하는 방법에 대한 2가지 옵션과 각 옵션에 대한 후속 옵션이 있습니다.
객체 분리 옵션
예시
# Create 3-channel mask mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) # Isolate object with binary mask isolated = cv2.bitwise_and(mask3ch, img)
이것은 어떻게 작동합니까?
-
먼저 이진 마스크가 단일 채널 이미지에서 3채널 이미지로 변환됩니다. 이 변환은 마스크와 원본 이미지를 결합하는 후속 단계에 필요합니다. 두 이미지는 블렌딩 작업과 호환되려면 동일한 수의 채널을 가져야 합니다.
-
원본 이미지와 3채널 이진 마스크는 OpenCV 함수를 사용하여 병합됩니다.
bitwise_and()
. 이 작업은 다음을 유지합니다. 다음만 0보다 큰 픽셀 값(> 0)
두 이미지에서. 마스크 픽셀이 0보다 크므로(> 0)
다음만 윤곽선 영역 내에서 원본 이미지에서 남은 픽셀은 윤곽선과 겹치는 픽셀입니다.
검은색 픽셀로 분리: 하위 옵션
전체 크기 이미지
전체 크기 이미지를 유지하는 경우 추가 단계가 필요하지 않습니다.
전체 크기 출력 예시 잘린 객체 이미지
이미지를 잘라 객체 영역만 포함하려면 추가 단계가 필요합니다.
# (1) Bounding box coordinates x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32) # Crop image to object region iso_crop = isolated[y1:y2, x1:x2]
- 바운딩 박스 결과에 대한 자세한 내용은 Predict 모드의 Boxes 섹션을 참조하십시오.
이 코드는 무엇을 하나요?
-
에 지정되어 있습니다.
c.boxes.xyxy.cpu().numpy()
호출은 바운딩 박스를 NumPy 배열로 검색합니다.xyxy
형식으로, 여기서xmin
,ymin
,xmax
및ymax
바운딩 박스 사각형의 좌표를 나타냅니다. 다음을 참조하십시오. Predict 모드의 Boxes 섹션 를 참조하세요. -
에 지정되어 있습니다.
squeeze()
작업은 NumPy 배열에서 불필요한 차원을 제거하여 예상되는 모양을 갖도록 합니다. -
다음을 사용하여 좌표 값을 변환하면
.astype(np.int32)
상자 좌표 데이터 유형이 다음과 같이 변경됩니다.float32
에서int32
, 인덱스 슬라이스를 사용하여 이미지를 자르는 데 호환되도록 합니다. -
마지막으로, 인덱스 슬라이싱을 사용하여 바운딩 박스 영역을 이미지에서 자릅니다. 경계는
[ymin:ymax, xmin:xmax]
검출 바운딩 박스의 좌표로 정의됩니다.
# Isolate object with transparent background (when saved as PNG) isolated = np.dstack([img, b_mask])
이것은 어떻게 작동합니까?
- NumPy를 사용하여
dstack()
함수(깊이 축을 따라 배열 스태킹)를 생성된 이진 마스크와 함께 사용하면 4개의 채널이 있는 이미지가 생성됩니다. 이를 통해 객체 윤곽선 외부의 모든 픽셀을 투명하게 하여 다음으로 저장할 수 있습니다.PNG
파일.
투명 픽셀로 분리: 하위 옵션
전체 크기 이미지
전체 크기 이미지를 유지하는 경우 추가 단계가 필요하지 않습니다.
전체 크기 출력 예시 + 투명 배경 잘린 객체 이미지
이미지를 잘라 객체 영역만 포함하려면 추가 단계가 필요합니다.
# (1) Bounding box coordinates x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32) # Crop image to object region iso_crop = isolated[y1:y2, x1:x2]
- 바운딩 박스 결과에 대한 자세한 내용은 Predict 모드의 박스 섹션을 참조하세요.
이 코드는 무엇을 하나요?
-
사용 시
c.boxes.xyxy.cpu().numpy()
, 바운딩 박스는 NumPy 배열로 반환되며, 다음을 사용하는xyxy
박스 좌표 형식은 점에 해당합니다.xmin, ymin, xmax, ymax
바운딩 박스(사각형)에 대해서는 다음을 참조하세요. Predict 모드의 Boxes 섹션 자세한 내용을 확인하세요. -
추가하면
squeeze()
NumPy 배열에서 불필요한 차원을 제거할 수 있습니다. -
다음을 사용하여 좌표 값을 변환하면
.astype(np.int32)
상자 좌표 데이터 유형이 다음과 같이 변경됩니다.float32
에서int32
인덱스 슬라이스를 사용하여 이미지를 자를 때 호환됩니다. -
마지막으로 바운딩 박스에 대한 이미지 영역은 인덱스 슬라이싱을 사용하여 잘리고, 경계는 다음을 사용하여 설정됩니다.
[ymin:ymax, xmin:xmax]
검출 바운딩 박스의 좌표로 정의됩니다.
배경 포함 객체를 자르려면 어떻게 해야 할까요?
Ultralytics 라이브러리의 내장 기능입니다. 다음의
save_crop
인수에 대해서는 Predict 모드 추론 인수 자세한 내용은 참조하십시오.
-
-
다음에 수행할 작업은 개발자인 여러분에게 달려 있습니다. 가능한 다음 단계(나중에 사용하기 위해 이미지를 파일에 저장)의 기본 예제가 나와 있습니다.
- 참고: 이 단계는 선택 사항이며 특정 사용 사례에 필요하지 않은 경우 건너뛸 수 있습니다.
최종 단계 예시
# Save isolated object to file _ = cv2.imwrite(f"{img_name}_{label}-{ci}.png", iso_crop)
- 이 예에서
img_name
은 소스 이미지 파일의 기본 이름이고,label
은 감지된 클래스 이름이며,ci
은 객체 감지 의 인덱스입니다(동일한 클래스 이름의 여러 인스턴스가 있는 경우).
전체 예제 코드
여기서는 이전 섹션의 모든 단계가 단일 코드 블록으로 결합됩니다. 반복적으로 사용하는 경우 for
-루프에 포함된 일부 또는 모든 명령을 수행하는 함수를 정의하는 것이 최적이지만, 이는 독자를 위한 연습으로 남겨둡니다.
from pathlib import Path
import cv2
import numpy as np
from ultralytics import YOLO
m = YOLO("yolo11n-seg.pt") # (4)!
res = m.predict() # (3)!
# Iterate detection results (5)
for r in res:
img = np.copy(r.orig_img)
img_name = Path(r.path).stem
# Iterate each object contour (6)
for ci, c in enumerate(r):
label = c.names[c.boxes.cls.tolist().pop()]
b_mask = np.zeros(img.shape[:2], np.uint8)
# Create contour mask (1)
contour = c.masks.xy.pop().astype(np.int32).reshape(-1, 1, 2)
_ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
# Choose one:
# OPTION-1: Isolate object with black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
# OPTION-2: Isolate object with transparent background (when saved as PNG)
isolated = np.dstack([img, b_mask])
# OPTIONAL: detection crop (from either OPT1 or OPT2)
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
iso_crop = isolated[y1:y2, x1:x2]
# TODO your actions go here (2)
- 채우는 라인
contour
여기서는 여러 줄로 분할되었던 내용이 한 줄로 결합됩니다. - 여기에 무엇을 넣을지는 여러분에게 달려 있습니다!
- 자세한 내용은 Predict 모드를 참조하세요.
- 자세한 내용은 Segment Task를 참조하세요.
- 결과 작업에 대해 자세히 알아보세요.
- 분할 마스크 결과에 대해 자세히 알아보세요.
FAQ
분할 작업을 위해 Ultralytics YOLO11을 사용하여 객체를 어떻게 분리합니까?
Ultralytics YOLO11을 사용하여 객체를 분리하려면 다음 단계를 따르세요.
-
모델을 로드하고 추론을 실행합니다:
from ultralytics import YOLO model = YOLO("yolo11n-seg.pt") results = model.predict(source="path/to/your/image.jpg")
-
이진 마스크를 생성하고 윤곽선을 그립니다:
import cv2 import numpy as np 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)
자세한 내용은 Predict 모드 및 Segment Task 가이드를 참조하세요.
분할 후 분리된 객체를 저장하는 데 사용할 수 있는 옵션은 무엇입니까?
Ultralytics YOLO11은 분리된 객체를 저장하는 두 가지 주요 옵션을 제공합니다.
-
검은색 배경 사용:
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) isolated = cv2.bitwise_and(mask3ch, img)
-
투명한 배경 사용:
isolated = np.dstack([img, b_mask])
자세한 내용은 Predict 모드 섹션을 참조하세요.
Ultralytics YOLO11을 사용하여 분리된 객체를 경계 상자로 어떻게 자릅니까?
분리된 객체를 경계 상자로 자르려면:
-
경계 상자 좌표를 검색합니다:
x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
-
분리된 이미지를 자릅니다:
iso_crop = isolated[y1:y2, x1:x2]
Predict 모드 문서에서 경계 상자 결과에 대해 자세히 알아보세요.
분할 작업에서 객체 분리를 위해 Ultralytics YOLO11을 사용해야 하는 이유는 무엇입니까?
Ultralytics YOLO11은 다음을 제공합니다:
- 고속 실시간 객체 감지 및 분할.
- 정확한 객체 분리를 위한 정확한 경계 상자 및 마스크 생성.
- 효율적인 개발을 위한 포괄적인 문서 및 사용하기 쉬운 API.
Segment Task 문서에서 YOLO 사용의 이점을 살펴보세요.
Ultralytics YOLO11을 사용하여 배경을 포함한 분리된 객체를 저장할 수 있습니까?
예, Ultralytics YOLO11에 내장된 기능입니다. 다음을 사용하세요. save_crop
인수의 predict()
메서드. 예:
results = model.predict(source="path/to/your/image.jpg", save_crop=True)
다음에 대해 자세히 알아보세요. save_crop
인수의 Predict 모드 추론 인수 섹션에서 확인할 수 있습니다.