YOLO의 구조 이해하기, YOLO의 앵커 박스(Anchor Boxes)와 그 역할

YOLO(You Only Look Once)는 물체 감지 분야에서 널리 사용되는 딥러닝 모델 중 하나로, 실시간 속도와 높은 정확성이라는 두 가지 특성을 모두 갖춘 모델입니다. YOLO의 구조를 이해하는 것은 물체 감지 기술을 심층적으로 이해하고, 이를 바탕으로 보다 정교한 애플리케이션을 개발하는 데 매우 중요합니다.

YOLO 모델의 기본 구조

YOLO 모델은 전통적인 물체 감지 기법과는 다르게 입력 이미지를 한 번에 처리하여 물체를 탐지합니다. 이를 위해 YOLO는 CNN(Convolutional Neural Network)을 기반으로 한 구조를 가지고 있으며, 주어진 입력 이미지를 여러 그리드로 나누고 각 그리드에서 물체를 예측합니다.

1. 입력 이미지 분할

입력 이미지는 먼저 일정한 크기로 조정되고 분할됩니다. YOLO는 이미지를 S x S 그리드로 나눈 다음 각 그리드 셀에서 물체를 감지합니다. 각 그리드 셀은 자신이 격리된 영역 내의 물체를 감지할 책임이 있습니다.

2. 바운딩 박스 예측

각 그리드 셀은 바운딩 박스를 예측합니다. 바운딩 박스는 물체의 위치와 크기를 나타냅니다. 각 바운딩 박스는 4개의 좌표(x, y, w, h)와 그 박스 안에 물체가 존재할 확률, 그리고 물체의 클래스 확률을 포함합니다.

3. 최종 출력

YOLO 함수는 모든 그리드 셀로부터 예측된 바운딩 박스와 클래스 확률을 결합하여 최종 출력으로 제공합니다. 이 단계에서는 Non-Maximum Suppression(NMS) 기법을 통해 중복된 박스를 제거하고 최종적으로 가장 확실한 박스만 남깁니다.

YOLO의 앵커 박스(Anchor Boxes)와 그 역할

앵커 박스는 YOLO 모델에서 물체 감지의 정확성을 높이기 위해 사용되는 미리 정의된 바운딩 박스의 세트를 각각의 그리드 셀에 할당하는 기술입니다. 앵커 박스는 다양한 스케일과 비율을 갖고 있어, 다양한 형태와 크기의 물체를 효과적으로 감지할 수 있도록 도와줍니다.

1. 앵커 박스의 개념

앵커 박스는 사용자가 미리 정의한 바운딩 박스입니다. 이 바운딩 박스들은 물체의 크기와 비율에 대한 사전 정보를 기반으로 설정됩니다. 예를 들어, 길쭉한 형태의 물체가 많은 데이터셋이라면, 그에 맞춘 긴 직사각형 형태의 앵커 박스를 설정할 수 있습니다.

2. 앵커 박스의 역할

앵커 박스는 다음과 같은 역할을 수행합니다:

  • 다양한 물체 감지: 다양한 크기와 비율의 물체를 효과적으로 탐지할 수 있도록 도와줍니다.
  • 정확한 위치 예측: 실제 물체의 위치에 맞추어 앵커 박스를 조정함으로써 더욱 정확한 위치 예측이 가능해집니다.
  • 학습 효율 향상: 다양한 앵커 박스를 통해 실제 물체의 다양성을 반영한 데이터를 생성함으로써 모델 학습의 효율성을 높입니다.

3. 앵커 박스 설정 방법

YOLO에서는 보통 K-means 클러스터링 기법을 사용하여 앵커 박스를 설정합니다. 이 방법은 훈련 데이터에서 각 물체의 크기와 비율을 분석하여 가장 효과적인 앵커 박스를 정의합니다.

예제 코드

아래는 YOLOv3 모델에서 앵커 박스를 생성하는 예제 코드입니다. TensorFlow와 Keras를 기반으로 하며, 데이터셋은 COCO 데이터셋을 사용합니다.


import numpy as np
import cv2
from sklearn.cluster import KMeans

# 바운딩 박스의 너비와 높이 정의: (width, height) 형식
bounding_boxes = [
    [116, 90], [156, 198], [373, 326], 
    [30, 61], [62, 45], [59, 119], 
    [10, 13], [20, 30], [60, 62]
]

# K-means 클러스터링을 사용하여 앵커 박스 생성
num_clusters = 9  # 앵커 박스의 수
kmeans = KMeans(n_clusters=num_clusters)

# 데이터를 K-means에 맞추어 앵커 박스 생성
kmeans.fit(bounding_boxes)
anchors = kmeans.cluster_centers_

# 앵커 박스 출력
print("Generated Anchor Boxes:")
for anchor in anchors:
    print(f"Width: {anchor[0]}, Height: {anchor[1]}")

4. 앵커 박스의 효과

앵커 박스를 통해 YOLO 모델은 보다 다양한 물체를 신속하게 감지하면서도 성능을 유지할 수 있습니다. 따라서, 다양한 앵커 박스를 정의하는 것이 모델 성능에 중요한 영향을 미치는 요소가 됩니다.

결론

YOLO 모델은 물체 감지 기술의 혁신을 가져온 모델입니다. YOLO의 구조와 앵커 박스의 개념을 이해하는 것은 물체 감지 수행의 첫 걸음입니다. 각 단계를 정확하게 이해하고, 실험을 통해 최적의 앵커 박스를 찾아가는 과정은 더욱 정확하고 효율적인 물체 감지 시스템을 구축하는 데 큰 도움이 될 것입니다.

YOLO는 계속 발전하고 있으며, 새로운 버전들이 계속 제안되고 있습니다. 이러한 기술들은 물체 감지 뿐만 아니라 다양한 분야에서도 응용될 수 있기 때문에, YOLO와 관련된 기술들을 지속적으로 학습하고 연구하는 것이 중요합니다.

다음 강좌에서는 YOLO 모델을 활용한 실제 프로젝트에 대해 다루어보겠습니다. 많은 기대 부탁드립니다!

YOLO의 다양한 버전 이해하기, 각 버전의 장단점과 적합한 사용 사례 비교

YOLO(You Only Look Once)는 객체 탐지 분야에서 가장 널리 알려진 알고리즘 중 하나로, 단일 신경망을 통해 이미지를 분할하고 탐지하는 방식으로, 이전의 방법들보다 훨씬 빠르고 효율적입니다. YOLO는 여러 버전으로 발전하여 각 버전마다 특징과 장단점이 있습니다. 본 글에서는 YOLO의 다양한 버전을 비교하고 각 버전의 적합한 사용 사례를 논의하겠습니다.

1. YOLO의 발전 과정

YOLO는 처음 2015년 Joseph Redmon이 발표한 논문에서 소개되었습니다. 이후 YOLO의 발전 과정은 다음과 같은 주요 버전으로 나눌 수 있습니다:

  • YOLOv1
  • YOLOv2 (YOLO9000)
  • YOLOv3
  • YOLOv4
  • YOLOv5
  • YOLOv6
  • YOLOv7

2. YOLOv1 (2015)

YOLO의 첫 번째 버전은 단일 신경망을 사용하여 이미지를 슬라이스 없이 한 번에 처리하는 구조입니다. 이 인사이트는 이미지 전체를 격자(grid)로 나눈 후 각 격자 내의 객체를 탐지하는 방식을 기반으로 합니다.

장점

  • 전통적인 방법에 비해 빠른 속도
  • 실시간 객체 탐지가 가능

단점

  • 작은 객체 탐지의 정확도가 낮음
  • 격자 기반 구조로 인해 격자 하나에 여러 객체가 존재할 경우 객체 탐지에 한계가 있음

3. YOLOv2 (YOLO9000, 2016)

YOLOv2는 YOLOv1의 한계를 극복하기 위해 여러 개선 사항이 추가되었습니다. 더 깊고 복잡한 네트워크 구조를 사용하고, anchor boxes를 도입하여 해상도를 높이면서 탐지 성능을 향상시켰습니다. YOLO9000은 다양한 데이터셋에서 학습할 수 있는 모델입니다.

장점

  • 더 나은 정확도 및 다중 객체 탐지 가능
  • 복수의 데이터셋에서 학습한 YOLO9000 모델 제공

단점

  • YOLOv1에 비해 구조가 복잡함
  • 여전히 작은 객체에 대한 탐지 성능 개선 필요

4. YOLOv3 (2018)

YOLOv3는 이전 버전들에서의 한계를 더욱 보완하여, FPN(Feature Pyramid Networks) 구조를 도입하여 다양한 해상도에서의 객체 탐지를 가능하게 했습니다. 이는 작은 객체에 대한 탐지 성능을 향상시켜 주었습니다.

장점

  • 다양한 크기의 객체에 대한 성능 향상
  • 직관적인 구조와 손쉬운 사용자 정의

단점

  • 모델 크기가 커져서 속도 저하 가능성
  • 추가적인 학습 데이터 필요

5. YOLOv4 (2020)

YOLOv4는 도넛 구조와 CSP(Network in Network) 등 여러 최신 대안을 활용하여 더욱 높은 속도와 정확도를 달성하였습니다. GPU 최적화 구현을 통해 학습 시간과 성능을 동시에 개선하였습니다.

장점

  • 빠른 학습 속도와 높은 정확도
  • 다양한 하드웨어에 최적화 가능

단점

  • 복잡한 설정 및 추가적인 물리적 하드웨어 요구

6. YOLOv5 (2020)

YOLOv5는 GitHub에서 개발되었으며, 전형적인 YOLO 구조를 가진 신경망 모델로 쉽게 사용할 수 있는 특성을 가지고 있습니다. PyTorch 기반이며, 실험 및 프로토타입 제작이 용이합니다.

장점

  • 간편한 설정과 사용
  • 우수한 성능과 다양한 스케일로 제공

단점

  • YOLOv4에 비해 체계적이지 않은 최적화
  • 비공식적 문서화 및 커뮤니티 지원이 필요

7. YOLOv6 (2022)

YOLOv6는 더욱 향상된 정확도와 속도를 목표로 하여 개발된 버전입니다. 사용자 친화적인 인터페이스와 커스터마이징 기능으로 인기를 얻고 있습니다.

장점

  • 확장성과 유연성이 뛰어난 구조
  • 모바일 및 엣지 디바이스에서의 적용 가능성

단점

  • YOLOv5에 비해 학습 곡선이 가파를 수 있음

8. YOLOv7 (2022)

가장 최신 버전인 YOLOv7은 자율주행 및 로봇 비전 시스템에 최적화되어 있으며, 최첨단 객체 탐지 기술들이 통합된 버전입니다. 이 버전에서는 다양한 구조적 개선과 데이터 증강 기법들이 도입되었습니다.

장점

  • 최고의 탐지 성능
  • 추가적인 신경망 구조와 기법들이 최적화됨

단점

  • 높은 컴퓨터 자원 소모
  • 여전히 커뮤니티의 발전이 필요한 상태

9. YOLO 버전 비교

버전 장점 단점 적합한 사용 사례
YOLOv1 빠른 속도, 실시간 처리 가능 작은 객체 탐지 불량 실시간 비디오 감시
YOLOv2 다양한 데이터셋 학습 가능 구조 복잡성 증가 대규모 객체 탐지
YOLOv3 작은 객체에 대해 향상된 성능 모델 크기 증가로 속도 저하 가능성 드론 영상 분석
YOLOv4 빠른 속도와 높은 정확도 하드웨어 요구사항 증가 자동차 번호판 인식
YOLOv5 간편한 사용 및 프로토타입 제작 용이 최적화 부족 산업용 감시 시스템
YOLOv6 확장성과 유연성 학습 곡선이 가파를 수 있음 모바일 및 엣지 디바이스
YOLOv7 최고 탐지 성능 높은 자원 소모 자율주행 및 로봇 비전 시스템

10. 적합한 사용 사례 분석

각 YOLO 버전의 장단점을 고려할 때, 적합한 사용 사례는 다음과 같다고 할 수 있습니다:

실시간 비디오 감시

YOLOv1 및 YOLOv4는 속도가 중요한 실시간 비디오 감시 시스템에 적합합니다. 특히, 범죄 감시와 같은 분야에서 신속한 객체 인식이 요구됩니다.

산업용 안전 시스템

YOLOv5와 같은 손쉬운 사용성과 프로토타입 제작 가능성을 갖춘 모델은 산업용 안전 시스템에 적합합니다. 게다가 복잡한 기계의 결함을 탐지하는 데도 유용합니다.

자율주행차

YOLOv7과 같은 최신 버전은 자율주행차에서 주행 환경을 인식하는 데 필요한 고도의 정확성을 제공합니다. 객체 인식, 도로 및 장애물 분석이 필수적인 자율주행 시스템에서 가장 좋은 선택입니다.

모바일 및 엣지 디바이스

YOLOv6 버전은 모바일 및 IoT 디바이스에서 실행할 수 있는 최적화된 모델로, 사진 및 비디오에서의 빠른 객체 탐지가 가능하게 합니다.

11. 결론

YOLO는 객체 탐지 기술의 혁신을 이끌어온 중요한 알고리즘입니다. 각 버전은 특정한 요구사항과 환경에 최적화되어 있으며, 사용자는 자신의 프로젝트에 가장 적합한 버전을 선택해야 합니다. YOLO의 발전은 앞으로도 계속될 것이며, 우리는 더욱 정교하고 효과적인 객체 탐지 기술을 보게 될 것입니다.

12. 참고 자료

  • YOLO: Real-Time Object Detection (Redmon et al., 2015)
  • YOLO9000: Better, Faster, Stronger (Redmon & Farhadi, 2017)
  • YOLOv3: An Incremental Improvement (Redmon & Farhadi, 2018)

YOLO 모델로 객체 검출 시작하기, YOLO 출력 후처리 비최대 억제(NMS) 기법 설명과 적용 방법

YOLO(You Only Look Once)는 객체 검출 분야에서 매우 인기 있는 알고리즘 중 하나입니다. YOLO는 이미지를 단일 네트워크에서 처리하여 객체의 위치와 종류를 동시에 예측하는 혁신적인 접근 방식을 제공합니다. 기존의 객체 검출 알고리즘들이 이미지를 여러 부분으로 나눈 후 각각의 부분에 대해 클래스를 예측하던 방식과는 달리, YOLO는 전체 이미지를 통해 객체를 인식합니다. 이 장에서는 YOLO의 기본 개념과 함께 YOLO의 출력 후처리 과정인 비최대 억제(NMS)에 대해 살펴보겠습니다.

YOLO의 기본 구조

YOLO는 CNN(Convolutional Neural Network)을 기반으로 하며, 입력 이미지를 그리드로 나누고 각 그리드 셀에 대해 객체 존재 가능성과 바운딩 박스 정보를 추정합니다. YOLO는 다음의 주요 단계를 통해 작동합니다:

  1. 입력 이미지가 네트워크를 통과하며 피쳐를 추출합니다.
  2. 네트워크의 마지막 레이어에서 그리드 셀 수 만큼의 바운딩 박스와 확률을 출력합니다.
  3. NMS를 사용하여 중복된 박스를 제거하고 최종 예측 결과를 도출합니다.

YOLO 출력 해석

YOLO는 각 바운딩 박스에 대해 다음과 같은 정보를 출력합니다:

  • 박스의 위치 (X, Y, Width, Height)
  • 객체의 클래스 가능성 (Probability)
  • 각 클래스에 대한 확률 스코어

이러한 출력 데이터는 최종적으로 후처리 단계를 거쳐 정리됩니다.

비최대 억제(NMS)란?

비최대 억제(NMS)는 여러 개의 중복된 바운딩 박스를 정리하기 위해 사용되는 후처리 기법입니다. YOLO의 경우, 동일한 객체에 대해 여러 개의 바운딩 박스가 있을 수 있는데, 이는 같은 객체를 여러 번 검출하는 경우에 해당합니다. NMS의 주요 프로세스는 다음과 같습니다:

  1. 모든 바운딩 박스를 신뢰도에 따라 내림차순으로 정렬합니다.
  2. 가장 높은 신뢰도를 가진 박스를 선택하고, 나머지 박스와의 IoU(Intersection over Union)를 계산합니다.
  3. 사전에 정의된 임계치(threshold)를 기준으로 IoU가 threshold 이상의 박스를 제거합니다.
  4. 작업이 끝날 때까지 반복합니다.

NMS Python 예제 구현

아래는 Python을 사용하여 NMS를 구현하는 방법의 예시입니다. 먼저, 필요한 라이브러리를 설치해야 합니다:

pip install numpy
pip install opencv-python
        

이제 NMS 함수와 간단한 YOLO 예제를 작성해 보겠습니다:

import cv2
import numpy as np

def nms(boxes, scores, threshold):
    if len(boxes) == 0:
        return []

    # 박스의 좌표 분리
    boxes = np.array(boxes)
    x1 = boxes[:, 0]
    y1 = boxes[:, 1]
    x2 = boxes[:, 2]
    y2 = boxes[:, 3]

    # 각 박스의 면적 계산
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)

    # 인덱스를 신뢰도에 따라 내림차순으로 정렬
    order = scores.argsort()[::-1]

    kept_indices = []
    
    while order.size > 0:
        i = order[0]  # 현재 가장 높은 점수를 가진 박스
        kept_indices.append(i)

        # IoU 계산
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])
        
        w = np.maximum(0, xx2 - xx1 + 1)
        h = np.maximum(0, yy2 - yy1 + 1)
        
        inter = w * h
        iou = inter / (areas[i] + areas[order[1:]] - inter)

        # Threshold를 기준으로 인덱스 제거
        order = order[np.where(iou <= threshold)[0] + 1]

    return kept_indices


# 테스트 데이터
boxes = [
    [50, 50, 150, 150],
    [60, 60, 160, 160],
    [70, 70, 170, 170],
]
scores = [0.9, 0.8, 0.7]

# NMS 실행
threshold = 0.3
kept_indices = nms(boxes, scores, threshold)
print("최종 선택된 박스 인덱스:", kept_indices)
        

위 코드는 주어진 바운딩 박스와 각 박스의 신뢰도를 입력으로 받아, NMS를 적용하여 최종적인 박스 인덱스를 반환합니다.

NMS의 유용성

NMS는 YOLO와 같은 객체 검출 시스템에서 필수적인 요소입니다. 객체가 겹치는 경우, NMS는 최종 결과에서 중복을 제거하여 더 정확한 예측을 제공합니다. 이는 모델의 성능을 향상시키고, 최종 사용자가 더 신뢰할 수 있는 예측 결과를 받을 수 있도록 합니다.

마무리

YOLO 모델을 사용한 객체 검출은 현대 컴퓨터 비전의 중요한 분야로 많은 사람들이 관심을 가지고 연구하고 있습니다. 본 글에서는 YOLO의 기본 원리와 비최대 억제(NMS)의 개념 및 실제 구현 방법에 대해 다루어 보았습니다. YOLO와 NMS를 활용한 다양한 프로젝트에서 여러분의 창의력을 발휘하시길 바랍니다.

YOLO 설치 및 설정, 사전 학습된 YOLO 모델 로드 및 설정 방법

이번 포스트에서는 YOLO(You Only Look Once) 객체 탐지 모델을 설치하고 설정하는 방법, 그리고 사전 학습된 YOLO 모델을 로드하여 사용해보는 방법에 대해 자세히 설명하겠습니다. YOLO는 그 성능과 효율성 덕분에 객체 탐지 분야에서 매우 인기 있는 모델입니다. 이를 통해 이미지나 동영상에서 실시간으로 객체를 탐지할 수 있습니다.

1. YOLO란 무엇인가?

YOLO는 한 번의 신경망 통과로 객체를 탐지하는 방식으로, 이미지 전체를 동시에 처리하여 매우 빠른 속도로 객체를 인식할 수 있습니다. YOLO는 여러 버전이 있으며, 최신 버전인 YOLOv5(2021년 기준)는 성능과 속도에서 두각을 나타내고 있습니다. 다양한 환경에서도 유용하게 사용할 수 있도록 유연한 아키텍처를 가지고 있습니다.

2. YOLO 설치하기

YOLO를 설치하기 위해서는 Python과 몇 가지 필수 패키지를 설치해야 합니다. 아래는 설치 과정을 단계별로 설명합니다.

2.1 사전 준비

  • Python 3.6 이상이 설치되어 있어야 합니다.
  • pip 패키지 관리자가 필요합니다. Python 설치 시 기본적으로 포함됩니다.
  • Git이 설치되어 있어야 합니다. 설치된 상태인지 확인하려면 터미널에서 git --version을 입력하여 확인합니다.

2.2 YOLOv5 클론하기

YOLOv5는 GitHub에서 관리되고 있으며, 아래의 명령어를 통해 YOLOv5 리포지토리를 클론할 수 있습니다.

git clone https://github.com/ultralytics/yolov5.git
cd yolov5

2.3 필수 패키지 설치하기

YOLOv5는 여러 Python 패키지를 필요로 합니다. 다음 명령어를 사용하여 필수 패키지를 설치합니다.

pip install -U -r requirements.txt

2.4 CUDA 설치 (선택 사항)

GPU 가속을 사용하려면 CUDA와 cuDNN을 설치해야 합니다. NVIDIA의 공식 웹사이트에서 자신의 GPU에 맞는 버전을 다운로드하고 설치하세요. CUDA를 설치한 경우, PyTorch를 CUDA 지원 버전으로 설치해야 합니다. 아래 명령어로 PyTorch를 설치할 수 있습니다.

pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117

그 외에도 CPU 버전의 PyTorch를 설치하고자 한다면 단순히 pip install torch torchvision torchaudio를 사용하면 됩니다.

3. YOLO 모델 로드 및 설정하기

YOLOv5가 성공적으로 설치되었다면, 다음 단계는 사전 학습된 YOLO 모델을 로드하고 설정하는 것입니다.

3.1 모델 로드하기

YOLOv5에서 사전 학습된 모델은 기본적으로 yolov5s.pt, yolov5m.pt, yolov5l.pt, yolov5x.pt의 네 가지 버전을 제공합니다. 여기서 s, m, l, x는 각각 small, medium, large, extra large를 나타냅니다. 다음 코드를 통해 YOLOv5 모델을 로드할 수 있습니다.

import torch

# 모델 로드
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

3.2 이미지에서 객체 탐지하기

로드한 모델을 사용하여 이미지에서 객체를 탐지하는 방법은 간단합니다. 먼저 이미지를 입력으로 받아서 모델에 전달하면 됩니다. 탐지된 객체는 바운딩 박스와 레이블로 표시됩니다.

# 이미지 경로
img_path = 'path/to/your/image.jpg'

# 이미지 로드 및 객체 탐지
results = model(img_path)

# 결과 출력
results.print()  # 탐지된 객체 정보 출력
results.show()   # 탐지된 객체가 표시된 이미지 출력

탐지된 객체는 아래처럼 표시됩니다. 각 바운딩 박스에는 클래스ID와 신뢰도가 표시됩니다.

3.3 동영상 파일에서 객체 탐지하기

YOLOv5는 동영상 파일에서도 객체 탐지를 수행할 수 있습니다. 다음 코드를 활용하여 동영상에서 객체를 탐지할 수 있습니다.

video_path = 'path/to/your/video.mp4'

# 동영상 파일에서 객체 탐지
results = model(video_path) 

# 결과를 창에서 보여주기
results.show()  # 탐지 결과 출력

3.4 실시간 객체 탐지

웹캠을 사용하여 실시간으로 객체를 탐지하는 것도 가능합니다. 다음 코드는 OpenCV 라이브러리를 활용하여 실시간 객체 탐지를 구현한 예제입니다.

import cv2

# 웹캠 열기
cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, frame = cap.read()  # 웹캠으로부터 프레임 읽기
    if not ret:
        break
    
    # 탐지하기
    results = model(frame)
    
    # 결과를 이미지로 변환
    annotated_frame = results.render()[0]
    
    # 이미지 보여주기
    cv2.imshow('YOLOv5 Webcam Detection', annotated_frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):  # 'q' 키를 눌러 종료
        break

cap.release()
cv2.destroyAllWindows()

4. YOLOv5의 다양한 설정

YOLOv5는 다양한 옵션을 제공하여 사용자 맞춤형 객체 탐지를 가능하게 합니다. 설정할 수 있는 주요 인자들은 다음과 같습니다:

  • conf_thres: 신뢰도 임계값. 탐지 결과의 신뢰도가 이 값 이상일 경우만 결과로 나옵니다.
  • iou_thres: IoU(Intersection over Union) 임계값. 탐지된 객체 간 중복을 줄이는 데 사용됩니다.
  • device: 모델을 실행할 장치(GPU/CPU)를 지정합니다.
  • half: 반 정밀도(half precision) 실행 여부. GPU에서 메모리를 절약하는 데 유용합니다.

이를 통해 탐지의 성능을 조정할 수 있습니다. 다음은 이러한 인자를 활용하여 객체 탐지를 수행하는 예입니다.

results = model(img_path, conf_thres=0.5, iou_thres=0.4, device='cuda:0')  # GPU 사용 시

4.1 사전 학습된 모델 변형

YOLOv5는 훈련된 모델 외에도 원하는 데이터셋으로 Fine-tuning을 하여 사용할 수 있는 기능도 제공합니다. 이를 통해 특정 객체 탐지 성능을 더욱 높일 수 있습니다.

5. 결론

YOLOv5는 설치와 사용이 간편하면서도 뛰어난 성능을 demonstrably 제공합니다. 본 포스팅에서는 YOLOv5 설치 방법과 사전 학습된 모델 로드, 객체 탐지를 수행하는 방법을 설명하였습니다. 다양한 설정을 통해 성능을 조정하여 최적의 결과를 이끌어낼 수 있습니다.

YOLO를 이용하여 다양한 연구나 프로젝트에 활용하시길 바랍니다. 추후 YOLO를 이용한 실전 프로젝트나 데이터셋 준비 방법에 대해서도 다루어 보겠습니다.

참고: YOLO 모델을 활용하는 데 있어 라이센스 및 저작권 문제에 유의해야 합니다. YOLOv5는 Ultralytics의 저작물이며, 사용 시 조건을 준수해야 합니다.

YOLO 모델의 다양한 응용, 비디오 분석을 위한 YOLO 활용 동작 검출과 이상행동 탐지

YOLO(You Only Look Once)는 실시간 객체 감지 알고리즘으로, 이미지나 비디오에서 객체를 빠르게 식별하고 위치를 추정하는 데 사용됩니다. 본 포스트에서는 YOLO 모델의 다양한 응용을 살펴보고, 특히 비디오 분석을 위한 YOLO 활용 방법, 동작 검출 및 이상 행동 탐지에 중점을 두어 설명하겠습니다.

YOLO 모델 개요

YOLO는 단일 신경망을 사용하여 입력 이미지를 grid로 나누고 각 grid 셀에서 객체를 예측하는 방식으로 작동합니다. 이 방식은 전통적인 방법보다 빠른 속도와 높은 정확도를 자랑합니다. YOLO는 다양한 버전(예: YOLOv1, YOLOv2, YOLOv3, YOLOv4, YOLOv5 등)이 있으며, 각 버전은 성능을 개선하기 위한 여러 최적화를 도입하였습니다.

비디오 분석을 위한 YOLO 활용

비디오 분석은 현대 데이터 처리의 중요한 분야로, 다양한 산업에서 활용되고 있습니다. YOLO는 이러한 비디오 분석에서 매우 유용한 도구로 자리 잡고 있습니다. YOLO를 사용한 비디오 분석은 크게 두 가지 주요 응용 분야로 나눌 수 있습니다: 동작 검출(Motion Detection)과 이상 행동 탐지(Anomaly Detection).

1. 동작 검출

동작 검출은 비디오 스트림에서 특정 개체가 움직임을 보이는지를 확인하는 과정입니다. 이 기술은 보안 시스템, 교통 감시, 스포츠 분석 등 다양한 분야에서 사용됩니다.

동작 검출을 위한 YOLO 활용 예제

다음은 YOLO를 사용하여 웹캠 입력에서 동작을 검출하는 간단한 파이썬 코드 예제입니다.


import cv2
import numpy as np

# YOLO 모델 로드
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

# 색상 정의
colors = np.random.uniform(0, 255, size=(len(classes), 3))

# 비디오 캡처
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    height, width, channels = frame.shape

    # 이미지 전처리
    blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
    net.setInput(blob)
    outs = net.forward(output_layers)

    # 정보 초기화
    class_ids = []
    confidences = []
    boxes = []

    # 탐지된 객체 정보 수집
    for out in outs:
        for detection in out:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.5:
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)

                # 박스 좌표
                x = int(center_x - w / 2)
                y = int(center_y - h / 2)

                boxes.append([x, y, w, h])
                confidences.append(float(confidence))
                class_ids.append(class_id)

    # 비최대 억제
    indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

    # 결과 표시
    for i in range(len(boxes)):
        if i in indexes:
            x, y, w, h = boxes[i]
            label = str(classes[class_ids[i]])
            color = colors[class_ids[i]]
            cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
            cv2.putText(frame, label, (x, y + 30), cv2.FONT_HERSHEY_PLAIN, 3, color, 3)

    cv2.imshow("Image", frame)
    key = cv2.waitKey(1)
    if key == 27:  # 'ESC' 키로 종료
        break

cap.release()
cv2.destroyAllWindows()

이 코드는 웹캠에서 비디오 프레임을 캡처하고, YOLO를 통해 객체 감지를 수행하여 동작을 검출합니다. 사용자는 ESC 키를 눌러 프로그램을 종료할 수 있습니다.

2. 이상 행동 탐지

이상 행동 탐지는 정해진 규칙이나 패턴에서 벗어나는 행동을 식별하는데 사용됩니다. 이는 보안, 의료, 교통 등 다양한 분야에서 중요합니다. YOLO는 비디오 스트림에서 객체를 감지한 후, 이 객체의 행동을 분석하여 이상 행동을 탐지하는 데 효과적입니다.

이상 행동 탐지를 위한 YOLO 활용 예제

아래의 코드는 YOLO를 사용하여 비디오에서 이상 행동을 탐지하는 예제 코드입니다.


import cv2
import numpy as np

# YOLO 모델 로드
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

# 비디오 캡처
cap = cv2.VideoCapture('test_video.mp4')

while True:
    ret, frame = cap.read()
    height, width, channels = frame.shape
        
    # 이미지 전처리
    blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
    net.setInput(blob)
    outs = net.forward(output_layers)

    # 탐지된 객체 정보 수집
    class_ids = []
    confidences = []
    boxes = []

    for out in outs:
        for detection in out:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.5:
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)

                x = int(center_x - w / 2)
                y = int(center_y - h / 2)

                boxes.append([x, y, w, h])
                confidences.append(float(confidence))
                class_ids.append(class_id)

    indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

    # 이상 행동 탐지 로직
    for i in range(len(boxes)):
        if i in indexes:
            # 이상 행동 조건을 정의
            if class_ids[i] == 'person':  # 예를 들어 사람이라고 가정
                # 추가 행동 로직을 구현
                # x, y, w, h 변수를 통해 행위를 분석할 수 있음
                x, y, w, h = boxes[i]
                label = str(classes[class_ids[i]])
                color = (0, 255, 0)  # 녹색으로 표시
                cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
                cv2.putText(frame, "Anomaly detected!", (x, y + 30), cv2.FONT_HERSHEY_PLAIN, 1, color, 2)

    cv2.imshow("Image", frame)
    key = cv2.waitKey(1)
    if key == 27:  # 'ESC' 키로 종료
        break

cap.release()
cv2.destroyAllWindows()

이 코드는 비디오 파일에서 객체를 감지하고, 특정 조건을 만족하는 경우 이상 행동을 표시합니다. 사용자는 필요에 따라 이상 행동의 조건을 구체화할 수 있습니다.

결론

YOLO 모델은 동작 검출과 이상 행동 탐지라는 두 가지 주요 비디오 분석 응용 분야에서 매우 효과적입니다. 실시간으로 객체를 감지하고, 그들의 행동을 분석하여 유용한 정보를 추출할 수 있는 기회를 제공합니다. 본 포스트에서 소개한 예제 코드를 기반으로, 여러분의 비디오 분석 프로젝트에 YOLO를 활용하여 동작 검출 및 이상 행동 탐지를 구현해 보시기 바랍니다.

이외에도 YOLO는 의료 이미징, 자율주행차, 로봇 비전 등 다양한 분야에서도 응용될 수 있습니다. 앞으로도 YOLO의 발전과 가능성에 대한 지속적인 연구가 이루어질 것으로 기대됩니다.