custom dataset인 쓰레기 데이터셋을 이용하였고 라벨은 11종류 입니다.(플라스틱, 종이 등등). 현재 YOLO v5를 이용하여 custom dataset 학습을 완료한 상태입니다. 이때 webcam과 연동하여 실시간으로 정상 분류되는 것을 확인하였습니다. 하고자 하는 작업은 webcam과 YOLO 결과를 바탕으로 아두이노에 연결된 스텝모터를 제어하고자 합니다. 예를 들어, 플라스틱이면 1번 서보모터를 2초동안 시계방향으로 돌립니다. 종이라면 2번 스텝모터를 2초동안 시계방향으로 돌리는 식으로 구성하고자 합니다. 아두이노와 연동 부분에서 감이 안오네요. 도와주세요!
- 아래 답변은 OpenAI의 GPT-3.5(ChatGPT) 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
- 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
아두이노와 연동하는 부분은 아두이노에서 제공하는 시리얼 통신을 이용하면 됩니다. 먼저 아두이노와 PC를 연결하고, 아두이노에서 시리얼 통신을 이용하여 PC로 데이터를 보내는 코드를 작성합니다. 이때 아두이노에서는 서보모터를 제어하는 코드를 작성합니다.
아래는 아두이노에서 서보모터를 제어하는 코드입니다. 이 코드를 아두이노에 업로드합니다.
#include <Servo.h>
Servo servo1;
Servo servo2;
void setup() {
Serial.begin(9600);
servo1.attach(9);
servo2.attach(10);
}
void loop() {
if (Serial.available() > 0) {
int label = Serial.read() - '0';
if (label == 1) {
servo1.write(180);
delay(2000);
servo1.write(0);
} else if (label == 2) {
servo2.write(180);
delay(2000);
servo2.write(0);
}
}
}
이제 PC에서 아래와 같이 파이썬 코드를 작성하여 시리얼 통신을 이용하여 아두이노로 데이터를 보냅니다. 이때 YOLO v5 모델을 이용하여 쓰레기를 분류하고, 분류된 결과를 아두이노로 보내서 서보모터를 제어합니다.
import serial
import time
import cv2
import torch
import torchvision
import numpy as np
from PIL import Image
# 아두이노와 시리얼 통신을 위한 객체 생성
ser = serial.Serial('COM3', 9600)
# YOLO v5 모델 로드
model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')
# 웹캠에서 영상을 받아오는 객체 생성
cap = cv2.VideoCapture(0)
while True:
# 웹캠에서 영상을 읽어옴
ret, frame = cap.read()
if not ret:
break
# YOLO v5 모델을 이용하여 쓰레기를 분류
results = model(frame)
# 분류된 결과를 출력
results.print()
# 분류된 결과를 아두이노로 보내서 서보모터를 제어
for result in results.xyxy[0]:
label = int(result[5])
if label == 1:
ser.write(b'1')
elif label == 2:
ser.write(b'2')
time.sleep(2)
# 웹캠에서 읽어온 영상을 화면에 출력
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
# 객체 해제
cap.release()
cv2.destroyAllWindows()
위 코드에서 COM3
부분은 아두이노가 연결된 포트에 따라 다르게 설정해야 합니다. 또한, best.pt
부분은 학습된 모델의 경로에 따라 다르게 설정해야 합니다. 이후 웹캠에서 쓰레기를 분류하면서 분류된 결과에 따라 아두이노에서 서보모터가 제어됩니다.
- 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래
를 한 번 눌러주시길 부탁드려요!
- 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
- 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
YOLO v5와 아두이노를 연동하여 서보모터를 제어하는 방법을 설명하겠습니다. 이 작업을 수행하려면 Python에서 아두이노와 통신할 수 있는 라이브러리인 pyserial
이 필요합니다. 먼저 pyserial
을 설치하십시오.
pip install pyserial
그런 다음 아두이노 코드를 작성하여 서보모터를 제어할 수 있는 기능을 구현합니다. 예를 들어, 다음 코드는 시리얼 통신을 통해 들어오는 문자에 따라 서보모터를 제어합니다.
#include <Servo.h>
Servo servo1;
Servo servo2;
int pos = 0;
void setup() {
servo1.attach(9);
servo2.attach(10);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
char received = Serial.read();
if (received == '1') {
for (pos = 0; pos <= 180; pos += 1) {
servo1.write(pos);
delay(15);
}
delay(2000);
for (pos = 180; pos >= 0; pos -= 1) {
servo1.write(pos);
delay(15);
}
} else if (received == '2') {
for (pos = 0; pos <= 180; pos += 1) {
servo2.write(pos);
delay(15);
}
delay(2000);
for (pos = 180; pos >= 0; pos -= 1) {
servo2.write(pos);
delay(15);
}
}
}
}
이제 Python 코드를 작성하여 YOLO v5의 결과를 기반으로 아두이노와 통신하고 서보모터를 제어합니다. 아래 코드는 YOLO v5의 결과를 얻고, 분류된 물체에 따라 시리얼 통신을 통해 아두이노에 명령을 전송하는 예입니다.
import cv2
import torch
import serial
# 아두이노와 연결
arduino = serial.Serial('COM3', 9600)
# YOLO v5 모델 불러오기
model = torch.hub.load('ultralytics/yolov5', 'custom', path='path/to/your/best.pt')
model.conf = 0.5
# 웹캠 사용
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# YOLO v5로 물체 감지
results = model(frame)
# 결과를 기반으로 서보모터 제어
for *box, conf, cls in results.xyxy[0]:
if cls == 0: # 플라스틱
arduino.write(b'1')
elif cls == 1: # 종이
arduino.write(b'2')
# 화면에 결과 표시
results.render()
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
arduino.close()
위 코드를 실행하면 웹캠에서 실시간으로 플라스틱과 종이를 감지하고, 감지된 물체에 따라 서보모터를 제어합니다. 이 코드를 참고하여 필요한 기능을 추가하고 수정하여 프로젝트를 완성하십시오.
- 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래
를 한 번 눌러주시길 부탁드려요!
스텝 모터도 동일한가요?
- 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
- 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
아두이노와 YOLO v5를 연동하기 위해서는 먼저 YOLO v5의 출력을 파싱하여 원하는 라벨에 따라 아두이노에 명령을 전달해야 합니다. 이를 위해 Python에서 시리얼 통신을 사용하여 아두이노와 통신할 수 있습니다. 아래는 전체 과정을 설명하는 예제입니다.
- 먼저, Python에서 아두이노와 시리얼 통신을 할 수 있도록
pyserial
라이브러리를 설치합니다.
pip install pyserial
- 아두이노 IDE에서 아래 코드를 아두이노에 업로드합니다. 이 코드는 아두이노가 시리얼 통신으로 명령을 받아 서보모터를 제어하는 예제입니다.
#include <Servo.h>
Servo servo1;
Servo servo2;
void setup() {
Serial.begin(9600);
servo1.attach(9); // 서보모터 1을 9번 핀에 연결
servo2.attach(10); // 서보모터 2를 10번 핀에 연결
}
void loop() {
if (Serial.available() > 0) {
int command = Serial.parseInt();
if (command == 1) {
servo1.write(0); // 시계방향으로 회전
delay(2000);
servo1.write(90); // 원래 위치로 돌아옴
} else if (command == 2) {
servo2.write(0); // 시계방향으로 회전
delay(2000);
servo2.write(90); // 원래 위치로 돌아옴
}
}
}
- 이제 Python 코드를 작성하여 YOLO v5의 출력을 파싱하고, 원하는 라벨에 따라 아두이노에 명령을 전달합니다.
import cv2
import torch
import serial
# 시리얼 통신 설정
ser = serial.Serial('COM3', 9600) # 아두이노가 연결된 포트와 보레이트 설정
# YOLO v5 모델 불러오기
model = torch.hub.load('ultralytics/yolov5', 'custom', path='path/to/your/best.pt') # 학습된 모델 경로
model.conf = 0.25 # confidence threshold 설정
# 웹캠 사용
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# YOLO v5로 객체 검출
results = model(frame)
# 검출된 객체 정보 파싱
for *box, conf, cls in results.xyxy[0].tolist():
label = int(cls)
if label == 0: # 플라스틱
ser.write(b'1') # 아두이노에 1번 명령 전달
elif label == 1: # 종이
ser.write(b'2') # 아두이노에 2번 명령 전달
# 프레임 출력
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
이 예제 코드를 사용하여 웹캠에서 실시간으로 YOLO v5를 실행하고, 플라스틱과 종이를 감지하여 각각 서보모터를 제어할 수 있습니다. 필요에 따라 코드를 수정하여 다른 라벨에 대한 서보모터 제어를 추가할 수 있습니다.
- 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래
를 한 번 눌러주시길 부탁드려요!