컴퓨터로 yolo8학습 후 라즈베리파이 제로에서 학습모델만 사용하는 방법

지금 문제는 데이터셋은 roloflow에서 만들었는데 라즈베리파이 제로에서 import roboflow가 안되고 있습니다. 그래서 라즈 파이캠으로는 실시간으로 영상만 받아와서 pc에서 다 처리 후에 다시 라즈로 데이터 전송하는 형태로 만들고 싶은데 정확한 방법이 떠오르지 않아서 질문드립니다.

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

안녕하세요 dmstj님,

라즈베리파이 제로에서 yolo 모델을 사용하려는 문제에 대해 잘 이해했습니다.

해결 방안은 다음과 같습니다.

  1. PC에서 yolo 모델을 학습합니다.
  2. 학습된 모델(weights)만 라즈베리파이로 옮깁니다.
  3. 라즈베리파이에 설치된 PyTorch에서 학습된 weights를 불러와 추론(inference)을 수행합니다.

아래 코드는 라즈베리파이에서 학습된 yolo weights를 불러오는 예시입니다.

import torch

# 학습된 weights 경로
weights_path = 'best.pt' 

# 모델 정의 
model = YOLOv3()

# weights 불러오기
model.load_state_dict(torch.load(weights_path))

# 추론 모드 전환
model.eval()

# 이미지 읽어오기
img = Image.open('test.jpg')

# 추론 수행
predictions = model(img)

이 방법으로 PC에서 모델을 학습하고, 라즈베리파이에서 실시간으로 학습된 weights만 이용하여 추론을 수행할 수 있습니다.

데이터 전송 과정도 필요에 따라 추가로 구현하시면 될 것 같습니다.

제가 설명한 내용 중 이해가 안 되거나 모호한 부분이 있다면 언제든지 댓글 달아 주세요. 감사합니다.


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

안녕하세요! YOLOv8 모델을 학습시킨 후 라즈베리파이 제로에서 모델을 사용하고자 하는 상황에 대해 질문해주셨군요. 라즈베리파이 제로에서 roboflow를 import하는 데 문제가 있으신 것 같습니다. 라즈베리파이 제로의 성능 제약으로 인해 실시간 영상 처리가 어려울 수 있으므로, PC에서 처리 후 라즈베리파이로 결과만 전송하는 방식을 고려하고 계신 것으로 이해했습니다.

라즈베리파이 제로에서 직접 roboflow를 사용하지 않고, PC에서 처리한 후 결과를 라즈베리파이로 전송하는 방법에 대해 설명드리겠습니다.

  1. 라즈베리파이 카메라 설정: 라즈베리파이에서 카메라 모듈을 사용하여 실시간으로 영상을 캡처합니다. 이 영상을 PC로 전송하기 위해 스트리밍 서버를 설정할 수 있습니다.

  2. PC에서 영상 처리: PC에서는 스트리밍된 영상을 받아 YOLOv8 모델을 사용하여 객체 인식을 수행합니다. 처리된 결과(예: 객체의 위치, 종류 등)를 추출합니다.

  3. 결과 전송: 처리된 결과를 라즈베리파이로 전송하기 위해 네트워크를 통한 통신 방법을 사용합니다. 예를 들어, MQTT 프로토콜이나 HTTP 요청을 사용할 수 있습니다.

아래는 간단한 예시 코드입니다.

라즈베리파이에서 영상 스트리밍 서버 설정 (Python 코드 예시):

# 라즈베리파이에서 실행할 스트리밍 서버 코드
from http.server import BaseHTTPRequestHandler, HTTPServer
import socketserver
import io
from picamera import PiCamera
from threading import Condition

PAGE="""\
<html>
<head>
<title>라즈베리파이 카메라 스트리밍</title>
</head>
<body>
<center><h1>라즈베리파이 카메라 스트리밍</h1></center>
<center><img src="stream.mjpg" width="640" height="480"></center>
</body>
</html>
"""

class StreamingHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            self.send_response(200)
            self.send_header('Content-Type', 'text/html')
            self.end_headers()
            self.wfile.write(PAGE.encode('utf-8'))
        elif self.path == '/stream.mjpg':
            self.send_response(200)
            self.send_header('Age', 0)
            self.send_header('Cache-Control', 'no-cache, private')
            self.send_header('Pragma', 'no-cache')
            self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME')
            self.end_headers()
            try:
                while True:
                    with output.condition:
                        output.condition.wait()
                        frame = output.frame
                    self.wfile.write(b'--FRAME\r\n')
                    self.send_header('Content-Type', 'image/jpeg')
                    self.send_header('Content-Length', len(frame))
                    self.end_headers()
                    self.wfile.write(frame)
                    self.wfile.write(b'\r\n')
            except Exception as e:
                print('스트리밍 중 에러 발생:', e)

class StreamingOutput(object):
    def __init__(self):
        self.frame = None
        self.condition = Condition()

    def write(self, buf):
        if buf.startswith(b'\xff\xd8'):
            # 새 프레임 시작, 조건 변수를 사용하여 스트리밍 스레드에 알림
            with self.condition:
                self.frame = buf
                self.condition.notify_all()

with PiCamera(resolution='640x480', framerate=24) as camera:
    output = StreamingOutput()
    # 카메라 출력을 'output'으로 설정
    camera.start_recording(output, format='mjpeg')
    try:
        address = ('', 8000)
        server = HTTPServer(address, StreamingHandler)
        print('스트리밍 서버 시작...')
        server.serve_forever()
    finally:
        camera.stop_recording()

PC에서 영상 처리 및 라즈베리파이로 결과 전송 (Python 코드 예시):

# PC에서 실행할 객체 인식 및 결과 전송 코드
import cv2
import requests

# 라즈베리파이 스트리밍 서버의 URL
stream_url = 'http://raspberrypi.local:8000/stream.mjpg'

# 스트리밍 영상을 받아오기
cap = cv2.VideoCapture(stream_url)

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

    # YOLOv8 모델을 사용하여 객체 인식 처리 (여기서는 예시로 생략)
    # ...

    # 처리된 결과를 라즈베리파이로 전송 (예시로 HTTP POST 요청 사용)
    # 여기서는 'http://raspberrypi.local:5000/result'가 결과를 받을 라즈베리파이의 서버 주소라고 가정
    result_data = {'object': 'detected_object', 'confidence': 0.9}
    response = requests.post('http://raspberrypi.local:5000/result', json=result_data)

    if response.status_code == 200:
        print('결과 전송 성공')

    # 영상을 화면에 표시 (선택적)
    cv2.imshow('Frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

위 코드는 예시이며 실제 환경에 맞게 수정이 필요합니다. 또한, 라즈베리파이 제로의 성능 제약으로 인해 실시간 처리가 어려울 수 있으므로, 처리 속도와 전송 속도를 고려해야 합니다.

추가적으로 PyTorch 관련 자료는 PyTorch 공식 튜토리얼(Welcome to PyTorch Tutorials — PyTorch Tutorials 2.2.0+cu121 documentation)에서 찾아볼 수 있습니다. 한국어로 된 튜토리얼은 https://tutorials.pytorch.kr 에서 확인하실 수 있습니다.

제 답변이 정확하지 않을 수도 있으니, 실제 구현 시 추가적인 검토가 필요하다는 점을 유념해주시기 바랍니다.


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

안녕하세요!

문제 상황을 정리해보겠습니다. 라즈베리파이 제로에서 Roboflow 라이브러리를 사용할 수 없어서, YOLOv8을 학습시킨 모델을 라즈베리파이 제로에서 사용하는 데 어려움을 겪고 계신 것 같습니다. 목표는 라즈베리파이 카메라로 실시간 영상을 캡처하고, 이를 PC로 전송하여 YOLOv8 모델로 처리한 후 결과를 다시 라즈베리파이로 전송하는 것으로 이해했습니다.

이 문제를 해결하기 위해 몇 가지 방법을 제안드리겠습니다.

  1. 라즈베리파이 제로에서 영상 캡처 및 전송:
    라즈베리파이에서 Python을 사용하여 PiCamera로 영상을 캡처하고, 이를 네트워크를 통해 PC로 전송할 수 있습니다. 이를 위해 picamera 라이브러리와 socket 통신을 사용할 수 있습니다.

  2. PC에서 YOLOv8 모델로 영상 처리:
    PC에서는 PyTorch와 YOLOv8 모델을 사용하여 전송받은 영상을 처리합니다. 처리된 결과는 다시 라즈베리파이로 전송할 수 있습니다.

  3. 라즈베리파이 제로에서 결과 수신 및 활용:
    라즈베리파이는 PC로부터 결과를 수신하여 필요한 작업을 수행합니다.

아래는 라즈베리파이에서 영상을 캡처하고 PC로 전송하는 예시 코드입니다.

# 라즈베리파이 코드 예시
import io
import socket
import picamera

# PC의 IP 주소와 포트 번호 설정
server_ip = 'PC의 IP 주소'
server_port = 8000

# 소켓 연결 생성
client_socket = socket.socket()
client_socket.connect((server_ip, server_port))

# 연결된 소켓을 파일처럼 사용
connection = client_socket.makefile('wb')

try:
    with picamera.PiCamera() as camera:
        camera.resolution = (640, 480)  # 해상도 설정
        camera.start_preview()
        # 카메라가 준비될 때까지 대기
        time.sleep(2)

        # 스트림 생성
        stream = io.BytesIO()
        for _ in camera.capture_continuous(stream, 'jpeg'):
            # 스트림 길이를 서버에 전송
            connection.write(struct.pack('<L', stream.tell()))
            connection.flush()
            # 스트림의 내용을 서버에 전송
            stream.seek(0)
            connection.write(stream.read())
            # 스트림을 재설정
            stream.seek(0)
            stream.truncate()
finally:
    connection.close()
    client_socket.close()

PC에서는 소켓을 통해 데이터를 수신하고 YOLOv8 모델로 처리한 후 결과를 다시 라즈베리파이로 전송하는 코드를 작성해야 합니다.

이러한 네트워크 통신과 영상 처리에 대한 자세한 내용은 PyTorch 공식 문서나 다른 네트워크 프로그래밍 관련 자료를 참고하시면 도움이 될 것입니다. PyTorch 관련 문서는 다음 링크에서 확인하실 수 있습니다:

제가 제안한 방법이나 코드에 오류가 있을 수 있으니, 실제 환경에 맞게 조정하시고 필요한 경우 추가적인 정보를 찾아보시기 바랍니다. 문제 해결에 도움이 되길 바랍니다!


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