→ 해당 링크를 참고해 colab에서 drone을 인식하는 훈련모델을 생성
생성된 훈련모델은 best.pt
→drone_yolov5.pt 으로 이름 변경 후
# CvBridge 인스턴스 생성
self.bridge = CvBridge()
# 상대경로
weights = './drone_yolov5.pt'
# 모델 로드
self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=weights)
torch.hub는 사전 훈련된 모델을 쉽게 다운로드하고 사용할 수 있는 PyTorch의 유틸리티
**torch.hub.load(repo_or_dir, model, *args, **kwargs)**
//해당 함수는 repo_or_dir에서 모델을 로드하며
//*args와 **kwargs를 통해 모델 초기화에 필요한 매개변수를 전달
**ultralytics/yolov5**
이 부분은 GitHub에서 YOLOv5 모델을 호스팅하는 Ultralytics의 저장소
pyTorch Hub는 이 저장소의 `hubconf.py` 파일을 참조하여 필요한 정보를 얻고 모델을 로드
`'custom'`:이 매개변수는 로드하고자 하는 모델의 종류
`'custom'`은 사용자 정의 가중치 파일을 사용하여 모델을 초기화할때 사용
`path=weights`여기서 `weights`는 사용자 정의 가중치 파일의 경로를 나타내는 변수
이 가중치 파일은 **드론 학습 가중치 파일**
`path` 매개변수를 통해 해당 가중치 파일의 경로를 모델 로드 함수에 전달
이를 통해 모델은 사용자가 제공한 **가중치**를 사용하여 초기화
**가중치란?**
:객체 검출을 수행하기 위해 이미지 내 객체의 형태, 크기, 위치 등을 식별하는 데 필요한 정보
pytorch는 앞서 설명 한 것 처럼 모델 로드부터 의존성설치, 가중치 다운로드등이 자동으로 처리되어
간편함
해당 링크에서 사용한 데이터셋은 nc값은 21이므로 (모델이 탐지하고 분류할 수 있는 객체의 클래스 수)
/ultralytics의 하위 폴더에 존재하는(사람마다 경로가 다를 수 있음) yolov5.yaml파일을 수정해줘야한다.
**//기존 파일**
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv5 object detection model with P3-P5 outputs. For details see <https://docs.ultralytics.com/models/yolov5>
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov5n.yaml' will call yolov5.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024]
s: [0.33, 0.50, 1024]
m: [0.67, 0.75, 1024]
l: [1.00, 1.00, 1024]
x: [1.33, 1.25, 1024]
.
.
.
**//수정 후 파일**
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv5 object detection model with P3-P5 outputs. For details see <https://docs.ultralytics.com/models/yolov5>
# Parameters
nc: 21 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov5n.yaml' will call yolov5.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024]
s: [0.33, 0.50, 1024]
m: [0.67, 0.75, 1024]
l: [1.00, 1.00, 1024]
x: [1.33, 1.25, 1024]
.
.
.
import cv2
import rospy
import numpy as np
import torch
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image
from std_msgs.msg import String
import yaml
import time
class RealTimeObjectDetection:
def __init__(self):
# ROS 노드 초기화
rospy.init_node('dronedetection', anonymous=True)
# CvBridge 인스턴스 생성
self.bridge = CvBridge()
# 상대경로
weights = './drone_yolov5.pt'
# 모델 로드
self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=weights)
def callback(self, data):
try:
# ROS 이미지를 OpenCV 형식으로 변환
cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
except CvBridgeError as e:
print(e)
# YOLOv5를 이용한 객체 탐지 수행
results = self.model(cv_image)
# 탐지 결과를 OpenCV 이미지로 변환하여 보여줌
cv2.imshow('YOLOv5 Detection', np.squeeze(results.render()))
cv2.waitKey(1)
if __name__ == '__main__':
rtodt = RealTimeObjectDetection()
try:
rospy.spin()
except KeyboardInterrupt:
cv2.destroyAllWindows()