[DL] YOLO v8 모델을 활용하여 가위바위보 Object Detection

Minjeong Kim·2026년 1월 7일

인공지능

목록 보기
47/50

📢 YOLO v8 모델을 활용하여 주먹, 가위, 보 객체 탐지

개념

  • YOLO 계열의 모델은 실시간 객체 탐지 작업에 용이
  • 8 버전은 6에 비해 성능이 좋아짐
  • ultralytics 회사에서 제공하는 라이브러리로, 코드와 사용법이 직관적이고 문서화가 잘 되어 있음
  • YOLOv8: 높은 정확도와 유연한 탐지 방법을 가지고 있어 사용자 친화적인 인터페이스 가짐

Code

설치

  • Utralytics 울트라리틱스 → YOLO 를 사용하기 위한 패키지
!pip -q install ultralytics

데이터 다운로드

https://universe.roboflow.com/project-kzetv/yolov7_rock_paper_scissors/dataset/1

  1. Download Dataset 클릭

  2. 3번째 Download Dataset 클릭

  3. 모델 선택 > continue 클릭

  4. code 복사

    !pip install roboflow
    
    from roboflow import Roboflow
    rf = Roboflow(api_key="mvueo9gbNXGpc80f1UFu")
    project = rf.workspace("project-kzetv").project("yolov7_rock_paper_scissors")
    version = project.version(1)
    dataset = version.download("yolov8")
  5. data.yaml 파일 수정

    • 경로 수정 (test, train, val 부분 → 절대 경로로 변경)

학습

  1. import library

    • v8 부터는 라이브러리 사용하듯이 사용 가능
    from ultralytics import YOLO
  2. 모델 객체 생성

    # 모델 객체 생성
    # 사전 학습된 모델 사용 -> 전이학습
    model = YOLO('yolov8n.pt')
    • model = YOLO()
      • 사전학습이 되지 않은 기본 뼈대 모델을 불러오는 방법
      • 사전 학습된 모델 사용하려면, 즉 전이학습하려면, 모델 이름 작성해주면 됨

    모델 선택 방법

  3. 모델 학습

    • 학습 키워드 사용하여 학습 (train)
    # 모델 학습
    result = model.train(data = './yolov7_rock_paper_scissors-1/data.yaml',
                         epochs = 100,
                         imgsz = 640)
    • std
      ...
            Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
           99/100      2.62G     0.4481      0.334      0.882         14        640: 100% ━━━━━━━━━━━━ 19/19 3.4it/s 5.6s
                       Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 2/2 4.2it/s 0.5s
                         all         63         73      0.906      0.965      0.965       0.81
      
            Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
          100/100      2.62G     0.4458     0.3325     0.8807         15        640: 100% ━━━━━━━━━━━━ 19/19 4.7it/s 4.1s
                       Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 2/2 2.9it/s 0.7s
                         all         63         73      0.898      0.973      0.964      0.807
      
      100 epochs completed in 0.188 hours.
      ...

모델 학습 결과

  • runs/detect/train
  • ./weight
    • best.pt : 성능 가장 좋음
    • last.pt : 가장 마지막

예측

  1. 베스트 모델 불러오기

    # runs/detect/train2/weights/best.pt 베스트 모델 불러오기
    my_model = YOLO('./runs/detect/train2/weights/best.pt')
  2. 예측에 사용할 이미지 한 장으로 예측해보기

    # 예측에 사용할 이미지 한 장 가져오기
    source = './yolov7_rock_paper_scissors-1/test/images/IMG_5636_MOV-40_jpg.rf.451d107b173a6856044a5d884eb7ed90.jpg'
    
    # 예측 결과를 저장할 경로
    save_dir = './runs/detect/predict'
    
    # 예측
    my_model(source = source, save_dir = save_dir, save = True, conf = 0.3)
    • conf
      • 신뢰도 cut-off
      • 0.3 : 30% 이상의 신뢰도를 가질 경우 표시

  3. 결과 확인

    result_img = my_model(source = source, save_dir = save_dir, save = True, conf = 0.3)
    
    import matplotlib.pyplot as plt
    plt.imshow(result_img[0].plot())
    plt.axis('off')

    • (참고) matplotlib 으로 그렸을 때 파란색으로 보이는 이유
      numpy 와 matplotlib 이 사용하는 컬러 채널 순서가 다름
      그래서 지금 red 와 blue 가 바뀌어서 저렇게 보임!

0개의 댓글