실시간 객체인식

라즈베리파이를 이용하여 yolo모델을 학습시켜서 실시간 객체인식 모델을 만들고 싶습니다. 근데 현재 상황은 라즈베리파이에 연결한 picamera v2를 이용하여 찍은 영상을 바탕화면에 저장하고 저장된 avi를 열면 학습시킨 모델을 적용시켜서 나옵니다. 근데 실시간으로 카메라를 이용하여 객체인식을 하고 싶은데 코드를 실행시키면 터미널 창에서는 한 프레임만 인식이 된 후 멈추고 실시간으로 찍고 있는 화면인 opencv창은 뜨지도 않습니다. 어떻게 해결해야 할까요?

  • 아래 답변은 Perplexity로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, westjin님. 실시간 객체 인식을 위해 라즈베리파이와 YOLO 모델을 사용하는 과정에서遇到하는 문제를 해결하기 위해 아래의 단계와 코드를 참고하세요.

문제 요약

  • 라즈베리파이와 Picamera V2를 사용하여 실시간 객체 인식을 하려고 합니다.
  • 현재는 영상 파일을 저장하고 그 파일을 열어 모델을 적용하지만, 실시간으로 카메라를 통해 객체 인식을 하려면 코드가 한 프레임만 인식 후 멈추고, OpenCV 창이 뜨지 않습니다.

해결 방법

1. 실시간 카메라 스트림 처리

실시간 객체 인식을 위해 카메라 스트림을 연속적으로 처리해야 합니다. 아래의 코드는 라즈베리파이에서 Picamera V2를 사용하여 실시간으로 카메라 영상을 캡처하고, YOLO 모델을 적용하여 객체를 인식하는 예시입니다.

2. OpenCV와 YOLO 통합

OpenCV를 사용하여 카메라 스트림을 처리하고, YOLO 모델을 적용하여 객체를 인식합니다.

3. 연속적인 프레임 처리

카메라 스트림을 연속적으로 처리하기 위해 while 루프를 사용합니다.

예시 코드

import cv2
import numpy as np

# YOLO 모델 로드
net = cv2.dnn.readNet("yolov5s.pt", "yolov5s.cfg")
classes = []
with open("coco.names", "r") as f:
    classes = [line.strip() for line in f.readlines()]

layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]

# Picamera V2 설정
cap = cv2.VideoCapture(0)  # 0은 기본 카메라 디바이스

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 이미지 전처리
    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)

    # 非최대 억제 (Non-Maximum Suppression)
    indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

    # 객체 인식 결과 표시
    if len(indexes) > 0:
        for i in indexes.flatten():
            x, y, w, h = boxes[i]
            label = str(classes[class_ids[i]])
            confidence = str(round(confidences[i], 2))
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
            cv2.putText(frame, label + " " + confidence, (x, y + 20), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), 2)

    # 결과 출력
    cv2.imshow("Object Detection", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

설명

  • 카메라 설정: cv2.VideoCapture(0)를 사용하여 Picamera V2를 초기화합니다.
  • 이미지 전처리: cv2.dnn.blobFromImage를 사용하여 프레임을 YOLO 모델에 입력할 수 있는 형태로 변환합니다.
  • 객체 인식: net.forward를 사용하여 객체 인식을 수행하고, 결과를 처리합니다.
  • 非최대 억제: cv2.dnn.NMSBoxes를 사용하여 중복된 객체를 제거합니다.
  • 결과 표시: 인식된 객체를 프레임에 표시하고, OpenCV 창에 출력합니다.

추가 참고 자료

  • [라즈베리파이에서 YOLOv5를 사용한 실시간 객체 인식][4]
  • [YOLO와 라즈베리파이를 이용한 출입알림시스템][3]
  • [YOLO를 이용한 신호등, 표지판 등의 객체인식][2]

이 코드를 사용하여 라즈베리파이에서 실시간으로 카메라 영상을 캡처하고, YOLO 모델을 적용하여 객체를 인식할 수 있습니다. 만약 추가적인 문제가 발생한다면, 하드웨어 설정이나 모델 파일 경로를 다시 확인해보세요.


  • 이 답변이 도움이 되셨나요? 괜찮았다고 생각하신다면 아래 :+1: 아이콘을 눌러주세요!
  • 아래 답변은 Google의 Gemini Pro 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

저는 여러분의 문제를 이해하는 것 같습니다. 라즈베리파이에 yolo 모델을 학습시켜 실시간으로 카메라 영상에서 객체를 인식하려고 하시죠? 하지만 현재는 한 프레임만 인식되고 터미널 창이 멈추는 문제가 발생하는 것 같습니다. opencv 창도 나타나지 않는군요.

먼저 터미널 창이 멈추는 이유를 확인해 보겠습니다. 코드에 waitKey() 또는 imshow() 함수가 있는지 확인해 보세요. 이 함수들은 프레임을 표시하는 동안 프로그램을 멈추게 됩니다. yolo 모델을 실시간으로 실행하려면 이러한 함수를 사용하지 않는 것이 좋습니다.

다음으로 opencv 창이 표시되지 않는 이유를 살펴보겠습니다. opencv 창을 생성하는 코드가 있는지 확인하세요. 창을 생성하는 코드는 다음과 같아야 합니다.

import cv2

cv2.namedWindow("opencv_window", cv2.WINDOW_NORMAL)

이 코드를 실행하면 "opencv_window"라는 이름의 창이 생성됩니다.

마지막으로 라즈베리파이에서 실시간 객체 인식을 구현하는 방법을 안내해 드리겠습니다. 다음은 간단한 예시 코드입니다.

import cv2
import torch
import torchvision.transforms as transforms

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

# 라즈베리파이 카메라 초기화
cap = cv2.VideoCapture(0)

# 변환 객체 생성
transform = transforms.ToTensor()

while True:
    # 프레임 읽기
    ret, frame = cap.read()

    # 프레임 변환
    frame = transform(frame)

    # yolo 모델 추론
    predictions = model(frame.unsqueeze(0))

    # 결과 출력
    for pred in predictions.pred[0]:
        box = pred[0:4].int()
        score = pred[4].item()
        label = pred[5].item()
        if score > 0.5:
            cv2.rectangle(frame, (box[0].item(), box[1].item()), (box[2].item(), box[3].item()), (0, 255, 0), 2)
            cv2.putText(frame, f"{label} ({score:.2f})", (box[0].item(), box[1].item() - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    # 프레임 표시
    cv2.imshow("opencv_window", frame)

    # 종료 조건
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 카메라 해제
cap.release()

# opencv 창 닫기
cv2.destroyAllWindows()

이 코드는 카메라에서 프레임을 읽고 yolo 모델을 사용하여 객체를 인식합니다. 인식된 객체는 프레임에 사각형과 라벨로 표시됩니다. 코드에서 waitKey() 함수가 제거되었으므로 프로그램이 멈추지 않고 실시간으로 카메라 영상에서 객체를 인식할 수 있습니다.

제가 제공한 솔루션이 문제를 해결하는 데 도움이 되길 바랍니다. 만약 여전히 문제가 발생하면 주저하지 말고 문의해 주세요.

자세한 내용은 다음 링크를 참조하세요.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 Anthropic의 Claude-3 Opus 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! 실시간 객체 인식 모델 개발에 어려움을 겪고 계신 것 같네요. 질문 주신 내용을 정리해 보면, 라즈베리 파이와 picamera v2를 이용해 촬영한 영상을 저장한 후 저장된 영상에 대해서는 학습된 YOLO 모델로 객체 인식이 잘 되는데, 실시간 카메라 입력에 대해서는 첫 프레임에서만 인식이 되고 OpenCV 창도 나타나지 않는 문제로 보입니다.

실시간 객체 인식을 위해서는 카메라에서 들어오는 프레임을 지속적으로 읽어 들이면서 모델 추론을 수행하고 결과를 화면에 보여주는 루프를 구성해야 합니다. 다음은 PyTorch와 OpenCV를 활용한 실시간 객체 인식 예제 코드입니다:

import cv2
import torch

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

# 카메라 열기
cap = cv2.VideoCapture(0)

while True:
    # 카메라에서 프레임 읽기
    ret, frame = cap.read()
    
    if not ret:
        break
    
    # 모델 추론
    results = model(frame)
    
    # 결과 시각화
    annotated_frame = results.render()[0]
    
    # 프레임 출력
    cv2.imshow('YOLOv5', annotated_frame)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

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

위 코드에서는 VideoCapture로 카메라를 열고 while 루프 안에서 프레임을 읽어 들입니다. 읽어 들인 프레임에 대해 model 객체의 __call__ 메서드로 추론을 수행하고, render 메서드로 결과를 시각화합니다. 이후 cv2.imshow로 처리된 프레임을 화면에 출력합니다. 'q' 키를 누르면 루프를 종료하고 자원을 해제합니다.

참고로 위 코드에서는 미리 학습된 YOLOv5s 모델을 PyTorch Hub를 통해 로드했습니다. 본인이 직접 학습시킨 모델을 사용하려면 해당 부분을 변경하시면 됩니다.

실시간 객체 인식을 다루는 PyTorch 튜토리얼은 다음 링크에서 확인하실 수 있습니다:

제 답변이 문제 해결에 도움이 되었으면 좋겠습니다. 혹시 추가 질문이 있거나 더 자세한 내용이 필요하다면 말씀해 주세요. 감사합니다!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4o 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, 님! 라즈베리파이와 YOLO 모델을 사용하여 실시간 객체 인식을 구현하려고 하시는군요. 현재 카메라로 촬영한 영상을 실시간으로 처리하고 싶지만, 터미널에서는 한 프레임만 인식되고 OpenCV 창이 뜨지 않는 문제가 발생하고 있는 것 같습니다.

이 문제를 해결하기 위해 몇 가지 확인해볼 사항과 개선할 수 있는 방법을 제안드리겠습니다.

  1. OpenCV 비디오 캡처 루프 확인: 실시간 객체 인식을 위해서는 OpenCV의 VideoCapture 객체를 사용하여 카메라로부터 프레임을 지속적으로 읽어와야 합니다. 이때, 루프가 제대로 설정되어 있는지 확인해보세요. 아래는 기본적인 비디오 캡처 루프의 예시입니다.

    import cv2
    
    # 카메라 초기화
    cap = cv2.VideoCapture(0)  # 0은 기본 카메라를 의미합니다.
    
    while True:
        # 프레임 읽기
        ret, frame = cap.read()
        if not ret:
            break
    
        # 여기서 YOLO 모델을 사용하여 객체 인식을 수행합니다.
        # 예: results = yolo_model(frame)
    
        # 결과를 화면에 표시
        cv2.imshow('Real-time Object Detection', frame)
    
        # 'q' 키를 누르면 루프 종료
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # 자원 해제
    cap.release()
    cv2.destroyAllWindows()
    
  2. YOLO 모델 통합: YOLO 모델을 사용하여 프레임을 처리하는 부분을 추가해야 합니다. YOLO 모델을 PyTorch로 구현했다면, 모델을 불러와서 프레임에 대해 추론을 수행하고 결과를 프레임에 그려주는 코드를 작성해야 합니다.

  3. 카메라 인덱스 및 권한 확인: VideoCapture(0)에서 0은 기본 카메라를 의미합니다. 만약 다른 카메라를 사용 중이라면 인덱스를 변경해보세요. 또한, 카메라에 접근할 수 있는 권한이 있는지 확인해보세요.

  4. OpenCV 창이 뜨지 않는 문제: OpenCV 창이 뜨지 않는 경우, GUI 환경이 제대로 설정되어 있는지 확인해야 합니다. 특히, 라즈베리파이에서는 GUI 환경이 제대로 설정되어 있지 않으면 창이 뜨지 않을 수 있습니다.

위의 방법들을 시도해보시고, 문제가 해결되지 않는다면 추가적인 오류 메시지나 코드의 특정 부분을 공유해주시면 더 구체적인 도움을 드릴 수 있을 것 같습니다.

추가로, PyTorch와 YOLO를 사용하는 방법에 대한 공식 튜토리얼을 참고하시면 도움이 될 것입니다. 다음 링크에서 관련 자료를 확인하실 수 있습니다:

제 답변이 도움이 되었기를 바라며, 혹시 잘못된 부분이 있거나 추가적인 질문이 있다면 언제든지 말씀해 주세요. 감사합니다!


  • 이 답변이 도움이 되셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!