IT/영상처리

OpenCV를 사용한 사람 감지 및 객체 감지: HOG vs YOLOv3

chn1002 2024. 5. 4. 07:59

이미지 처리 및 컴퓨터 비전 분야에서 OpenCV는 널리 사용되는 라이브러리 중 하나입니다. 특히, 사람의 위치를 감지하거나 객체를 식별하는 데 사용될 수 있습니다. 이번 포스트에서는 OpenCV를 사용하여 사람을 감지하는 두 가지 방법을 비교하고자 합니다: HOG(Histogram of Oriented Gradients)와 YOLOv3(You Only Look Once).

 

HOG 

먼저, HOG 방법은 이미지의 그래디언트 방향을 계산하여 사람을 감지합니다. 다음은 HOG를 사용하여 사람을 감지하는 간단한 Python 코드입니다.

# 필요한 라이브러리를 임포트합니다
import cv2

# 이미지 파일 경로
image_path = 'your_image.jpg'

# 이미지 파일을 읽어옴
image = cv2.imread(image_path)

# 사람을 탐지할 Pre-trained 모델
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

# 사람 탐지
(rects, _) = hog.detectMultiScale(image, winStride=(4, 4), padding=(8, 8), scale=1.05)

# 사람의 위치를 사각형으로 표시
for (x, y, w, h) in rects:
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 결과를 화면에 표시
cv2.imshow("People Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

YOLOv3

다음으로, YOLOv3 방법은 딥러닝 기반의 객체 감지 모델을 사용합니다. YOLOv3는 이미지에서 다양한 객체를 감지할 수 있습니다. 아래는 YOLOv3를 사용하여 사람을 감지하는 코드입니다.

 

# 필요한 라이브러리를 임포트합니다
import cv2
import numpy as np

# YOLOv3 모델과 가중치 파일의 경로
config_path = 'yolov3.cfg'
weight_path = 'yolov3.weights'

# YOLOv3 모델을 로드
net = cv2.dnn.readNet(config_path, weight_path)

# 클래스 라벨 파일의 경로
labels_path = 'coco.names'

# 클래스 라벨을 로드
with open(labels_path, 'r') as f:
    labels = f.read().strip().split('\n')

# 이미지 파일 경로
image_path = 'your_image.jpg'

# 이미지 파일을 읽어옴
image = cv2.imread(image_path)

# 이미지의 높이와 너비 추출
height, width = image.shape[:2]

# YOLOv3의 입력 이미지 크기는 (416, 416)입니다.
blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416), swapRB=True, crop=False)

# 이미지를 네트워크에 전달하여 객체 감지
net.setInput(blob)
output_layers = net.getUnconnectedOutLayersNames()
outputs = net.forward(output_layers)

# 객체를 감지하고 사람인 경우에만 표시
for output in outputs:
    for detection in output:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if class_id == 0 and confidence > 0.5:  # 사람 클래스의 인덱스는 0입니다.
            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)
            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 결과를 화면에 표시
cv2.imshow("YOLOv3 People Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

이렇게 두 가지 방법을 사용하여 사람을 감지할 수 있습니다. HOG 방법은 간단하지만 정확도가 낮을 수 있으며, YOLOv3 방법은 딥러닝을 사용하여 정확도를 향상시킬 수 있습니다. 어떤 방법을 선택할지는 사용 사례 및 요구 사항에 따라 다를 수 있습니다.

 

HOG 와 YOLOv3 의 비교

HOG와 YOLOv3는 모두 객체 감지를 위한 인기 있는 알고리즘입니다. 이 두 가지 방법을 비교하여 결론을 내보겠습니다.

  1. HOG(Histogram of Oriented Gradients):
    • 장점:
      • 간단하고 빠르게 구현할 수 있습니다.
      • 상대적으로 경량화되어 있어, 리소스가 제한된 환경에서도 사용할 수 있습니다.
    • 단점:
      • 정확도가 낮을 수 있습니다. 특히, 복잡한 배경이나 다양한 포즈를 가진 객체를 감지하는 데 어려움을 겪을 수 있습니다.
      • 사람의 디테일한 특징을 감지하기 어려울 수 있습니다.
  2. YOLOv3(You Only Look Once):
    • 장점:
      • 딥러닝 기반의 알고리즘으로, 정확도가 높습니다. 다양한 객체를 식별하고 다양한 환경에서도 잘 작동합니다.
      • 빠르게 실행될 수 있는 실시간 객체 감지가 가능합니다.
    • 단점:
      • 더 복잡하고 무거운 모델이므로, 리소스가 제한된 환경에서는 사용하기 어려울 수 있습니다.
      • 훈련된 모델의 가중치 파일이 크기 때문에 다운로드 및 배포가 더 어려울 수 있습니다.

결론적으로, HOG는 빠르고 간단하지만 정확도가 낮을 수 있고, YOLOv3는 정확도가 높지만 더 많은 리소스를 필요로 합니다. 따라서 사용 사례와 환경에 따라 적절한 알고리즘을 선택해야 합니다. 실시간 객체 감지가 필요하고 리소스가 풍부한 경우에는 YOLOv3가 적합하며, 단순한 객체 감지가 필요하고 리소스가 제한된 환경에서는 HOG를 사용할 수 있습니다.

 
 
 

'IT > 영상처리' 카테고리의 다른 글

[OpenCV] 이미지 이진화(Binarization)  (0) 2022.05.17
[OpenCV] Video 읽어 보여주기  (0) 2022.05.17
[OpenCV] 이미지 읽기와 쓰기  (2) 2022.05.17
[Facebook] Spark AR  (0) 2022.05.17
[OpenCV] OpenCV-Python 준비  (0) 2022.05.17