본문 바로가기

프로젝트/Data_Analysis_Track_33_FinalProject

FinalProject_03(개별 Action 수행, 모델링 webcam FPS 측정 코드)

모델링파트 Action

  • time 라이브러리로 모델(n, m 등)의 FPS 측정할 수 있는 코드로 확인해보기(현재 가용할 수 있는 GPU 사양을 최대한 높여서 확인해보기)
  • CPU로밖에 진행을 못한다면 모델의 수준이 낮아질 수 밖에 없다. -> 확인해보기
  • 코드 부분의 result 위에 time before를 걸고 뒤에 time after를 걸어서 FPS확인하기
  • time을 활용한 FPS측정 강의 자료 레퍼런스 있는 걸로 앎 -> 찾아보기
  • AIhub 데이터셋 활용 AI 모델 확보할 수 있다면 확보, 모델을 돌릴 수 있는 환경 확보하기
  • 이후에 클래스 재정의할 것이다. 각각의 라벨 클래스를 더 살펴보고 어떤 걸 버리고 어떤 걸 채택할지 테이블 작성

 

- AIhub 데이터셋 활용 AI 모델

지자체 도로부속시설물 파손 데이터 활용 AI 모델

 

- 클래스 재정의 논의(빨간색: 포함X, 노란색: 추가기능으로 사용시 포함)

현재 클래스 재정의 상황

 

 

아래는 FPS 측정을 위한 코드이다.

 

OpenCV

 

OpenCV webcam FPS 측정 코드

import datetime
import cv2

# cap = cv2.VideoCapture('images/wave.mp4') # str : 동영상파일 경로
cap = cv2.VideoCapture(0)
print(cap.isOpened())
# 동영상의 FPS(Frame Per Second)를 조회 -> 1초에 몇 frame(영상)씩 보여주는지.

# cap.get(flag) : 연결된 동영상(webcam, 파알) 에 대한 정보를 조회
fps = cap.get(cv2.CAP_PROP_FPS)
print("FPS:", fps)
delay = int(1000/fps) # 한장 출력 시간. waitKey()에 들어가는 상수는 밀리초 단위이기에 1000
print('FPS:', fps, "delay:", delay)

while cap.isOpened():
    start = datetime.datetime.now()
    succ, img = cap.read() # 한 frame 읽기
    
    if not succ:
        print('읽기 실패')
        break
        
    end = datetime.datetime.now()

    total = (end - start).total_seconds()
    print(f'Time to process 1 frame: {total * 1000:.0f} milliseconds')

    fps = f'FPS: {1 / total:.2f}'
    cv2.putText(img, fps, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

    cv2.imshow('wave.mp4', img)
    
    if cv2.waitKey(delay) == 27:
        break

cap.release()
cv2.destroyAllWindows()

 

- 모델링 구현이 되지 않은 웹캠에서는 평균 60FPS가 나왔다. 이제 모델링이 구현된 웹캠에서의 FPS 측정을 하겠다.

 

YOLOv8 webcam FPS 측정 코드

import datetime
import cv2
from ultralytics import YOLO

# 웹캠 연결
cap = cv2.VideoCapture(0)
#### YOLO 모델 생성
model = YOLO("models/yolov8n.pt")

while cap.isOpened():
    start = datetime.datetime.now()
    # 한 frame(이미지)을 읽기
    succ, frame = cap.read()
    if not succ:
        print("웹캠 연결에 문제가 생겼습니다.")
        break
    # flip(대칭)
    frame = cv2.flip(frame, 1) # 양수: 좌우, 0: 상하, 음수: 상하좌우
    ###############################################
    # YOLO 모델을 이용한 추론 -> 결과 이미지 생성
    ###############################################
    img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # yolo는 rgb 이미지를 학습시킨다.
    
    # 추론. 추론대상이미지타입 - 문자열(경로), Image(ndarray, PIL.Image)
    result = model(img,
                   conf=0.5,  # 확률이 0.5 이상인 것만 결과로 리턴
                   verbose=False)[0] # 추론 결과 로그를 출력하지 않는다.
    
    # 결과에서 위치, 클래스 정보 추출
    ### (찾은 object 개수, shape)
    xyxy_list = result.boxes.xyxy.to("cpu").numpy().astype("int32")
    cls_list = result.boxes.cls.to("cpu").numpy().astype("int32")
    conf_list = result.boxes.conf.to("cpu").numpy()
    
    # for in 문을 이용해 찾은 object 별로 bbox 처리를 한다.
    for xyxy, cls, conf in zip(xyxy_list, cls_list, conf_list):
        pt1, pt2 = xyxy[:2], xyxy[2:]
        txt = f"{result.names[cls]} - {conf*100:.3f}%"
        # box
        cv2.rectangle(frame, pt1, pt2, color=(255, 0, 0), thickness=2)
        cv2.putText(frame, txt, org=pt1, fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=1, color=(200,0,0), thickness=1, lineType=cv2.LINE_AA)

    end = datetime.datetime.now()
    
    total = (end - start).total_seconds()
    print(f'Time to process 1 frame: {total * 1000:.0f} milliseconds')

    fps = f'FPS: {1 / total:.2f}'
    cv2.putText(frame, fps, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

    # 영상 출력
    cv2.imshow("frame", frame)
    # 중단여부확인
    if cv2.waitKey(1) == 27: # ESC를 입력하면
        break
# 마무리
cap.release() # 웹캠연결 종료
cv2.destroyAllWindows() # 출력 윈도우 종료

- 모델링이 구현된 웹캠에서의 평균 FPS는 YOLOv8n 기준 10정도 나왔다

- YOLOv8s 기준 평균 8FPS

- YOLOv8m 기준 평균 2FPS

- FPS를 높게하려면 위의 출처의 설명처럼 CPU연산만 지원하는 OpenCV가 아닌 GPU를 지원하는 Darknet 또는 Darkflow를 사용해야 한다.

- 현재 상황에서 GPU를 사용할 수 있는 방법은 colab뿐이다. 하지만 colab은 동영상 디스플레이 지원이 불가해 webcam의 FPS를 확인할 수 없다. 그렇다고 웹캠이 달려 있는 노트북의 local 환경으로 하기에는 FPS 수치가 아쉽다.-> 해결방안 확보 시급

 

이제 이전에 .txt 확장자로 바꾼 라벨링 데이터들을 yolov8에 fine tuning을 진행할 것이다.

1. 데이터 준비 (원본데이터 -> jpg, 라벨데이터 -> txt)

    - 최종 클래스 선정 후 대용량 데이터를 하드에 다운로드

2. yaml파일 준비 -> 참고하여 파라미터들을 적절히 활용하여 yaml 파일 만들기

    - 참고출처 -> https://velog.io/@dl021587/%EC%93%B0%EB%A9%B4%EC%84%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-YOLOv8

3. 학습 (학습에 적절히 활용할 파라미터들을 확인해보기)

    - 팀원 중 한 명이 학습 진행, 학습 완료 후 학습된 모델(pt파일) 공유

4. 평가

    - 공유된 학습된 모델로 평가 진행 (여러 척도 추출 후 시각화)

5. 추론

    - 평가를 통해 최적의 모델 선정 후 추론 진행하면 될 듯