yolo v5 객체 인식이 되지 않아요

커스텀 데이터셋 학습을 완료하고 best.pt를 구하였습니다. 그 후 yolo v5에 넣어서 python detect.py --weight best.pt --conf 0.5 --img 416 --source 0
으로 하여서 실시간 객체인식을 시켰습니다. 저는 이제 여기서 아두이노와 연결하여 객체 head가 인식되면 빨간색 Led와 능동 부저가 작동하고, 객체 helmet이 인식되면 빨간색 Led와 능동부저는 멈추고 초록색 Led가 작동 하게끔 코딩을 하는 도중
import serial
import time
import cv2
from models.experimental import attempt_load
from utils.general import non_max_suppression
from utils.general import scale_segments

시리얼 포트 설정 (아두이노와 연결된 포트로 변경)

ser = serial.Serial('COM3', 9600, timeout=1)
time.sleep(2) # 시리얼 통신 안정화 대기

YOLO v5 모델 로드

import torch

가중치 경로 설정

weights = 'best.pt' # 모델 경로

모델 로드

model = attempt_load(weights) # load model

CPU로 모델 이동

device = torch.device('cpu')
model.to(device)

객체 인식 함수

import numpy as np
import cv2

def detect(image):
try:
img = image[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB, to 3x416x416
except Exception as e:
print(f"Error processing image: {e}")
return None

img = np.ascontiguousarray(img)
img = torch.from_numpy(img).to(device)
img = img.float() / 255.0  # 0 - 255 to 0.0 - 1.0
if img.ndimension() == 3:
    img = img.unsqueeze(0)

pred = model(img, augment=False)[0]
pred = non_max_suppression(pred, 0.5, 0.45, classes=None, agnostic=False)

for det in pred:
    if len(det):
        det[:, :4] = scale_segments(img.shape[2:], det[:, :4], image.shape).round()
        for *xyxy, conf, cls in det:
            label = model.names[int(cls)]
            return label
return None

실시간 객체 인식 및 시리얼 통신

cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break

label = detect(frame)
if label:
    if label == 'head':
        ser.write(b'head\n')
    elif label == 'helmet':
        ser.write(b'helmet\n')

cv2.imshow('YOLO v5', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
    break

cap.release()
cv2.destroyAllWindows()
ser.close()
이렇게 코딩을 하여 run을 시키니 웹캠만 켜지고 객체 인식과 박스,라벨 이름등은 뜨지도 않네요 ㅠㅜ

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

안녕하세요! YOLO v5를 사용하여 객체 인식과 아두이노 연동을 시도하셨는데, 객체 인식이 제대로 되지 않아 많이 답답하셨을 것 같습니다. 문제를 잘 이해했습니다. YOLO v5 모델을 사용하여 실시간 객체 인식을 시도했지만, 웹캠만 켜지고 객체 인식 결과가 화면에 표시되지 않는 문제를 겪고 계시네요.

이 문제를 해결하기 위해 몇 가지 점검해볼 사항과 수정할 부분을 제안드리겠습니다.

  1. 모델 로드 및 이미지 전처리:

    • 모델을 로드하고 이미지를 전처리하는 부분에서 문제가 있을 수 있습니다. 이미지 전처리 과정에서 BGR에서 RGB로 변환하고, 차원을 변경하는 부분을 확인해보세요.
  2. 객체 인식 결과 시각화:

    • 객체 인식 결과를 화면에 표시하기 위해서는 cv2.rectanglecv2.putText를 사용하여 바운딩 박스와 라벨을 그려야 합니다.
  3. 디버깅:

    • 디버깅을 위해 중간 결과를 출력해보는 것도 좋은 방법입니다. 예를 들어, detect 함수 내에서 예외가 발생하는지 확인하고, 모델의 출력이 올바른지 확인해보세요.

아래는 수정된 코드입니다. 객체 인식 결과를 화면에 표시하도록 추가하였습니다.

import serial
import time
import cv2
import torch
from models.experimental import attempt_load
from utils.general import non_max_suppression, scale_segments
import numpy as np

# 시리얼 포트 설정 (아두이노와 연결된 포트로 변경)
ser = serial.Serial('COM3', 9600, timeout=1)
time.sleep(2)  # 시리얼 통신 안정화 대기

# YOLO v5 모델 로드
weights = 'best.pt'  # 모델 경로
model = attempt_load(weights)  # load model

# CPU로 모델 이동
device = torch.device('cpu')
model.to(device)

# 객체 인식 함수
def detect(image):
    try:
        img = image[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB, to 3x416x416
        img = np.ascontiguousarray(img)
        img = torch.from_numpy(img).to(device)
        img = img.float() / 255.0  # 0 - 255 to 0.0 - 1.0
        if img.ndimension() == 3:
            img = img.unsqueeze(0)

        pred = model(img, augment=False)[0]
        pred = non_max_suppression(pred, 0.5, 0.45, classes=None, agnostic=False)

        for det in pred:
            if len(det):
                det[:, :4] = scale_segments(img.shape[2:], det[:, :4], image.shape).round()
                for *xyxy, conf, cls in det:
                    label = model.names[int(cls)]
                    # 바운딩 박스 그리기
                    cv2.rectangle(image, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 255, 0), 2)
                    # 라벨 텍스트 그리기
                    cv2.putText(image, label, (int(xyxy[0]), int(xyxy[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
                    return label
        return None
    except Exception as e:
        print(f"Error processing image: {e}")
        return None

# 실시간 객체 인식 및 시리얼 통신
cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    label = detect(frame)
    if label:
        if label == 'head':
            ser.write(b'head\n')
        elif label == 'helmet':
            ser.write(b'helmet\n')

    cv2.imshow('YOLO v5', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
ser.close()

이 코드는 객체 인식 결과를 화면에 표시하고, 아두이노로 시리얼 데이터를 전송합니다. 객체 인식이 제대로 되는지 확인해보세요.

추가로, PyTorch 공식 튜토리얼을 참고하시면 더 많은 정보를 얻으실 수 있습니다:

혹시 더 궁금한 점이 있거나 문제가 해결되지 않으면 언제든지 질문해 주세요. 제 답변이 틀릴 수도 있으니, 다른 의견도 참고하시기 바랍니다. 화이팅입니다!


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

죄송하지만 귀하가 제공한 내용만으로는 문제가 무엇인지 파악할 수 없습니다. 코드를 실행했을 때 오류가 발생하는지 또는 객체가 인식되지 않는지 여부를 알 수 없습니다. 문제가 무엇인지 더 자세히 설명해 주시기 바랍니다.

가능한 문제 중 하나는 detect 함수가 None을 반환하는 것입니다. 이 경우 반환 값을 확인하고 None이 아닌지 확인하세요. 또 다른 가능한 문제는 model이 올바르게 로드되지 않은 것입니다. 이 경우 모델 로딩 코드를 확인하고 모델이 올바르게 로드되었는지 확인하세요.

도움을 주셔서 감사합니다.


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

안녕하세요! YOLO v5 객체 인식 문제로 어려움을 겪고 계시는 것 같네요. 질문 내용을 정리해 보면, 커스텀 데이터셋으로 학습을 완료하고 best.pt 가중치 파일을 얻은 후 실시간 객체 인식을 시도했습니다. 그리고 아두이노와 연결하여 객체 인식 결과에 따라 LED와 부저를 제어하려고 합니다. 그런데 실행 시 웹캠만 켜지고 객체 인식 결과와 바운딩 박스, 라벨 등이 표시되지 않는 문제가 발생했습니다.

이 문제를 해결하기 위해 다음과 같은 방법을 제안드립니다:

  1. 모델 가중치 파일(best.pt)의 경로가 올바른지 확인해 주세요. 가중치 파일이 detect.py 스크립트와 동일한 디렉토리에 있는지 확인하시기 바랍니다.

  2. detect 함수에서 pred 변수가 None일 경우에 대한 예외 처리를 추가해 주세요. 객체가 감지되지 않은 경우에도 프로그램이 계속 실행될 수 있도록 수정합니다.

  3. 실시간 객체 인식 루프에서 프레임에 바운딩 박스와 라벨을 그리는 코드를 추가해 주세요. cv2.rectangle()과 cv2.putText() 함수를 사용하여 감지된 객체의 바운딩 박스와 라벨을 프레임에 그릴 수 있습니다.

아래는 수정된 detect 함수와 실시간 객체 인식 루프의 예시 코드입니다:

def detect(image):
    try:
        img = image[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB, to 3x416x416
    except Exception as e:
        print(f"Error processing image: {e}")
        return None, None

    img = np.ascontiguousarray(img)
    img = torch.from_numpy(img).to(device)
    img = img.float() / 255.0  # 0 - 255 to 0.0 - 1.0
    if img.ndimension() == 3:
        img = img.unsqueeze(0)

    pred = model(img, augment=False)[0]
    pred = non_max_suppression(pred, 0.5, 0.45, classes=None, agnostic=False)

    if len(pred) > 0:
        det = pred[0]
        if len(det):
            det[:, :4] = scale_segments(img.shape[2:], det[:, :4], image.shape).round()
            for *xyxy, conf, cls in det:
                label = model.names[int(cls)]
                return label, det
    return None, None

# 실시간 객체 인식 및 시리얼 통신
cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    label, det = detect(frame)
    if label:
        if label == 'head':
            ser.write(b'head\n')
        elif label == 'helmet':
            ser.write(b'helmet\n')
        
        # 바운딩 박스와 라벨 그리기
        for *xyxy, conf, cls in det:
            x1, y1, x2, y2 = map(int, xyxy)
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    cv2.imshow('YOLO v5', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
ser.close()

이 코드는 객체 인식 결과에 따라 바운딩 박스와 라벨을 프레임에 그리고, 객체 인식이 되지 않은 경우에도 프로그램이 계속 실행될 수 있도록 수정되었습니다.

추가로 참고할 만한 PyTorch 튜토리얼은 다음과 같습니다:

위의 내용을 참고하여 코드를 수정해 보시기 바랍니다. 만약 문제가 지속되거나 추가 정보가 필요하다면 새로운 게시물을 작성해 주시면 더 자세히 도와드리도록 하겠습니다.

마지막으로 제가 제안한 해결 방법이 완벽하지 않을 수 있다는 점 양해 부탁드립니다. 기술적인 문제는 다양한 요인에 의해 발생할 수 있기 때문에 시행착오를 거쳐야 할 수도 있습니다. 함께 해결책을 찾아가 보았으면 좋겠습니다. 도움이 되었기를 바랍니다!


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

안녕하세요! YOLO v5를 사용하여 커스텀 데이터셋으로 학습한 모델을 실시간 객체 인식에 활용하려는 과정에서 문제가 발생했군요. 객체 인식이 되지 않아 웹캠에서 객체의 박스와 라벨 이름이 표시되지 않는 상황에 대해 답답함을 느끼고 계실 것 같습니다. 제공해주신 코드와 설명을 바탕으로 문제를 정리하고 해결 방안을 모색해보겠습니다.

문제는 크게 두 부분으로 나눌 수 있습니다:

  1. YOLO v5를 사용한 객체 인식이 실시간으로 이루어지지 않음.
  2. 인식된 객체에 따라 아두이노를 통해 LED와 부저를 제어하려는 코드가 예상대로 작동하지 않음.

먼저, 객체 인식이 되지 않는 문제에 대해 집중해 보겠습니다. 제공해주신 코드를 보면, YOLO v5 모델을 로드하고, 실시간으로 웹캠의 이미지를 받아와 객체 인식을 시도하는 부분까지는 잘 구성되어 있습니다. 하지만, 실제로 객체 인식 결과를 화면에 표시하는 부분이 누락되어 있는 것 같습니다. YOLO v5의 detect.py 스크립트를 사용할 때는 인식된 객체 주변에 박스를 그리고 라벨을 표시하는 코드가 포함되어 있어야 합니다.

아래는 객체 인식 후 결과를 화면에 표시하는 기능을 포함한 예시 코드입니다. 이 코드는 인식된 객체에 대한 박스와 라벨을 그리는 방법을 보여줍니다.

import cv2
import torch
import numpy as np
from models.experimental import attempt_load
from utils.general import non_max_suppression, scale_segments

# 시리얼 포트 설정
import serial
ser = serial.Serial('COM3', 9600, timeout=1)
time.sleep(2)  # 시리얼 통신 안정화 대기

# YOLO v5 모델 로드
weights = 'best.pt'  # 모델 경로
model = attempt_load(weights, map_location='cpu')  # CPU 사용
device = torch.device('cpu')
model.to(device)

def detect(image):
    # 이미지 전처리
    img = image[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB, to 3x416x416
    img = np.ascontiguousarray(img)
    img = torch.from_numpy(img).to(device)
    img = img.float() / 255.0  # 정규화
    if img.ndimension() == 3:
        img = img.unsqueeze(0)

    # 객체 인식
    pred = model(img, augment=False)[0]
    pred = non_max_suppression(pred, 0.5, 0.45, classes=None, agnostic=False)

    for det in pred:
        if len(det):
            det[:, :4] = scale_segments(img.shape[2:], det[:, :4], image.shape).round()
            for *xyxy, conf, cls in det:
                label = model.names[int(cls)]
                plot_one_box(xyxy, image, label=label, color=(255,0,0), line_thickness=2)
                return label
    return None

# 실시간 객체 인식 및 시리얼 통신
cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    label = detect(frame)
    if label:
        if label == 'head':
            ser.write(b'head\n')
        elif label == 'helmet':
            ser.write(b'helmet\n')

    cv2.imshow('YOLO v5', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
ser.close()

위 코드에서 plot_one_box 함수는 인식된 객체 주변에 박스를 그리고 라벨을 표시하는 역할을 합니다. 이 함수는 YOLO v5의 유틸리티 함수 중 하나이며, 실제 사용을 위해서는 해당 함수의 정의를 코드에 포함시켜야 합니다. plot_one_box 함수의 구현은 YOLO v5의 GitHub 저장소에서 찾을 수 있습니다.

이 예시 코드와 함께, PyTorch 공식 문서나 YOLO v5 관련 문서를 참고하시면 더 많은 정보를 얻을 수 있습니다. PyTorch 관련 문서는 다음 링크에서 확인하실 수 있습니다:

제가 제공한 코드나 설명에 오류가 있을 수 있으니, 실제 적용하실 때는 관련 문서를 참고하시어 필요한 부분을 조정해 주시기 바랍니다. 문제 해결에 도움이 되었기를 바라며, 추가적인 질문이나 필요한 정보가 있으시면 언제든지 질문해 주세요!


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