RT-DETR 객체인식이란? + 커스텀 트레이닝도 진행해보자!

RT-DETR 객체인식 모델을 소개하고, Ultralytics를 활용한 커스텀 데이터셋 학습 과정을 단계별로 안내합니다. 트랜스포머 기반의 고속 객체 탐지 기술과 yaml 설정, 파이썬 학습 코드까지! labelImg로 라벨링된 YOLO 포맷 데이터셋을 RT-DETR에 적용하는 실습 예제 포함.

RT-DETR 객체인식이란? + 커스텀 트레이닝도 진행해보자!

객체 인식에 관한 연구를 진행하며, 다양한 객체인식 모델들을 공부하고 사용해 보고있다. 그 중 한가지인 RT-DETR을 오늘 소개해보려고 한다.

RT-DETR (실시간 감지 트랜스포머)
높은 정확도와 적응형 추론 속도를 제공하는 비전 트랜스포머 기반 실시간 물체 감지기인 Baidu의 RT-DETR 를 살펴보세요. 자세한 내용은 Ultralytics 에서 확인하세요.


먼저 RT-DETR은 바이두에서 개발한 트랜스포머 기반 객체 탐지 모델이다.
ultralytics 라이브러리를 이용하면 간단한 파이썬 코드로 쉽게 학습시킬 수 있으며, yolo 커스텀 트레이닝 데이터셋도 그대로 사용가능하여 무척 편리하다.

모델에 대해서 간단하게 알아보자면

rt-detr overview
RT-DETR overview

RT-DETR은 DETR 아키텍처를 기반으로 하면서도 실시간 감지를 위해 여러 최적화된 기술을 적용한 것이 특징이다. 대표적으로는 스케일 간 융합(CCFM)과 스케일 내 상호 작용(AIFI) 모듈을 활용하는 ‘효율적인 하이브리드 인코더’를 통해 멀티스케일 특징 정보를 빠르고 정확하게 학습한다. 더불어 IoU 인식 쿼리 선택(IoU-aware Query Selection)을 도입해 중요한 객체 정보를 더욱 정밀하게 포착할 수 있으며, 재학습 없이도 디코더 레이어 수를 유연하게 조절함으로써 추론 속도와 정확도를 상황에 따라 최적화할 수 있다는 장점을 지닌다.

이제 이 모델을 자체 데이터셋로 학습시켜보자.
먼저 데이터셋을 준비해야한다.
데이터셋 준비 과정은 이전글을 참고하기 바란다.

labelImg를 이용한 YOLO 데이터셋 라벨링 방법
labelImg 설치 방법과 설정 과정을 단계별로 설명합니다. GitHub에서 다운로드하고 클래스 설정부터 PascalVOC를 YOLO 포맷으로 변경하는 방법까지, 라벨링 단축키와 저장 과정 소개.
dataset/
│
├── train/           # 학습 데이터 이미지 폴더
│   ├── image1.jpg
│   ├── image2.jpg
│   └── ...
│
├── val/             # 검증 데이터 이미지 폴더
│   ├── image1.jpg
│   ├── image2.jpg
│   └── ...
│
└── labels/          # 라벨 폴더
    ├── train/       # 학습 데이터의 라벨 (텍스트 파일들)
    │   ├── image1.txt
    │   ├── image2.txt
    │   └── ...
    │
    └── val/         # 검증 데이터의 라벨 (텍스트 파일들)
        ├── image1.txt
        ├── image2.txt
        └── ...

여기까지 준비되었다면 yaml파일을 생성해야한다.
yaml파일에는 준비한 데이터셋의 경로와 설정한 클래스명을 작성해주면 된다.
한가지 예시 파일은 아래와 같다.

train: C:\Users\kkwjk2718\Desktop\test\train\imaes # 학습 이미지 경로
val: C:\Users\kkwjk2718\Desktop\test\valid\images # 검증 이미지 경로
test: C:\Users\kkwjk2718\Desktop\test\test\images # 테스트 이미지 경로

names: # 클래스 이름
  0: card
  1: red
  2: box

데이터셋이 모두 준비되었다면, 이제는 정말 학습을 진행할 차례이다.

# run.py
from ultralytics import RTDETR

def main():
    model = RTDETR("rtdetr-l.pt")
    model.train(
        data="rtdetr.yaml",
        epochs=100,
        imgsz=640,
        batch=8,
    )

if __name__ == "__main__":
    main()

위 코드는 에포크 100, 배치사이즈 8정도로 돌린 코드이다. 학습시키는데 gpu리소스를 꽤 소모하므로, 이점 고려하여 학습 진행하기를 바란다.(필자는 4060ti 16gb에서 학습 진행하였다)

학습이 끝나면 프로젝트 폴더에 각종 평가 지표들도 함께 저장되니, 참고하면 좋을 것 같다!

이번 연구를 진행하면서 공부한 객체인식 모델들에 관한 글을 차차 적어가보려 한다. 다음글도 곧 작성해보겠다 😄