본문 바로가기
개발 언어/Python

실시간 객체 인식 시스템: 웹캠과 모바일 카메라를 활용한 AI 기술 구현하기

by 주호파파 2025. 5. 11.
728x90
반응형

 

웹캠이나 모바일 카메라를 통해 실시간으로 주변 객체를 탐지하고 분류하는 기술은 컴퓨터 비전 분야에서 가장 흥미롭고 실용적인 응용 사례 중 하나입니다.

 

이 글에서는 실시간 객체 인식 시스템의 기본 개념부터 직접 구현할 수 있는 샘플 코드까지 자세히 알아보겠습니다.

목차

  1. 실시간 객체 인식 기술 소개
  2. 주요 객체 탐지 알고리즘 비교
  3. 개발 환경 설정
  4. Python과 OpenCV를 활용한 실시간 객체 탐지 구현
  5. 모바일 카메라 연동 방법
  6. 성능 최적화 팁
  7. 결과 및 활용 방안

1. 실시간 객체 인식 기술 소개

실시간 객체 인식(Real-time Object Detection)은 카메라로 촬영된 영상에서 즉각적으로 다양한 객체를 식별하고 분류하는 기술입니다. 이 기술은 자율주행 자동차, 보안 시스템, 증강현실(AR), 로봇공학 등 다양한 분야에서 활용되고 있습니다.

객체 인식 시스템은 크게 다음과 같은 과정을 거칩니다:

  • 카메라로부터 이미지 프레임 획득
  • 이미지 전처리 (크기 조정, 정규화 등)
  • 딥러닝 모델을 통한 객체 탐지
  • 탐지된 객체에 경계 상자(Bounding Box) 표시 및 라벨링
  • 결과 화면 출력

2. 주요 객체 탐지 알고리즘 비교

현재 널리 사용되는 객체 탐지 알고리즘들을 비교해보겠습니다:

YOLO (You Only Look Once)

  • 장점: 빠른 처리 속도, 단일 신경망으로 전체 이미지 처리
  • 단점: 작은 객체 탐지에 상대적으로 약함
  • 버전: YOLOv2, YOLOv3, YOLOv4, YOLOv5, YOLOv8, YOLOv10 등으로 발전

SSD (Single Shot Detector)

  • 장점: 다양한 크기의 객체 탐지에 효과적, 상대적으로 빠른 속도
  • 단점: YOLO보다 정확도가 다소 낮을 수 있음

MobileNet

  • 장점: 모바일 기기에 최적화된 경량 모델
  • 단점: 고성능 모델에 비해 정확도가 다소 낮음

Faster R-CNN

  • 장점: 높은 정확도
  • 단점: 처리 속도가 상대적으로 느림, 리소스 소모가 큼

실시간 처리가 필요한 애플리케이션에서는 YOLO나 MobileNet 계열의 모델이 많이 사용됩니다.

3. 개발 환경 설정

실시간 객체 인식 시스템을 구현하기 위한 환경을 설정해봅시다.

Python 환경 설정 (아나콘다 사용)

# 가상환경 생성
conda create -n object_detection python=3.8
conda activate object_detection

# 필요 라이브러리 설치
pip install opencv-python
pip install numpy
pip install tensorflow # 또는 pip install torch

YOLO 모델 다운로드

YOLO 모델을 사용하기 위해 가중치 파일과 설정 파일을 다운로드해야 합니다. YOLOv5나 YOLOv8 등 최신 버전을 사용하는 것을 권장합니다.

# YOLOv5 설치
pip install ultralytics

4. Python과 OpenCV를 활용한 실시간 객체 탐지 구현

4.1 OpenCV와 YOLO를 활용한 웹캠 객체 탐지

다음은 OpenCV와 YOLO를 활용한 실시간 객체 탐지 코드입니다:

import cv2
import numpy as np

# 웹캠 연결
cap = cv2.VideoCapture(0)  # 0은 기본 웹캠

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

# COCO 데이터셋의 클래스 목록
with open("coco.names", "r") as f:
    classes = [line.strip() for line in f.readlines()]

# 색상 설정 (각 클래스별 다른 색상)
colors = np.random.uniform(0, 255, size=(len(classes), 3))

while True:
    # 웹캠에서 프레임 읽기
    ret, frame = cap.read()
    if not ret:
        break
    
    height, width, channels = frame.shape
    
    # YOLO 입력 준비
    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]
            
            # 신뢰도가 0.5 이상인 객체만 표시
            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)
    
    # 중복 상자 제거 (Non-Maximum Suppression)
    indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
    
    # 객체 표시
    font = cv2.FONT_HERSHEY_SIMPLEX
    for i in range(len(boxes)):
        if i in indexes:
            x, y, w, h = boxes[i]
            label = str(classes[class_ids[i]])
            confidence = confidences[i]
            color = colors[class_ids[i]]
            
            # 경계 상자 그리기
            cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
            
            # 라벨 표시
            cv2.putText(frame, f"{label} {confidence:.2f}", (x, y - 10), font, 0.5, color, 2)
    
    # 결과 화면 표시
    cv2.imshow("Object Detection", frame)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) == ord('q'):
        break

# 자원 해제
cap.release()
cv2.destroyAllWindows()

4.2 YOLOv8을 활용한 고급 객체 탐지

최신 YOLOv8 모델을 사용한 더 간결하고 강력한 코드입니다:

from ultralytics import YOLO
import cv2
import time

# YOLOv8 모델 로드
model = YOLO("yolov8n.pt")  # 'n'은 nano 버전 (가장 가벼운 모델)

# 웹캠 연결
cap = cv2.VideoCapture(0)
cap.set(3, 640)  # 너비 설정
cap.set(4, 480)  # 높이 설정

# FPS 계산을 위한 변수
prev_frame_time = 0
new_frame_time = 0

while True:
    # 프레임 읽기
    success, img = cap.read()
    if not success:
        break
    
    # YOLOv8로 객체 탐지
    results = model(img, stream=True)
    
    # FPS 계산
    new_frame_time = time.time()
    fps = 1 / (new_frame_time - prev_frame_time) if prev_frame_time > 0 else 0
    prev_frame_time = new_frame_time
    
    # 결과 처리
    for r in results:
        boxes = r.boxes
        
        # 각 탐지된 객체에 대해
        for box in boxes:
            # 경계 상자 좌표
            x1, y1, x2, y2 = box.xyxy[0]
            x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
            
            # 신뢰도
            conf = box.conf[0]
            
            # 클래스 ID 및 이름
            cls = int(box.cls[0])
            class_name = model.names[cls]
            
            # 경계 상자 그리기
            cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
            
            # 라벨 표시
            label = f"{class_name} {conf:.2f}"
            cv2.putText(img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    
    # FPS 표시
    cv2.putText(img, f"FPS: {fps:.1f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    
    # 결과 화면 표시
    cv2.imshow("YOLOv8 Object Detection", img)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) == ord('q'):
        break

# 자원 해제
cap.release()
cv2.destroyAllWindows()

5. 모바일 카메라 연동 방법

스마트폰 카메라를 웹캠처럼 사용하여 객체 탐지를 수행할 수 있습니다.

5.1 IP Webcam 앱을 활용한 연동

  1. 안드로이드 스마트폰에 'IP Webcam' 앱 설치 ( https://play.google.com/store/apps/details?id=com.pas.webcam&pcampaignid=web_share )
  2. 앱 실행 후 'Start server' 버튼 클릭
  3. 화면에 표시된 IP 주소 확인 (예: http://192.168.0.100:8080)
  4. 아래 Python 코드로 연결
 

IP Webcam - Google Play 앱

당신의 스마트폰을 무선카메라로 만들어 보세요.

play.google.com

 

import cv2
import numpy as np
import requests
import time
from ultralytics import YOLO

# YOLOv8 모델 로드
model = YOLO("yolov8n.pt")

# IP Webcam 서버 URL (스마트폰 IP 주소로 변경)
url = "http://192.168.0.100:8080/shot.jpg"

while True:
    # 스마트폰 카메라에서 이미지 가져오기
    img_resp = requests.get(url)
    img_arr = np.array(bytearray(img_resp.content), dtype=np.uint8)
    img = cv2.imdecode(img_arr, -1)
    
    # 이미지 크기 조정 (선택사항)
    img = cv2.resize(img, (640, 480))
    
    # YOLOv8로 객체 탐지
    results = model(img, stream=True)
    
    # 결과 처리
    for r in results:
        boxes = r.boxes
        
        for box in boxes:
            # 경계 상자 좌표
            x1, y1, x2, y2 = box.xyxy[0]
            x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
            
            # 신뢰도
            conf = box.conf[0]
            
            # 클래스 ID 및 이름
            cls = int(box.cls[0])
            class_name = model.names[cls]
            
            # 경계 상자 그리기
            cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
            
            # 라벨 표시
            label = f"{class_name} {conf:.2f}"
            cv2.putText(img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    
    # 결과 화면 표시
    cv2.imshow("Mobile Camera Object Detection", img)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) == ord('q'):
        break

cv2.destroyAllWindows()

6. 성능 최적화 팁

실시간 객체 인식 시스템의 성능을 향상시키기 위한 팁입니다:

  1. 경량 모델 사용: YOLOv8n, MobileNetSSD 등 경량 모델 사용
  2. 해상도 조정: 입력 이미지 크기를 줄여 처리 속도 향상
  3. GPU 가속: CUDA 지원 GPU를 활용하여 처리 속도 향상
  4. 배치 처리: 여러 프레임을 한 번에 처리
  5. 프레임 스킵: 모든 프레임을 처리하지 않고 일부 건너뛰기
  6. ROI 설정: 관심 영역만 처리하여 계산량 감소

7. 결과 및 활용 방안

실시간 객체 인식 시스템은 다양한 분야에서 활용될 수 있습니다:

  • 보안 시스템: 침입자 감지, 이상 행동 탐지
  • 자율주행: 차량, 보행자, 신호등 인식
  • 산업 자동화: 제품 검사, 불량품 감지
  • 소매업: 재고 관리, 고객 행동 분석
  • 의료: 의료 영상에서 특정 패턴 감지
  • AR/VR: 증강현실 애플리케이션
  • 스마트홈: 거주자 활동 모니터링, 자동화

결론

실시간 객체 인식 시스템은 컴퓨터 비전과 딥러닝 기술의 발전으로 점점 더 정확하고 빠르게 발전하고 있습니다. 이 글에서 소개한 코드와 방법을 활용하여 여러분만의 객체 인식 애플리케이션을 개발해보세요. 웹캠이나 모바일 카메라를 활용한 실시간 객체 탐지는 다양한 분야에서 혁신적인 솔루션을 제공할 수 있습니다.

 

실제 구현 시 사용 사례에 맞는 모델 선택과 최적화가 중요하며, 지속적인 학습과 실험을 통해 더 나은 성능을 얻을 수 있습니다. 직접 코드를 실행하고 결과를 확인해보면서 객체 인식의 세계를 탐험해보세요!

샘플 실행 결과

 

실시간 객체 인식 결과

위 이미지는 YOLO 모델을 사용한 실시간 객체 인식 결과입니다. 사람과 자동차 등 다양한 객체를 정확하게 탐지하고 분류하는 것을 확인할 수 있습니다.

 

728x90
반응형