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의 발전과 가능성에 대한 지속적인 연구가 이루어질 것으로 기대됩니다.