콘텐츠로 건너뛰기

분할 객체 분리

분할 작업을 수행한 후 추론 결과에서 분리된 객체를 추출하는 것이 바람직할 때가 있습니다. 이 가이드는 Ultralytics 예측 모드를 사용하여 이를 수행하는 방법에 대한 일반적인 레시피를 제공합니다.

분리된 객체 분할 예시

레시피 둘러보기

  1. 필수 라이브러리 설치에 대한 빠른 안내는 Ultralytics 퀵스타트 설치 섹션을 참조하십시오.


  2. 모델을 로드하고 실행합니다. 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() 메서드에 대한 자세한 내용은 예측 모드 설명서 섹션.


  3. 이제 결과와 윤곽선을 반복합니다. 이미지를 파일에 저장하려는 워크플로우의 경우, 소스 이미지, 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()]
    
    1. 감지 결과 작업에 대한 자세한 내용은 예측 모드의 Boxes 섹션을 참조하십시오.
    2. 자세한 내용은 predict() 결과를 보려면 예측 모드 결과 작업
    For-Loop

    단일 이미지는 첫 번째 루프를 한 번만 반복합니다. 단일 감지만 있는 단일 이미지는 각 루프를 한 번만 반복합니다.


  4. 소스 이미지에서 바이너리 마스크를 생성한 다음 마스크에 채워진 윤곽선을 그리는 것으로 시작합니다. 이렇게 하면 객체를 이미지의 다른 부분과 분리할 수 있습니다. 다음의 예: 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)
    
    1. 자세한 내용은 c.masks.xy 다음을 참조하십시오. 예측 모드의 마스크 섹션.

    2. 여기서 값은 다음과 같이 캐스팅됩니다. np.int32 과의 호환성을 위해 drawContours() 함수: OpenCV.

    3. 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() 자세한 내용을 확인하세요.


  5. 다음으로 이 시점부터 이미지를 처리하는 방법에 대한 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]
    

    1. 바운딩 박스 결과에 대한 자세한 내용은 Predict 모드의 Boxes 섹션을 참조하십시오.
    이 코드는 무엇을 하나요?
    • 에 지정되어 있습니다. c.boxes.xyxy.cpu().numpy() 호출은 바운딩 박스를 NumPy 배열로 검색합니다. xyxy 형식으로, 여기서 xmin, ymin, xmaxymax 바운딩 박스 사각형의 좌표를 나타냅니다. 다음을 참조하십시오. 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]
    

    1. 바운딩 박스 결과에 대한 자세한 내용은 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 모드 추론 인수 자세한 내용은 참조하십시오.


  6. 다음에 수행할 작업은 개발자인 여러분에게 달려 있습니다. 가능한 다음 단계(나중에 사용하기 위해 이미지를 파일에 저장)의 기본 예제가 나와 있습니다.

    • 참고: 이 단계는 선택 사항이며 특정 사용 사례에 필요하지 않은 경우 건너뛸 수 있습니다.
    최종 단계 예시
    # 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)
  1. 채우는 라인 contour 여기서는 여러 줄로 분할되었던 내용이 한 줄로 결합됩니다.
  2. 여기에 무엇을 넣을지는 여러분에게 달려 있습니다!
  3. 자세한 내용은 Predict 모드를 참조하세요.
  4. 자세한 내용은 Segment Task를 참조하세요.
  5. 결과 작업에 대해 자세히 알아보세요.
  6. 분할 마스크 결과에 대해 자세히 알아보세요.

FAQ

분할 작업을 위해 Ultralytics YOLO11을 사용하여 객체를 어떻게 분리합니까?

Ultralytics YOLO11을 사용하여 객체를 분리하려면 다음 단계를 따르세요.

  1. 모델을 로드하고 추론을 실행합니다:

    from ultralytics import YOLO
    
    model = YOLO("yolo11n-seg.pt")
    results = model.predict(source="path/to/your/image.jpg")
    
  2. 이진 마스크를 생성하고 윤곽선을 그립니다:

    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)
    
  3. 이진 마스크를 사용하여 객체를 분리합니다:

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

자세한 내용은 Predict 모드Segment Task 가이드를 참조하세요.

분할 후 분리된 객체를 저장하는 데 사용할 수 있는 옵션은 무엇입니까?

Ultralytics YOLO11은 분리된 객체를 저장하는 두 가지 주요 옵션을 제공합니다.

  1. 검은색 배경 사용:

    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    isolated = cv2.bitwise_and(mask3ch, img)
    
  2. 투명한 배경 사용:

    isolated = np.dstack([img, b_mask])
    

자세한 내용은 Predict 모드 섹션을 참조하세요.

Ultralytics YOLO11을 사용하여 분리된 객체를 경계 상자로 어떻게 자릅니까?

분리된 객체를 경계 상자로 자르려면:

  1. 경계 상자 좌표를 검색합니다:

    x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
    
  2. 분리된 이미지를 자릅니다:

    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 모드 추론 인수 섹션에서 확인할 수 있습니다.



📅 1년 전에 생성됨 ✏️ 2개월 전에 업데이트됨

댓글