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

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

아래는 FPS 측정을 위한 코드이다.
OpenCV
- 내장 함수를 통한 YOLO 구현
- 단점 : CPU 연산만 지원
- 장점 : 간단한 설치
- 출처: https://deep-eye.tistory.com/6
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. 추론
- 평가를 통해 최적의 모델 선정 후 추론 진행하면 될 듯
'프로젝트 > Data_Analysis_Track_33_FinalProject' 카테고리의 다른 글
| FinalProject_06(개별 Action 수행, sequential img inference) (0) | 2024.01.12 |
|---|---|
| FinalProject_05(개별 Action 수행, Modeling) (2) | 2024.01.11 |
| FinalProject_04(개별 Action 수행) (0) | 2024.01.10 |
| FinalProject_02(개별 Action 선정 및 수행, webcam inference code) (1) | 2024.01.03 |
| FinalProject_01(주제 선정 및 개요, SRS_v1.0, 프로젝트 기획서) (1) | 2024.01.02 |