Yolov5를 활용한 드론 탐지

→ 해당 링크를 참고해 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를 활용하여 모델을 로드한이유?

pytorch는 앞서 설명 한 것 처럼 모델 로드부터 의존성설치, 가중치 다운로드등이 자동으로 처리되어

간편함

yolov5.yaml 수정

해당 링크에서 사용한 데이터셋은 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]
  .
  .
  .

해당 훈련 모델을 gazebo에서 사용하기

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()