https://thisisjava.tistory.com/588
위 글의 오류 해결 과정이다
위 사진들에서 메모리 사용량을 보면 yolov8 객체탐지 과정에서 메모리 소모량이 매우 극심하다.
이유는 객체 탐지 과정에서 사용한 model.predict 함수는 영상 객체를 탐지할 때 프레임 단위로 나온 결과값을 메모리에 누적하여 저장하기 때문이다. 때문에 results = model.predict()를 수행하고 나면 results 변수에 영상 객체 탐지 결과가 전부 저장되어 이를 활용할 수 있는 것이고.
이 때문에 양이 많지 않은 사진 탐지는 정상적으로 수행되었으나 영상은 계속 탐지되다가 중간에 프로세스가 죽어버리는 것이다.
그러면 현재 사용중인 모델은 'yolov8s.pt' 를 파인튜닝한 것이니 이보다 크기가 작은 'yolov8n.pt'를 사용하면 괜찮을까 해서 해당 모델로 객체탐지를 시도해 보았다.
결과는 보다시피 똑같이 프로세스가 종료되었다.
모델 크기가 아니라 결과값을 메모리에 저장하는 부분이 문제라서 그런 것 같다.
혹시 조금이라도 메모리 부담을 줄여줄 수 있을까 해서 hide_conf 옵션을 True로 했는데 별 의미는 없었다.
model.predict를 사용할 수 없으니 나는 현재 yolov8을 이용해서 영상 객체 탐지의 결과영상을 얻을 수 없는 상태다.
하지만 결과 영상을 얻지는 못하더라도 프레임 단위로 식별된 값을 얻을 수는 있다.
https://docs.ultralytics.com/modes/predict/#key-features-of-predict-mode
위 링크의 글을 참고하였다. predict 메소드를 사용하지 않고 그냥 model에 stream = True 옵션을 주면 객체 탐지 결과값을 메모리에 적재하지 않고 바로 없애버린다.
영상 객체를 탐지할 때 n번째 프레임에서 탐지한 값을 n+1번째 프레임을 탐지할 때는 지워버리는 식으로 메모리 부담을 줄인다.
메모리에 부담은 가지 않지만 results 변수에 반환할 결과가 남아있지 않아서 이를 활용할 수 없고, 결과로 출력되는 객체 탐지 영상도 얻을 수 없다.
results를 print(results)로 출력해보면 실제로 아무 값도 들어있지 않아서 '<generator object BasePredictor.stream_inference at 0x179ff1120>' 가 출력된다.
현재 목적은 객체 탐지 영상이 아니라 객체 추적으로 한 객체가 이동할 경로를 몇가지로 정의하고 집계하는 것인데 stream으로 메모리에 저장된 값을 다 날려버리면 이게 불가능하지 않을까 생각된다.
https://docs.ultralytics.com/modes/predict/#streaming-source-for-loop
위 링크를 참고하여 작성한 아래의 opencv를 이용하는 코드로 연속된 프레임을 탐지해 화면에 출력할 수 있는데 내가 opencv를 잘 못해서 이 코드를 더 발전시켜서 영상을 추출해낼 수 있을지 모르겠다.
# Load the YOLOv8 model
model = YOLO('best.pt')
# Open the video file
video_path = "/Users/user/Desktop/vscodeProject/YOLOv8_Practice/12.MP4"
cap = cv2.VideoCapture(video_path)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLOv8 inference on the frame
results = model(frame)
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLOv8 Inference", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()
어쨌든 현재 목적은 객체 경로 추적 후 집계이니까 이걸 구현해보면서 더 고민해봐야겠다.
'프로그래밍 > 데이터 사이언스 공부' 카테고리의 다른 글
YOLOv8 차량 추적, 집계 실습 (0) | 2023.09.23 |
---|---|
YOLOv8 Object Tracking 실습 (0) | 2023.09.23 |
YOLOv8 Detection WARNING ⚠️ NMS time limit (0) | 2023.09.18 |
YOLOv8 객체 탐지 시 zsh: killed 오류 (0) | 2023.09.18 |
yolov5 detect.py 결과로 출력된 txt, csv와 yolov5 results 활용의 불편함 (0) | 2023.09.18 |